API Reference
Add Skryber-quality transcription to your own apps. A simple REST API over HTTPS: send a media URL, get back clean text with word-level timestamps. More endpoints (clip generation, export) are on the way.
Your API keys
Create a key below, then pass it as a Bearer token on every request. The full key is shown only once at creation — store it somewhere safe. Revoke a key any time; it stops working immediately.
Authentication
Authenticate every request with your secret key in the Authorization header. Keep your keys server-side — never ship them in a browser or mobile app.
Authorization: Bearer sky_live_xxxxxxxxxxxxxxxx
Rate limits
Requests are limited per key (default 60 per minute). Every response includes your current limit state; a 429 means you should retry after the window resets (see Retry-After).
X-RateLimit-Limit: 60 X-RateLimit-Remaining: 59 X-RateLimit-Reset: 42
Transcribe audio or video
/api/v1/transcribeTranscribes the media at a public URL and returns the full text plus word-level timestamps and confidence. Uses the same engine as the Skryber editor, including the automatic fallback for music-heavy audio.
Body parameters
urlstringrequiredA publicly reachable http(s) URL to an audio or video file. (Aliases: audio_url, media_url.)
modelstringoptionalSpeech model. Defaults to nova-2; pass nova-3 for hard audio (distant mics, crowd noise).
titlestringoptionalOptional label for your own bookkeeping.
Request
curl https://www.skryber.com/api/v1/transcribe \
-H "Authorization: Bearer sky_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/podcast.mp3"
}'const res = await fetch("https://www.skryber.com/api/v1/transcribe", {
method: "POST",
headers: {
"Authorization": "Bearer sky_live_YOUR_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({ url: "https://example.com/podcast.mp3" }),
});
const data = await res.json();
console.log(data.text);import requests
res = requests.post(
"https://www.skryber.com/api/v1/transcribe",
headers={"Authorization": "Bearer sky_live_YOUR_KEY"},
json={"url": "https://example.com/podcast.mp3"},
)
print(res.json()["text"])Response
{
"id": "txn_4e1c8b2a-...",
"object": "transcription",
"duration": 184.32,
"language": "en",
"text": "Welcome back to the show. Today we're talking about...",
"words": [
{ "word": "Welcome", "start": 0.08, "end": 0.42, "confidence": 0.99 },
{ "word": "back", "start": 0.42, "end": 0.71, "confidence": 0.98 }
]
}idstringoptionalUnique id for this transcription.
durationnumberoptionalMedia length in seconds.
languagestringoptionalDetected language code (e.g. en).
textstringoptionalThe full transcript as a single string.
wordsarrayoptionalPer-word objects with word, start, end (seconds), and confidence (0–1).
Errors
Errors return the matching HTTP status and a JSON body of the form { "error": { "type", "message" } }.
400invalid_request_errorMalformed request — bad JSON, or a missing/invalid url.
401authentication_errorMissing, invalid, or revoked API key.
402quota_errorMonthly usage / minute limit reached for the account.
403permission_errorThe key lacks the scope this endpoint requires.
429rate_limit_errorToo many requests — back off and retry after Retry-After.
502transcription_errorThe media couldn't be fetched or transcribed.
Build with confidence
Live platform health and uptime are always available — wire the status endpoint into your own monitoring.