13 KiB
cobalt api documentation
methods, acceptable values, headers, responses and everything else related to making and parsing requests from a cobalt api instance.
Important
hosted api instances (such as
api.cobalt.tools
) use bot protection and are not intended to be used in other projects without explicit permission. if you want to use the cobalt api, you should host your own instance or ask an instance owner for access.
all endpoints (except for GET /
) are rate limited and return current rate limiting status in RateLimit-*
headers, according to the "RateLimit Header Fields for HTTP" spec.
authentication
an api instance may be configured to require you to authenticate yourself.
if this is the case, you will typically receive an error response
with a api.auth.<method>.missing
code, which tells you that a particular method
of authentication is required.
authentication is done by passing the Authorization
header, containing
the authentication scheme and the token:
Authorization: <scheme> <token>
currently, cobalt supports two ways of authentication. an instance can choose to configure both, or neither:
api-key authentication
the api key authentication is the most straightforward. the instance owner will assign you an api key which you can then use to authenticate like so:
Authorization: Api-Key aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
if you are an instance owner and wish to configure api key authentication, see the instance documentation!
bearer authentication
the cobalt server may be configured to issue JWT bearers, which are short-lived tokens intended for use by regular users (e.g. after passing a challenge). currently, cobalt can issue tokens for successfully solved turnstile challenge, if the instance has turnstile configured. the resulting token is passed like so:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
POST /
cobalt's main processing endpoint.
Important
you must include correct
Accept
andContent-Type
headers with everyPOST /
request.
Accept: application/json
Content-Type: application/json
request body
body type: application/json
not a fan of reading tables of text? you can read the api schema directly from code instead!
api schema
all keys except for url
are optional. value options are separated by /
.
general
key | type | description/value | default |
---|---|---|---|
url |
string |
source URL | required |
audioBitrate |
string |
320 / 256 / 128 / 96 / 64 / 8 (kbps) |
128 |
audioFormat |
string |
best / mp3 / ogg / wav / opus |
mp3 |
downloadMode |
string |
auto / audio / mute |
auto |
filenameStyle |
string |
classic / pretty / basic / nerdy |
basic |
videoQuality |
string |
max / 4320 / 2160 / 1440 / 1080 / 720 / 480 / 360 / 240 / 144 |
1080 |
disableMetadata |
boolean |
title, artist, and other info will not be added to the file | false |
alwaysProxy |
boolean |
always tunnel all files, even when not necessary | false |
localProcessing |
boolean |
remux/transcode files locally instead of the server | false |
service-specific options
key | type | description/value | default |
---|---|---|---|
youtubeVideoCodec |
string |
h264 / av1 / vp9 |
h264 |
youtubeDubLang |
string |
any valid language code, such as: en or zh-CN |
none |
convertGif |
boolean |
convert twitter gifs to the actual GIF format | true |
allowH265 |
boolean |
allow H265/HEVC videos from tiktok/xiaohongshu | false |
tiktokFullAudio |
boolean |
download the original sound used in a video | false |
youtubeBetterAudio |
boolean |
prefer higher quality youtube audio if possible | false |
youtubeHLS |
boolean |
use HLS formats when downloading from youtube | false |
response
body type: application/json
the response will always be a JSON object containing the status
key, which is one of:
tunnel
: cobalt is proxying and/or remuxing/transcoding the file for you.local-processing
: cobalt is proxying the files for you, but you have to remux/transcode them locally.redirect
: cobalt will redirect you to the direct service URL.picker
: there are multiple items to choose from, a picker should be shown.error
: something went wrong, here's an error code.
tunnel/redirect response
key | type | value |
---|---|---|
status |
string |
tunnel / redirect |
url |
string |
url for the cobalt tunnel, or redirect to an external link |
filename |
string |
cobalt-generated filename for the file being downloaded |
local processing response
key | type | value |
---|---|---|
status |
string |
local-processing |
type |
string |
merge , mute , audio , or gif |
service |
string |
origin service (youtube , twitter , instagram , etc) |
tunnel |
string[] |
array of tunnel URLs |
output |
object |
details about the output file (see below) |
audio |
object |
audio-specific details (optional, see below) |
isHLS |
boolean |
whether the output is in HLS format (optional) |
output object
key | type | value |
---|---|---|
type |
string |
mime type of the output file |
filename |
string |
filename of the output file |
metadata |
object |
metadata associated with the file (optional, see below) |
output.metadata object
all keys in this table are optional.
key | type | description |
---|---|---|
album |
string |
album name or collection title |
copyright |
string |
copyright information or ownership details |
title |
string |
title of the track or media file |
artist |
string |
artist or creator name |
track |
string |
track number or position in album |
date |
string |
release date or creation date |
audio object
key | type | value |
---|---|---|
copy |
boolean |
defines whether audio codec data is copied |
format |
string |
output audio format |
bitrate |
string |
preferred bitrate of audio format |
picker response
key | type | value |
---|---|---|
status |
string |
picker |
audio |
string |
returned when an image slideshow (such as on tiktok) has a general background audio (optional) |
audioFilename |
string |
cobalt-generated filename, returned if audio exists (optional) |
picker |
array |
array of objects containing the individual media |
picker object
key | type | value |
---|---|---|
type |
string |
photo / video / gif |
url |
string |
|
thumb |
string |
thumbnail url (optional) |
error response
key | type | value |
---|---|---|
status |
string |
error |
error |
object |
error code & optional context |
error object
key | type | value |
---|---|---|
code |
string |
machine-readable error code explaining the failure reason |
context |
object |
additional error context (optional) |
error.context object
key | type | value |
---|---|---|
service |
string |
origin service (optional) |
limit |
number |
the maximum downloadable video duration or the rate limit window (optional) |
POST /session
used for generating JWT tokens, if enabled. currently, cobalt only supports generating tokens when a turnstile challenge solution is submitted by the client.
the turnstile challenge response is submitted via the cf-turnstile-response
header.
response body
key | type | description |
---|---|---|
token |
string |
a Bearer token used for later request authentication |
exp |
number |
number in seconds indicating the token lifetime |
on failure, an error response is returned.
GET /
provides basic instance info.
response
body type: application/json
key | type | description |
---|---|---|
cobalt |
object |
information about the cobalt instance |
git |
object |
information about the codebase that is currently running |
cobalt object
key | type | description |
---|---|---|
version |
string |
cobalt version |
url |
string |
instance url |
startTime |
string |
instance start time in unix milliseconds |
turnstileSitekey |
string |
site key for a turnstile widget (optional) |
services |
string[] |
array of services which this instance supports |
git object
key | type | description |
---|---|---|
commit |
string |
commit hash |
branch |
string |
git branch |
remote |
string |
git remote |
GET /tunnel
endpoint for file tunnels (proxy/remux/transcode). the response is a file stream. all errors are reported via HTTP status codes.
returned headers
Content-Length
: file size, in bytes. returned when exact final file size is known.Estimated-Content-Length
: estimated file size, in bytes. returned when realContent-Length
is not known. a rough estimate which should NOT be used for strict size verification. can be used to show approximate download progress in UI.
possible HTTP status codes
- 200: OK
- 401: Unauthorized
- 403: Bad Request
- 404: Not Found
- 429: Too Many Requests (rate limit exceeded, check RateLimit-* headers)
- 500: Internal Server Error.