API
Send a file, get a timestamped transcript back. The API draws on the same hours as the app - plan hours first, then top-up credits. A file costs exactly its audio length and failed jobs refund automatically. Create a key in Settings → API keys and get hours on the pricing page.
Authentication
Pass your key as a bearer token on every request. Keys start with fs_live_ and can be revoked in Settings at any time.
Authorization: Bearer fs_live_...
Create a transcription
POST /api/v1/transcriptions - the file is the raw request body (not multipart), with the name in X-Filename. Audio and video both work; files can be up to 10 hours. The response returns immediately while transcription runs in the background - it also shows the hours you have left.
curl -X POST https://flashscribe.ai/api/v1/transcriptions \ -H "Authorization: Bearer $FLASHSCRIBE_API_KEY" \ -H "X-Filename: interview.mp3" \ --data-binary @interview.mp3
{
"id": "1f0f9a4e-...",
"status": "pending",
"original_name": "interview.mp3",
"duration_sec": 1847.3,
"credits_charged_sec": 1847.3,
"credits_remaining_sec": 16152.7,
"created_at": "2026-08-26T14:03:07.512Z"
}Fetch the result
GET /api/v1/transcriptions/{id} - poll until status is completed (roughly a minute per audio-hour). Completed responses include the full text, word-level timestamps, and sentence-shaped subtitle cues.
curl https://flashscribe.ai/api/v1/transcriptions/1f0f9a4e-... \ -H "Authorization: Bearer $FLASHSCRIBE_API_KEY"
{
"id": "1f0f9a4e-...",
"status": "completed",
"language": "english",
"duration_sec": 1847.3,
"text": "Welcome back to the show - today we're talking about...",
"words": [{ "word": "Welcome", "start": 1.24, "end": 1.61 }, ...],
"cues": [{ "start": 1.24, "end": 3.81, "text": "Welcome back to the show -" }, ...]
}Errors
Errors are JSON with an error message and a meaningful status code:
- 401 - missing, invalid, or revoked key
- 400 - unreadable file (can't be priced or transcribed)
- 402 - not enough hours for this file's length
- 413 - file over the size cap or the 10-hour length cap
- 415 - multipart upload (send the raw body instead)
Hours are charged when the upload is accepted and refunded in full if transcription fails. API usage always draws on your paid hours - the free daily allowance applies only in the app.