Good to know
Errors
Every failure is JSON of the same shape: { "error": { "code": "…", "message": "…" } }. The code is stable and worth branching on; the message is for a person reading a log, and says what to do.
A thing belonging to another account answers 404, not 403: whether an id exists is not something to confirm to whoever asks.
Every code
Codes
no_key · bad_key401No key sent, or one that isn't valid (it may have been revoked).
plan_required402The plan doesn't include this — watching streamers needs a paid one.
rate_limited429Over the rate limit. Wait Retry-After seconds.
bad_json400The body isn't JSON.
no_channel · bad_channel400No channel given, or one that isn't a channel.
bad_setting400A setting or streamer rule that can't be taken; the message says which.
bad_webhook400A webhook URL that isn't public https, or events that don't exist.
bad_id · bad_cursor · bad_limit400A clip id, cursor or limit that isn't one of ours.
bad_destination400Not somewhere clips can be posted.
no_clip · no_file · not_found404No such clip, file or webhook — or not yours.
not_following403A live feed for a streamer you don't follow. Follow them first.
no_feed404A live feed that isn't analysis, transcript or chat.
too_many_feeds42960 live feeds open on this account already. Close one first.
cutting409Posting a clip that is not cut yet. The cut has started; post it again in about a minute.
publish_failed409The destination refused, or nothing is connected there. The message is theirs.
not_configured503Posting to that destination isn't set up on this server.
internal500Our fault. Nothing about it is in the message, on purpose.