Overlay

API-referentie

Transcribeer, verbeter en vertaal ondertitels programmatisch. Base-URL, authenticatie, elk endpoint en elke foutcode — alles op één pagina.
Base URL: https://api.inwista.ai/v1

Authenticatie

Maak een API-sleutel aan in Dashboard → API Keys (alleen voor workspacebeheerders). De sleutel wordt maar één keer getoond — bewaar deze zoals een wachtwoord.

Stuur de sleutel als Bearer-token mee met elk verzoek. Sleutels zijn beperkt tot één workspace: alles wat de API teruggeeft hoort daarbij. Resources die via de API zijn aangemaakt, zijn zichtbaar in het dashboard, maar dashboardprojecten zijn niet toegankelijk via de API.

Elke authenticatiefout — ontbrekende header, onbekende sleutel, ingetrokken sleutel — geeft dezelfde 401-response terug.

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

Fouten

Elke fout gebruikt dezelfde envelop: een object met een machineleesbare code en een leesbaar bericht voor mensen. Binnen v1 komen er alleen codes bij, er verdwijnen er geen — bouw op de code, niet op het bericht.

{ "error": { "code": "insufficient_credits", "message": "…" } }
StatusCodeWanneer
401invalid_api_keyAuthenticatie mislukt (ongeacht de reden)
400invalid_source_urlGeen https, inloggegevens in de URL, privéhost of ongeldige opbouw
400conflicting_sourceZowel source_url als upload_id zijn meegestuurd; geef er precies één op
400invalid_upload_idupload_id is geen geldig upload-id
400upload_not_foundGeen upload met dat id in deze workspace
400upload_incompleteEr is nog geen bestand met PUT naar de upload gestuurd
409upload_already_usedDe upload is al omgezet in een transcriptie
409upload_in_progressEen ander verzoek is deze upload op dit moment aan het indienen
400invalid_filenameOntbreekt, of heeft geen extensie van een mediabestand
400invalid_content_typeGeen MIME-type zoals audio/mp4
400invalid_sizesize_bytes is geen positief geheel getal
413file_too_largeDe opgegeven grootte is groter dan 4 GB
429too_many_pending_uploadsDe workspace heeft al 25 uploads die wachten op indiening
400invalid_languageOntbreekt of is geen ISO 639-1-code
400invalid_temperatureGeen getal tussen 0 en 1
400invalid_num_speakersGeen geheel getal tussen 1 en 32
400invalid_store_mediaGeen boolean
400invalid_retentionNiet "standard" of "none", of gecombineerd met store_media true
400invalid_metadataGeen object, of groter dan 1 KB
400invalid_settingsGeen object, of groter dan 2 KB
400unreadable_sourceDe duur van de media kon niet worden bepaald
400invalid_cursorstarting_after is geen bekend id
400invalid_formatOndertitelformaat niet ondersteund
402insufficient_creditsHet tegoed dekt de kosten niet
404not_foundOnbekende resource
404translation_not_foundDe gevraagde taal heeft geen voltooide vertaling voor de geleverde versie
409not_readyVereist een voltooide transcriptie
409operation_in_progressEr wordt nog een verbetering verwerkt
409translation_existsDeze taal bestaat al voor deze versie
400invalid_idempotency_keyIdempotency-Key-header leeg of langer dan 255 tekens
400idempotency_key_reusedIdempotency-Key is al gebruikt voor een ander verzoek
409idempotency_conflictEen verzoek met deze sleutel wordt nog verwerkt
429rate_limitedTe veel verzoeken — probeer opnieuw na de Retry-After-header

Idempotentie

Elke POST-aanroep belast credits bij acceptatie, dus een time-out gevolgd door blind opnieuw proberen zou een tweede taak en een tweede afschrijving aanmaken. Stuur een Idempotency-Key-header mee (een willekeurige unieke tekenreeks van maximaal 255 tekens) en nieuwe pogingen worden veilig: het antwoord op het eerste verzoek wordt 24 uur bewaard en ongewijzigd teruggegeven bij elke nieuwe poging met dezelfde sleutel.

Hergebruik van een sleutel met een ander verzoek geeft 400 idempotency_key_reused; opnieuw proberen terwijl het origineel nog loopt geeft 409 idempotency_conflict. Foutantwoorden worden nooit bewaard — een mislukt verzoek houdt nooit zijn afschrijving, dus de sleutel komt vrij voor een schone nieuwe poging.

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

Verzoeklimieten

Elke API-sleutel mag 300 leesverzoeken (GET) en 60 schrijfverzoeken (POST) per minuut doen. Het quotum vult continu aan en mag in één keer worden opgebruikt. Daarboven antwoordt de API met 429 rate_limited en een Retry-After-header in seconden.

Beschouw de aantallen als indicatief: neem gas terug bij elke 429 en geef de voorkeur aan webhooks boven strak pollen.

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

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

Credits

Bewerkingen worden afgerekend in credits uit het prepaid tegoed van je workspace (opwaarderen kan in Dashboard → Billing). Transcriptie kost 4 credits per begonnen minuut media. Verbetering en vertaling worden geprijsd op basis van de omvang van de inhoud — tegen dezelfde tarieven als de studio. Ophalen, lijsten opvragen en pollen zijn gratis.

Kosten worden afgeschreven zodra een verzoek wordt geaccepteerd. Mislukt een bewerking, dan wordt het bedrag automatisch terugbetaald en meldt de resource credits_charged: 0. Een 402-afwijzing kost nooit iets.

Paginering

Lijst-endpoints accepteren limit (standaard 25, maximaal 100) en starting_after — het laatste id van de vorige pagina. Responses verpakken de resultaten in een list-object met has_more.

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

Transcripties

Dien media in via een URL of vanuit een upload, poll tot de status completed is (of gebruik webhooks) en haal daarna de ondertitels op. De statussen zijn processing, completed en failed. Tijdstempels zijn unix-seconden.

Pollen en resultaten delen één endpoint: GET /v1/transcriptions/{id} is waar je de status volgt ÉN waar de voltooide resource leeft — er is geen apart resultaat-endpoint. De enige uitzondering zijn de ondertitelbestanden zelf: die komen altijd van het captions-endpoint, omdat het ruwe bestandsinhoud is en geen JSON.

Een transcriptie aanmaken

POST/v1/transcriptions

Zet elk gehost mediabestand om in nauwkeurige ondertitels met tijdstempels, zonder dat iemand de studio hoeft te openen — voed je CMS, archief of publicatiepijplijn rechtstreeks.

Precies één van source_url en upload_id is verplicht.

De duur van de media wordt vastgesteld voordat het verzoek wordt geaccepteerd; het afschrijven van het tegoed en het in de wachtrij zetten van de job gebeuren in één atomaire stap. Geeft 201 terug met de transcriptie-resource.

Credits: 4 credits per begonnen minuut media, afgeschreven zodra de job wordt geaccepteerd. Mislukte jobs worden automatisch terugbetaald.

Body

VeldTypeBeschrijving
source_urlstringPublieke https-URL van het mediabestand, of een YouTube-, TikTok- of Vimeo-URL. Geef dit of upload_id op
upload_idstringHet id van een upload waarvan het bestand al met PUT is verstuurd (zie Uploads). Geef dit of source_url op
languageverplichtstringISO 639-1-code, bijv. "en" of "nb-NO"
diarizationbooleanSprekerlabels (standaard false)
num_speakersinteger1–32, hint voor diarization
temperaturenumberWhisper-samplingtemperatuur tussen 0 en 1; standaard 0 (deterministisch)
store_mediabooleanfalse = alleen transcriptie: er worden geen afspeelbestanden voorbereid (standaard true)
retentionstring"none" verwijdert de bronmedia na transcriptie — het transcript blijft bewaard (standaard "standard")
metadataobjectJe eigen tags, maximaal 1 KB, letterlijk teruggegeven
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
  }'

Response

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

Transcripties weergeven

GET/v1/transcriptions

Stem je catalogus af op de verwerkte jobs of bouw een dashboard over alles wat je hebt getranscribeerd.

Via de API aangemaakte transcripties, nieuwste eerst. Standaardpaginering.

Credits: Gratis.

Queryparameters

VeldTypeBeschrijving
limitintegerPaginagrootte, standaard 25, maximaal 100
starting_afterstringCursor: het laatste id van de vorige pagina
curl "https://api.inwista.ai/v1/transcriptions?limit=10" \
  -H "Authorization: Bearer inw_live_…"

Een transcriptie ophalen

GET/v1/transcriptions/{id}

Zowel de voortgangspoll als het eindresultaat: zie de status omslaan naar completed en lees vervolgens de duur, taal en afgeschreven credits uit dezelfde response.

Poll tot de status completed is (of registreer een webhook, zie hieronder). Het opvragen van een mislukte transcriptie activeert ook de automatische terugbetaling.

Credits: Gratis.

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

Response

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

Een transcriptie verwijderen

DELETE/v1/transcriptions/{id}

Verwijder een taak op verzoek — volledige controle over uw gegevens in één aanroep.

Verwijdert de transcriptie permanent met alles wat ervoor is opgeslagen: mediabestanden, transcriptie-inhoud, revisies, vertalingen en opmerkingen. Geaggregeerde factureringstellers blijven bewaard — ze bevatten geen inhoud.

Alleen voltooide of mislukte taken kunnen worden verwijderd; een taak die nog wordt verwerkt geeft 409, net als een met een lopende verbetering of vertaling. Verwijdering is onmiddellijk en onomkeerbaar.

Credits: endpoints.delete-transcription.pricing

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

Response

{
  "id": "aB3dE9f2…",
  "object": "transcription",
  "deleted": true
}

Ondertitels ophalen

GET/v1/transcriptions/{id}/captions

Haal uitzendklare ondertitelbestanden rechtstreeks binnen in je speler, MAM of leveringspijplijn — geen handmatige exports, geen formaatconversie aan jouw kant. In een videoproductiepijplijn valt de voltooide SRT of VTT direct in je NLE, reviewtool of packagingstap zodra een montage is getranscribeerd.

Geeft de ruwe inhoud van het ondertitelbestand terug met het bijbehorende Content-Type — niet verpakt in JSON. Antwoordt met 409 not_ready totdat de transcriptie is voltooid.

Credits: Gratis.

Queryparameters

VeldTypeBeschrijving
formatverplichtstringsrt, vtt, json of txt
diarization"true"Plaats sprekerlabels vóór de tekst
languagestringLever een voltooide vertaling in plaats van de brontaal; 404 translation_not_found als die ontbreekt voor de geleverde versie
revisionstringHaal één specifieke versie op (een verbeterings-id is de revisie-id); weggelaten = nieuwste
curl "https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/captions?format=srt" \
  -H "Authorization: Bearer inw_live_…" -o interview.srt

Het json-formaat is een geversioneerd contract: { version: 1, language, segments: [{ index, start, end, text, speaker? }] } — seconden met millisecondeprecisie; binnen een versie worden er alleen velden toegevoegd.

Vertalingen horen bij de versie waarvoor ze zijn gemaakt — de revision_id van de vertaalresource benoemt die, en de versie van een latere verbetering erft ze niet. Geef die revision_id door als revision om de vertaalde versie op te halen.

Uploads

Rechtstreekse bestandsupload voor media zonder publieke URL: lokale bestanden, desktopplugins, bestanden achter een login. Een upload is een eenmalig slot. Maak hem aan, stuur het bestand met PUT naar de signed URL uit de response en geef daarna het id door als upload_id wanneer je de transcriptie aanmaakt.

De bytes gaan rechtstreeks naar de opslag en passeren nooit de API-host, dus bestanden tot 4 GB werken, en er wordt niets afgeschreven totdat de transcriptie is ingediend. Uploads die nooit worden ingediend, worden na een dag verwijderd.

Een upload aanmaken

POST/v1/uploads

Transcribeer een bestand rechtstreeks vanuit een desktop-app, een montageplugin of een privéserver, zonder het eerst ergens publiek te hosten.

Geeft 201 terug met de upload-resource. De signed URL is vier uur geldig en is gebonden aan de headers in upload_headers: stuur ze bij de PUT precies mee zoals ze zijn teruggegeven, anders wijst de opslag het verzoek af. De length-range-header is wat de limiet van 4 GB afdwingt.

Idempotency-Key wordt gerespecteerd: een opnieuw verstuurd aanmaakverzoek geeft dezelfde upload terug in plaats van een tweede slot aan te maken.

Credits: Gratis. Credits worden afgeschreven zodra de upload als transcriptie wordt ingediend, tegen het transcriptietarief.

Body

VeldTypeBeschrijving
filenameverplichtstringMoet een extensie van een mediabestand hebben, zoals .m4a, .wav of .mp4; maximaal 180 tekens
content_typestringMIME-type van het bestand, standaard application/octet-stream. De PUT moet precies dit Content-Type meesturen
size_bytesintegerOpgegeven grootte in bytes; antwoordt met 413 file_too_large boven 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" }'

Response

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

Audio is voldoende voor transcriptie: door alleen het audiospoor te exporteren blijft een speelfilm onder de 100 MB.

Een upload wordt precies één transcriptie. Opnieuw indienen antwoordt met 409 upload_already_used.

Een upload ophalen

GET/v1/uploads/{id}

Controleer of een bestand al is ingediend en welke transcriptie het is geworden.

De uploadresource zonder de eenmalige uploadvelden. status is consumed en transcription_id wordt gezet zodra de upload is ingediend.

Credits: Gratis.

curl https://api.inwista.ai/v1/uploads/7hKq2mZp… \
  -H "Authorization: Bearer inw_live_…"

Response

{
  "id": "7hKq2mZp…",
  "object": "upload",
  "status": "consumed",
  "filename": "interview.m4a",
  "content_type": "audio/mp4",
  "size_bytes": 84213770,
  "transcription_id": "aB3dE9f2…",
  "created": 1754558000
}

Verbeteringen

AI-ondertitelverbetering — regellengte, regelbalans en timingregels — die een nieuwe versie van de ondertitels oplevert. Vereist een voltooide transcriptie. Zodra een verbetering is afgerond, levert het ophalen van ondertitels automatisch de verbeterde versie.

Een verbetering starten

POST/v1/transcriptions/{id}/enhance

Timing en regelbalans op uitzendniveau, volledig automatisch — lever ondertitels die de QC doorstaan zonder dat er een redacteur aan te pas komt. Voor productiehuizen automatiseert dit de ondertitel-conformstap van de leveringspijplijn: elke aflevering vertrekt met consistente ondertitels die aan de specificaties voldoen.

Geeft 202 terug met de verbeteringsresource.

Credits: Berekend op basis van de omvang van de ondertitelinhoud, tegen hetzelfde tarief als de studio, en afgeschreven zodra de job wordt geaccepteerd. Bij mislukking automatisch terugbetaald.

Body

VeldTypeBeschrijving
settingsobjectVerbeteringsinstellingen van de studio, maximaal 2 KB; weglaten voor de standaardwaarden

Verbeteringsinstellingen

VeldTypeBeschrijving
maxLinesPerBlock"1" | "2"Aantal regels dat tegelijk wordt getoond; broadcaststandaard en standaardwaarde is 2
maxCharactersPerLine1–100Tekens per regel; broadcaststandaard en standaardwaarde is 42
blockLineBalancingbottom_heavy | top_heavy | equal | unconstrainedVisuele vorm van tweeregelige blokken; standaard is unconstrained
textCondensationnone | smart | aggressiveLaat de AI dialoog comprimeren die te snel leest; standaard is none (letterlijk)
speakerDialogueFormatnone | hyphens | speaker_name | bracketsHoe meerdere sprekers in één blok worden gescheiden; standaard is none
continuationMarkersnone | end | start | bothMarkeringsplaatsing wanneer een zin meerdere blokken beslaat; standaard is none
continuationMarkerStyledash | ellipsisStreepje of beletselteken voor gesplitste zinnen; standaard is dash
gapBetweenBlocksnone | broadcasting | streaming | sdhGeforceerde lege ruimte tussen opeenvolgende blokken; standaard is broadcasting (~99 ms)
minBlockDuration0.1–60 sKortste tijd dat een blok in beeld blijft, in seconden; standaard is 1.0
maxBlockDuration> minLangste tijd dat een blok in beeld blijft, in seconden; standaard is 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" } }'

Response

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

Een verbetering ophalen

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

Poll en resultaat in één: zodra de status completed is, levert het captions-endpoint al de verbeterde versie.

Poll tot completed. Het opvragen van een mislukte verbetering activeert de automatische terugbetaling.

Credits: Gratis.

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

Vertalingen

Ondertitelvertaling waarbij de timing van de bron wordt overgenomen — één vertaling per taal per ondertitelversie. Vereist een voltooide transcriptie.

Een vertaling starten

POST/v1/transcriptions/{id}/translate

Eén aanroep per taal maakt van een afgeronde ondertiteltrack een gelokaliseerde versie met identieke timing — vermenigvuldig het bereik van elke video die je al hebt.

Geeft 202 terug. Antwoordt met 409 translation_exists als die taal al bestaat voor de huidige versie.

Credits: Berekend op basis van de omvang van de ondertitelinhoud, tegen hetzelfde tarief als de studio, per doeltaal, afgeschreven bij acceptatie. Bij mislukking automatisch terugbetaald.

Body

VeldTypeBeschrijving
target_languageverplichtstringISO 639-1-code, bijv. "es"
target_labelstringWeergavenaam, maximaal 60 tekens
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" }'

Response

{
  "id": "es",
  "object": "translation",
  "transcription_id": "aB3dE9f2…",
  "target_language": "es",
  "revision_id": "TRkf2nY7…",
  "status": "processing",
  "progress": 0,
  "credits_charged": 6,
  "error": null,
  "created": 1754559600
}

Een vertaling ophalen

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

Poll en resultaat in één: eenmaal completed haal je het vertaalde ondertitelbestand op van het captions-endpoint met de language-parameter.

Poll tot completed en haal daarna de vertaalde ondertitels op van het captions-endpoint met de language-queryparameter.

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

Stel een webhook in via Dashboard → Integrations → Webhook om transcript.completed-events te ontvangen in plaats van te pollen. Payloads zijn ondertekend met HMAC-SHA256 (X-Inwista-Signature: sha256=<hex> over de ruwe body), met de signing-secret die bij het instellen één keer wordt getoond. Bestands-URL's zijn pre-signed en verlopen na 24 uur.

{
  "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
    }
  ]
}