API

Base URL https://transcriptanything.zhst.app. Authenticate with a Bearer key (tt_live_… or tt_test_…). Always send an Idempotency-Key when creating a job.

Create a transcription

curl https://transcriptanything.zhst.app/api/v1/transcriptions \
  -H "Authorization: Bearer $TA_API_KEY" \
  -H "Idempotency-Key: episode-0042" \
  -H "Content-Type: application/json" \
  -d '{
    "link": "https://www.youtube.com/watch?v=VIDEO_ID",
    "options": { "word_timestamps": true, "summary": { "preset": "bullets" } }
  }'

# 201
{
  "transcription": {
    "id": "trj_…",
    "status": "queued",
    "stage": "probe",
    "credits": 41,
    "free": false
  }
}

Poll

curl https://transcriptanything.zhst.app/api/v1/transcriptions/trj_… \
  -H "Authorization: Bearer $TA_API_KEY"

{
  "transcription": {
    "id": "trj_…",
    "status": "succeeded",
    "durationSeconds": 842,
    "billableMinutes": 15,
    "chargedCredits": 41,
    "formats": ["json", "txt", "srt", "vtt"],
    "addons": { "status": "done", "preset": "bullets", "summary": "- …" }
  }
}

Upload a file

# 1. ask for a presigned PUT
curl -X POST https://transcriptanything.zhst.app/api/v1/uploads \
  -H "Authorization: Bearer $TA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filename":"call.mp3","content_type":"audio/mpeg","size":18432221}'

# 2. PUT the bytes straight to R2 (no auth header: the URL is signed)
curl -X PUT --upload-file call.mp3 "<url from step 1>"

# 3. queue it
curl -X POST https://transcriptanything.zhst.app/api/v1/transcriptions \
  -H "Authorization: Bearer $TA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"upload_id":"upl_…","options":{"language":"vi"}}'

Endpoints

MethodPathPurpose
POST/api/v1/transcriptionsCreate from a link, upload_id, probe_id or items[]
GET/api/v1/transcriptionsList transcriptions
GET/api/v1/transcriptions/{id}Status and price
GET/api/v1/transcriptions/{id}/result?format=json · txt · srt · vtt
POST/api/v1/transcriptions/{id}/cancelCancel (idempotent)
POST/api/v1/transcriptions/batchCreate many jobs with one Idempotency-Key
POST/api/v1/links/previewPreview: title, duration, price, playlist items
POST/api/v1/uploadsPresigned R2 PUT

Pricing in the API

Errors

Errors use application/problem+json with a stable code: unauthenticated, forbidden, invalid_input, insufficient_credits, quota_exceeded, rate_limited, not_found, dependency_unavailable.

n8n

The importable example workflow (HTTP Request → Wait → Webhook) lives in docs/transcript/n8n/ in the repo.