Skip to main content
Every failed request returns a non-2xx status and a body of the same shape.

The error body

array
required
One or more error details.
Always read code, never message. Message text is written for humans and may be reworded; codes are stable.

Status codes

Only 429 and 5xx are worth retrying. Retrying a 401, 403, 409 or 422 will fail identically every time and will count against your rate limit.

Error codes

code is the stable identifier. These are every code the payment-link endpoints return.
A malformed request body is also a 422, raised by request validation before any of the codes above. Its message names the offending field and its code is not from this list — treat any unrecognised 422 as “fix the request”.
INVALID_API_KEY deliberately covers unknown, revoked and deactivated keys with one identical message. Distinguishing them would tell an attacker whether a guessed key ever existed. EXPIRED_API_KEY is separate because expiry is a state the legitimate owner needs to diagnose, and it reveals nothing to anyone who did not already hold the key.

The ones worth understanding

The key is valid and correctly scoped, but its owner cannot receive money yet: no default wallet, or no handle.This is not a transient failure and there is nothing your code can do about it. The account owner has to claim a Moove Handle and set a default wallet with a settlement token.Surface it to the user rather than retrying.
The request body did not match the schema. message names the field.Common causes: toAmount missing or not greater than zero, description over 500 characters, maxUsage below 1, expirationDate not an ISO 8601 timestamp or not in the future.There is also one 422 that schema validation cannot catch: INVALID_PAYMENT_LINK_AMOUNT. toAmount is quantised to the settlement token’s decimals, and rejected if that changes the value — so 49.9999999 fails against a 6-decimal USDC wallet while 49.999999 succeeds. Trailing zeros are not significant, so 100.0000000 is fine.The limit belongs to the destination wallet’s token, not to your request. See toAmount.
Limits apply per API key and per source IP, whichever is reached first. Back off exponentially with jitter.Rate Limits →

Handling errors

Next

Rate Limits

What triggers a 429.

Authentication

401 and 403 in detail.

Moove Payment Links

The endpoints.