Docs pages
Errors
Errors have the same shape every time. No error is a verdict: let the message through.
Error body
Match on code. The message is for people and may change.
{ "error": { "code": "invalid_api_key", "message": "Missing or invalid API key" } }
A 422 answer adds details: the path of each field that is not valid and what is wrong with it.
{
"error": {
"code": "validation_failed",
"message": "Request body is invalid",
"details": [{ "path": "fields.0.type", "code": "invalid_type" }]
}
}
Error codes
| Status | Code | What to do |
|---|---|---|
400 | invalid_json | The body is not valid JSON. Fix the request. |
401 | invalid_api_key | The key is missing, wrong or was replaced. Copy it again from the site page. |
404 | not_found | Unknown endpoint. Check the method and path. |
409 | idempotency_conflict | This Idempotency-Key was already used for a different message. Use a new key for each message. |
409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Treat it as no result. |
413 | payload_too_large | The body is too large. Send only what the visitor submitted. |
422 | validation_failed | The body or the Idempotency-Key header is not valid. details says which field. |
429 | quota_exhausted | Your plan limit is reached. Let the message through. |
429 | rate_limited | Too many requests at once. Let the message through. |
500 | internal_error | Something went wrong on our side. Let the message through. |
503 | scoring_unavailable | The check could not be completed this time. Let the message through. |
At your plan limit
When your plan limit is reached, we answer 429 quota_exhausted and the message is not checked. New messages come through unchecked until your plan resets or you upgrade.
Your key stays valid. Verify a key to see your usage, or read the limits of each plan.
Too many requests
Very fast bursts get 429 rate_limited with a Retry-After header in seconds. Let the message through rather than make the visitor wait.
If we are slow or cannot be reached, let the message through. Set a client timeout of 5 seconds, as the WordPress plugin does.