Skip to content

Meeting management API reference

Generated from the OpenAPI specification (version 2026-10-01). Base URL: https://app.meetingize.com/api. All requests need Authorization: Bearer <API key or OAuth token>. Try them in the API explorer.

Create a meeting from an audio file or URL

Section titled “Create a meeting from an audio file or URL”
POST /v1/meetings

Creates a meeting and starts its processing: transcription with speaker diarization, then the AI meeting report (summary, action items…), then the documents you asked for. This is the only way to send audio to Meetingize.

Input: either multipart/form-data with file (max 2 GB), or application/json with audio_url (public https URL, downloaded by Meetingize). In multipart, tags, participants, document_templates and metadata are JSON strings (tags and templates also accept comma-separated lists).

Options: title, recorded_at (meeting date), language (default auto-detect), recording_type (meeting = several speakers, solo = dictation), participants (names/emails, optionally with the speaker labels they correspond to; never emailed), tags, document_templates (up to 5 tpl_ ids, generated automatically after the report) or persona (its templates, max 5), metadata (your JSON, echoed in jobs and webhooks).

Client: attach the meeting to a client folder (same as the webapp client column) with client_id (cli_..., see GET /clients) or client: {name, email, phone} (an existing client with this name is reused, otherwise it is created; email/phone optional). Changeable with PATCH, filterable with GET /meetings?client=.

transcribe_only: true: only the transcript is produced (no AI report, no documents, cheaper). The meeting is completed as soon as the transcript is ready.

Response (202): the created meeting (status: queued) with its job. Then either poll GET /jobs/{job.id} (or GET /meetings/{id}) every 10 to 30 seconds, or wait for the webhooks: transcription.completed (transcript readable), then processing.completed (report ready, or end of a transcribe_only processing), and document.generated for each requested document. On error: transcription.failed or processing.failed. Typical duration: 2 to 4 minutes per hour of audio.

Parallel processing quota: same rule as the webapp. Your plan allows N simultaneous processings (meetings being processed + documents being generated, webapp and API together; Free 1 by default). Above it the request is refused with 429 parallel_processing_limit and Retry-After: 30; nothing is queued on our side, retry later.

Billing: consumption (audio minutes, LLM tokens) is measured after completion and debited from the monthly API allowance of your plan, then billed on demand if you enabled it (spend cap). If nothing can pay, the request is refused with 402 (insufficient_balance or spend_cap_reached).

Required scope: write:meetings. Supports Idempotency-Key (strongly recommended: a retried upload must not create two meetings).

ParameterInTypeRequiredDescription
Idempotency-KeyheaderstringOptional unique key (max 255 characters, a UUID v4 is recommended) that makes the request safe to retry. If a network error leaves you unsure whether the request was received, send it again with the same key: if it was already processed, you get the original response again (header Idempotent-Replayed: true) and nothing is created twice (no duplicate meeting, no double billing). Keys are kept 24 hours per account. Same key with a different body: 422 idempotency_key_reused; same key while the first request is still being processed: 409 idempotency_key_in_use. Example: Idempotency-Key: 6f1c2a3e-9b7d-4c1e-8f2a-0d3b4c5e6f70.

Request body (multipart/form-data)

FieldTypeRequiredDescription
titlestringDefaults to the AI-generated title, else file name
recorded_atstring (date-time)Meeting date (ISO 8601). Default: now
languagestringISO 639-1 (fr, en, …) or auto (default)
recording_typemeeting, solomeeting (several speakers, diarization, default) or solo (dictation)
transcribe_onlybooleantrue: transcript only (no AI report, no documents, cheaper)
personastringPersona id (GET /personas): without document_templates, generates the persona templates (max 5) after the report
metadataobjectYour own JSON object (max 4 KB), echoed in jobs and webhooks
client_idstringExisting client (cli_, see GET /clients)
filestring (binary)yesAudio or video file (max 2 GB): mp3, m4a, wav, flac, ogg, webm, mp4…
tagsstringJSON array or comma-separated list
participantsstringJSON array of {name, email, speaker_labels}
document_templatesstringJSON array or comma-separated tpl_ ids
clientstringJSON object {name, email, phone} or just a client name

Request body (application/json)

FieldTypeRequiredDescription
titlestringDefaults to the AI-generated title, else file name
recorded_atstring (date-time)Meeting date (ISO 8601). Default: now
languagestringISO 639-1 (fr, en, …) or auto (default)
recording_typemeeting, solomeeting (several speakers, diarization, default) or solo (dictation)
transcribe_onlybooleantrue: transcript only (no AI report, no documents, cheaper)
personastringPersona id (GET /personas): without document_templates, generates the persona templates (max 5) after the report
metadataobjectYour own JSON object (max 4 KB), echoed in jobs and webhooks
client_idstringExisting client (cli_, see GET /clients)
audio_urlstring (uri)yesPublic https URL of the audio/video file, downloaded by Meetingize
tagsarray of string
participantsarray of object
document_templatesarray of stringTemplates to generate after the AI report (max 5)
clientobjectClient found by name or created (alternative to client_id)

Responses

  • 202:
  • 400: Validation error
  • 401: Missing or invalid credential
  • 402: Insufficient balance or spend cap reached
  • 403: Insufficient scope
  • 404: Not found (also for resources of other accounts)
  • 429: Rate limit (rate_limited) or parallel processing quota (parallel_processing_limit) exceeded; see Retry-After
Response fields (202)
FieldTypeRequiredDescription
idstring (uuid)yes
objectstringyes
titlestringyes
statusdraft, queued, processing, completed, failedyesdraft (no audio yet, webapp only), queued, processing (transcription then AI report), completed (transcript + report ready; transcript only when transcribe_only), failed
transcribe_onlybooleanyesCreated with transcribe_only=true: no AI report, no documents
recorded_atstring (date-time)yesDate of the meeting (recorded_at at creation, else upload date)
created_atstring (date-time)yes
updated_atstring (date-time)yes
duration_secondsinteger | null
languagestring | null
sourceupload, live_recording, text, url, api | null
recording_typemeeting, solo | null
tagsarray of stringyes
clientobject | nullClient folder the meeting belongs to
has_transcriptbooleanyes
has_summarybooleanyes
web_urlstring (uri)yes
summaryobject | null
participantsarray of objectyes
documentsarray of objectyes
jobobject | nullLatest processing job of the meeting when created via the API (null for webapp meetings): what to poll with GET /jobs/{job_id}
Terminal window
curl -s -X POST "https://app.meetingize.com/api/v1/meetings" \
-H "Authorization: Bearer $MEETINGIZE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'

Update a meeting (title, date, tags, participants)

Section titled “Update a meeting (title, date, tags, participants)”
PATCH /v1/meetings/{meeting_id}

Partial update; only the fields sent are changed.

  • title: replaces the title (it then stays fixed even if the AI report is regenerated).
  • recorded_at: meeting date.
  • tags: replaces the whole tag list ([] removes all).
  • client_id / client: attach to an existing client or find/create one by name; client: null detaches the meeting from its client.
  • participants: add (name/email/speaker_labels), update (by par_ id, only fields present; speaker_labels replaces the participant’s labels), remove (by par_ id). A speaker label belongs to one participant at most: assigning it moves it. Labels must exist in the transcript (SPEAKER_00…). Speaker names then appear in the transcript (speaker_name) and exports. Removing a person the meeting is shared with (webapp sharing) only removes them from the participants, their access is kept.

No email is ever sent by this endpoint. The AI report is not regenerated. Required scope: write:meetings.

ParameterInTypeRequiredDescription
meeting_idpathstringyes

Request body (application/json)

FieldTypeRequiredDescription
titlestring
recorded_atstring (date-time)
tagsarray of stringReplaces all tags
participantsobject
client_idstring | nullAttach to an existing client
clientobject | nullFind/create by name; null detaches

Responses

  • 200:
  • 400: Validation error
  • 401: Missing or invalid credential
  • 403: Insufficient scope
  • 404: Not found (also for resources of other accounts)
  • 429: Rate limit (rate_limited) or parallel processing quota (parallel_processing_limit) exceeded; see Retry-After
Response fields (200)
FieldTypeRequiredDescription
idstring (uuid)yes
objectstringyes
titlestringyes
statusdraft, queued, processing, completed, failedyesdraft (no audio yet, webapp only), queued, processing (transcription then AI report), completed (transcript + report ready; transcript only when transcribe_only), failed
transcribe_onlybooleanyesCreated with transcribe_only=true: no AI report, no documents
recorded_atstring (date-time)yesDate of the meeting (recorded_at at creation, else upload date)
created_atstring (date-time)yes
updated_atstring (date-time)yes
duration_secondsinteger | null
languagestring | null
sourceupload, live_recording, text, url, api | null
recording_typemeeting, solo | null
tagsarray of stringyes
clientobject | nullClient folder the meeting belongs to
has_transcriptbooleanyes
has_summarybooleanyes
web_urlstring (uri)yes
summaryobject | null
participantsarray of objectyes
documentsarray of objectyes
jobobject | nullLatest processing job of the meeting when created via the API (null for webapp meetings): what to poll with GET /jobs/{job_id}
Terminal window
curl -s -X PATCH "https://app.meetingize.com/api/v1/meetings/<meeting_id>" \
-H "Authorization: Bearer $MEETINGIZE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'
DELETE /v1/meetings/{meeting_id}

Deletes the meeting and everything attached (audio, transcript, report, documents), exactly like the webapp. A processing in progress is cancelled. Irreversible. Usage already consumed stays in the ledger and the deleted documents keep counting in the webapp quotas. Required scope: write:meetings.

ParameterInTypeRequiredDescription
meeting_idpathstringyes

Responses

  • 204: No response body
  • 400: Validation error
  • 401: Missing or invalid credential
  • 403: Insufficient scope
  • 404: Not found (also for resources of other accounts)
  • 429: Rate limit (rate_limited) or parallel processing quota (parallel_processing_limit) exceeded; see Retry-After
Terminal window
curl -s -X DELETE "https://app.meetingize.com/api/v1/meetings/<meeting_id>" \
-H "Authorization: Bearer $MEETINGIZE_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'