Before you get started make sure to create an API key in your CaptionKit dashboard and read up on the API authentication.
Your API key is scoped to your account, so it can only access your own account's sessions. You can find your account ID in the id field of the Account endpoint.
Listing your sessions
GET /v2/accounts/{accountId}/sessions
Returns your account's past caption sessions, newest first.
Using curl
curl "https://api.captionkit.com/v2/accounts/{ACCOUNT_ID}/sessions?key={API_KEY}"
Using fetch in JS or Node
fetch(`https://api.captionkit.com/v2/accounts/${ACCOUNT_ID}/sessions?key=${API_KEY}`)Query parameters
All parameters are optional:
limit— number of sessions to return, between 1 and 100. Defaults to 20.offset— number of sessions to skip, for paging through results. Defaults to 0.order—ascordescby start time. Defaults todesc(newest first).profile_id— only return sessions for a specific profile.language— only return sessions with this source language, e.g.en-US.
Response
{
"data": [
{
"id": "2355239b-578f-4bca-bfa5-8cd544633967",
"account_id": "9c9a80c2-ee91-4590-a83a-cf2a454893c3",
"profile_id": "b1f6d0d7-3d1c-4a4e-9a58-2f0d54cf40a1",
"language": "en-US",
"translations": ["es-419"],
"duration": 5423,
"started_at": "2026-08-14T18:31:03.199Z"
}
],
"pagination": {
"limit": 20,
"offset": 0,
"total": 42,
"hasMore": true
}
}Use pagination.hasMore to check whether there are more sessions to fetch — if it's true, request the next page by increasing offset by limit.
Sessions are cached briefly, so a session that just finished can take up to a minute to appear in the list.
Downloading a transcript
GET /v2/accounts/{accountId}/sessions/{sessionId}/transcript
Returns the full transcript for a single session, in your choice of format.
Using curl
curl "https://api.captionkit.com/v2/accounts/{ACCOUNT_ID}/sessions/{SESSION_ID}/transcript?key={API_KEY}"Using fetch in JS or Node
fetch(`https://api.captionkit.com/v2/accounts/${ACCOUNT_ID}/sessions/${SESSION_ID}/transcript?key=${API_KEY}`)Query parameters
format— one ofjson,textorsrt. Defaults tojson.json— structured captions with timing information.text— a plain text transcript, one caption per line.srt— a subtitle file, delivered as a.srtdownload.
lang— return a translation instead of the original transcript, e.g.lang=es-419. Only languages the session was translated into are available (see thetranslationsfield on the session). If the translation doesn't exist you'll get a404.
Response (json format)
{
"id": "2355239b-578f-4bca-bfa5-8cd544633967",
"language": "en-US",
"items": [
{
"start": 0,
"duration": 3200,
"text": "Welcome everyone, thanks for joining us today.",
"isComplete": true
}
]
}Each item includes start and duration in milliseconds, so you can rebuild timing for your own captioning or archiving workflows.