Errors & Rate Limits
SendPipe uses standard HTTP status codes and a consistent error response format across all endpoints.
Error Format
json
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid email address in 'to' field",
"field": "to",
"docs": "https://docs.sendpipe.io/errors#VALIDATION_ERROR"
}
}HTTP Status Codes
| Status | Meaning |
|---|---|
| 200 | OK — request succeeded |
| 201 | Created — resource created successfully |
| 204 | No Content — deletion successful |
| 400 | Bad Request — invalid parameters or body |
| 401 | Unauthorized — missing or invalid authentication |
| 403 | Forbidden — insufficient permissions or IP blocked |
| 404 | Not Found — resource does not exist |
| 409 | Conflict — resource already exists (e.g., duplicate domain) |
| 429 | Rate Limited — too many requests |
| 500 | Server Error — something went wrong on our end |
Common Error Codes
| Code | Description |
|---|---|
UNAUTHORIZED | Missing or invalid API key / session token |
FORBIDDEN | IP address blocked or insufficient role permissions |
NOT_FOUND | Resource not found in the current project scope |
VALIDATION_ERROR | Request body failed schema validation |
RATE_LIMIT_EXCEEDED | Too many requests — retry after the reset time |
SLUG_ALREADY_EXISTS | Organization or project slug already taken |
DOMAIN_ALREADY_EXISTS | Domain already registered in this project |
DOMAIN_HAS_ACTIVE_MESSAGES | Cannot remove domain with queued/sending messages |
EMAIL_ALREADY_EXISTS | Account with this email already exists |
BILLING_NOT_CONFIGURED | Stripe billing is not configured on the server |
Rate Limit Headers
Every response includes rate limit information:
X-RateLimit-Limit | Maximum requests allowed in the current window |
X-RateLimit-Remaining | Requests remaining in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
When rate limited, wait until X-RateLimit-Reset before retrying. The response body will have error code RATE_LIMIT_EXCEEDED.