SKRYBER//AI
← Back to Home

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.

Base URL: https://www.skryber.comGet an API key ↓

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.

HTTP header
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).

Response headers
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 42

Transcribe audio or video

POST/api/v1/transcribe

Transcribes 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

urlstringrequired

A publicly reachable http(s) URL to an audio or video file. (Aliases: audio_url, media_url.)

modelstringoptional

Speech model. Defaults to nova-2; pass nova-3 for hard audio (distant mics, crowd noise).

titlestringoptional

Optional label for your own bookkeeping.

Request

cURL
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"
  }'
JavaScript
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);
Python
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

200 application/json
{
  "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 }
  ]
}
idstringoptional

Unique id for this transcription.

durationnumberoptional

Media length in seconds.

languagestringoptional

Detected language code (e.g. en).

textstringoptional

The full transcript as a single string.

wordsarrayoptional

Per-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_error

Malformed request — bad JSON, or a missing/invalid url.

401authentication_error

Missing, invalid, or revoked API key.

402quota_error

Monthly usage / minute limit reached for the account.

403permission_error

The key lacks the scope this endpoint requires.

429rate_limit_error

Too many requests — back off and retry after Retry-After.

502transcription_error

The 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.