API Documentation
Integrate video transcription into your application with our RESTful API. Upload media files, monitor processing status, and retrieve transcriptions programmatically.
Upload Video
POST /jobs to create, then stream your file
Process
We extract audio and transcribe automatically
Get Results
GET /jobs/:id to retrieve your transcription
Authentication
All API requests require authentication using your API key. Include it in the Authorization header using the Bearer scheme. You can find your API key in your dashboard settings.
Authorization: Bearer <your-api-key>Base URLs
The API is split across two endpoints: the Core API for job management and the Upload API for streaming media files.
https://kopia.ai/api/v1https://upload.kopia.aihttps://kopia.ai/api/v1/openapi.jsonJob Workflow
There are two ways to start a transcription depending on what you have available: upload raw media files, or provide a public HTTPS URL that points to the file. Both flows create a job and then let you track completion via polling or webhooks.
1) Create a job from a URL
Call POST /jobs/from-url with a public HTTPS link. We ingest and kick off transcription immediately.
curl -X POST "https://kopia.ai/api/v1/jobs/from-url" \
-H "Authorization: Bearer <api-key>" \
-H "Content-Type: application/json" \
-d '{ "mediaUrl": "https://example.com/media.mp4", "removeFillerWords": true }'2) Wait for completion
Either poll GET /jobs/:id until the job reaches completed status, or provide a webhook URL when creating the job to receive a completion notification (see Webhooks).
curl -X GET "https://kopia.ai/api/v1/jobs/<jobId>" \
-H "Authorization: Bearer <api-key>"Upload API
Stream raw media files directly to storage. Use the Upload API base URL for all upload endpoints.
/v1/jobs/:id/uploadUpload a media file for processing. The request body should be the raw binary file content. After upload, the job enters the processing queue automatically.
Parameters
:idstringrequiredThe job ID returned from POST /jobsAuthorizationBearer <api-key>requiredContent-Typevideo/mp4, audio/mpeg, etc.requiredNo request body required
Core API
Manage transcription jobs, check processing status, and retrieve results. Generate translations of your transcriptions into multiple languages. Use the Core API base URL for all endpoints in this section.
/jobsCreate a new transcription job. Returns a job object with pending status and a unique ID for subsequent operations.
{
"language": "en",
"removeFillerWords": true
}languagestringSee supported transcription languages
enGlobal EnglishautoAuto-detecten_auAustralian Englishen_ukBritish Englishen_usUS EnglishesSpanishfrFrenchdeGermanitItalianptPortuguesenlDutchhiHindijaJapanesezhChinesefiFinnishkoKoreanplPolishruRussiantrTurkishukUkrainianviVietnameseafAfrikaanssqAlbanianamAmharicarArabichyArmenianasAssameseazAzerbaijanibaBashkireuBasquebeBelarusianbnBengalibsBosnianbrBretonbgBulgarianmyBurmesecaCatalanhrCroatiancsCzechdaDanishetEstonianfoFaroeseglGaliciankaGeorgianelGreekguGujaratihtHaitianhaHausahawHawaiianheHebrewhuHungarianisIcelandicidIndonesianjwJavaneseknKannadakkKazakhkmKhmerloLaolaLatinlvLatvianlnLingalaltLithuanianlbLuxembourgishmkMacedonianmgMalagasymsMalaymlMalayalammtMaltesemiMaorimrMarathimnMongolianneNepalinoNorwegiannnNorwegian NynorskocOccitanpaPanjabipsPashtofaPersianroRomaniansaSanskritsrSerbiansnShonasdSindhisiSinhalaskSlovakslSloveniansoSomalisuSundaneseswSwahilisvSwedishtlTagalogtgTajiktaTamilttTatarteTeluguthThaiboTibetantkTurkmenurUrduuzUzbekcyWelshyiYiddishyoYorubaremoveFillerWordsboolean/jobs/from-urlCreate a new transcription job from a public HTTPS media URL.
{
"mediaUrl": "https://example.com/media.mp4",
"language": "en",
"removeFillerWords": true,
"webhookUrl": "https://your-server.com/webhooks/transcription"
}mediaUrlstringrequiredlanguagestringremoveFillerWordsbooleanwebhookUrlstring/jobsList all jobs for the authenticated user with optional filtering and pagination. Results are sorted by creation date (newest first).
Parameters
offsetintegerNumber of items to skip (default: 0)limitintegerItems per page (default: 50, max: 100)statusstringFilter by status: pending, uploaded, queued, processing, completed, failedtypestringFilter by type: audio, videocreatedFromstringFilter jobs created after this date (ISO 8601)createdTostringFilter jobs created before this date (ISO 8601)sortstringSort field: createdAt, updatedAt (default: createdAt)orderstringSort order: asc, desc (default: desc)No request body required
/jobs/:idRetrieve details for a specific job including status, metadata, and transcription results (when completed).
Parameters
:idstringrequiredThe job ID (e.g., job_1234567890)No request body required
/jobs/:idPermanently delete a job and all associated data including the uploaded media file and transcription results. This action cannot be undone.
Parameters
:idstringrequiredThe job ID to deleteNo request body required
/jobs/:id/translationsList existing translations for a job.
Parameters
:idstringrequiredThe job IDNo request body required
/jobs/:id/translationsCreate translations for a completed job. Translates the original transcript into one or more target languages.
Parameters
:idstringrequiredThe job ID (must have status 'completed'){
"languages": ["es", "fr", "de"],
"formal": true
}languagesarraySee supported transcription languages
enEnglishesSpanishfrFrenchdeGermanptPortuguese (Brazil)itItaliannlDutchruRussiankoKoreanarArabichiHinditrTurkishviVietnamesezh-HansChinese SimplifiedjaJapaneseplPolishukUkrainianfaPersianbnBanglathThaiidIndonesianelGreekcsCzechroRomanianhuHungariansvSwedishdaDanishfiFinnishnbNorwegian BokmålheHebrewurUrducaCatalanhrCroatianbgBulgarianskSlovakltLithuanianslSlovenianetEstonianlvLatviansr-LatnSerbian (Latin)zh-HantChinese TraditionaltaTamilteTelugumrMarathiguGujaratiknKannadamlMalayalampaPunjabifilFilipinoafAfrikaanssqAlbanianamAmharichyArmenianasAssameseazAzerbaijani (Latin)baBashkireuBasquebhoBhojpuribrxBodobsBosnian (Latin)yueCantonese (Traditional)hneChhattisgarhilzhChinese (Literary)snchiShonaprsDaridvDivehidoiDogrifoFaroesefjFijianfr-caFrench (Canada)glGaliciankaGeorgianhtHaitian CreolehaHausamwwHmong Daw (Latin)isIcelandicigIgboiktInuinnaqtuniuInuktitutiu-LatnInuktitut (Latin)gaIrishksKashmirikkKazakhkmKhmerrwKinyarwandatlh-LatnKlingontlh-PiqdKlingon (plqaD)gomKonkanikuKurdish (Central)kmrKurdish (Northern)kyKyrgyz (Cyrillic)loLaodsbLower SorbianlugLugandamkMacedonianmaiMaithilimgMalagasymsMalay (Latin)mtMaltesemniManipurimiMaorimn-CyrlMongolian (Cyrillic)mn-MongMongolian (Traditional)myMyanmarneNepalinyaNyanjaorOdiapsPashtopt-ptPortuguese (Portugal)otqQueretaro OtomirunRundismSamoan (Latin)sr-CyrlSerbian (Cyrillic)stSesothonsoSesotho sa LeboatnSetswanasdSindhisiSinhalasoSomali (Arabic)swSwahili (Latin)tyTahitianttTatar (Latin)boTibetantiTigrinyatoTongantkTurkmen (Latin)hsbUpper SorbianugUyghur (Arabic)uzUzbek (Latin)cyWelshxhXhosayoYorubayuaYucatec MayazuZuluformalboolean/jobs/:id/translations/:translationIdPermanently delete a translation for a job. This action cannot be undone.
Parameters
:idstringrequiredThe job ID:translationIdstringrequiredThe translation ID to deleteNo request body required
/jobs/:id/transcriptRetrieve the transcript for a job. Returns structured JSON by default, or a JSON object with a text property when format=text.
Parameters
:idstringrequiredThe job IDformatstringOutput format: 'json' (default) or 'text'languagestringISO 639-1 language code to get original or specific translation transcript. Mutually exclusive with translationId.translationIdstringSpecific translation ID to retrieve. Mutually exclusive with language parameter.No request body required
Webhooks
Receive real-time notifications when your transcription jobs complete. Provide a webhook URL when creating a job, and we'll POST to that URL when the transcription is ready.
Setting Up Webhooks
When creating a job via POST /jobs, include these optional fields:
{
"language": "en",
"removeFillerWords": true,
"webhookUrl": "https://your-server.com/webhooks/transcription"
}Additionally, include a secret in the request header for webhook verification:
X-Kopia-Webhook-Secret: your-random-secret-keyWebhook Payload
When a job completes, we POST the following JSON payload to your webhook URL:
{
"jobId": "job_1234567890"
}Webhook Verification
Verify webhook authenticity by checking the X-Kopia-Webhook-Secret header in the incoming POST request. This header contains the secret you provided when creating the job.
X-Kopia-Webhook-Secret: your-random-secret-keycompleted statusError Handling
When an error occurs, the API returns a JSON response with a consistent error structure containing a machine-readable code and human-readable message.
{
"error": {
"message": "Error description",
"code": "ERROR_CODE"
}
}Error Codes
UNAUTHORIZEDInvalid or missing API keyVALIDATION_ERRORRequest data is invalid or malformedNOT_FOUNDThe requested resource does not existPOLICY_VIOLATIONRequest conflicts with resource state or policyINTERNAL_ERRORAn unexpected server error occurred