Daily limits you can read

API

A 429 from a per-minute brake and a 429 from a spent daily ceiling call for different handling. Your code can now tell them apart without reading the message.

What changed

  • error.limit is on every refusal by a daily ceiling: name (what it counts), scope (person, application, account or platform), max and resetsAt. A per-minute brake has none.
  • Every daily refusal names its number. Provisioning, build sessions and verification texts used to say only that a limit was reached.
  • A build budget Layout cannot read is now 503 unavailable with Retry-After, not 429 build_limit. Nothing was built, and the person has not reached a limit. Retry with the same key.
  • The MCP order tool returns refusal when it refuses to start a build: code (the REST code), retryable, and the same limit.

Why it matters

A client that is not a model, such as a texting service or an app, can stop retrying until resetsAt and tell the person why.

What to do

When error.limit is present, do not retry before resetsAt. See Handling a 429.

Breaking changes

None for a spent limit: its status code and error code are unchanged, and the fields are additive. A build budget Layout could not read used to answer 429 build_limit; it now answers 503 unavailable, which a client that retries a 5xx already handles.

All changes