
Base URL: https://api.inwista.ai/v1Skapa en API-nyckel i Dashboard → API Keys (endast administratörer för arbetsytan). Nyckeln visas bara en gång — förvara den som ett lösenord.
Skicka nyckeln som Bearer-token i varje anrop. Nycklar är avgränsade till en arbetsyta: allt API:et returnerar tillhör den. Resurser som skapas via API:et syns i dashboarden, men dashboard-projekt exponeras inte genom API:et.
Varje autentiseringsfel — saknad header, okänd nyckel, återkallad nyckel — returnerar samma 401-svar.
curl https://api.inwista.ai/v1/transcriptions \
-H "Authorization: Bearer inw_live_4f6a…"Alla fel använder ett och samma kuvert: ett objekt med en maskinläsbar kod och ett människoläsbart meddelande. Koder är enbart additiva inom v1 — bygg mot koden, inte mot meddelandet.
{ "error": { "code": "insufficient_credits", "message": "…" } }| Status | Kod | När |
|---|---|---|
| 401 | invalid_api_key | Autentiseringen misslyckades (oavsett orsak) |
| 400 | invalid_source_url | Inte https, inloggningsuppgifter i URL:en, privat värd eller felformaterad |
| 400 | conflicting_source | Både source_url och upload_id skickades; ange exakt ett av dem |
| 400 | invalid_upload_id | upload_id är inte ett giltigt uppladdnings-id |
| 400 | upload_not_found | Ingen uppladdning med det id:t i den här arbetsytan |
| 400 | upload_incomplete | Ingen fil har ännu skickats med PUT till uppladdningen |
| 409 | upload_already_used | Uppladdningen har redan blivit en transkribering |
| 409 | upload_in_progress | En annan förfrågan skickar in den här uppladdningen just nu |
| 400 | invalid_filename | Saknas, eller har ingen filändelse för mediefiler |
| 400 | invalid_content_type | Inte en MIME-typ, t.ex. audio/mp4 |
| 400 | invalid_size | size_bytes är inte ett positivt heltal |
| 413 | file_too_large | Angiven storlek överstiger 4 GB |
| 429 | too_many_pending_uploads | Arbetsytan har redan 25 uppladdningar som väntar på att skickas in |
| 400 | invalid_language | Saknas eller är inte en ISO 639-1-kod |
| 400 | invalid_temperature | Inte ett tal mellan 0 och 1 |
| 400 | invalid_num_speakers | Inte ett heltal mellan 1 och 32 |
| 400 | invalid_store_media | Inte ett booleskt värde |
| 400 | invalid_retention | Inte "standard" eller "none", eller kombinerat med store_media true |
| 400 | invalid_metadata | Inte ett objekt, eller större än 1 KB |
| 400 | invalid_settings | Inte ett objekt, eller större än 2 KB |
| 400 | unreadable_source | Mediets längd kunde inte fastställas |
| 400 | invalid_cursor | starting_after är inte ett känt id |
| 400 | invalid_format | Undertextformatet stöds inte |
| 402 | insufficient_credits | Plånboken täcker inte kostnaden |
| 404 | not_found | Okänd resurs |
| 404 | translation_not_found | Det begärda språket har ingen slutförd översättning för versionen som serveras |
| 409 | not_ready | Kräver en slutförd transkribering |
| 409 | operation_in_progress | En förbättring bearbetas fortfarande |
| 409 | translation_exists | Språket finns redan för den här versionen |
| 400 | invalid_idempotency_key | Idempotency-Key-headern är tom eller över 255 tecken |
| 400 | idempotency_key_reused | Idempotency-Key har redan använts för en annan förfrågan |
| 409 | idempotency_conflict | En förfrågan med denna nyckel bearbetas fortfarande |
| 429 | rate_limited | För många förfrågningar — försök igen efter Retry-After-headern |
Varje POST-anrop debiterar krediter när det accepteras, så en förfrågan som får timeout och blint försöks igen skulle skapa ett andra jobb och en andra debitering. Skicka en Idempotency-Key-header (valfri unik sträng, upp till 255 tecken) så blir omförsök säkra: svaret på den första förfrågan lagras i 24 timmar och returneras oförändrat för varje omförsök med samma nyckel.
Återanvänds en nyckel med en annan förfrågan returneras 400 idempotency_key_reused; ett omförsök medan originalet fortfarande körs returnerar 409 idempotency_conflict. Felsvar lagras aldrig — en misslyckad förfrågan behåller aldrig debiteringen, så nyckeln frigörs för ett rent omförsök.
curl -X POST https://api.inwista.ai/v1/transcriptions \
-H "Authorization: Bearer inw_live_…" \
-H "Idempotency-Key: order-42-transcribe" \
-H "Content-Type: application/json" \
-d '{ "source_url": "…", "language": "en" }'Varje API-nyckel får göra 300 läsförfrågningar (GET) och 60 skrivförfrågningar (POST) per minut. Kvoten fylls på kontinuerligt och kan användas på en gång. Över gränsen svarar API:et med 429 rate_limited och en Retry-After-header i sekunder.
Betrakta siffrorna som ungefärliga: backa när du får 429 och föredra webhooks framför täta pollningsloopar.
HTTP/1.1 429 Too Many Requests
Retry-After: 12
{ "error": { "code": "rate_limited", "message": "…" } }Operationer mäts i krediter från din arbetsytas förskottsbetalda plånbok (fyll på i Dashboard → Billing). Transkribering kostar 4 krediter per påbörjad minut media. Förbättring och översättning prissätts utifrån innehållets storlek — till samma taxa som studion tar. Hämtning, listning och pollning är gratis.
Debitering sker när ett anrop accepteras. Om en operation misslyckas återbetalas debiteringen automatiskt och resursen rapporterar credits_charged: 0. Ett 402-avslag debiterar aldrig något.
List-endpoints tar limit (standard 25, max 100) och starting_after — sista id:t på föregående sida. Svaren kapslar in resultaten i ett listobjekt med has_more.
{ "object": "list", "data": [ … ], "has_more": true }Skicka in media via URL eller från en uppladdning, polla tills jobbet är completed (eller använd webhooks) och hämta sedan undertexterna. Statusarna är processing, completed och failed. Tidsstämplar anges i unix-sekunder.
Pollning och resultat delar en endpoint: GET /v1/transcriptions/{id} är både där du följer status OCH där den färdiga resursen finns — det finns ingen separat resultat-endpoint. Enda undantaget är själva undertextfilerna, som alltid hämtas från captions-endpointen eftersom de är råa filkroppar, inte JSON.
/v1/transcriptionsFörvandla vilken publikt lagrad mediefil som helst till korrekta, tidsstämplade undertexter utan att någon öppnar studion — mata ditt CMS, arkiv eller publiceringsflöde direkt.
Exakt ett av source_url och upload_id krävs.
Mediets längd kontrolleras innan anropet accepteras; plånboken debiteras och jobbet köläggs i ett atomärt steg. Returnerar 201 med transkriberingsresursen.
Krediter: 4 krediter per påbörjad minut media, debiteras när jobbet accepteras. Misslyckade jobb återbetalas automatiskt.
Body
| Fält | Typ | Beskrivning |
|---|---|---|
source_url | string | Publik https-URL till mediefilen, eller en YouTube-/TikTok-/Vimeo-URL. Ange denna eller upload_id |
upload_id | string | Id:t för en uppladdning vars fil har skickats med PUT (se Uppladdningar). Ange detta eller source_url |
languageobligatoriskt | string | ISO 639-1-kod, t.ex. "en" eller "nb-NO" |
diarization | boolean | Talaretiketter (standard false) |
num_speakers | integer | 1–32, vägledning för diarization |
temperature | number | Whispers samplingstemperatur mellan 0 och 1; standard 0 (deterministisk) |
store_media | boolean | false = endast transkription: inga uppspelningsfiler förbereds (standard true) |
retention | string | "none" raderar källmediet efter transkriberingen — transkriptionen behålls (standard "standard") |
metadata | object | Dina egna taggar, upp till 1 KB, ekas tillbaka oförändrade |
curl -X POST https://api.inwista.ai/v1/transcriptions \
-H "Authorization: Bearer inw_live_…" \
-H "Content-Type: application/json" \
-d '{
"source_url": "https://cdn.example.com/interview.mp4",
"language": "en",
"diarization": true
}'Svar
{
"id": "aB3dE9f2…",
"object": "transcription",
"status": "processing",
"progress": 50,
"language": "en",
"duration_seconds": 1834,
"diarization": true,
"store_media": true,
"retention": "standard",
"source_url": "https://cdn.example.com/interview.mp4",
"upload_id": null,
"temperature": 0,
"metadata": { "internal_ref": "case-42" },
"credits_charged": 124,
"error": null,
"created": 1754558000
}/v1/transcriptionsStäm av din katalog mot bearbetade jobb eller bygg en dashboard över allt du har transkriberat.
API-skapade transkriberingar, nyast först. Standardpaginering.
Krediter: Gratis.
Query-parametrar
| Fält | Typ | Beskrivning |
|---|---|---|
limit | integer | Sidstorlek, standard 25, max 100 |
starting_after | string | Cursor: sista id:t på föregående sida |
curl "https://api.inwista.ai/v1/transcriptions?limit=10" \
-H "Authorization: Bearer inw_live_…"/v1/transcriptions/{id}Både förloppspollning och slutresultat: se status slå om till completed och läs sedan längd, språk och debitering ur samma svar.
Polla tills status är completed (eller registrera en webhook, se nedan). Att läsa en misslyckad transkribering utlöser även dess automatiska återbetalning.
Krediter: Gratis.
curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2… \
-H "Authorization: Bearer inw_live_…"Svar
{
"id": "aB3dE9f2…",
"object": "transcription",
"status": "processing",
"progress": 50,
"language": "en",
"duration_seconds": 1834,
"diarization": true,
"store_media": true,
"retention": "standard",
"source_url": "https://cdn.example.com/interview.mp4",
"upload_id": null,
"temperature": 0,
"metadata": { "internal_ref": "case-42" },
"credits_charged": 124,
"error": null,
"created": 1754558000
}/v1/transcriptions/{id}Radera ett jobb på begäran — full kontroll över era data i ett enda anrop.
Raderar transkriptionen permanent med allt som lagrats för den: mediefiler, transkriptionsinnehåll, revisioner, översättningar och kommentarer. Aggregerade faktureringsräknare behålls — de innehåller inget innehåll.
Endast slutförda eller misslyckade jobb kan raderas; ett jobb som fortfarande bearbetas returnerar 409, liksom ett med en pågående förbättring eller översättning. Raderingen är omedelbar och kan inte ångras.
Krediter: endpoints.delete-transcription.pricing
curl -X DELETE https://api.inwista.ai/v1/transcriptions/aB3dE9f2… \
-H "Authorization: Bearer inw_live_…"Svar
{
"id": "aB3dE9f2…",
"object": "transcription",
"deleted": true
}/v1/transcriptions/{id}/captionsHämta sändningsklara undertextfiler rakt in i din spelare, ditt MAM eller ditt leveransflöde — inga manuella exporter, ingen formatkonvertering på din sida. I ett videoproduktionsflöde landar färdig SRT eller VTT direkt i din NLE, ditt granskningsverktyg eller paketeringssteget i samma ögonblick som ett klipp är transkriberat.
Returnerar den råa undertextfilens innehåll med matchande Content-Type — inte inkapslat i JSON. Svarar 409 not_ready tills transkriberingen är slutförd.
Krediter: Gratis.
Query-parametrar
| Fält | Typ | Beskrivning |
|---|---|---|
formatobligatoriskt | string | srt, vtt, json eller txt |
diarization | "true" | Sätter talaretiketter framför texten |
language | string | Servera en slutförd översättning i stället för källan; 404 translation_not_found om den saknas för versionen som serveras |
revision | string | Hämta en specifik version (ett förbättrings-id är dess revisions-id); utelämnad = senaste |
curl "https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/captions?format=srt" \
-H "Authorization: Bearer inw_live_…" -o interview.srtFormatet json är ett versionerat kontrakt: { version: 1, language, segments: [{ index, start, end, text, speaker? }] } — sekunder med millisekundsprecision, fält kan bara läggas till inom en version.
Översättningar hör till den version de skapades för — översättningsresursens revision_id anger den, och versionen från en senare förbättring ärver dem inte. Skicka detta revision_id som revision för att hämta den översatta versionen.
Direkt filuppladdning för media som saknar publik URL: lokala filer, plugins till skrivbordsprogram, filer bakom inloggning. En uppladdning är en engångsplats. Skapa den, skicka filen med PUT till den signerade URL:en som returneras och ange sedan dess id som upload_id när du skapar transkriberingen.
Filens data går direkt till lagringen och passerar aldrig API-värden, så filer upp till 4 GB fungerar, och inget debiteras förrän transkriberingen skickas in. Uppladdningar som aldrig skickas in tas bort efter ett dygn.
/v1/uploadsTranskribera en fil direkt från en skrivbordsapp, ett redigeringsplugin eller en privat server, utan att först behöva lägga upp den någonstans publikt.
Returnerar 201 med uppladdningsresursen. Den signerade URL:en är giltig i fyra timmar och är bunden till headrarna i upload_headers: skicka dem exakt som de returnerades i PUT-anropet, annars avvisar lagringen förfrågan. Det är length-range-headern som upprätthåller gränsen på 4 GB.
Idempotency-Key respekteras, så ett omförsök av skapandet returnerar samma uppladdning i stället för att skapa en andra plats.
Krediter: Gratis. Krediter debiteras när uppladdningen skickas in som en transkribering, till transkriberingstaxan.
Body
| Fält | Typ | Beskrivning |
|---|---|---|
filenameobligatoriskt | string | Måste ha en filändelse för media, t.ex. .m4a, .wav eller .mp4; upp till 180 tecken |
content_type | string | Filens MIME-typ, standard application/octet-stream. PUT-anropet måste skicka exakt denna Content-Type |
size_bytes | integer | Angiven storlek i byte; svarar 413 file_too_large över 4 GB |
# 1. Create the upload
curl -X POST https://api.inwista.ai/v1/uploads \
-H "Authorization: Bearer inw_live_…" \
-H "Content-Type: application/json" \
-d '{ "filename": "interview.m4a", "content_type": "audio/mp4" }'
# 2. PUT the file to upload_url with upload_headers
curl -X PUT "<upload_url>" \
-H "Content-Type: audio/mp4" \
-H "x-goog-content-length-range: 0,4294967296" \
-H "x-goog-if-generation-match: 0" \
--data-binary @interview.m4a
# 3. Submit it
curl -X POST https://api.inwista.ai/v1/transcriptions \
-H "Authorization: Bearer inw_live_…" \
-H "Content-Type: application/json" \
-d '{ "upload_id": "7hKq2mZp…", "language": "en" }'Svar
{
"id": "7hKq2mZp…",
"object": "upload",
"status": "pending",
"filename": "interview.m4a",
"content_type": "audio/mp4",
"size_bytes": 84213770,
"transcription_id": null,
"created": 1754558000,
"upload_url": "https://storage.googleapis.com/…",
"upload_method": "PUT",
"upload_headers": {
"Content-Type": "audio/mp4",
"x-goog-content-length-range": "0,4294967296",
"x-goog-if-generation-match": "0"
},
"upload_url_expires_at": 1754572400
}Ljud räcker för transkribering: exporterar du bara ljudspåret håller sig en långfilm under 100 MB.
En uppladdning blir exakt en transkribering. Skickas den in igen svarar API:et 409 upload_already_used.
/v1/uploads/{id}Kontrollera om en fil har skickats in ännu och vilken transkribering den blev.
Uppladdningsresursen utan engångsfälten för uppladdning. status visar consumed och transcription_id sätts när uppladdningen har skickats in.
Krediter: Gratis.
curl https://api.inwista.ai/v1/uploads/7hKq2mZp… \
-H "Authorization: Bearer inw_live_…"Svar
{
"id": "7hKq2mZp…",
"object": "upload",
"status": "consumed",
"filename": "interview.m4a",
"content_type": "audio/mp4",
"size_bytes": 84213770,
"transcription_id": "aB3dE9f2…",
"created": 1754558000
}AI-förbättring av undertexter — regler för radlängd, balansering och tajming — som skapar en ny version av undertexterna. Kräver en slutförd transkribering. När en förbättring är slutförd serveras den förbättrade versionen automatiskt vid hämtning av undertexter.
/v1/transcriptions/{id}/enhanceTajming och radbalansering i sändningsklass på autopilot — leverera undertexter som klarar QC utan att en redaktör rör dem. För produktionsbolag automatiserar detta konformeringen av undertexter i leveransflödet: varje avsnitt lämnar huset med konsekventa undertexter som följer specen.
Returnerar 202 med förbättringsresursen.
Krediter: Beräknas utifrån undertextinnehållets storlek till samma taxa som studion tar, dras när jobbet accepteras. Återbetalas automatiskt vid fel.
Body
| Fält | Typ | Beskrivning |
|---|---|---|
settings | object | Studions förbättringsinställningar, upp till 2 KB; utelämna för standardvärden |
Inställningar för förbättring
| Fält | Typ | Beskrivning |
|---|---|---|
maxLinesPerBlock | "1" | "2" | Antal rader som visas samtidigt; broadcaststandard och standardval är 2 |
maxCharactersPerLine | 1–100 | Tecken per rad; broadcaststandard och standardval är 42 |
blockLineBalancing | bottom_heavy | top_heavy | equal | unconstrained | Visuell form på tvåradsblock; standard är unconstrained |
textCondensation | none | smart | aggressive | Låter AI:n komprimera dialog som läses för snabbt; standard är none (ordagrant) |
speakerDialogueFormat | none | hyphens | speaker_name | brackets | Hur flera talare i samma block separeras; standard är none |
continuationMarkers | none | end | start | both | Markörplacering när en mening sträcker sig över flera block; standard är none |
continuationMarkerStyle | dash | ellipsis | Tankstreck eller ellips för delade meningar; standard är dash |
gapBetweenBlocks | none | broadcasting | streaming | sdh | Tvingat tomt mellanrum mellan på varandra följande block; standard är broadcasting (~99 ms) |
minBlockDuration | 0.1–60 s | Kortaste tid ett block visas på skärmen, i sekunder; standard är 1.0 |
maxBlockDuration | > min | Längsta tid ett block visas på skärmen, i sekunder; standard är 7.0 |
curl -X POST https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/enhance \
-H "Authorization: Bearer inw_live_…" \
-H "Content-Type: application/json" \
-d '{ "settings": { "maxCharactersPerLine": 37, "textCondensation": "smart" } }'Svar
{
"id": "rev8Xk3…",
"object": "enhancement",
"transcription_id": "aB3dE9f2…",
"status": "processing",
"progress": 0,
"credits_charged": 12,
"error": null,
"created": 1754559000
}/v1/transcriptions/{id}/enhancements/{enhancementId}Pollning och resultat i ett: när status visar completed serverar captions-endpointen redan den förbättrade versionen.
Polla tills completed. Att läsa en misslyckad förbättring utlöser dess automatiska återbetalning.
Krediter: Gratis.
curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/enhancements/rev8Xk3… \
-H "Authorization: Bearer inw_live_…"Undertextöversättning där tajmingen ärvs från källan — en översättning per språk och undertextversion. Kräver en slutförd transkribering.
/v1/transcriptions/{id}/translateEtt anrop per språk förvandlar ett färdigt undertextspår till en lokaliserad version med identisk tajming — mångfaldiga räckvidden för varje video du redan har.
Returnerar 202. Svarar 409 translation_exists om språket redan finns för den aktuella versionen.
Krediter: Beräknas utifrån undertextinnehållets storlek till samma taxa som studion tar, per målspråk, dras vid accept. Återbetalas automatiskt vid fel.
Body
| Fält | Typ | Beskrivning |
|---|---|---|
target_languageobligatoriskt | string | ISO 639-1-kod, t.ex. "es" |
target_label | string | Visningsnamn, upp till 60 tecken |
curl -X POST https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/translate \
-H "Authorization: Bearer inw_live_…" \
-H "Content-Type: application/json" \
-d '{ "target_language": "es" }'Svar
{
"id": "es",
"object": "translation",
"transcription_id": "aB3dE9f2…",
"target_language": "es",
"revision_id": "TRkf2nY7…",
"status": "processing",
"progress": 0,
"credits_charged": 6,
"error": null,
"created": 1754559600
}/v1/transcriptions/{id}/translations/{language}Pollning och resultat i ett: när den är completed hämtar du den översatta undertextfilen från captions-endpointen med parametern language.
Polla tills completed och hämta sedan de översatta undertexterna från captions-endpointen med query-parametern language.
Krediter: Gratis.
# Poll the translation resource
curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/translations/es \
-H "Authorization: Bearer inw_live_…"
# Once completed, fetch the translated subtitle file
curl "https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/captions?format=vtt&language=es" \
-H "Authorization: Bearer inw_live_…" -o interview-es.vttKonfigurera en webhook i Dashboard → Integrations → Webhook för att ta emot transcript.completed-händelser i stället för att polla. Payloads signeras med HMAC-SHA256 (X-Inwista-Signature: sha256=<hex> över den råa kroppen) med signeringshemligheten som visas en gång vid konfigureringen. Fil-URL:er är försignerade och går ut efter 24 timmar.
{
"event": "transcript.completed",
"id": "evt_9f2c…",
"timestamp": 1754560000,
"workspaceId": "ws_…",
"project": {
"id": "aB3dE9f2…",
"name": "interview.mp4",
"language": "en",
"durationSeconds": 1834
},
"files": [
{
"format": "srt",
"name": "interview.srt",
"mimeType": "application/x-subrip; charset=utf-8",
"url": "https://…",
"expiresAt": 1754646400
}
]
}