DocsGetting started
Getting started
Create an API key and transcribe your first YouTube video or file with cURL, Python or Node.js.
Send requests to https://api.transcript1.com with an API key in the Authorization header. Follow these steps to create a key, submit media and read a transcript.
1. Create an account and an API key
Sign up at /signup with an email address or Google. You get 60 free minutes once per account, after email verification. Google signups receive them immediately. No card is needed.
Create an API key on the API keys page of the dashboard at /dashboard/account/tokens. Keys start with t1_ and are shown once, so copy yours right away. Then export it as TRANSCRIPT1_API_KEY:
export TRANSCRIPT1_API_KEY="t1_..."2. Transcribe a YouTube video
Send the video URL to POST /v1/transcriptions. The wait=60 query parameter holds the request open for up to 60 seconds. The create response does not include the transcript. The Python example reads it in a separate request to GET /v1/transcriptions/:id?wait=60. The Node.js SDK reads TRANSCRIPT1_API_KEY and does that waiting for you.
cURL
curl -X POST "https://api.transcript1.com/v1/transcriptions?wait=60" \
-H "Authorization: Bearer $TRANSCRIPT1_API_KEY" \
-H "Content-Type: application/json" \
-d '{"platform":"youtube","url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}'Python
import os
import requests
headers = {"Authorization": f"Bearer {os.environ['TRANSCRIPT1_API_KEY']}"}
response = requests.post(
"https://api.transcript1.com/v1/transcriptions?wait=60",
headers=headers,
json={"platform": "youtube", "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"},
)
response.raise_for_status()
transcription = response.json()
while True:
transcription = requests.get(
f"https://api.transcript1.com/v1/transcriptions/{transcription['id']}?wait=60",
headers=headers,
).json()
if transcription["status"] in ("completed", "failed", "canceled"):
break
if transcription["status"] == "completed":
print(transcription["transcript"]["text"])
else:
print(transcription["status"], transcription["error"])Node.js
Save this example as index.mjs (or set "type": "module" in package.json for a .js file) and run it with node index.mjs.
// npm i @transcript1/sdk
import { Transcript1 } from '@transcript1/sdk';
const t1 = new Transcript1();
const transcription = await t1.transcribe('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
console.log(transcription.transcript.text);By default transcript1 uses the video's YouTube captions when a usable track exists and falls back to AI transcription otherwise. See Sources and options to choose.
3. Read the result
Check the response status:
200means it reached a final status within the wait (completed,failedorcanceled).202means it is still processing. Fetch it again withGET /v1/transcriptions/:id?wait=60, which holds the request for up to 60 seconds, and repeat untilstatusis final.
A completed transcription looks like this (shortened):
{
"id": "tr_8fK2Lm0PqRsTuVwXyZaBcD",
"object": "transcription",
"status": "completed",
"transcript_source": "youtube_captions",
"language": "en",
"billed_minutes": 4,
"transcript": {
"text": "Welcome back to the channel. Today we are looking at how transcripts are made.",
"speakers": [],
"segments": [
{ "start": 0, "end": 4.2, "speaker": null, "language": "en", "text": "Welcome back to the channel." },
{ "start": 4.2, "end": 9.8, "speaker": null, "language": "en", "text": "Today we are looking at how transcripts are made." }
]
}
}transcript.text is the whole transcript and transcript.segments holds the timed segments, each with start and end in seconds.
For plain text or subtitles, request one of these formats: text, srt and vtt:
curl "https://api.transcript1.com/v1/transcriptions/tr_8fK2Lm0PqRsTuVwXyZaBcD?format=srt" \
-H "Authorization: Bearer $TRANSCRIPT1_API_KEY"That is GET /v1/transcriptions/:id?format=srt. Rendered formats are returned only once the transcription is completed; before that you get the JSON object back so you can see the status.
4. Transcribe a file
To transcribe a local audio or video file, send it as multipart/form-data in one request. This works for files up to 95 MB:
curl -X POST "https://api.transcript1.com/v1/transcriptions?wait=60" \
-H "Authorization: Bearer $TRANSCRIPT1_API_KEY" \
-F [email protected]Larger files, up to 2 GB, are sent in resumable chunks. See Uploads.
Next steps
- Sources and options: captions or AI transcription, speaker labels and language.
- Uploads: one-shot and chunked file uploads.
- Webhooks: get a signed request when a transcription finishes.
- MCP server: use transcript1 from Claude, ChatGPT, Cursor, VS Code and Claude Code.
- API reference: every endpoint and parameter.
Updated October 14, 2026