Error Codes Reference
Complete reference for all error codes returned by the Courimax API.
Error Response Format
All errors follow a standard format:
{
"statusCode": 400,
"message": "Error description",
"error": "Bad Request"
}
Some errors include additional details:
{
"statusCode": 400,
"message": [
"externalRef is required",
"pickupAddress is required"
],
"error": "Bad Request"
}
HTTP Status Codes
400 Bad Request
The request was invalid or cannot be processed.
Common Causes:
- Missing required fields
- Invalid field format
- Validation errors
Example:
{
"statusCode": 400,
"message": [
"externalRef (partner order ID) is required",
"dropoffLat/dropoffLng required unless geocodeOnIngest is true"
],
"error": "Bad Request"
}
Resolution:
- Check all required fields are present
- Verify field formats (dates, coordinates, etc.)
- Review validation error messages
401 Unauthorized
Authentication credentials are missing or invalid.
Common Causes:
- Missing
X-API-Keyheader - Invalid API key
- Expired API key
Example:
{
"statusCode": 401,
"message": "Missing X-API-Key header",
"error": "Unauthorized"
}
Resolution:
- Include
X-API-Keyheader with valid API key - Verify API key is active
- Check API key matches the integration platform
403 Forbidden
The API key is valid but doesn't have permission for this operation.
Common Causes:
- API key doesn't match integration platform
- Insufficient permissions
Example:
{
"statusCode": 403,
"message": "API key does not match Yango integration",
"error": "Forbidden"
}
Resolution:
- Use the correct API key for the integration platform
- Contact support if permissions need to be updated
404 Not Found
The requested resource doesn't exist.
Common Causes:
- Order not found
- Invalid external reference
- Resource belongs to different organization
Example:
{
"statusCode": 404,
"message": "Order not found",
"error": "Not Found"
}
Resolution:
- Verify the external reference exists
- Check you're using the correct API key
- Ensure resource belongs to your organization
409 Conflict
The request conflicts with the current state of the resource.
Common Causes:
- Duplicate external reference
- Invalid state transition
- Resource already exists
Example:
{
"statusCode": 409,
"message": "Order with externalRef YANGO-ORDER-123 already exists",
"error": "Conflict"
}
Resolution:
- Use idempotency keys for retries
- Check for duplicate requests
- Verify resource state before operation
422 Unprocessable Entity
The request is well-formed but contains semantic errors.
Common Causes:
- Zod validation failures
- Business logic violations
- Invalid combinations of fields
Example:
{
"statusCode": 422,
"message": "Cannot pick_up from status pending",
"error": "Unprocessable Entity"
}
Resolution:
- Review validation error messages
- Check business logic requirements
- Verify field combinations are valid
429 Too Many Requests
Rate limit exceeded.
Common Causes:
- Too many requests in time window
- Exceeded API quota
Example:
{
"statusCode": 429,
"message": "Too many requests, please try again later",
"error": "Too Many Requests"
}
Resolution:
- Implement exponential backoff
- Reduce request frequency
- Contact support to increase limits
500 Internal Server Error
An unexpected error occurred on the server.
Common Causes:
- Server-side bug
- Database error
- External service failure
Example:
{
"statusCode": 500,
"message": "Internal server error",
"error": "Internal Server Error"
}
Resolution:
- Retry the request
- Contact support if error persists
- Check status page for service issues
502 Bad Gateway
The server received an invalid response from an upstream service.
Common Causes:
- External service failure
- Network issues
Example:
{
"statusCode": 502,
"message": "Bad gateway",
"error": "Bad Gateway"
}
Resolution:
- Retry the request
- Check status page for service issues
503 Service Unavailable
The server is temporarily unavailable.
Common Causes:
- Server maintenance
- Server overload
Example:
{
"statusCode": 503,
"message": "Service unavailable",
"error": "Service Unavailable"
}
Resolution:
- Retry the request after a delay
- Check status page for maintenance windows
Validation Errors
Field Validation
When fields fail validation, the message field contains an array of errors:
{
"statusCode": 400,
"message": [
"externalRef must be a string",
"pickupLat must be a number",
"dropoffLat must be a number"
],
"error": "Bad Request"
}
Schema Validation
For complex validation errors:
{
"statusCode": 422,
"message": "Validation failed",
"errors": [
{
"field": "dropoffLat",
"message": "dropoffLat/dropoffLng required unless geocodeOnIngest is true"
}
],
"error": "Unprocessable Entity"
}
State Machine Errors
Invalid State Transitions
When attempting an invalid state transition:
{
"statusCode": 409,
"message": "Cannot pick_up from status pending",
"currentStatus": "pending",
"allowedTransitions": ["dispatch", "assign", "cancel"],
"error": "Conflict"
}
Resolution:
- Check current order status
- Only perform allowed transitions
- Review order state machine
Rate Limiting
Rate Limit Headers
Rate limit information is included in response headers:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1629388800
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per window |
X-RateLimit-Remaining | Remaining requests in window |
X-RateLimit-Reset | Unix timestamp when window resets |
Rate Limit Windows
| Endpoint Category | Limit | Window |
|---|---|---|
| Order creation | 100 | 1 minute |
| Order queries | 500 | 1 minute |
| Delivery windows | 200 | 1 minute |
| Provisioning | 60 | 1 hour |
Error Handling Best Practices
Retry Logic
Implement retry logic for transient errors:
async function requestWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch(url, options);
if (response.status === 429) {
// Rate limited, wait and retry
const retryAfter = response.headers.get('Retry-After') || Math.pow(2, i);
await sleep(retryAfter * 1000);
continue;
}
if (response.status >= 500) {
// Server error, retry
await sleep(Math.pow(2, i) * 1000);
continue;
}
return response;
} catch (error) {
if (i === maxRetries - 1) throw error;
await sleep(Math.pow(2, i) * 1000);
}
}
}
Error Logging
Log all errors for debugging:
try {
const response = await fetch(url, options);
if (!response.ok) {
const error = await response.json();
logger.error('API request failed', {
status: response.status,
error: error.message,
url: url,
method: options.method
});
throw new Error(error.message);
}
return await response.json();
} catch (error) {
logger.error('Request error', error);
throw error;
}
User-Friendly Messages
Convert API errors to user-friendly messages:
function getUserFriendlyError(apiError) {
const errorMap = {
400: 'Invalid request. Please check your input.',
401: 'Authentication failed. Please check your API key.',
403: 'Permission denied. Please contact support.',
404: 'Resource not found. Please verify the reference.',
409: 'Conflict detected. Please try again.',
429: 'Too many requests. Please wait a moment.',
500: 'Server error. Please try again later.'
};
return errorMap[apiError.statusCode] || 'An error occurred. Please try again.';
}
Troubleshooting
Common Issues
Issue: 401 Unauthorized
- Verify API key is correct
- Check API key is active
- Ensure API key matches platform
Issue: 404 Not Found
- Verify external reference exists
- Check you're using correct API key
- Ensure resource belongs to your organization
Issue: 409 Conflict
- Check for duplicate requests
- Use idempotency keys
- Verify resource state
Issue: 429 Too Many Requests
- Implement exponential backoff
- Reduce request frequency
- Contact support to increase limits
Support
If you encounter persistent errors:
- Check Status Page
- Review Best Practices
- Contact support@courimax.com
Next Steps
- Rate Limits - Detailed rate limit information
- Best Practices - Error handling best practices