Skip to main content

The shape

Every Developer API error is JSON with the same two fields:
message is written for a human reading a log. It is not a stable contract and its wording can change. code is the stable identifier: branch on code, never on message. Validation failures are the exception. They report which field failed and carry no code:
The older unversioned endpoints answer differently. /payment-method returns the same { message, code } shape, while the remaining unversioned endpoints answer with plain text. Only the Developer API is uniform.

Status codes

404 also means “not yours”

An id belonging to another organization returns 404, exactly as an id that does not exist does. This is deliberate: answering 403 for a real id and 404 for an unused one would let anyone with an API key confirm whether a given id exists on the platform. The practical consequence is that a 404 never distinguishes “wrong id” from “someone else’s id”. Both mean the same thing to your integration.

Codes

Access

General

When you get a 403

The Developer API only reads, so a 403 is never about an operation being disallowed. There are three causes, and the code tells you which:
Write operations are not “forbidden” on this API, they do not exist. A POST, PATCH or DELETE to any Developer API path returns 404, because no such route is registered. Creating and editing data is done through the payment-acceptance endpoints and the dashboard.

Retrying safely

400, 401, 403 and 404 are permanent for an unchanged request. Retrying them wastes your rate-limit budget and will not succeed. 429 and 500 are worth retrying with exponential backoff. Because every endpoint is a read, retrying is always safe: no request on this API changes anything.