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
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”.The ones worth understanding
409 — the account is not set up to receive payments
409 — the account is not set up to receive payments
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.
422 — validation
422 — validation
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.429 — rate limited
429 — rate limited
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.