Inwista API er her
Overlay

API-reference

Transskribér, forbedr og oversæt undertekster programmatisk. Base-URL, autentificering, alle endpoints og alle fejlkoder — samlet på én side.
Base URL: https://api.inwista.ai/v1

Autentificering

Opret en API-nøgle i Dashboard → API Keys (kun workspace-administratorer). Nøglen vises kun én gang — opbevar den som en adgangskode.

Send nøglen som bearer-token med hver request. Nøgler er bundet til ét workspace: alt, hvad API'et returnerer, tilhører det. Ressourcer oprettet via API'et er synlige i dashboardet, men dashboard-projekter eksponeres ikke gennem API'et.

Alle autentificeringsfejl — manglende header, ukendt nøgle, tilbagekaldt nøgle — returnerer det samme 401-svar.

curl https://api.inwista.ai/v1/transcriptions \
  -H "Authorization: Bearer inw_live_4f6a…"

Fejl

Alle fejl bruger den samme indpakning: et objekt med en maskinlæsbar code og en menneskelæsbar message. Inden for v1 tilføjes der kun nye koder — byg din logik på code, ikke på message.

{ "error": { "code": "insufficient_credits", "message": "…" } }
StatusKodeHvornår
401invalid_api_keyAutentificering mislykkedes (uanset årsag)
400invalid_source_urlIkke https, loginoplysninger i URL'en, privat host eller ugyldigt udformet
400invalid_languageMangler eller er ikke en ISO 639-1-kode
400invalid_num_speakersIkke et heltal mellem 1 og 32
400invalid_store_mediaIkke en boolesk værdi
400invalid_retentionIkke "standard" eller "none", eller kombineret med store_media true
400invalid_metadataIkke et objekt, eller over 1 KB
400invalid_settingsIkke et objekt, eller over 2 KB
400unreadable_sourceMediets varighed kunne ikke bestemmes
400invalid_cursorstarting_after er ikke et kendt id
400invalid_formatUndertekstformatet understøttes ikke
402insufficient_creditsSaldoen dækker ikke omkostningen
404not_foundUkendt ressource
404translation_not_foundDet forespurgte sprog har ingen fuldført oversættelse til den leverede version
409not_readyKræver en fuldført transskription
409operation_in_progressEn forbedring kører stadig
409translation_existsSproget findes allerede for denne version
400invalid_idempotency_keyIdempotency-Key-headeren er tom eller over 255 tegn
400idempotency_key_reusedIdempotency-Key er allerede brugt til en anden forespørgsel
409idempotency_conflictEn forespørgsel med denne nøgle behandles stadig
429rate_limitedFor mange forespørgsler — prøv igen efter Retry-After-headeren

Idempotens

Hvert POST-kald trækker kreditter, når det accepteres, så en forespørgsel der får timeout og blindt prøves igen, ville oprette et nyt job og et nyt træk. Send en Idempotency-Key-header (en vilkårlig unik streng på op til 255 tegn), så bliver gentagne forsøg sikre: svaret på den første forespørgsel gemmes i 24 timer og returneres uændret for hvert nyt forsøg med samme nøgle.

Genbruges en nøgle med en anden forespørgsel, returneres 400 idempotency_key_reused; et nyt forsøg mens originalen stadig kører, returnerer 409 idempotency_conflict. Fejlsvar gemmes aldrig — en fejlet forespørgsel beholder aldrig trækket, så nøglen frigives til et rent nyt forsøg.

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" }'

Forespørgselsgrænser

Hver API-nøgle må lave 300 læseforespørgsler (GET) og 60 skriveforespørgsler (POST) i minuttet. Kvoten fyldes løbende op og kan bruges på én gang. Over grænsen svarer API'et med 429 rate_limited og en Retry-After-header i sekunder.

Betragt tallene som omtrentlige: hold igen, når du får 429, og foretræk webhooks frem for hyppig polling.

HTTP/1.1 429 Too Many Requests
Retry-After: 12

{ "error": { "code": "rate_limited", "message": "…" } }

Credits

Operationer afregnes i credits fra dit workspaces forudbetalte saldo (optank i Dashboard → Billing). Transskription koster 4 credits pr. påbegyndt minut medie. Forbedring og oversættelse prissættes ud fra indholdets størrelse — samme takster som i studiet. Hentning, listning og polling er gratis.

Der trækkes credits, når en request accepteres. Fejler en operation, refunderes beløbet automatisk, og ressourcen viser credits_charged: 0. En 402-afvisning koster aldrig noget.

Paginering

Liste-endpoints tager limit (standard 25, maks. 100) og starting_after — sidste id fra forrige side. Svar pakker resultaterne ind i et listeobjekt med has_more.

{ "object": "list", "data": [ … ], "has_more": true }

Transskriptioner

Indsend medie via URL, poll indtil completed (eller brug webhooks), og hent derefter underteksterne. Statusserne er processing, completed og failed. Tidsstempler er unix-sekunder.

Polling og resultat deler samme endpoint: GET /v1/transcriptions/{id} er både der, hvor du følger status, OG der, hvor den færdige ressource ligger — der findes ikke et separat resultat-endpoint. Eneste undtagelse er selve undertekstfilerne, som altid hentes fra captions-endpointet, fordi de er rå filindhold, ikke JSON.

Opret en transskription

POST/v1/transcriptions

Forvandl enhver hostet mediefil til præcise, tidsstemplede undertekster, uden at nogen åbner studiet — og før resultatet direkte ind i dit CMS, arkiv eller din publiceringspipeline.

Mediets varighed aflæses, før requesten accepteres; saldoen trækkes, og jobbet sættes i kø i ét atomart trin. Returnerer 201 med transskriptionsressourcen.

Credits: 4 credits pr. påbegyndt minut medie, trukket når jobbet accepteres. Fejlede jobs refunderes automatisk.

Body

FeltTypeBeskrivelse
source_urlpåkrævetstringOffentlig https-URL til mediefilen, eller en YouTube/TikTok/Vimeo-URL
languagepåkrævetstringISO 639-1-kode, f.eks. "en" eller "nb-NO"
diarizationbooleanTalermarkeringer (standard false)
num_speakersinteger1–32, hint til diarization
store_mediabooleanfalse = kun transskription: ingen afspilningsfiler klargøres (standard true)
retentionstring"none" sletter kildemediet efter transskriptionen — transskriptionen beholdes (standard "standard")
metadataobjectDine egne tags, op til 1 KB, sendes uændret retur
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",
  "metadata": { "internal_ref": "case-42" },
  "credits_charged": 124,
  "error": null,
  "created": 1754558000
}

List transskriptioner

GET/v1/transcriptions

Afstem dit katalog mod behandlede jobs, eller byg et dashboard over alt, hvad du har transskriberet.

API-oprettede transskriptioner, nyeste først. Standardpaginering.

Credits: Gratis.

Query-parametre

FeltTypeBeskrivelse
limitintegerSidestørrelse, standard 25, maks. 100
starting_afterstringCursor: sidste id fra forrige side
curl "https://api.inwista.ai/v1/transcriptions?limit=10" \
  -H "Authorization: Bearer inw_live_…"

Hent en transskription

GET/v1/transcriptions/{id}

Både statuspolling og det endelige resultat: se status skifte til completed, og læs derefter varighed, sprog og trukket beløb fra samme svar.

Poll, indtil status er completed (eller registrér en webhook, se nedenfor). Læsning af en fejlet transskription udløser samtidig dens automatiske refusion.

Credits: 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",
  "metadata": { "internal_ref": "case-42" },
  "credits_charged": 124,
  "error": null,
  "created": 1754558000
}

Slet en transskription

DELETE/v1/transcriptions/{id}

Slet et job på forespørgsel — fuld kontrol over jeres data i ét kald.

Sletter transskriptionen permanent med alt, der er gemt for den: mediefiler, transskriptionsindhold, revisioner, oversættelser og kommentarer. Aggregerede faktureringstællere bevares — de indeholder intet indhold.

Kun fuldførte eller fejlede jobs kan slettes; et job, der stadig behandles, returnerer 409, det samme gør et med en igangværende forbedring eller oversættelse. Sletningen er øjeblikkelig og kan ikke fortrydes.

Credits: 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
}

Hent undertekster

GET/v1/transcriptions/{id}/captions

Træk broadcast-klare undertekstfiler direkte ind i din player, MAM eller leveringspipeline — ingen manuelle eksporter, ingen formatkonvertering i din ende. I en videoproduktionspipeline lander færdig SRT eller VTT direkte i dit NLE, reviewværktøj eller pakketrin, i samme øjeblik et klip er transskriberet.

Returnerer den rå undertekstfil som body med den tilhørende Content-Type — ikke pakket ind i JSON. Svarer 409 not_ready, indtil transskriptionen er fuldført.

Credits: Gratis.

Query-parametre

FeltTypeBeskrivelse
formatpåkrævetstringsrt, vtt, json eller txt
diarization"true"Sæt talermarkeringer foran
languagestringServér en fuldført oversættelse i stedet for kildesproget; 404 translation_not_found hvis den ikke findes for den leverede version
revisionstringHent én bestemt version (et forbedrings-id er dets revisions-id); udeladt = nyeste
curl "https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/captions?format=srt" \
  -H "Authorization: Bearer inw_live_…" -o interview.srt

json-formatet er en versioneret kontrakt: { version: 1, language, segments: [{ index, start, end, text, speaker? }] } — sekunder med millisekundpræcision, og felter tilføjes kun inden for en version.

Oversættelser hører til den version, de blev oprettet ud fra — oversættelsesressourcens revision_id angiver den, og versionen fra en senere forbedring arver dem ikke. Send dette revision_id som revision for at hente den oversatte version.

Forbedringer

AI-forbedring af undertekster — linjelængde, balancering og timingregler — som producerer en ny version af underteksterne. Kræver en fuldført transskription. Når en forbedring er fuldført, leveres den forbedrede version automatisk ved hentning af undertekster.

Start en forbedring

POST/v1/transcriptions/{id}/enhance

Broadcast-kvalitet i timing og linjebalancering på autopilot — lever undertekster, der består QC, uden at en redigerer rører dem. For produktionsselskaber automatiserer det conform-trinnet for undertekster i leveringspipelinen: hvert afsnit sendes af sted med ensartede undertekster, der overholder specifikationerne.

Returnerer 202 med forbedringsressourcen.

Credits: Beregnes ud fra undertekstindholdets størrelse til samme takst som i studiet, og trækkes når jobbet accepteres. Refunderes automatisk ved fejl.

Body

FeltTypeBeskrivelse
settingsobjectStudiets forbedringsindstillinger, op til 2 KB; udelad for standardværdier

Indstillinger for forbedring

FeltTypeBeskrivelse
maxLinesPerBlock"1" | "2"Antal linjer der vises samtidig; broadcaststandard og standardvalg er 2
maxCharactersPerLine1–100Tegn pr. linje; broadcaststandard og standardvalg er 42
blockLineBalancingbottom_heavy | top_heavy | equal | unconstrainedVisuel form på blokke med to linjer; standard er unconstrained
textCondensationnone | smart | aggressiveLader AI'en komprimere dialog der læses for hurtigt; standard er none (ordret)
speakerDialogueFormatnone | hyphens | speaker_name | bracketsHvordan flere talere i samme blok adskilles; standard er none
continuationMarkersnone | end | start | bothMarkørplacering når en sætning strækker sig over flere blokke; standard er none
continuationMarkerStyledash | ellipsisTankestreg eller ellipse for delte sætninger; standard er dash
gapBetweenBlocksnone | broadcasting | streaming | sdhTvungen tom pause mellem på hinanden følgende blokke; standard er broadcasting (~99 ms)
minBlockDuration0.1–60 sKorteste tid en blok vises på skærmen, i sekunder; standard er 1.0
maxBlockDuration> minLængste tid en blok vises på skærmen, 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" } }'

Svar

{
  "id": "rev8Xk3…",
  "object": "enhancement",
  "transcription_id": "aB3dE9f2…",
  "status": "processing",
  "progress": 0,
  "credits_charged": 12,
  "error": null,
  "created": 1754559000
}

Hent en forbedring

GET/v1/transcriptions/{id}/enhancements/{enhancementId}

Polling og resultat i ét: når status viser completed, serverer captions-endpointet allerede den forbedrede version.

Poll indtil completed. Læsning af en fejlet forbedring udløser dens automatiske refusion.

Credits: Gratis.

curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/enhancements/rev8Xk3… \
  -H "Authorization: Bearer inw_live_…"

Oversættelser

Oversættelse af undertekster med timing arvet fra kilden — én oversættelse pr. sprog pr. undertekstversion. Kræver en fuldført transskription.

Start en oversættelse

POST/v1/transcriptions/{id}/translate

Ét kald pr. sprog forvandler et færdigt undertekstspor til en lokaliseret version med identisk timing — mangedobl rækkevidden af hver video, du allerede har.

Returnerer 202. Svarer 409 translation_exists, hvis sproget allerede findes for den aktuelle version.

Credits: Beregnes ud fra undertekstindholdets størrelse til samme takst som i studiet, pr. målsprog, og trækkes ved accept. Refunderes automatisk ved fejl.

Body

FeltTypeBeskrivelse
target_languagepåkrævetstringISO 639-1-kode, f.eks. "es"
target_labelstringVisningsnavn, op til 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" }'

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
}

Hent en oversættelse

GET/v1/transcriptions/{id}/translations/{language}

Polling og resultat i ét: når den er completed, hentes den oversatte undertekstfil fra captions-endpointet med language-parameteren.

Poll indtil completed, og hent derefter de oversatte undertekster fra captions-endpointet med query-parameteren language.

Credits: 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.vtt

Webhooks

Konfigurér en webhook i Dashboard → Integrations → Webhook for at modtage transcript.completed-events i stedet for at polle. Payloads signeres med HMAC-SHA256 (X-Inwista-Signature: sha256=<hex> over den rå body) med den signeringshemmelighed, der vises én gang ved opsætningen. Fil-URL'er er præsignerede og udløber efter 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
    }
  ]
}
Vi værner om dit privatliv

Vi bruger cookies til at forstå, hvordan Inwista bruges, og til at måle vores annoncering. Privatlivspolitik · Cookiepolitik