Skip to content

Error Codes & Rate Limits

All API errors return a JSON object with an error field:

{
"error": "Human-readable error message"
}

Some endpoints include additional context fields.

StatusMeaningWhen
200SuccessGET requests, updates
201CreatedPOST creating new resources
202AcceptedEvent ingestion (async processing)
204No ContentDELETE operations
400Bad RequestMissing/invalid fields, validation errors
401UnauthorizedMissing or invalid API key / JWT
403ForbiddenInsufficient permissions, account locked
404Not FoundResource doesn’t exist
409ConflictVersion conflict (cloud saves)
413Payload Too LargeBatch too large, save data too big
429Too Many RequestsRate limit or quota exceeded
500Internal Server ErrorUnexpected server error

All API endpoints are rate-limited to 1,000 requests per minute per API key (or per IP for unauthenticated routes).

When rate-limited, the response is:

{
"statusCode": 429,
"error": "Too Many Requests",
"message": "Rate limit exceeded, retry in 60 seconds"
}

Headers included:

HeaderDescription
X-RateLimit-LimitMax requests per window
X-RateLimit-RemainingRequests left in current window
X-RateLimit-ResetSeconds until window resets
Retry-AfterSeconds to wait (on 429)

Each game has a monthly event quota based on the billing tier:

TierMonthly Events
Free100,000
Indie1,000,000
Studio10,000,000

When the quota is exceeded, POST /v1/track returns:

{
"error": "Monthly event quota exceeded",
"quota": {
"current": 100001,
"limit": 100000,
"remaining": 0
}
}
Terminal window
curl https://api.questdata.io/v1/config
# 401: { "error": "Missing x-game-api-key header" }
Terminal window
curl https://api.questdata.io/v1/config -H "x-game-api-key: wrong-key"
# 401: { "error": "Invalid API key" }
Terminal window
curl https://api.questdata.io/v1/games -H "Authorization: Bearer expired-token"
# 401: { "error": "Token expired" }
Terminal window
curl -X POST https://api.questdata.io/v1/track \
-H "x-game-api-key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{}'
# 400: { "error": "event_name is required" }