Errors
The API error format, how to handle errors and the full list of codes, each with its own anchor.
API documentationGuides · Errors
Shape of an error
An error uses the application/problem+json format (RFC 9457), with a stable code:
{
"type": "https://mabellenote.com/developers/errors#invalid_request",
"title": "Invalid request",
"status": 400,
"code": "invalid_request",
"detail": "The request contains invalid fields.",
"requestId": "req_Qm9uam91ciBNYSBCZWxsZQ",
"errors": [{ "path": "query.limit", "message": "Must be less than or equal to 100" }]
}
| Field | Purpose |
|---|---|
type | Address of the code's documentation, that is the matching anchor on this page. |
title | Short title, in English. |
status | HTTP status of the response. |
code | Stable code, to use for automated handling. |
detail | Explanation specific to this occurrence, in English, or null. |
requestId | Request identifier, identical to the X-Request-Id header. |
errors | Only present for invalid_request: the list of faulty fields, with their path (query.limit, body.email…) and a message. |
Every response, error or not, carries the X-Request-Id header. Share it with support for any question about a specific call.
Handling an error
- Code against
code, never againsttitleordetail, whose wording may change. - A code never disappears and never changes status within a version. New codes may come with new operations: handle an unknown code based on its HTTP status.
429 rate_limited: wait for the number of seconds given by theRetry-Afterheader, then send the request again.409 idempotency_in_progress: a request with the sameIdempotency-Keyis still running. Send it again a little later, with the same key. The idempotency guide details these cases.503 service_unavailable: the request had no effect. Send it again after theRetry-Afterdelay when present, otherwise after an increasing wait.500 internal_error: send the request again with an increasing wait and a limited number of attempts, then contact support with therequestId.- Other
4xxerrors are not fixed by sending the same request again: fix it first. 404 route_not_foundmeans the path does not exist,404 not_foundthat the resource is missing or belongs to another account.405 method_not_allowedlists the accepted methods in theAllowheader.
Code catalog
This list comes from the API's OpenAPI description. It is part of the v1 contract.
The request contains invalid parameters or fields. Details are listed in errors.
The pagination cursor is invalid or was issued for different filters.
No API key was provided in the Authorization: Bearer header.
The provided API key does not exist.
The API key has been revoked. Create a new one from the application.
The API key has passed its expiration date.
The account's monthly AI credit is exhausted.
The API key does not carry the scope required by this operation.
The API is reserved for the Pro plan. It resumes as soon as the account is back on Pro.
The account is read-only: writes are refused, reads remain available.
No operation matches this path.
not_found
404The resource does not exist or does not belong to the key's account.
This path exists but does not accept this method. The Allow header lists the accepted methods.
conflict
409The operation conflicts with the current state of the resource.
A request with the same idempotency key is still being processed.
The account has reached the maximum number of active API keys.
The account has reached the maximum number of webhook endpoints.
This promo code has already been redeemed.
This promo code has expired.
The request body exceeds the maximum allowed size.
The request body must be sent as application/json.
The idempotency key was already used for a different request.
The request is well formed but breaks a business rule.
rate_limited
429Too many calls with this key. Retry after the delay given by Retry-After.
Unexpected error. Share the requestId with support.
Publishing to Google through the API is temporarily disabled for all accounts.
Updated on October 25, 2026

