Errors
Error Codes
HTTP Status Codes
| Code | Meaning |
|---|---|
| 200 | OK |
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Authentication failed |
| 403 | Forbidden - No permission |
| 404 | Not Found - Resource does not exist |
| 429 | Too Many Requests - Rate limit |
| 500 | Internal Server Error |
Error Codes
401 - Unauthorized
{
"error": {
"message": "Unauthorized",
"code": "UNAUTHORIZED"
}
}Cause: Invalid or missing API Key
403 - Forbidden
{
"error": {
"message": "Access denied",
"code": "FORBIDDEN"
}
}Cause: User lacks permission for action
404 - Not Found
{
"error": {
"message": "Analysis not found",
"code": "NOT_FOUND"
}
}Cause: ID does not exist
400 - Bad Request
{
"error": {
"message": "Invalid input",
"code": "BAD_REQUEST",
"issues": [{
"path": ["salespersonId"],
"message": "Required"
}]
}
}Cause: Invalid or missing parameters
429 - Rate Limit
{
"error": {
"message": "Rate limit exceeded",
"code": "TOO_MANY_REQUESTS"
}
}Limit: 60 requests/minute
Retry with Backoff
async function fetchWithRetry(url, options, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const res = await fetch(url, options);
if (res.ok) return res;
if (res.status === 429) {
const delay = Math.pow(2, i) * 1000;
await new Promise(r => setTimeout(r, delay));
continue;
}
throw new Error(`HTTP ${res.status}`);
} catch (error) {
if (i === maxRetries - 1) throw error;
}
}
}Limits
| Resource | Limit |
|---|---|
| Requests/minute | 60 |
| File size | 40MB |
| Audio duration | 2 hours |
| Active API Keys | 10 |
Base URL: https://api.evolu-ai.com/trpc