Errors & Rate Limits
Error format
All errors return a consistent JSON envelope:
json
{
"error": {
"code": "VALIDATION_ERROR",
"message": "customerEmail is required."
}
}HTTP status codes
| Status | Meaning | What to do |
|---|---|---|
400 | Validation failed | Fix the request body, the message names the field |
401 | Missing/expired token | Get a new token and retry once |
403 | Not permitted for your client | Check GET /v4/endpoints for your allowed operations |
404 | Resource not found | Check the id |
429 | Rate limited | Back off and retry with exponential delay |
5xx | Server error | Retry with backoff; contact support if persistent |
Rate limits
Requests are rate-limited per integration client. Limits depend on your tier. Contact support@roofangle.com for yours. On 429, honor a backoff (start at 1s, double each retry, cap at 60s).
Idempotency tips
- Order creation is not idempotent, so guard against double-submits on your side.
- Webhook retries carry the same
X-Webhook-Delivery-Id, so dedupe on it.
