API Documentation
Captain Transcribe API v1 — transcribe audio and video files programmatically.
API access is available on the Pro plan. Generate your API key in Settings.
Authentication
All API requests must include your API key in the Authorization header as a Bearer token.
curl https://captaintranscribe.com/api/v1/transcriptions \
-H "Authorization: Bearer ct_your_api_key_here"Your API key starts with ct_. Keep it secret — do not expose it in client-side code.
Keys expire after one year and can be revoked or regenerated immediately from Settings.
POST /api/v1/transcribe
Transcribe an audio or video file. This endpoint waits until processing is complete before returning the response.
Idempotency-Key is required. Reuse the same value when retrying the exact same upload; use a new value for a different request.
Request
Send a multipart/form-data request with the following fields:
| Field | Type | Required | Description |
|---|---|---|---|
| file | File | Yes | Audio or video file (MP3, WAV, MP4, etc.) |
| language | string | No | Language code (for example "fr" or "en"). Default: "auto" |
| speakerDetection | string | No | Set to "true" to enable speaker detection |
Example
curl -X POST https://captaintranscribe.com/api/v1/transcribe \
-H "Authorization: Bearer ct_your_api_key_here" \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-F "file=@interview.mp3" \
-F "language=fr" \
-F "speakerDetection=true"Response
{
"id": "abc123",
"text": "Full transcription text...",
"segments": [
{ "start": 0.0, "end": 3.5, "text": "Hello world" }
],
"words": [
{ "start": 0.0, "end": 0.5, "word": "Hello" },
{ "start": 0.6, "end": 1.0, "word": "world" }
],
"language": "en",
"duration": 125.4,
"speakers": [
{
"label": "A",
"segments": [{ "start": 0.0, "end": 3.5, "text": "Hello world" }]
}
]
}The speakers field is present only when speaker detection is enabled. The X-Quota-Minutes-Remaining header shows the remaining quota in minutes.
GET /api/v1/transcriptions
List your transcriptions with pagination.
Query parameters
| Parameter | Default | Description |
|---|---|---|
| limit | 20 | Number of results (maximum 100) |
| cursor | — | Opaque cursor returned as nextCursor by the previous page |
Example
curl https://captaintranscribe.com/api/v1/transcriptions?limit=10 \
-H "Authorization: Bearer ct_your_api_key_here"Response
{
"transcriptions": [
{
"id": "abc123",
"fileName": "interview.mp3",
"language": "fr",
"duration": 125.4,
"createdAt": "2026-04-01T10:30:00.000Z"
}
],
"limit": 10,
"count": 1,
"nextCursor": null
}GET /api/v1/transcription/:id
Get the full transcription result by ID.
Example
curl https://captaintranscribe.com/api/v1/transcription/abc123 \
-H "Authorization: Bearer ct_your_api_key_here"Response
{
"id": "abc123",
"text": "Full transcription text...",
"segments": [...],
"words": [...],
"language": "fr",
"duration": 125.4
}Rate limits
| Limit | Value |
|---|---|
| Concurrent transcriptions | 3 |
| Transcription requests per hour | 60 |
| Concurrent read requests | 10 |
| Read requests per hour | 300 |
| Monthly quota (Pro plan) | 2400 minutes (40 hours) |
| Maximum file size | 95 MB |
The X-Quota-Minutes-Remaining response header shows your remaining quota in minutes after each transcription.
Error handling
Every error returns a JSON object with an error field.
| Status | Meaning |
|---|---|
| 400 | Bad request (missing file or invalid format) |
| 401 | Invalid or missing API key |
| 403 | Quota exceeded or plan not eligible |
| 404 | Transcription not found |
| 429 | Rate limit exceeded |
| 500 | Server error |
Example error response
{
"error": "Monthly quota exceeded"
}