Errors
Errors come back as JSON in the same envelope as success responses, just with status: "error":
{
"status": "error",
"code": 401,
"message": "Invalid API key for this guild"
}Some endpoints add extra fields like details or retry_after. The status, code, and message fields are always there.
Status codes
| Code | Meaning | Common causes |
|---|---|---|
400 | Bad Request | Missing field, invalid JSON, wrong content-type, missing required header |
401 | Unauthorized | Missing key, invalid key, revoked key |
403 | Forbidden | Key valid but does not match the :guildId in the path |
404 | Not Found | The resource does not exist, or the guild has not been set up |
409 | Conflict | Duplicate (for example a binding that already exists) |
422 | Unprocessable Entity | Body is well-formed but breaks a rule |
426 | Upgrade Required | WebSocket route hit without an Upgrade: websocket header |
429 | Too Many Requests | Rate limit. See Rate Limits |
500 | Internal Server Error | Bug on our side. Retry once with backoff. |
502 503 | Upstream issue | Discord or Roblox is unhappy. Retry with backoff. |
Common error messages
"Missing API key"
You did not send any of X-API-Key, Authorization: ApiKey ..., or Authorization: Bearer technified_....
"Invalid API key for this guild"
The key was sent but does not match any active key on the target guild. Either the key is wrong, revoked, or you're targeting the wrong guild.
"API key does not match target guild"
The key embeds a guild ID. The :guildId in the path is a different guild. Use the key issued by the guild you're calling.
"Guild ID required for API key (use route :guildId or X-Guild-ID)"
The endpoint has no :guildId in the path (for example /lookup/discord/...). Send the guild ID in the X-Guild-ID header.
"Expected WebSocket upgrade"
You hit a WebSocket URL with a plain HTTP client. Send Upgrade: websocket and Connection: Upgrade. Most WebSocket libraries do this for you.
Retry strategy
429: respectRetry-After, then retry. Slow your call rate.5xx: retry with exponential backoff. Start at 1 second, cap at 30.4xxother than429: fix the request. Retrying the same call will not help.