Aller au contenu

Créer une réunion et récupérer les résultats

Ce guide parcourt toute la vie d’une réunion créée via l’API : vous envoyez un enregistrement, Meetingize le transcrit avec diarisation des intervenants, rédige le compte rendu IA et, si vous le demandez, génère des documents. À chaque étape, vous voyez quoi appeler et ce que vous recevez.

Vous avez besoin d’une clé API avec le scope write:meetings (pour créer) et read:meetings + read:transcripts (+ read:documents si vous générez des documents) pour lire les résultats.

POST /v1/meetings crée une réunion à partir d’un fichier audio ou vidéo et démarre son traitement. Envoyez soit le fichier lui-même (multipart), soit une URL publique https que Meetingize télécharge.

Fenêtre de terminal
# Avec un fichier (multipart/form-data)
curl -s -X POST "https://app.meetingize.com/api/v1/meetings" \
-H "Authorization: Bearer $MEETINGIZE_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F file=@rdv-dupont.m4a \
-F title="Annual review - Mr Dupont" \
-F recorded_at=2026-10-14T09:30:00Z \
-F language=fr \
-F 'participants=[{"name": "Paul Dupont", "email": "paul.dupont@example.com"}]' \
-F 'tags=["client", "dupont"]'
Fenêtre de terminal
# Avec une URL (application/json)
curl -s -X POST "https://app.meetingize.com/api/v1/meetings" \
-H "Authorization: Bearer $MEETINGIZE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"audio_url": "https://files.example.com/calls/2026-10-14-dupont.mp3",
"title": "Annual review - Mr Dupont",
"recorded_at": "2026-10-14T09:30:00Z",
"language": "fr",
"document_templates": ["tpl_42"],
"metadata": {"crm_id": "C-1042"}
}'
ChampCe qu’il fait
file ou audio_urll’enregistrement, exactement l’un des deux. Fichiers jusqu’à 2 Go (mp3, m4a, wav, flac, ogg, webm, mp4…). Les URL doivent être des adresses https publiques
titletitre de la réunion (300 caractères max). Sans lui, le compte rendu IA nomme la réunion
recorded_atdate de la réunion (ISO 8601). Par défaut : maintenant
languagecode ISO 639-1 (fr, en…) ou auto (par défaut)
recording_typemeeting (plusieurs intervenants, diarisation, par défaut) ou solo (dictée)
participantsliste de {name, email} (50 max). L’attribution des intervenants peut être ajoutée plus tard
tagsnoms de tags (20 max)
client_id ou clientclasse la réunion dans un dossier client : un identifiant cli_<n> existant (GET /v1/clients), ou client = {"name", "email", "phone"} retrouvé par son nom ou créé
transcribe_onlytrue : transcription seule, sans compte rendu IA ni documents (plus rapide et moins cher)
document_templatesjusqu’à 5 ids de modèles (GET /v1/templates) à générer après le compte rendu IA
personaun id de persona (GET /v1/personas) : sans document_templates, génère les modèles de cette persona (5 max)
metadatavotre propre objet JSON (4 Ko max), renvoyé dans les jobs et les événements webhook

Dans les requêtes multipart, participants, tags et document_templates sont des chaînes JSON (tags et modèles acceptent aussi une liste séparée par des virgules).

202 Accepted avec la nouvelle réunion et son job de traitement. Conservez id (la réunion) et job.id.

{
"id": "6f0c2a4e-1b7d-4c55-9a51-3e2d8f0b7c11",
"object": "meeting",
"title": "Annual review - Mr Dupont",
"status": "queued",
"recorded_at": "2026-10-14T09:30:00Z",
"created_at": "2026-10-14T10:02:11Z",
"language": "fr",
"source": "api",
"transcribe_only": false,
"tags": ["client", "dupont"],
"has_transcript": false,
"has_summary": false,
"web_url": "https://app.meetingize.com/meeting/detail?uuid=6f0c2a4e-1b7d-4c55-9a51-3e2d8f0b7c11",
"summary": null,
"participants": [
{ "id": "par_311", "name": "Paul Dupont", "email": "paul.dupont@example.com", "speaker_labels": [] }
],
"documents": [],
"job": {
"id": "job_9b0c2d1e",
"object": "job",
"kind": "meeting_processing",
"status": "queued",
"stage": "queued",
"meeting_id": "6f0c2a4e-1b7d-4c55-9a51-3e2d8f0b7c11",
"document_templates": ["tpl_42"],
"document_job_ids": [],
"metadata": { "crm_id": "C-1042" },
"created_at": "2026-10-14T10:02:11Z"
}
}

Erreurs possibles à cette étape : 400 validation_error (un champ est incorrect, voir errors[]), 413 file_too_large, 402 insufficient_balance ou spend_cap_reached (facturation), 429 parallel_processing_limit (tous les traitements simultanés de votre offre sont occupés, voir limites).

Le job passe par ces états :

statusstageSignification
queuedqueueden attente d’un worker
processingdownloadingaudio_url uniquement : Meetingize télécharge le fichier
processingtranscribingtranscription et diarisation des intervenants
processingsummarizingla transcription est prête, le compte rendu IA est en cours de rédaction
completeddonetranscription et compte rendu IA prêts (transcription seule avec transcribe_only)
failedvoir error.code et error.message

Le status de la réunion elle-même suit le même vocabulaire (queued, processing, completed, failed). Comptez environ un quart de la durée audio pour la transcription, plus une ou deux minutes pour le compte rendu.

Fenêtre de terminal
curl -s "https://app.meetingize.com/api/v1/jobs/job_9b0c2d1e" -H "Authorization: Bearer $MEETINGIZE_API_KEY"
{ "id": "job_9b0c2d1e", "object": "job", "kind": "meeting_processing",
"status": "processing", "stage": "summarizing", "meeting_id": "6f0c2a4e-...", "progress": null }

Interrogez toutes les 10 à 30 secondes, et arrêtez-vous quand status est completed ou failed. Le polling ne compte pas sur votre forfait API, seulement sur la limite de débit.

Enregistrez un endpoint une fois (webhooks) et Meetingize vous appelle :

ÉvénementQuandCe que vous pouvez lire maintenant
transcription.completedla transcription diarisée est prête (stage summarizing)la transcription
processing.completedle compte rendu IA est prêt, job completedtranscription, compte rendu, participants
document.generatedchaque document demandé est prêtle document
transcription.failed, processing.failed, document.failedune étape a échouéerror dans l’événement
{
"id": "evt_7d1f...",
"object": "event",
"type": "processing.completed",
"created": "2026-10-14T10:09:42Z",
"api_version": "2026-10-01",
"data": {
"object": {
"id": "job_9b0c2d1e", "object": "job", "kind": "meeting_processing", "status": "completed", "stage": "done",
"meeting_id": "6f0c2a4e-...", "document_job_ids": ["job_a41f..."], "metadata": { "crm_id": "C-1042" },
"meeting": { "id": "6f0c2a4e-...", "object": "meeting", "title": "Annual review - Mr Dupont", "status": "completed" }
}
}
}

Votre metadata revient dans chaque événement, ce qui facilite le rapprochement de l’événement avec votre propre enregistrement.

Dès que le stage atteint summarizing (événement transcription.completed) :

Fenêtre de terminal
curl -s "https://app.meetingize.com/api/v1/meetings/6f0c2a4e-.../transcript" -H "Authorization: Bearer $MEETINGIZE_API_KEY"
{
"object": "transcript",
"meeting_id": "6f0c2a4e-...",
"language": "fr",
"duration_seconds": 2412,
"speakers": ["SPEAKER_00", "SPEAKER_01"],
"segments": [
{ "start": 14.2, "end": 21.9, "speaker": "SPEAKER_00", "speaker_name": null,
"text": "Je m'engage à vous envoyer une proposition d'allocation avant vendredi." }
]
}

Ajoutez ?format=md, txt, srt ou vtt pour les formats texte. Avant ce point, l’endpoint répond 409 transcript_not_ready.

Quand le job est completed (événement processing.completed) :

Fenêtre de terminal
curl -s "https://app.meetingize.com/api/v1/meetings/6f0c2a4e-.../summary?format=md" -H "Authorization: Bearer $MEETINGIZE_API_KEY"

Le format JSON renvoie markdown plus un objet structured (résumé court et long, compte rendu, points clés, actions à mener, identification des intervenants). GET /v1/meetings/{id} renvoie tout en une fois : métadonnées, compte rendu, participants et documents. Non disponible avec transcribe_only.

Les documents listés dans document_templates (ou les modèles de la persona) sont générés après le compte rendu. Chacun est un job enfant (document_job_ids, type document_generation) qui se termine par un événement document.generated :

Fenêtre de terminal
curl -s "https://app.meetingize.com/api/v1/documents?meeting_id=6f0c2a4e-..." -H "Authorization: Bearer $MEETINGIZE_API_KEY"
curl -s "https://app.meetingize.com/api/v1/documents/doc_1234?format=md" -H "Authorization: Bearer $MEETINGIZE_API_KEY"

Formats : json (métadonnées et Markdown), md, pdf, docx. Vous pouvez aussi générer des documents plus tard, à tout moment, avec POST /v1/meetings/{id}/documents (documents).

Étape 6 (optionnelle) : corriger les métadonnées

Section intitulée « Étape 6 (optionnelle) : corriger les métadonnées »

PATCH /v1/meetings/{id} met à jour le titre, la date, les tags et les participants d’une réunion, par exemple pour indiquer qui est quel intervenant une fois que vous le savez :

Fenêtre de terminal
curl -s -X PATCH "https://app.meetingize.com/api/v1/meetings/6f0c2a4e-..." \
-H "Authorization: Bearer $MEETINGIZE_API_KEY" -H "Content-Type: application/json" \
-d '{"participants": {"update": [{"id": "par_311", "speaker_labels": ["SPEAKER_01"]}],
"add": [{"name": "Claire Martin", "speaker_labels": ["SPEAKER_00"]}]}}'

Les changements de participants sont add, update (seuls les champs que vous envoyez changent ; speaker_labels remplace la liste) et remove (une liste d’ids par_). Aucun e-mail n’est jamais envoyé aux participants par l’API. DELETE /v1/meetings/{id} supprime la réunion avec son enregistrement, sa transcription, son compte rendu et ses documents ; cela ne peut pas être annulé.

  • Envoyez toujours une Idempotency-Key sur POST : une nouvelle tentative ne crée jamais une seconde réunion.
  • Préférez les webhooks au polling pour les intégrations ; gardez le polling en secours.
  • Utilisez transcribe_only quand vous n’avez besoin que du texte : plus rapide et moins cher.
  • Placez vos propres identifiants dans metadata.
  • Respectez 429 et Retry-After (limites).