Skip to main content

Error response format

Every error response has the same shape:
{
  "error": "Unauthorized",
  "message": "Invalid API key"
}
FieldTypeDescription
errorstringShort error category matching the HTTP status (e.g. Bad Request, Unauthorized)
messagestringHuman-readable description of what went wrong

HTTP status codes

400 Bad Request

The request body failed validation.
MessageCause
Amount must be greater than 0amount is zero, negative, or not a valid decimal string
Currency is requiredcurrency is missing or empty
Expires in minutes must be greater than 0expiresInMinutes is zero or negative
Invalid webhook URL formatwebhookUrl is not a valid URL
Webhook URL must use HTTPS in productionwebhookUrl uses HTTP in a production environment
Webhook URL cannot point to localhost or loopback addresseswebhookUrl resolves to 127.0.0.1, ::1, or similar
Webhook URL cannot point to private or internal IP addresseswebhookUrl resolves to a private IP range

401 Unauthorized

Authentication failed. Check your API key.
MessageCause
Missing or invalid Authorization header. Use: Bearer <api_key>The Authorization header is absent or not in Bearer <key> format
Invalid API keyThe key was not found — it may have been deleted
API key has been revokedThe key exists but has been explicitly revoked
API key has expiredThe key passed its expiry date

403 Forbidden

The request was authenticated but not permitted.
MessageCause
Merchant account is not activeYour account is suspended or pending review
API key does not have the required permission: <permission>The API key lacks the permission needed for this endpoint. See API key permissions

404 Not Found

The requested resource does not exist under your account.
MessageCause
Invoice not foundNo invoice with that ID exists, or it belongs to a different merchant

429 Too Many Requests

You have exceeded the rate limit for your account tier.
{
  "error": "Too Many Requests",
  "message": "Rate limit exceeded",
  "retryAfter": 12
}
The retryAfter field tells you how many seconds to wait before retrying. The response also includes rate limit headers:
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1744329600
Rate limits by tier:
TierReadWrite
Free60 / min30 / min
Pro300 / min150 / min

500 Internal Server Error

An unexpected error occurred on our side. These are rare and transient — retry with exponential backoff. If the issue persists, contact support.

API key permissions

When you create an API key in the dashboard, you can scope it to specific permissions. If a request is made with a key that lacks the required permission, you will receive:
{
  "error": "Forbidden",
  "message": "API key does not have the required permission: invoices:write"
}
PermissionEndpoints
invoices:readGET /api/v1/invoices/:id
invoices:writePOST /api/v1/invoices
Keys with full access (no permission restrictions) can call any endpoint.