TwinToneAPI Docs

API reference

Errors & rate limits

Error format

Every error response has the same shape:

{ "error": { "code": "rate_limited", "message": "Too many requests. Limit: 100/min." } }
HTTPCodeMeaningFix
400missing_fieldsRequired body/query params absent.Check the endpoint reference.
400invalid_fieldsField validation failed (e.g. bad platform, script too long, duration out of range).Check the endpoint reference for constraints.
400invalid_creatorThe creator_id doesn't match any creator.Use GET /api/v1/creators to list available creators.
400invalid_urlWebhook url failed validation (must be an https:// endpoint).Check the URL and re-register.
400invalid_eventsWebhook events must be a non-empty subset of stream.started, stream.ended, stream.error.Fix the event list.
401unauthorizedKey missing, malformed, or revoked.Verify the Bearer tt_… header; create a new key if revoked.
402plan_requiredManaging streams and webhooks with a live key requires the Growth plan or above (test keys are exempt).Upgrade your plan or use a test key.
403insufficient_scopeKey lacks the scope for this endpoint.Create a key with the needed scope.
403vertical_mismatchvertical in the request ≠ your brand's vertical, or platform is not permitted for your brand's vertical.Drop the vertical field (defaults to your brand), or pick a platform your vertical may stream to — iGaming is limited to kick, youtube and twitch.
404not_foundResource doesn't exist or belongs to another brand. Ending a stream that isn't live also returns this.Check the id, or wait for the stream to be live before ending it.
429rate_limitedOver the per-minute request limit.Back off before retrying.
429concurrency_limitBrand already has 3 active (preparing+live) streams.End one before starting another.
500db_errorSomething failed on our side.Retry with backoff; contact support if persistent.
502launch_failedStream dispatch to the agent worker failed.Retry — this is usually transient. If persistent, contact support.

Rate limits

LimitApplies to
100 requests/minAll v1 endpoints except public GET /creators

The limit is per brand, per minute, fixed window. When you hit it you'll get a 429 rate_limited. GET /api/v1/creators is public and not rate-limited. 429 concurrency_limit is separate — retrying won't clear it, end a stream first.

Limits are applied in-memory and reset on deploy. If you're polling stream status, switch to webhooks — it's what they're for.

Idempotency & retries

  • GET/DELETE are safe to retry freely.
  • For POST /streams: if your request times out, check GET /streams before retrying — the stream may have been created.
  • Webhook deliveries are at-least-once; dedupe on the event id.

Abuse prevention

Keys used for probing, scraping, or exceeding rate limits without prior arrangement may be revoked. If you need higher limits, email us — we're happy to accommodate legitimate traffic.

Was this page helpful?