Skip to content

Errors

Errors have an HTTP status and a body like this:

{
"error": {
"code": "not_found",
"message": "ZZZ9 is not on the CBP FIRMS list.",
"links": { "docs": "https://docs.firmsapi.com/api/errors/#not_found" },
"details": null
},
"meta": { "data_as_of": "2026-10-23", "source": "…", "mode": "live", "request_id": "…" }
}

Match on error.code, not on message; messages may change. links always has docs and sometimes a link that fixes the problem. details is present for some codes.

401. No x-api-key header. Send your key in x-api-key.

401. The key is not a FIRMSapi key, or it does not exist (check for missing characters).

401. The key was revoked in the portal. Create a new one. Revocations take effect within a minute.

403. Your plan does not include this endpoint (batch and the changes feed need Pro; watchlists need Enterprise). details.plans lists the plans that do. Not counted.

400. A parameter or the body is missing or invalid. details lists each problem as {"field", "problem"}. Not counted.

404. The code, port or watchlist entry does not exist. Counted, because it is an answer: the code is not on the FIRMS list.

404. There is no such endpoint. Check the path and that it starts with /v1.

429. Your plan’s calls, your call packs and your overage cap are used up for this month. links has buy_pack, billing and, on the Free plan, upgrade. See Usage and quotas. Not counted.

503. The FIRMS data is briefly unavailable (for example, before the first build). Retry with backoff. Not counted.

503. GET /nearby?address= could not reach the address geocoder. Retry with backoff, or pass lat and lon. Not counted.

500. Something went wrong on our side. Not counted. Retry with backoff, and quote meta.request_id if it persists.