Error Response Format
All API errors return a consistent JSON structure with an HTTP status code and a descriptive message:message field is human-readable text, not a stable error code. Use the HTTP status and the operation’s contract for program logic.
HTTP Status Codes
The AhaSend API uses standard HTTP status codes to indicate the success or failure of requests:2xx Success
- 200 OK - Request succeeded
- 201 Created - Resource created successfully
- 202 Accepted - Message accepted for processing; inspect each recipient’s status
4xx Client Errors
400 Bad Request
Returned when the request is malformed or contains invalid parameters. Example scenarios:- Invalid UUID format for
account_idor resource IDs - Malformed email addresses
- Invalid time formats (expecting RFC3339)
- Parameters outside allowed ranges (e.g.,
limitnot between 1-100) - Invalid domain names or URLs
- Malformed request body
401 Unauthorized
Authentication failed or is missing. Common causes:- Missing
Authorizationheader - Invalid API key format (must be
Bearer <api_key>) - API key doesn’t exist or has been revoked
- Account associated with API key is suspended
- API key doesn’t belong to the specified account
403 Forbidden
Authentication succeeded, but you don’t have permission to access the resource. Common causes:- API key lacks required scopes (e.g., trying to delete domains without
domains:delete:allordomains:delete:{domain}scope) - Attempting to access resources outside your API key’s domain restrictions
- Insufficient permissions for specific operations
404 Not Found
The requested resource doesn’t exist or you don’t have access to it. Common scenarios:- Resource ID doesn’t exist
- Resource was deleted
- Resource belongs to a different account
409 Conflict
The request conflicts with the current state of the resource. Common causes:- Idempotency conflicts: Another request with the same idempotency key is already in progress
- Resource conflicts: Trying to create a resource that already exists (e.g., duplicate domain)
- IP allow list conflicts: Updating your own key would exclude the caller’s current IP
422 Unprocessable Entity
The same idempotency key was used with a different method, resolved path, or request body. Use a new key for a new request, or retry the original request unchanged. See idempotency.429 Too Many Requests
You’ve exceeded the API rate limits.5xx Server Errors
500 Internal Server Error
An unexpected server error occurred on our side (these are rare).These errors indicate a problem on our end. If you consistently receive 500 errors, please contact support.
Validation Errors
When request validation fails, you’ll receive a400 Bad Request with a descriptive message:
Request Body Validation
Field-Specific Validation
The API provides specific validation messages for individual fields:Security-Related Validation
Scope and Permission Errors
When your API key doesn’t have sufficient permissions:Missing Scopes
Invalid API Key Context
Best Practices
Error Handling
- Always check the HTTP status code first
- Show the
messagefield to people; do not branch on its text, which can change - Implement appropriate retry logic for 5xx errors
- Respect rate limits when receiving 429 responses
Common Fixes
- 400 errors: Validate your request parameters and JSON structure
- 401 errors: Check your API key and authentication headers
- 403 errors: Verify your API key has the required scopes
- 404 errors: Confirm the resource exists and belongs to your account
- 429 errors: Implement exponential backoff in your retry logic
Error messages are designed to be descriptive and actionable. They provide specific guidance on what needs to be corrected in your request.

