Errors

All errors share one JSON shape:

{ "message": "human readable message", "code": "machine_code", "detail": "optional detail" }

Common codes

HTTPCodeMeaningFix
400(varies)Business failureHandle by the code field (extraction codes below) — these calls are not charged
401invalid_api_keyMissing, malformed or deleted keyCheck the Authorization: Bearer sk_snapany_xxx header and the key status in Console → API Keys
402insufficient_creditsBalance too lowTop up in the Console, or enable auto top-up
404Resource not found (e.g. an invalid job id)Check the resource id returned by the API
422Invalid request parametersThe detail field says which parameter failed and why
429rate_limitedOver 1200 requests/minBack off and retry after a delay
500Server errorRetry later; contact us if it persists

Extraction error codes

Extraction failures return HTTP 400 with a code from the extraction engine. These are business failures — no credits are charged.

CodeCommon causeWhat to do
invalid_urlMalformed linkFix the URL format
unsupported_urlA valid URL, but not a post/video linkUse the share link of a single post or video
unsupported_siteThe site is not supported, or not supported by this endpointCheck which sites the endpoint accepts, or contact us to request the site
no_subtitlesThe video has no subtitle tracks (HTTP 404)Fall back to Transcription
invalid_playlist_urlNot a channel/profile/playlist linkUse a public channel, profile or playlist URL
playlist_not_supportedA playlist URL was sent to the single-post endpointUse /extract/playlist, or pass one post URL
content_deletedThe post was deleted or never existedNothing to extract
user_not_foundAccount deleted, renamed or restrictedVerify the handle
no_storyThe account has no active storiesStories expire after 24h
private_contentPrivate or follower-only contentNot extractable
members_only_contentPaid or members-only contentNot extractable
age_restrictedThe media is age-restrictedNot extractable (see note below)
region_restrictedThe media is region-restrictedNot extractable (see note below)
not_premieredScheduled content that has not gone liveRetry after the publish time
live_stream_not_supportedLive streams on this site aren't supported yetRetry once archived as a normal video (see note below)
extract_failedSite changes, or the content is currently unreachableRetry later (see note below)
retryableTransient failure during extractionRetry after a short delay (see note below)
timeoutThe extraction took too longRetry after a short delay (see note below)
unknownUnclassified failureRetry once (see note below)

extract_failed, retryable, timeout and unknown are transient — retrying the same URL later can succeed. Every other code is a settled conclusion about the content itself, so retrying will not change the outcome. Codes get added over time, so treat any code you don't recognise as permanent and log it rather than retrying in a loop. If one site keeps returning extract_failed, or unknown shows up repeatedly, contact us with the request time.

age_restricted, region_restricted and live_stream_not_supported only come up on a small number of sites. Age- and region-restricted media usually extracts fine, and live streams are supported on many sites — Twitch and TikTok among them. Getting one of these three means we can't reach that kind of media on that particular site; it does not mean we don't support age-restricted media, region-restricted media or live streams.

403 Forbidden when downloading YouTube media

This 403 does not come from the SnapAny API: extraction succeeded, but downloading the returned YouTube video_url / audio_url / resource_url from your own server fails. YouTube often refuses downloads from data-center IPs (cloud servers, VPS), and some links only download from US IPs — sending the media headers doesn't change that.

Use YouTube Proxy Download instead: it returns the same response plus proxy URLs for variants up to 1080p, which download through our network rather than from YouTube directly. If a proxy URL returns 404 (payload_expired), call the endpoint again; a 403 (upstream_error) is rare and a single retry usually succeeds, but call the endpoint again if it persists.

Transcription request errors

These come back from the submit call (HTTP 400), before a job is created — nothing is charged.

CodeCommon cause
file_too_largeUpload over 512 MB, or the file at file_url exceeds the limit
audio_too_longAudio longer than 6 hours
unsupported_audio_formatAudio format not in the supported list, or the duration can't be read
download_failedWe could not fetch file_url
unsupported_languagelanguage is not a value our provider accepts — omit the field to auto-detect, or pass a language name / ISO code (english, en, chinese, zh)

Transcription failures

A failed job shows "status": "failed" with an error field when polling, and the reserved credits are refunded automatically.