Error codes
The API uses standard HTTP status codes and returns structured JSON error responses with a machine-readable code field and a human-readable message.
Error response format
json
{
"error": {
"code": "monitor_limit_exceeded",
"message": "Your plan allows up to 20 monitors. Upgrade to create more.",
"status": 422
}
}Common error codes
| HTTP Status | Code | Description |
|---|---|---|
| 401 | missing_api_key | No Authorization header |
| 401 | invalid_api_key | Key not found or revoked |
| 401 | expired_api_key | Key has expired |
| 403 | ip_not_allowed | Request IP not in key's whitelist |
| 403 | feature_not_available | Feature requires a higher plan |
| 404 | not_found | Resource doesn't exist |
| 409 | snapshot_in_progress | A capture is already running |
| 422 | validation_error | Invalid request body (see errors field) |
| 422 | monitor_limit_exceeded | Plan monitor limit reached |
| 422 | frequency_not_allowed | Frequency too low for plan |
| 429 | rate_limit_exceeded | Too many requests |
| 500 | server_error | Internal server error |
Validation errors
When the request body fails validation (422), the response includes a detailed errors object mapping each invalid field to its error messages:
json
{
"error": {
"code": "validation_error",
"message": "The given data was invalid.",
"status": 422,
"errors": {
"url": ["The url field is required."],
"frequency_minutes": ["The frequency minutes must be at least 60."]
}
}
}