API Endpoints¶
Base URL: https://api.icana.ai/api/v1
All endpoints require an X-API-Key header. See Authentication.
POST /transcribe¶
Submit an audio file for transcription and speaker diarization.
Request¶
Content-Type: multipart/form-data
| Parameter | Type | Required | Description |
|---|---|---|---|
file |
file | Yes | Audio file (MP3, WAV, OGG, FLAC, M4A, MP4, WebM). Max 100 MB. |
language |
string | No | Language code (default: en). Supports other languages. |
prompt |
string | No | Comma-separated words or abbreviations that appear in the recording, to help the transcriber spell them correctly (e.g. brand names, acronyms, jargon). Only the last ~200 tokens are used, so keep it under ~50 words. |
Response 200 OK¶
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"message": "Job submitted successfully. Poll the status endpoint to check progress."
}
Errors¶
| Status | Description |
|---|---|
400 |
Unsupported file type or missing file |
401 |
Invalid or missing API key |
402 |
Insufficient credit balance (minimum $0.50 AUD required) |
500 |
Internal server error |
Example¶
curl -X POST https://api.icana.ai/api/v1/transcribe \
-H "X-API-Key: sk_test_your_api_key_here" \
-F "file=@recording.mp3" \
-F "language=en" \
-F "prompt=Icana, APAC, CallCoach, AUD"
GET /jobs/{job_id}¶
Get the status and results of a transcription job.
Path parameters¶
| Parameter | Type | Description |
|---|---|---|
job_id |
UUID | The job ID returned from /transcribe |
Response 200 OK¶
The response fields vary depending on the job status.
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"original_filename": "recording.mp3",
"language": "en",
"audio_duration_seconds": null,
"audio_duration_minutes": null,
"transcription": null,
"diarization": null,
"error_message": null,
"created_at": "2025-02-03T10:30:00Z",
"completed_at": null
}
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"original_filename": "recording.mp3",
"language": "en",
"audio_duration_seconds": 180,
"audio_duration_minutes": 3.0,
"transcription": "Thanks everyone for joining today's call. Let's start with the Q4 budget review...",
"diarization": "[Speaker 1]: Thanks everyone for joining today's call.\n[Speaker 2]: Thanks for having us. Let's dive into the numbers...",
"error_message": null,
"created_at": "2025-02-03T10:30:00Z",
"completed_at": "2025-02-03T10:32:00Z"
}
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "failed",
"original_filename": "recording.mp3",
"language": "en",
"audio_duration_seconds": null,
"audio_duration_minutes": null,
"transcription": null,
"diarization": null,
"error_message": "Transcription failed",
"created_at": "2025-02-03T10:30:00Z",
"completed_at": "2025-02-03T10:30:45Z"
}
Job statuses¶
| Status | Description |
|---|---|
pending |
Job is queued and waiting to be processed |
uploading |
Audio file is being uploaded |
processing |
Transcription is in progress |
completed |
Transcription finished successfully — results available |
failed |
Transcription failed — check error_message for details |
Errors¶
| Status | Description |
|---|---|
401 |
Invalid or missing API key |
404 |
Job not found (or belongs to a different user) |
Example¶
curl https://api.icana.ai/api/v1/jobs/550e8400-e29b-41d4-a716-446655440000 \
-H "X-API-Key: sk_test_your_api_key_here"
GET /jobs¶
List all transcription jobs for your account, with optional filtering and pagination.
Query parameters¶
| Parameter | Type | Default | Description |
|---|---|---|---|
page |
integer | 1 |
Page number (minimum: 1) |
page_size |
integer | 20 |
Items per page (minimum: 1, maximum: 100) |
status |
string | — | Filter by job status: pending, uploading, processing, completed, failed |
Response 200 OK¶
{
"jobs": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"original_filename": "recording.mp3",
"language": "en",
"audio_duration_seconds": 180,
"audio_duration_minutes": 3.0,
"error_message": null,
"created_at": "2025-02-03T10:30:00Z",
"completed_at": "2025-02-03T10:32:00Z"
}
],
"total": 42,
"page": 1,
"page_size": 20,
"total_pages": 3
}
Note
The job list response does not include transcription or diarization text. Use GET /jobs/{job_id} to retrieve full results for a specific job.
Errors¶
| Status | Description |
|---|---|
401 |
Invalid or missing API key |
Example¶
# List all completed jobs, page 2
curl "https://api.icana.ai/api/v1/jobs?status=completed&page=2&page_size=10" \
-H "X-API-Key: sk_test_your_api_key_here"
GET /usage¶
Get a usage summary for the current billing period.
Response 200 OK¶
{
"billing_period_start": "2025-02-01",
"billing_period_end": "2025-02-28",
"included_minutes": 0,
"minutes_used": 45.5,
"minutes_remaining": 0,
"plan_name": "Pay As You Go",
"balance_aud": 8.29,
"price_per_minute_aud": 0.02
}
| Field | Description |
|---|---|
billing_period_start |
First day of the current billing period |
billing_period_end |
Last day of the current billing period |
minutes_used |
Total minutes transcribed this period |
balance_aud |
Current credit balance in AUD |
price_per_minute_aud |
Price per minute of audio ($0.02 AUD) |
plan_name |
Always Pay As You Go for the credit-based system |
Errors¶
| Status | Description |
|---|---|
401 |
Invalid or missing API key |