Rate limits and errors

Error shape

Every error is JSON with an error field carrying a message meant for a human reading a log:

{ "error": "API key missing required scope: tests:read" }

Branch on the status code, not on the message text — messages get clearer over time and are not part of the v1 contract.

Status codes

CodeMeaningWhat to do
200Success
201Test created
400Malformed request bodyFix the request; retrying will not help
401Missing, malformed, expired or revoked keyCheck the key; do not retry
403Key lacks the scope, or the plan has no APIIssue a key with the scope, or upgrade the plan
404No such test or report, or the token expiredDo not retry
429Rate limitedWait Retry-After seconds, then retry
5xxOur faultRetry with backoff; if it persists, tell us

A 404 on a report you just created usually means the token is right but the message has not arrived. A test that exists but is unscored returns 200 with "status": "pending" — so 404 really does mean no such test.

Rate limits

Key-authenticated requests are limited per account, per minute, at your plan’s rate. The limit applies to the account, not to the individual key, so ten keys do not get ten times the budget.

Over the limit you get 429 with a Retry-After header in seconds:

HTTP/1.1 429 Too Many Requests
Retry-After: 6
Content-Type: application/json

{ "error": "API rate limit exceeded" }

Honour Retry-After. It is calculated from your plan’s actual rate — on a 10/min plan the next request slot is about six seconds away, so the header says 6 rather than a blanket minute. Retrying sooner just consumes the limit again.

POST /v1/tests requires a key on this API. Tests can be run without an account from the website, but not from api.deliversight.com.

Retrying safely

POST /v1/tests is not idempotent: each call allocates a new address and consumes quota from your monthly test allowance. If a create request times out, check whether it succeeded before retrying — a blind retry loop can burn a month’s quota quickly.

GET requests are safe to retry freely.