Skip to main content
Errors are JSON, always with an error string:
Validation failures add the details:

Status codes

There is no 403. Requesting a resource that belongs to another account returns 404, identical to one that never existed. A 403 would confirm the row exists, which is information the caller is not entitled to. Do not write code that distinguishes “gone” from “not yours” — it cannot.

Validation

Request bodies are validated against a schema before anything is written. Unknown fields are ignored rather than rejected, so a client sending a field the API does not know about will not break — but that field will not be stored either. If a value you sent is not coming back, check that the field name matches the schema. Defaults are applied on create. Omitting efficiency on a new recipe gives you 0.72, not null.

AI limits

The AI endpoints are metered per account per day: Both reset at midnight UTC. Exceeding either returns 429 with a message saying which limit you hit. Check where you stand:
The chat endpoint also caps a single user message at 8,000 characters and returns 413 above that.

Retries

500 responses are safe to retry with backoff. 429 is not worth retrying until the limit resets. 4xx other than 429 will fail identically on retry — fix the request instead. Writes are not idempotent: retrying a POST that actually succeeded but whose response you missed will create a second resource. If that matters to your script, list and check before retrying a create.