L'API Inwista est là
Overlay

Référence de l'API

Transcrivez, améliorez et traduisez des sous-titres par programmation. URL de base, authentification, chaque endpoint et chaque code d'erreur — le tout sur une seule page.
Base URL: https://api.inwista.ai/v1

Authentification

Cré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…"

Erreurs

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": "…" } }
StatutCodeQuand
401invalid_api_keyÉchec de l'authentification (quelle qu'en soit la raison)
400invalid_source_urlPas en https, identifiants dans l'URL, hôte privé ou URL malformée
400invalid_languageAbsent ou n'est pas un code ISO 639-1
400invalid_num_speakersN'est pas un entier compris entre 1 et 32
400invalid_store_mediaN'est pas un booléen
400invalid_retentionNi "standard" ni "none", ou combiné avec store_media true
400invalid_metadataN'est pas un objet, ou dépasse 1 Ko
400invalid_settingsN'est pas un objet, ou dépasse 2 Ko
400unreadable_sourceLa durée du média n'a pas pu être déterminée
400invalid_cursorstarting_after ne correspond à aucun id connu
400invalid_formatFormat de sous-titres non pris en charge
402insufficient_creditsLe solde du portefeuille ne couvre pas le coût
404not_foundRessource inconnue
404translation_not_foundLa langue demandée n'a pas de traduction terminée pour la version servie
409not_readyNécessite une transcription au statut completed
409operation_in_progressUne amélioration est encore en cours de traitement
409translation_existsCette langue existe déjà pour cette version
400invalid_idempotency_keyEn-tête Idempotency-Key vide ou dépassant 255 caractères
400idempotency_key_reusedIdempotency-Key déjà utilisée pour une autre requête
409idempotency_conflictUne requête avec cette clé est encore en cours de traitement
429rate_limitedTrop de requêtes — réessayez après le délai de l'en-tête Retry-After

Idempotence

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

Limites de requêtes

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": "…" } }

Crédits

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.

Pagination

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 }

Transcriptions

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.

Créer une transcription

POST/v1/transcriptions

Transformez 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

ChampTypeDescription
source_urlobligatoirestringURL https publique du fichier média, ou URL YouTube/TikTok/Vimeo
languageobligatoirestringCode ISO 639-1, par ex. "en" ou "nb-NO"
diarizationbooleanÉtiquettes de locuteurs (false par défaut)
num_speakersinteger1–32, indication pour la diarisation
store_mediabooleanfalse = transcription seule : aucun fichier de lecture n'est préparé (true par défaut)
retentionstring"none" supprime le média source après la transcription — la transcription est conservée ("standard" par défaut)
metadataobjectVos 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
}

Lister les transcriptions

GET/v1/transcriptions

Rapprochez 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

ChampTypeDescription
limitintegerTaille de page, 25 par défaut, 100 au maximum
starting_afterstringCurseur : dernier id de la page précédente
curl "https://api.inwista.ai/v1/transcriptions?limit=10" \
  -H "Authorization: Bearer inw_live_…"

Récupérer une transcription

GET/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
}

Supprimer une transcription

DELETE/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
}

Récupérer les sous-titres

GET/v1/transcriptions/{id}/captions

Ré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

ChampTypeDescription
formatobligatoirestringsrt, vtt, json ou txt
diarization"true"Préfixe les étiquettes de locuteurs
languagestringSert une traduction au statut completed à la place de la source ; 404 translation_not_found si elle n'existe pas pour la version servie
revisionstringRé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.srt

Le 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éliorations

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.

Lancer une amélioration

POST/v1/transcriptions/{id}/enhance

Synchronisation 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

ChampTypeDescription
settingsobjectParamètres d'amélioration du studio, jusqu'à 2 Ko ; omettez pour les valeurs par défaut

Paramètres de l'amélioration

ChampTypeDescription
maxLinesPerBlock"1" | "2"Nombre de lignes affichées à la fois ; norme broadcast et valeur par défaut : 2
maxCharactersPerLine1–100Caractères par ligne ; norme broadcast et valeur par défaut : 42
blockLineBalancingbottom_heavy | top_heavy | equal | unconstrainedForme visuelle des blocs de deux lignes ; par défaut : unconstrained
textCondensationnone | smart | aggressivePermet à l'IA de condenser les dialogues trop rapides à lire ; par défaut : none (mot à mot)
speakerDialogueFormatnone | hyphens | speaker_name | bracketsSéparation de plusieurs locuteurs dans un même bloc ; par défaut : none
continuationMarkersnone | end | start | bothPosition du marqueur quand une phrase s'étend sur plusieurs blocs ; par défaut : none
continuationMarkerStyledash | ellipsisTiret ou points de suspension pour les phrases scindées ; par défaut : dash
gapBetweenBlocksnone | broadcasting | streaming | sdhPause vide forcée entre blocs consécutifs ; par défaut : broadcasting (~99 ms)
minBlockDuration0.1–60 sDurée minimale d'affichage d'un bloc, en secondes ; par défaut : 1.0
maxBlockDuration> minDuré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
}

Récupérer une amélioration

GET/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_…"

Traductions

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.

Lancer une traduction

POST/v1/transcriptions/{id}/translate

Un 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

ChampTypeDescription
target_languageobligatoirestringCode ISO 639-1, par ex. "es"
target_labelstringNom 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
}

Récupérer une traduction

GET/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.vtt

Webhooks

Configurez 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 respectons votre vie privée

Nous utilisons des cookies pour comprendre comment Inwista est utilisé et pour mesurer notre publicité. Politique de confidentialité · Politique de cookies