Developers
Developers
The Overcode API, its error codes, and every machine-readable file this site publishes for agents.
What there is, and what there is not
Overcode is an engineering practice, not a software product. There is no account to create, no dashboard, no API key, and no data API. The public HTTP surface is one endpoint — the contact form — plus the machine-readable files that describe this site.
That is stated plainly because the alternative is worse. An agent that trusts an invented API and calls a route which does not exist has been actively misled, and a specification padded out to look substantial is how that happens.
Authentication
There is none. The contact endpoint is open, and abuse is bounded rather than authenticated: a honeypot field, length and link limits, a Cloudflare Turnstile challenge, and a per-address rate limit at the edge.
The rate limit is two requests per ten seconds per IP. Exceed it and Cloudflare answers with its own block page before the request reaches the endpoint, so the response will not be in the JSON shape documented below.
One outcome, three representations
The endpoint answers in whichever form the caller can use, decided by the request headers. Send Accept: application/json, or no preference at all, and both success and failure come back as JSON. A browser posting the form natively is sent the whole failure page, because that response is the entire page the visitor is looking at. The form on the site sends X-Requested-With: fetch and gets one line of plain text plus a 204 on success, because the page it came from renders its own confirmation.
Reading the site itself
Every page serves Markdown at its own URL when the request sends Accept: text/markdown, and responds with Vary: Accept. If you would rather be explicit, append .md to the path without its trailing slash — /about.md, /work/manufacturing-erp.md.
A path that does not exist returns a real 404, not a 200 carrying the site shell, so a miss can be trusted. Ask for a type nothing here can produce and you get a 406 rather than a guess.
The endpoint
POST https://overcode.io/api/contact
Form-encoded, as application/x-www-form-urlencoded ormultipart/form-data. A JSON body is rejected withmalformed_body.
| Field | Required | Notes |
|---|---|---|
name | Yes | Who is writing. Up to 200 characters. |
email | Yes | Where the reply goes. An acknowledgement is sent here immediately. Up to 320 characters. |
message | Yes | The operational problem, not the feature you think you need. Between 25 and 5000 characters, at most 2 links. |
cf-turnstile-response | No | Cloudflare Turnstile token from the widget on the page. Required whenever the challenge is configured. An automated client cannot produce one. |
company_website | No | Honeypot. Leave it out. A non-empty value is answered as if it succeeded and nothing is sent. |
Example
curl -X POST https://overcode.io/api/contact \
-H "Accept: application/json" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "name=Aisha Rahman" \
--data-urlencode "email=aisha@example.com" \
--data-urlencode "message=Our sales team re-keys every WhatsApp order into the ERP by hand, roughly 60 a day, and the two disagree by the end of every week."A successful send returns 200 with:
{
"ok": true,
"message": "Enquiry received. A reply will come to the address you gave."
}Errors
Every error carries a stable error code, a human message, a hint saying what to do about it, and a documentation_url. Branch on the code, never on the message — the wording may be improved at any time and the code will not change.
{
"error": "message_too_short",
"message": "Please say a little more about the problem (at least 25 characters).",
"hint": "Describe the problem in at least 25 characters. \"hi\" and \"test\" are rejected.",
"status": 400,
"documentation_url": "https://overcode.io/openapi.json"
}| Code | Status | What to do |
|---|---|---|
field_too_long | 400 | name is capped at 200 characters, email at 320. |
human_verification_failed | 400 | Solve the Cloudflare Turnstile challenge on the page and send the cf-turnstile-response token with the form. |
invalid_email | 400 | Send a syntactically valid address; the reply goes to it. |
malformed_body | 400 | Post multipart/form-data or application/x-www-form-urlencoded. JSON bodies are not read. |
message_too_long | 400 | Trim the message to 5000 characters or fewer. |
message_too_short | 400 | Describe the problem in at least 25 characters. "hi" and "test" are rejected. |
missing_fields | 400 | Send all three fields with non-empty values. |
too_many_links | 400 | At most 2 links per message. |
method_not_allowed | 405 | The contact endpoint accepts POST only. |
not_acceptable | 406 | Send Accept: application/json, text/plain or text/html. |
mail_send_failed | 502 | Nothing was delivered. Retry once, then email cheefi.ng@overcode.io instead. |
mail_backend_unconfigured | 503 | Nothing was sent and retrying will not help until this is fixed. Email cheefi.ng@overcode.io instead. |
Machine-readable files
| Path | What it is |
|---|---|
/llms.txt | Index of this site for language models, including when to use Overcode and every machine-readable file below. |
/agent-instructions.md | When an agent should reach for Overcode, what we are a fit for, what we are not, and how to hand a lead over. |
/openapi.json | The complete public API surface: the contact endpoint, its request shape, and every error code it returns. |
/developers/ | The contact endpoint, its request shape, every error code, and the machine-readable files this site publishes. Written for a person; /openapi.json is the same surface for a machine. |
/work/ | Every published case study, not just the four the home page leads with — client, problem, what was built and the outcome, for each one. |
/.well-known/api-catalog | The standard discovery document for what APIs this host publishes, as an RFC 9264 linkset. |
/sitemap.xml | Every published page, including every published case study. |
/index.md | What Overcode does, the engagement models, and the case-study index, without markup. |
/about.md | Who runs the company, where it operates, and how the work is actually done. |
/contact.md | Email, phone, WhatsApp, vCard, and the contact endpoint an agent should post to. |
/developers.md | The API reference and the error-code table, without markup. |
/work.md | Every published case study, with client, year and outcomes, without markup. |
/privacy.md | What the contact form collects, who processes it, and how long it is kept. |
/.well-known/api-catalog | RFC 9727 API catalog, as an RFC 9264 linkset. The standard place to discover what APIs this host publishes. |