
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 | invalid_language | Ontbreekt of is geen ISO 639-1-code |
| 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, 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.
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_urlverplicht | string | Publieke https-URL van het mediabestand, of een YouTube-, TikTok- of Vimeo-URL |
languageverplicht | string | ISO 639-1-code, bijv. "en" of "nb-NO" |
diarization | boolean | Sprekerlabels (standaard false) |
num_speakers | integer | 1–32, hint voor diarization |
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",
"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",
"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.
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
}
]
}We gebruiken cookies om te begrijpen hoe Inwista wordt gebruikt en om onze advertenties te meten. Privacybeleid · Cookiebeleid