
Base URL: https://api.inwista.ai/v1Opprett en API-nøkkel i Dashboard → API Keys (kun administratorer i arbeidsområdet). Nøkkelen vises bare én gang — oppbevar den som et passord.
Send nøkkelen som Bearer-token i hver forespørsel. Hver nøkkel hører til ett arbeidsområde: alt API-et returnerer, tilhører det. Ressurser opprettet via API-et er synlige i dashbordet, men dashbordprosjekter er ikke tilgjengelige gjennom API-et.
Alle autentiseringsfeil — manglende header, ukjent nøkkel, tilbakekalt nøkkel — gir samme 401-respons.
curl https://api.inwista.ai/v1/transcriptions \
-H "Authorization: Bearer inw_live_4f6a…"Alle feil bruker én og samme konvolutt: et objekt med en maskinlesbar kode og en menneskelesbar melding. Innenfor v1 kommer det bare nye koder til — eksisterende endres ikke. Bygg på koden, ikke meldingen.
{ "error": { "code": "insufficient_credits", "message": "…" } }| Status | Kode | Når |
|---|---|---|
| 401 | invalid_api_key | Autentisering mislyktes (uansett årsak) |
| 400 | invalid_source_url | Ikke https, påloggingsinformasjon i URL-en, privat vert eller feilformatert |
| 400 | conflicting_source | Både source_url og upload_id ble sendt; oppgi nøyaktig én |
| 400 | invalid_upload_id | upload_id er ikke en gyldig opplastings-id |
| 400 | upload_not_found | Ingen opplasting med den id-en i dette arbeidsområdet |
| 400 | upload_incomplete | Ingen fil er ennå sendt til opplastingen med PUT |
| 409 | upload_already_used | Opplastingen er allerede blitt til en transkribering |
| 409 | upload_in_progress | En annen forespørsel sender inn denne opplastingen akkurat nå |
| 400 | invalid_filename | Mangler, eller uten filendelse for mediefiler |
| 400 | invalid_content_type | Ikke en MIME-type som audio/mp4 |
| 400 | invalid_size | size_bytes er ikke et positivt heltall |
| 413 | file_too_large | Oppgitt størrelse er over 4 GB |
| 429 | too_many_pending_uploads | Arbeidsområdet har allerede 25 opplastinger som venter på å bli sendt inn |
| 400 | invalid_language | Mangler eller er ikke en ISO 639-1-kode |
| 400 | invalid_temperature | Ikke et tall mellom 0 og 1 |
| 400 | invalid_num_speakers | Ikke et heltall mellom 1 og 32 |
| 400 | invalid_store_media | Ikke en boolsk verdi |
| 400 | invalid_retention | Ikke "standard" eller "none", eller kombinert med store_media true |
| 400 | invalid_metadata | Ikke et objekt, eller over 1 KB |
| 400 | invalid_settings | Ikke et objekt, eller over 2 KB |
| 400 | unreadable_source | Varigheten på mediefilen kunne ikke fastslås |
| 400 | invalid_cursor | starting_after er ikke en kjent id |
| 400 | invalid_format | Undertekstformatet støttes ikke |
| 402 | insufficient_credits | Kredittsaldoen dekker ikke kostnaden |
| 404 | not_found | Ukjent ressurs |
| 404 | translation_not_found | Det forespurte språket har ingen fullført oversettelse for versjonen som leveres |
| 409 | not_ready | Krever en fullført transkribering |
| 409 | operation_in_progress | En forbedring er fortsatt under behandling |
| 409 | translation_exists | Språket finnes allerede for denne versjonen |
| 400 | invalid_idempotency_key | Idempotency-Key-headeren er tom eller over 255 tegn |
| 400 | idempotency_key_reused | Idempotency-Key er allerede brukt for en annen forespørsel |
| 409 | idempotency_conflict | En forespørsel med denne nøkkelen behandles fortsatt |
| 429 | rate_limited | For mange forespørsler — prøv igjen etter Retry-After-headeren |
Hvert POST-kall belaster kreditter når det godtas, så en forespørsel som får tidsavbrudd og prøves blindt på nytt, ville skapt en ny jobb og et nytt trekk. Send en Idempotency-Key-header (en valgfri unik streng på inntil 255 tegn), så blir nye forsøk trygge: svaret på den første forespørselen lagres i 24 timer og returneres uendret for hvert nytt forsøk med samme nøkkel.
Gjenbruk av en nøkkel med en annen forespørsel gir 400 idempotency_key_reused; et nytt forsøk mens den første fortsatt kjører gir 409 idempotency_conflict. Feilsvar lagres aldri — en mislykket forespørsel beholder aldri trekket, så nøkkelen frigjøres for et rent nytt forsø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" }'Hver API-nøkkel kan gjøre 300 leseforespørsler (GET) og 60 skriveforespørsler (POST) per minutt. Kvoten fylles på kontinuerlig og kan brukes på én gang. Over grensen svarer API-et med 429 rate_limited og en Retry-After-header i sekunder.
Se på tallene som omtrentlige: trapp ned når du får 429, og foretrekk webhooks fremfor hyppig polling.
HTTP/1.1 429 Too Many Requests
Retry-After: 12
{ "error": { "code": "rate_limited", "message": "…" } }Operasjoner måles i kreditter fra arbeidsområdets forhåndsbetalte saldo (fyll på i Dashboard → Billing). Transkribering koster 4 kreditter per påbegynte minutt med media. Forbedring og oversettelse prises etter innholdsmengden — samme satser som i studioet. Henting, listevisning og statussjekk er gratis.
Belastningen skjer når forespørselen godtas. Hvis en operasjon feiler, refunderes beløpet automatisk, og ressursen viser credits_charged: 0. En 402-avvisning belaster aldri noe.
Listeendepunkter tar limit (standard 25, maks 100) og starting_after — siste id fra forrige side. Responsene pakker resultatene inn i et listeobjekt med has_more.
{ "object": "list", "data": [ … ], "has_more": true }Send inn media via URL eller fra en opplasting, spør jevnlig til status er completed (eller bruk webhooks), og hent deretter undertekstene. Statusene er processing, completed og failed. Tidsstempler er unix-sekunder.
Statussjekk og resultat deler ett endepunkt: GET /v1/transcriptions/{id} er både der du følger med på status OG der den ferdige ressursen ligger — det finnes ikke noe eget resultatendepunkt. Det eneste unntaket er selve undertekstfilene, som alltid hentes fra captions-endepunktet fordi de er rått filinnhold, ikke JSON.
/v1/transcriptionsGjør en hvilken som helst mediefil på nett om til presise undertekster med tidsstempler, uten at noen åpner studioet — koble API-et rett på CMS-et, arkivet eller publiseringsflyten din.
Nøyaktig én av source_url og upload_id er påkrevd.
Varigheten på mediet måles før forespørselen godtas; saldoen belastes og jobben legges i kø i ett atomisk steg. Returnerer 201 med transkriberingsressursen.
Kreditter: 4 kreditter per påbegynte minutt med media, belastet når jobben godtas. Mislykkede jobber refunderes automatisk.
Body
| Felt | Type | Beskrivelse |
|---|---|---|
source_url | string | Offentlig https-URL til mediefilen, eller en YouTube-/TikTok-/Vimeo-URL. Oppgi denne eller upload_id |
upload_id | string | Id-en til en opplasting der filen er sendt med PUT (se Opplastinger). Oppgi denne eller source_url |
languagepåkrevd | string | ISO 639-1-kode, f.eks. "en" eller "nb-NO" |
diarization | boolean | Talermerking (standard false) |
num_speakers | integer | 1–32, hint til talermerkingen |
temperature | number | Samplingtemperatur for Whisper, mellom 0 og 1; standard 0 (deterministisk) |
store_media | boolean | false = kun transkripsjon: ingen avspillingsfiler klargjøres (standard true) |
retention | string | "none" sletter kildemediet etter transkriberingen — transkripsjonen beholdes (standard "standard") |
metadata | object | Dine egne merkelapper, opptil 1 KB, returneres ordrett |
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
}'Respons
{
"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/transcriptionsAvstem katalogen din mot behandlede jobber, eller bygg et dashbord over alt du har transkribert.
Transkriberinger opprettet via API-et, nyeste først. Standard paginering.
Kreditter: Gratis.
Spørringsparametere
| Felt | Type | Beskrivelse |
|---|---|---|
limit | integer | Sidestørrelse, standard 25, maks 100 |
starting_after | string | Peker: siste id fra forrige side |
curl "https://api.inwista.ai/v1/transcriptions?limit=10" \
-H "Authorization: Bearer inw_live_…"/v1/transcriptions/{id}Både fremdriftssjekk og endelig resultat: se status skifte til completed, og les deretter varighet, språk og kredittbelastning fra samme respons.
Spør jevnlig til status er completed (eller registrer en webhook, se nedenfor). Å lese en mislykket transkribering utløser også den automatiske refusjonen.
Kreditter: Gratis.
curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2… \
-H "Authorization: Bearer inw_live_…"Respons
{
"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}Slett en jobb på forespørsel — full kontroll over egne data i ett kall.
Sletter transkripsjonen permanent med alt som er lagret for den: mediefiler, transkripsjonsinnhold, revisjoner, oversettelser og kommentarer. Aggregerte faktureringstellere beholdes — de inneholder ikke innhold.
Bare fullførte eller feilede jobber kan slettes; en jobb som fortsatt behandles returnerer 409, det samme gjør en med en pågående forbedring eller oversettelse. Slettingen er umiddelbar og kan ikke angres.
Kreditter: endpoints.delete-transcription.pricing
curl -X DELETE https://api.inwista.ai/v1/transcriptions/aB3dE9f2… \
-H "Authorization: Bearer inw_live_…"Respons
{
"id": "aB3dE9f2…",
"object": "transcription",
"deleted": true
}/v1/transcriptions/{id}/captionsHent kringkastingsklare undertekstfiler rett inn i avspilleren, MAM-systemet eller leveranseflyten din — ingen manuelle eksporter, ingen formatkonvertering på din side. I en videoproduksjonsflyt lander ferdig SRT eller VTT rett i klippeprogrammet, gjennomgangsverktøyet eller pakkesteget i det øyeblikket et klipp er transkribert.
Returnerer det rå filinnholdet med riktig Content-Type — ikke pakket inn i JSON. Svarer 409 not_ready til transkriberingen er fullført.
Kreditter: Gratis.
Spørringsparametere
| Felt | Type | Beskrivelse |
|---|---|---|
formatpåkrevd | string | srt, vtt, json eller txt |
diarization | "true" | Sett talermerking foran linjene |
language | string | Lever en fullført oversettelse i stedet for kilden; 404 translation_not_found hvis den ikke finnes for versjonen som leveres |
revision | string | Hent én bestemt versjon (en forbedrings-id er dens revisjons-id); utelatt = nyeste |
curl "https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/captions?format=srt" \
-H "Authorization: Bearer inw_live_…" -o interview.srtjson-formatet er en versjonert kontrakt: { version: 1, language, segments: [{ index, start, end, text, speaker? }] } — sekunder med millisekundpresisjon, og felter blir bare lagt til innenfor en versjon, aldri fjernet.
Oversettelser hører til versjonen de ble laget for — oversettelsesressursens revision_id angir den, og versjonen fra en senere forbedring arver dem ikke. Send denne revision_id-en som revision for å hente den oversatte versjonen.
Direkte filopplasting for media som ikke har noen offentlig URL: lokale filer, tillegg til skrivebordsprogrammer, filer bak en innlogging. En opplasting er til engangsbruk. Opprett den, send filen med PUT til den signerte URL-en den returnerer, og oppgi deretter id-en dens som upload_id når du oppretter transkriberingen.
Filinnholdet går rett til lagringstjenesten og passerer aldri API-verten, så filer på opptil 4 GB fungerer, og ingenting belastes før transkriberingen sendes inn. Opplastinger som aldri sendes inn, fjernes etter ett døgn.
/v1/uploadsTranskriber en fil rett fra et skrivebordsprogram, et tillegg i et klippeprogram eller en privat server, uten å måtte legge den ut offentlig først.
Returnerer 201 med opplastingsressursen. Den signerte URL-en er gyldig i fire timer og er bundet til headerne i upload_headers: send dem nøyaktig slik de ble returnert i PUT-forespørselen, ellers avviser lagringstjenesten forespørselen. Det er length-range-headeren som håndhever grensen på 4 GB.
Idempotency-Key respekteres, så et nytt forsøk på å opprette gir samme opplasting tilbake i stedet for å lage en ny.
Kreditter: Gratis. Kreditter belastes når opplastingen sendes inn som en transkribering, etter satsen for transkribering.
Body
| Felt | Type | Beskrivelse |
|---|---|---|
filenamepåkrevd | string | Må ha en filendelse for mediefiler, f.eks. .m4a, .wav eller .mp4; opptil 180 tegn |
content_type | string | Filens MIME-type, standard application/octet-stream. PUT-forespørselen må sende nøyaktig samme Content-Type |
size_bytes | integer | Oppgitt størrelse i byte; over 4 GB svarer API-et med 413 file_too_large |
# 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" }'Respons
{
"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
}Lyd er nok for transkribering: eksporterer du bare lydsporet, holder en spillefilm seg under 100 MB.
En opplasting blir til nøyaktig én transkribering. Sender du den inn på nytt, svarer API-et med 409 upload_already_used.
/v1/uploads/{id}Sjekk om en fil er sendt inn ennå, og hvilken transkribering den ble til.
Opplastingsressursen uten engangsfeltene for opplasting. status viser consumed, og transcription_id settes når opplastingen er sendt inn.
Kreditter: Gratis.
curl https://api.inwista.ai/v1/uploads/7hKq2mZp… \
-H "Authorization: Bearer inw_live_…"Respons
{
"id": "7hKq2mZp…",
"object": "upload",
"status": "consumed",
"filename": "interview.m4a",
"content_type": "audio/mp4",
"size_bytes": 84213770,
"transcription_id": "aB3dE9f2…",
"created": 1754558000
}AI-forbedring av undertekster — linjelengde, balansering og regler for timing — som gir en ny versjon av undertekstene. Krever en fullført transkribering. Når en forbedring er fullført, leverer captions-endepunktet automatisk den forbedrede versjonen.
/v1/transcriptions/{id}/enhanceTiming og linjebalansering i kringkastingskvalitet, på autopilot — lever undertekster som består kvalitetskontrollen uten at noen må redigere dem manuelt. For produksjonsselskaper automatiserer dette tilpasningen av undertekster i leveranseflyten: hver episode leveres med konsekvente undertekster som følger spesifikasjonen.
Returnerer 202 med forbedringsressursen.
Kreditter: Beregnes ut fra størrelsen på undertekstinnholdet, etter samme sats som i studioet, og trekkes når jobben godtas. Refunderes automatisk ved feil.
Body
| Felt | Type | Beskrivelse |
|---|---|---|
settings | object | Studioets forbedringsinnstillinger, opptil 2 KB; utelat for standardinnstillinger |
Innstillinger for forbedring
| Felt | Type | Beskrivelse |
|---|---|---|
maxLinesPerBlock | "1" | "2" | Antall linjer som vises samtidig; kringkastingsstandard og standardvalg er 2 |
maxCharactersPerLine | 1–100 | Tegn per linje; kringkastingsstandard og standardvalg er 42 |
blockLineBalancing | bottom_heavy | top_heavy | equal | unconstrained | Visuell form på blokker med to linjer; standard er unconstrained |
textCondensation | none | smart | aggressive | Lar AI-en komprimere dialog som leses for raskt; standard er none (ordrett) |
speakerDialogueFormat | none | hyphens | speaker_name | brackets | Hvordan flere talere i samme blokk skilles fra hverandre; standard er none |
continuationMarkers | none | end | start | both | Plassering av markør når en setning går over flere blokker; standard er none |
continuationMarkerStyle | dash | ellipsis | Tankestrek eller ellipse for delte setninger; standard er dash |
gapBetweenBlocks | none | broadcasting | streaming | sdh | Tvungen tom pause mellom påfølgende blokker; standard er broadcasting (~99 ms) |
minBlockDuration | 0.1–60 s | Korteste tid en blokk vises på skjermen, i sekunder; standard er 1.0 |
maxBlockDuration | > min | Lengste tid en blokk vises på skjermen, i sekunder; standard er 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" } }'Respons
{
"id": "rev8Xk3…",
"object": "enhancement",
"transcription_id": "aB3dE9f2…",
"status": "processing",
"progress": 0,
"credits_charged": 12,
"error": null,
"created": 1754559000
}/v1/transcriptions/{id}/enhancements/{enhancementId}Statussjekk og resultat i ett: når status viser completed, leverer captions-endepunktet allerede den forbedrede versjonen.
Spør jevnlig til status er completed. Å lese en mislykket forbedring utløser den automatiske refusjonen.
Kreditter: Gratis.
curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/enhancements/rev8Xk3… \
-H "Authorization: Bearer inw_live_…"Oversettelse av undertekster der timingen arves fra kilden — én oversettelse per språk per undertekstversjon. Krever en fullført transkribering.
/v1/transcriptions/{id}/translateEtt kall per språk gjør et ferdig undertekstspor om til en lokalisert versjon med identisk timing — mangedoble rekkevidden til hver video du allerede har.
Returnerer 202. Svarer 409 translation_exists hvis språket allerede finnes for gjeldende versjon.
Kreditter: Beregnes ut fra størrelsen på undertekstinnholdet, etter samme sats som i studioet, per målspråk, og trekkes når forespørselen godtas. Refunderes automatisk ved feil.
Body
| Felt | Type | Beskrivelse |
|---|---|---|
target_languagepåkrevd | string | ISO 639-1-kode, f.eks. "es" |
target_label | string | Visningsnavn, opptil 60 tegn |
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" }'Respons
{
"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}Statussjekk og resultat i ett: når den er completed, henter du den oversatte undertekstfilen fra captions-endepunktet med language-parameteren.
Spør jevnlig til status er completed, og hent deretter de oversatte undertekstene fra captions-endepunktet med spørringsparameteren language.
Kreditter: 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.vttSett opp en webhook i Dashboard → Integrations → Webhook for å motta transcript.completed-hendelser i stedet for å spørre etter status. Payloadene signeres med HMAC-SHA256 (X-Inwista-Signature: sha256=<hex> over den rå meldingskroppen) med signeringshemmeligheten som vises én gang ved oppsett. Fil-URL-ene er forhåndssignerte og utløper etter 24 timer.
{
"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
}
]
}