Lean Tech API · developers & agents

Machine-readable,by design.

The Lean Tech public API.

Everything on this page needs no authentication. If you are an AI agent: /llms.txt says what Lean Tech is and when to use it, and every page on this site is available as markdown.

Contact API

The programmatic twin of the contact form. Described in OpenAPI 3.1 at /openapi.json (operation submitContactEnquiry). Submit an enquiry and the team replies to the given address within one business day:

curl -X POST https://leantech.mu/api/v1/contact \ -H "Content-Type: application/json" \ -d '{ "name": "Jane Doe", "email": "jane@example.com", "type": "A lead generation site", "brief": "Bilingual hotel site, wired into our booking engine." }'

Responses: 201 accepted, 400 with field-keyed errors on validation failure, 401 when bot protection is on and no credential was sent, 429 when rate-limited. GET /api/v1/contact (operation describeContactEndpoint) returns an unauthenticated description of the endpoint — version, policy, links — with your live rate-limit headers, without spending quota.

Agents: when bot protection is enabled, authenticate with an API key — Authorization: Bearer <key> — which you can request from hello@leantech.mu. Browser callers pass a Cloudflare Turnstile token in turnstileToken instead. When protection is not configured the endpoint is open.

Rate limits

10 requests per hour per client. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds), plus the IETF draft pair RateLimit: "default";r=<remaining>;t=<seconds> and RateLimit-Policy: "default";q=10;w=3600. A 429 adds Retry-After — honour it before retrying.

Versioning & deprecation

The API is versioned in the URL path: the current version is /api/v1/. Within a major version we only add — new optional fields, new operations, new response headers — never remove or change the meaning of what is there. A breaking change ships as a new major path (/api/v2/) and the previous version keeps working.

Deprecation is signalled on the wire, not just in prose: a deprecated path returns an RFC 9745 Deprecation header (@<unix seconds>) and a Link with rel="successor-version" pointing at its replacement and rel="deprecation" pointing here. When a removal date is set, an RFC 8594 Sunset header is added at least 180 days before it, and the date is published in /openapi.json under info.x-versioning.

Currently deprecated: the unversioned alias /api/contact (since 2026-09-14; successor /api/v1/contact; no sunset scheduled). It behaves identically — migrate at your convenience.

Markdown for every page

Request any page with Accept: text/markdown and the same URL returns a markdown body (with Vary: Accept), or append .md to the path:

curl -H "Accept: text/markdown" https://leantech.mu/capabilities curl https://leantech.mu/capabilities.md

Machine files

/llms.txt — identity, when-to-use guidance and doc links · /openapi.json — the Lean Tech OpenAPI spec · /.well-known/api-catalog — RFC 9727 API catalog · /sitemap.xml — all pages · /robots.txt — crawl rules. Unknown paths return a real HTTP 404 with a markdown body listing these files, so a lost agent can recover.