Docs / Error codes

Error codes

Errors are JSON: {"error": "human message", "code": "machine_code"}. Status semantics: 401 the key is unusable · 403 the key is valid but not allowed here · 402 plan limit · 429 slow down.

API (/v1/*)

statuscodemeaning / what to do
400invalid_targetSpecify exactly one notification target: webhook_url or telegram: true.
400telegram_not_boundtelegram: true requires Telegram connected in the console first.
400Invalid body: bad TRON address, malformed JSON, or a webhook URL that fails validation (non-http(s), credentials in URL, private/reserved IP range, unresolvable host).
401missing_api_keyNo Authorization: Bearer tw_… header.
401invalid_api_keyMalformed or unknown key. Check for truncation/whitespace.
401revoked_api_keyKey was revoked (timestamp included). Create a new one in the console.
402quota_exceededActive-watch quota reached. Response includes usage: {active_watches, limit, plan}. Delete a watch or upgrade.
403wrong_networkKey bound to the other network (tw_test_ ↔ tw_live_). The message names the key you should use.
404Resource not found or not yours (we don't distinguish).
409A watch with the same address + filter + channel already exists.
429rate_limitedPlan rpm exceeded. Honor Retry-After; check X-RateLimit-Remaining to self-pace.
500{"error":"internal server error"} — our fault, no internals leaked. Retry with backoff; check /healthz.

Console (/console/*, session auth)

statuscodemeaning
401no_sessionNot signed in (or session expired — 7-day sliding window).
403csrf_mismatchX-CSRF-Token header missing or not matching the csrf cookie.
409telegram_watches_activeUnbind blocked: delete your active Telegram watches first.
429login_rate_limited5 failed logins / 15 min (per IP + email). Wait it out.
503telegram_unavailableTelegram bot not configured on this deployment.

Webhook delivery outcomes

Not errors you receive, but states you'll see in the console and GET /v1/events:

delivery.statusmeaning
PENDINGQueued or between retries (schedule: 1m/5m/30m/2h/6h after the immediate attempt).
DELIVEREDYour endpoint (or Telegram) acknowledged.
DEADAll 6 attempts failed — inspect per-attempt response codes in the console, fix your receiver, reconcile via the events API.