Error format
All errors follow a consistent JSON structure:HTTP status codes
Error codes reference
forbidden (403)
forbidden (403)
Your API key is valid but doesn’t have permission for this action.Common causes:
- Calling a write endpoint with a read-only key
- Missing the required scope for this resource
not_found (404)
not_found (404)
The requested resource doesn’t exist.Common causes:
- Invalid UUID in the URL
- Resource was deleted
- Resource belongs to a different organization
validation_error (400)
validation_error (400)
The request body or query parameters are invalid.Example response:Fix: Check the
details array for specific field-level errors and correct your request.rate_limit_exceeded (429)
rate_limit_exceeded (429)
You’ve exceeded your rate limit for this time window.Fix: Wait until the
Retry-After header value (in seconds) has elapsed, then retry. See Rate Limiting.internal_error (500)
internal_error (500)
An unexpected error occurred on our servers.Fix: Retry the request after a brief delay. If the error persists, contact support at contact@propal.io with the request details.
Handling errors in code
Retry strategy
For transient errors (429, 500), we recommend exponential backoff:
- Wait 1 second, retry
- Wait 2 seconds, retry
- Wait 4 seconds, retry
- Wait 8 seconds, retry
- Give up after 4 retries
429 responses, always respect the Retry-After header instead of using your own delay.