Error Handling¶
DeepTagger API uses standard HTTP status codes and returns JSON error objects.
HTTP Status Codes¶
Code | Meaning | Description |
---|---|---|
200 | OK | Request successful |
400 | Bad Request | Invalid parameters |
401 | Unauthorized | Missing or invalid API key |
403 | Forbidden | Insufficient permissions |
404 | Not Found | Project not found |
429 | Too Many Requests | Rate limit exceeded |
500 | Internal Server Error | Server error |
Error Response Format¶
Common Errors¶
INVALID_API_KEY¶
{
"status": "error",
"error": {
"code": "INVALID_API_KEY",
"message": "Invalid or missing API key"
}
}
Solution: Check your x-api-key
header.
PROJECT_NOT_FOUND¶
{
"status": "error",
"error": {
"code": "PROJECT_NOT_FOUND",
"message": "Project with ID fo_123 not found"
}
}
Solution: Verify the fo_id
parameter.
MISSING_FILE¶
{
"status": "error",
"error": {
"code": "MISSING_FILE",
"message": "Either 'file' or 'text' parameter is required"
}
}
Solution: Include either file
or text
in your request.
RATE_LIMIT_EXCEEDED¶
{
"status": "error",
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Try again in 60 seconds."
}
}
Solution: Implement retry with exponential backoff.
Best Practices¶
- Check HTTP status first
- Parse error response for details
- Implement retry logic for 429 and 5xx errors
- Log errors for debugging
- Show user-friendly messages to end users
Example Error Handling¶
Python¶
try:
response = requests.post(url, headers=headers, data=data, files=files)
response.raise_for_status()
data = response.json()
except requests.exceptions.HTTPError as e:
if e.response.status_code == 429:
# Rate limit - retry after delay
time.sleep(60)
elif e.response.status_code >= 500:
# Server error - retry
pass
else:
# Client error - fix request
print(e.response.json())
JavaScript¶
try {
const response = await axios.post(url, formData, config);
return response.data;
} catch (error) {
if (error.response) {
// Server responded with error
console.error('API Error:', error.response.data.error);
if (error.response.status === 429) {
// Rate limit - retry
await new Promise(resolve => setTimeout(resolve, 60000));
}
} else if (error.request) {
// Network error
console.error('Network error');
}
}