Anti-Spam
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.

401 Unauthorized
{ "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.

422 Unprocessable Content
{
  "error": {
    "code": "validation_failed",
    "message": "Request body is invalid",
    "details": [{ "path": "fields.0.type", "code": "invalid_type" }]
  }
}

Error codes

Error codes
StatusCodeWhat to do
400invalid_jsonThe body is not valid JSON. Fix the request.
401invalid_api_keyThe key is missing, wrong or was replaced. Copy it again from the site page.
404not_foundUnknown endpoint. Check the method and path.
409idempotency_conflictThis Idempotency-Key was already used for a different message. Use a new key for each message.
409idempotency_in_progressA request with this Idempotency-Key is still running. Treat it as no result.
413payload_too_largeThe body is too large. Send only what the visitor submitted.
422validation_failedThe body or the Idempotency-Key header is not valid. details says which field.
429quota_exhaustedYour plan limit is reached. Let the message through.
429rate_limitedToo many requests at once. Let the message through.
500internal_errorSomething went wrong on our side. Let the message through.
503scoring_unavailableThe 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.