
Base URL: https://api.inwista.ai/v1Créez une clé API dans Dashboard → API Keys (réservé aux administrateurs de l'espace de travail). La clé ne s'affiche qu'une seule fois — conservez-la comme un mot de passe.
Envoyez la clé comme jeton Bearer dans chaque requête. Chaque clé est liée à un seul espace de travail : tout ce que renvoie l'API lui appartient. Les ressources créées via l'API sont visibles dans le tableau de bord, mais les projets du tableau de bord ne sont pas exposés par l'API.
Tout échec d'authentification — en-tête manquant, clé inconnue, clé révoquée — renvoie la même réponse 401.
curl https://api.inwista.ai/v1/transcriptions \
-H "Authorization: Bearer inw_live_4f6a…"Toutes les erreurs partagent la même enveloppe : un objet contenant un code lisible par une machine et un message lisible par un humain. Au sein de la v1, la liste des codes ne peut que s'allonger — appuyez-vous sur le code, jamais sur le message.
{ "error": { "code": "insufficient_credits", "message": "…" } }| Statut | Code | Quand |
|---|---|---|
| 401 | invalid_api_key | Échec de l'authentification (quelle qu'en soit la raison) |
| 400 | invalid_source_url | Pas en https, identifiants dans l'URL, hôte privé ou URL malformée |
| 400 | invalid_language | Absent ou n'est pas un code ISO 639-1 |
| 400 | invalid_num_speakers | N'est pas un entier compris entre 1 et 32 |
| 400 | invalid_store_media | N'est pas un booléen |
| 400 | invalid_retention | Ni "standard" ni "none", ou combiné avec store_media true |
| 400 | invalid_metadata | N'est pas un objet, ou dépasse 1 Ko |
| 400 | invalid_settings | N'est pas un objet, ou dépasse 2 Ko |
| 400 | unreadable_source | La durée du média n'a pas pu être déterminée |
| 400 | invalid_cursor | starting_after ne correspond à aucun id connu |
| 400 | invalid_format | Format de sous-titres non pris en charge |
| 402 | insufficient_credits | Le solde du portefeuille ne couvre pas le coût |
| 404 | not_found | Ressource inconnue |
| 404 | translation_not_found | La langue demandée n'a pas de traduction terminée pour la version servie |
| 409 | not_ready | Nécessite une transcription au statut completed |
| 409 | operation_in_progress | Une amélioration est encore en cours de traitement |
| 409 | translation_exists | Cette langue existe déjà pour cette version |
| 400 | invalid_idempotency_key | En-tête Idempotency-Key vide ou dépassant 255 caractères |
| 400 | idempotency_key_reused | Idempotency-Key déjà utilisée pour une autre requête |
| 409 | idempotency_conflict | Une requête avec cette clé est encore en cours de traitement |
| 429 | rate_limited | Trop de requêtes — réessayez après le délai de l'en-tête Retry-After |
Chaque appel POST débite des crédits à l'acceptation : une requête qui expire puis est réessayée à l'aveugle créerait donc un second travail et un second débit. Envoyez un en-tête Idempotency-Key (toute chaîne unique de 255 caractères maximum) et les nouvelles tentatives deviennent sûres : la réponse de la première requête est conservée 24 heures et renvoyée à l'identique pour chaque nouvelle tentative avec la même clé.
Réutiliser une clé avec une requête différente renvoie 400 idempotency_key_reused ; réessayer pendant que l'originale est encore en cours renvoie 409 idempotency_conflict. Les réponses d'erreur ne sont jamais conservées — une requête échouée ne garde jamais son débit, la clé est donc libérée pour une nouvelle tentative propre.
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" }'Chaque clé d'API peut effectuer 300 requêtes de lecture (GET) et 60 requêtes d'écriture (POST) par minute. Le quota se recharge en continu et peut être consommé d'un coup. Au-delà, l'API répond 429 rate_limited avec un en-tête Retry-After en secondes.
Considérez ces chiffres comme indicatifs : ralentissez à chaque 429 et préférez les webhooks à un polling serré.
HTTP/1.1 429 Too Many Requests
Retry-After: 12
{ "error": { "code": "rate_limited", "message": "…" } }Les opérations sont décomptées en crédits depuis le portefeuille prépayé de votre espace de travail (rechargeable dans Dashboard → Billing). La transcription coûte 4 crédits par minute de média entamée. L'amélioration et la traduction sont facturées selon la taille du contenu — aux mêmes tarifs que le studio. Récupérer, lister et interroger le statut sont des opérations gratuites.
Le débit a lieu à l'acceptation de la requête. Si une opération échoue, le montant est remboursé automatiquement et la ressource indique credits_charged: 0. Un rejet 402 n'entraîne jamais de débit.
Les endpoints de liste acceptent limit (25 par défaut, 100 au maximum) et starting_after — le dernier id de la page précédente. Les réponses enveloppent les résultats dans un objet list avec has_more.
{ "object": "list", "data": [ … ], "has_more": true }Soumettez un média par URL, interrogez le statut jusqu'à completed (ou utilisez les webhooks), puis récupérez les sous-titres. Les statuts sont processing, completed et failed. Les horodatages sont exprimés en secondes unix.
Le suivi et le résultat partagent le même endpoint : GET /v1/transcriptions/{id} sert à la fois à surveiller le statut ET à lire la ressource finale — il n'existe pas d'endpoint de résultat distinct. Seule exception : les fichiers de sous-titres eux-mêmes, toujours servis par l'endpoint captions, car ce sont des corps de fichiers bruts et non du JSON.
/v1/transcriptionsTransformez n'importe quel fichier média hébergé en sous-titres précis et horodatés sans que personne n'ouvre le studio — alimentez directement votre CMS, vos archives ou votre chaîne de publication.
La durée du média est analysée avant l'acceptation de la requête ; le portefeuille est débité et la tâche mise en file d'attente en une seule étape atomique. Renvoie 201 avec la ressource de transcription.
Crédits: 4 crédits par minute de média entamée, débités à l'acceptation de la tâche. Les tâches échouées sont remboursées automatiquement.
Corps
| Champ | Type | Description |
|---|---|---|
source_urlobligatoire | string | URL https publique du fichier média, ou URL YouTube/TikTok/Vimeo |
languageobligatoire | string | Code ISO 639-1, par ex. "en" ou "nb-NO" |
diarization | boolean | Étiquettes de locuteurs (false par défaut) |
num_speakers | integer | 1–32, indication pour la diarisation |
store_media | boolean | false = transcription seule : aucun fichier de lecture n'est préparé (true par défaut) |
retention | string | "none" supprime le média source après la transcription — la transcription est conservée ("standard" par défaut) |
metadata | object | Vos propres étiquettes, jusqu'à 1 Ko, renvoyées telles quelles |
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
}'Réponse
{
"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/transcriptionsRapprochez votre catalogue des tâches traitées ou construisez un tableau de bord sur tout ce que vous avez transcrit.
Les transcriptions créées via l'API, de la plus récente à la plus ancienne. Pagination standard.
Crédits: Gratuit.
Paramètres de requête
| Champ | Type | Description |
|---|---|---|
limit | integer | Taille de page, 25 par défaut, 100 au maximum |
starting_after | string | Curseur : dernier id de la page précédente |
curl "https://api.inwista.ai/v1/transcriptions?limit=10" \
-H "Authorization: Bearer inw_live_…"/v1/transcriptions/{id}À la fois le suivi de progression et le résultat final : observez le statut passer à completed, puis lisez la durée, la langue et le montant débité dans la même réponse.
Interrogez jusqu'à ce que le statut soit completed (ou enregistrez un webhook, voir plus bas). La lecture d'une transcription au statut failed déclenche aussi son remboursement automatique.
Crédits: Gratuit.
curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2… \
-H "Authorization: Bearer inw_live_…"Réponse
{
"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}Supprimez un traitement à la demande — contrôle total de vos données en un seul appel.
Supprime définitivement la transcription et tout ce qui est stocké pour elle : fichiers médias, contenu de la transcription, révisions, traductions et commentaires. Les compteurs de facturation agrégés sont conservés — ils ne contiennent aucun contenu.
Seuls les traitements terminés ou échoués peuvent être supprimés ; un traitement encore en cours renvoie 409, de même qu'un traitement avec une amélioration ou une traduction en cours. La suppression est immédiate et irréversible.
Crédits: endpoints.delete-transcription.pricing
curl -X DELETE https://api.inwista.ai/v1/transcriptions/aB3dE9f2… \
-H "Authorization: Bearer inw_live_…"Réponse
{
"id": "aB3dE9f2…",
"object": "transcription",
"deleted": true
}/v1/transcriptions/{id}/captionsRécupérez des fichiers de sous-titres prêts pour la diffusion directement dans votre lecteur, votre MAM ou votre chaîne de livraison — sans export manuel ni conversion de format de votre côté. Dans une chaîne de production vidéo, le SRT ou le VTT final arrive directement dans votre logiciel de montage, votre outil de relecture ou votre étape de packaging dès qu'un montage est transcrit.
Renvoie le corps brut du fichier de sous-titres avec le Content-Type correspondant — sans enveloppe JSON. Répond 409 not_ready tant que la transcription n'est pas terminée.
Crédits: Gratuit.
Paramètres de requête
| Champ | Type | Description |
|---|---|---|
formatobligatoire | string | srt, vtt, json ou txt |
diarization | "true" | Préfixe les étiquettes de locuteurs |
language | string | Sert une traduction au statut completed à la place de la source ; 404 translation_not_found si elle n'existe pas pour la version servie |
revision | string | Récupère une version précise (l'id d'une amélioration est son id de révision) ; omis = la plus récente |
curl "https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/captions?format=srt" \
-H "Authorization: Bearer inw_live_…" -o interview.srtLe format json est un contrat versionné : { version: 1, language, segments: [{ index, start, end, text, speaker? }] } — des secondes avec une précision à la milliseconde, et au sein d'une même version, des champs ne peuvent qu'être ajoutés.
Les traductions appartiennent à la version pour laquelle elles ont été créées — le revision_id de la ressource de traduction la désigne, et la version d'une amélioration ultérieure n'en hérite pas. Passez ce revision_id comme revision pour récupérer la version traduite.
Amélioration des sous-titres par IA — longueur des lignes, équilibrage et règles de synchronisation — produisant une nouvelle version des sous-titres. Nécessite une transcription au statut completed. Une fois l'amélioration terminée, la récupération des sous-titres sert automatiquement la version améliorée.
/v1/transcriptions/{id}/enhanceSynchronisation et équilibrage des lignes de qualité broadcast, en pilote automatique — livrez des sous-titres qui passent le contrôle qualité sans qu'un monteur n'y touche. Pour les sociétés de production, cela automatise l'étape de conformation des sous-titres dans la chaîne de livraison : chaque épisode part avec des sous-titres cohérents et conformes aux spécifications.
Renvoie 202 avec la ressource d'amélioration.
Crédits: Calculé à partir de la taille du contenu des sous-titres, au même tarif que le studio, déduit à l'acceptation de la tâche. Remboursé automatiquement en cas d'échec.
Corps
| Champ | Type | Description |
|---|---|---|
settings | object | Paramètres d'amélioration du studio, jusqu'à 2 Ko ; omettez pour les valeurs par défaut |
Paramètres de l'amélioration
| Champ | Type | Description |
|---|---|---|
maxLinesPerBlock | "1" | "2" | Nombre de lignes affichées à la fois ; norme broadcast et valeur par défaut : 2 |
maxCharactersPerLine | 1–100 | Caractères par ligne ; norme broadcast et valeur par défaut : 42 |
blockLineBalancing | bottom_heavy | top_heavy | equal | unconstrained | Forme visuelle des blocs de deux lignes ; par défaut : unconstrained |
textCondensation | none | smart | aggressive | Permet à l'IA de condenser les dialogues trop rapides à lire ; par défaut : none (mot à mot) |
speakerDialogueFormat | none | hyphens | speaker_name | brackets | Séparation de plusieurs locuteurs dans un même bloc ; par défaut : none |
continuationMarkers | none | end | start | both | Position du marqueur quand une phrase s'étend sur plusieurs blocs ; par défaut : none |
continuationMarkerStyle | dash | ellipsis | Tiret ou points de suspension pour les phrases scindées ; par défaut : dash |
gapBetweenBlocks | none | broadcasting | streaming | sdh | Pause vide forcée entre blocs consécutifs ; par défaut : broadcasting (~99 ms) |
minBlockDuration | 0.1–60 s | Durée minimale d'affichage d'un bloc, en secondes ; par défaut : 1.0 |
maxBlockDuration | > min | Durée maximale d'affichage d'un bloc, en secondes ; par défaut : 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" } }'Réponse
{
"id": "rev8Xk3…",
"object": "enhancement",
"transcription_id": "aB3dE9f2…",
"status": "processing",
"progress": 0,
"credits_charged": 12,
"error": null,
"created": 1754559000
}/v1/transcriptions/{id}/enhancements/{enhancementId}Suivi et résultat en un seul endpoint : dès que le statut indique completed, l'endpoint captions sert déjà la version améliorée.
Interrogez jusqu'au statut completed. La lecture d'une amélioration au statut failed déclenche son remboursement automatique.
Crédits: Gratuit.
curl https://api.inwista.ai/v1/transcriptions/aB3dE9f2…/enhancements/rev8Xk3… \
-H "Authorization: Bearer inw_live_…"Traduction des sous-titres avec la synchronisation héritée de la source — une traduction par langue et par version de sous-titres. Nécessite une transcription au statut completed.
/v1/transcriptions/{id}/translateUn appel par langue transforme une piste de sous-titres terminée en version localisée à la synchronisation identique — multipliez la portée de chaque vidéo que vous possédez déjà.
Renvoie 202. Répond 409 translation_exists si cette langue existe déjà pour la version courante.
Crédits: Calculé à partir de la taille du contenu des sous-titres, au même tarif que le studio, par langue cible, déduit à l'acceptation. Remboursé automatiquement en cas d'échec.
Corps
| Champ | Type | Description |
|---|---|---|
target_languageobligatoire | string | Code ISO 639-1, par ex. "es" |
target_label | string | Nom d'affichage, jusqu'à 60 caractères |
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" }'Réponse
{
"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}Suivi et résultat en un seul endpoint : une fois le statut completed atteint, récupérez le fichier de sous-titres traduit via l'endpoint captions avec le paramètre language.
Interrogez jusqu'au statut completed, puis récupérez les sous-titres traduits via l'endpoint captions avec le paramètre de requête language.
Crédits: Gratuit.
# 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.vttConfigurez un webhook dans Dashboard → Integrations → Webhook pour recevoir les événements transcript.completed au lieu d'interroger l'API. Les charges utiles sont signées en HMAC-SHA256 (X-Inwista-Signature: sha256=<hex> sur le corps brut de la requête), avec le secret de signature affiché une seule fois lors de la configuration. Les URL de fichiers sont pré-signées et expirent après 24 heures.
{
"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
}
]
}Nous utilisons des cookies pour comprendre comment Inwista est utilisé et pour mesurer notre publicité. Politique de confidentialité · Politique de cookies