
Base URL: https://api.inwista.ai/v1Maak 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…"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": "…" } }| Status | Code | Wanneer |
|---|---|---|
| 401 | invalid_api_key | Authenticatie mislukt (ongeacht de reden) |
| 400 | invalid_source_url | Geen https, inloggegevens in de URL, privéhost of ongeldige opbouw |
| 400 | conflicting_source | Zowel source_url als upload_id zijn meegestuurd; geef er precies één op |
| 400 | invalid_upload_id | upload_id is geen geldig upload-id |
| 400 | upload_not_found | Geen upload met dat id in deze workspace |
| 400 | upload_incomplete | Er is nog geen bestand met PUT naar de upload gestuurd |
| 409 | upload_already_used | De upload is al omgezet in een transcriptie |
| 409 | upload_in_progress | Een ander verzoek is deze upload op dit moment aan het indienen |
| 400 | invalid_filename | Ontbreekt, of heeft geen extensie van een mediabestand |
| 400 | invalid_content_type | Geen MIME-type zoals audio/mp4 |
| 400 | invalid_size | size_bytes is geen positief geheel getal |
| 413 | file_too_large | De opgegeven grootte is groter dan 4 GB |
| 429 | too_many_pending_uploads | De workspace heeft al 25 uploads die wachten op indiening |
| 400 | invalid_language | Ontbreekt of is geen ISO 639-1-code |
| 400 | invalid_temperature | Geen getal tussen 0 en 1 |
| 400 | invalid_num_speakers | Geen geheel getal tussen 1 en 32 |
| 400 | invalid_store_media | Geen boolean |
| 400 | invalid_retention | Niet "standard" of "none", of gecombineerd met store_media true |
| 400 | invalid_metadata | Geen object, of groter dan 1 KB |
| 400 | invalid_settings | Geen object, of groter dan 2 KB |
| 400 | unreadable_source | De duur van de media kon niet worden bepaald |
| 400 | invalid_cursor | starting_after is geen bekend id |
| 400 | invalid_format | Ondertitelformaat niet ondersteund |
| 402 | insufficient_credits | Het tegoed dekt de kosten niet |
| 404 | not_found | Onbekende resource |
| 404 | translation_not_found | De gevraagde taal heeft geen voltooide vertaling voor de geleverde versie |
| 409 | not_ready | Vereist een voltooide transcriptie |
| 409 | operation_in_progress | Er wordt nog een verbetering verwerkt |
| 409 | translation_exists | Deze taal bestaat al voor deze versie |
| 400 | invalid_idempotency_key | Idempotency-Key-header leeg of langer dan 255 tekens |
| 400 | idempotency_key_reused | Idempotency-Key is al gebruikt voor een ander verzoek |
| 409 | idempotency_conflict | Een verzoek met deze sleutel wordt nog verwerkt |
| 429 | rate_limited | Te veel verzoeken — probeer opnieuw na de Retry-After-header |
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" }'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": "…" } }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.
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 }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.
/v1/transcriptionsZet 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
| Veld | Type | Beschrijving |
|---|---|---|
source_url | string | Publieke https-URL van het mediabestand, of een YouTube-, TikTok- of Vimeo-URL. Geef dit of upload_id op |
upload_id | string | Het id van een upload waarvan het bestand al met PUT is verstuurd (zie Uploads). Geef dit of source_url op |
languageverplicht | string | ISO 639-1-code, bijv. "en" of "nb-NO" |
diarization | boolean | Sprekerlabels (standaard false) |
num_speakers | integer | 1–32, hint voor diarization |
temperature | number | Whisper-samplingtemperatuur tussen 0 en 1; standaard 0 (deterministisch) |
store_media | boolean | false = alleen transcriptie: er worden geen afspeelbestanden voorbereid (standaard true) |
retention | string | "none" verwijdert de bronmedia na transcriptie — het transcript blijft bewaard (standaard "standard") |
metadata | object | Je 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
}/v1/transcriptionsStem 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
| Veld | Type | Beschrijving |
|---|---|---|
limit | integer | Paginagrootte, standaard 25, maximaal 100 |
starting_after | string | Cursor: het laatste id van de vorige pagina |
curl "https://api.inwista.ai/v1/transcriptions?limit=10" \
-H "Authorization: Bearer inw_live_…"/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
}/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
}/v1/transcriptions/{id}/captionsHaal 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
| Veld | Type | Beschrijving |
|---|---|---|
formatverplicht | string | srt, vtt, json of txt |
diarization | "true" | Plaats sprekerlabels vóór de tekst |
language | string | Lever een voltooide vertaling in plaats van de brontaal; 404 translation_not_found als die ontbreekt voor de geleverde versie |
revision | string | Haal éé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.srtHet 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.
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.
/v1/uploadsTranscribeer 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
| Veld | Type | Beschrijving |
|---|---|---|
filenameverplicht | string | Moet een extensie van een mediabestand hebben, zoals .m4a, .wav of .mp4; maximaal 180 tekens |
content_type | string | MIME-type van het bestand, standaard application/octet-stream. De PUT moet precies dit Content-Type meesturen |
size_bytes | integer | Opgegeven 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.
/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
}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.
/v1/transcriptions/{id}/enhanceTiming 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
| Veld | Type | Beschrijving |
|---|---|---|
settings | object | Verbeteringsinstellingen van de studio, maximaal 2 KB; weglaten voor de standaardwaarden |
Verbeteringsinstellingen
| Veld | Type | Beschrijving |
|---|---|---|
maxLinesPerBlock | "1" | "2" | Aantal regels dat tegelijk wordt getoond; broadcaststandaard en standaardwaarde is 2 |
maxCharactersPerLine | 1–100 | Tekens per regel; broadcaststandaard en standaardwaarde is 42 |
blockLineBalancing | bottom_heavy | top_heavy | equal | unconstrained | Visuele vorm van tweeregelige blokken; standaard is unconstrained |
textCondensation | none | smart | aggressive | Laat de AI dialoog comprimeren die te snel leest; standaard is none (letterlijk) |
speakerDialogueFormat | none | hyphens | speaker_name | brackets | Hoe meerdere sprekers in één blok worden gescheiden; standaard is none |
continuationMarkers | none | end | start | both | Markeringsplaatsing wanneer een zin meerdere blokken beslaat; standaard is none |
continuationMarkerStyle | dash | ellipsis | Streepje of beletselteken voor gesplitste zinnen; standaard is dash |
gapBetweenBlocks | none | broadcasting | streaming | sdh | Geforceerde lege ruimte tussen opeenvolgende blokken; standaard is broadcasting (~99 ms) |
minBlockDuration | 0.1–60 s | Kortste tijd dat een blok in beeld blijft, in seconden; standaard is 1.0 |
maxBlockDuration | > min | Langste 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
}/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_…"Ondertitelvertaling waarbij de timing van de bron wordt overgenomen — één vertaling per taal per ondertitelversie. Vereist een voltooide transcriptie.
/v1/transcriptions/{id}/translateEé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
| Veld | Type | Beschrijving |
|---|---|---|
target_languageverplicht | string | ISO 639-1-code, bijv. "es" |
target_label | string | Weergavenaam, 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
}/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.vttStel 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
}
]
}