Skip to main content
When the meeting ends, the transcript is finalized and stored. If summarize_on_end was set to true on session creation, a summary artifact is generated via Telnyx Inference (action items are a separate artifact type you request yourself). Read results directly, or have them pushed to a webhook. A terminal ended status alone does not prove the bot attended — check that joined_at is non-null when attendance matters.

Get the Transcript

GET /v2/meeting_sessions/{id}/transcript returns the finalized transcript, cursor-paged: with no query parameters it returns at most the first 100 segments, not the entire transcript. Page with after and limit (1-1,000) until a request comes back with empty data: Cursor and long-poll query parameters (after, limit, wait_seconds) are documented on List meeting session transcript.
The transcript.completed webhook fires when the transcript is finalized. See Webhooks.

Artifacts

Artifacts are generated outputs read from the transcript. Each one is its own request (summarize_on_end attempts only a summary). Trigger one, then poll until it is completed and read the generated text from content.text. An artifact can be requested any time the transcript has content — including while the meeting is still running; a session with an empty transcript returns 409 invalid_state.
Every artifact is an inference run, and every request is billed. Generation happens on Telnyx inference infrastructure rather than as part of the per-minute meeting rates, so each artifact you ask for costs money — including the automatic one from summarize_on_end. Tokens are billed at Inference API rates.

Create an Artifact

POST /v2/meeting_sessions/{id}/artifacts returns 202 Accepted. The request is not idempotent — each call generates a new artifact, and each one is billed. Asking for the same type twice produces two artifacts and two charges, so guard the call rather than relying on the service to collapse it.
The full request schema is on Create a meeting session artifact.

Ask Your Own Question

custom answers an open-ended request from the transcript. It takes a prompt of 1-4000 characters, and the prompt is required:
  • prompt is required when type is custom, and rejected with 400 on any named type.
  • It is trimmed before storage, and echoed back on every artifact — prompt: null for a named type — including in the artifact.completed webhook payload. A consumer can always see what produced a given output.
Answers are grounded in the transcript alone. Nothing else is consulted, and where the transcript cannot answer the request the model is instructed to say so explicitly rather than fill the gap. Treat “the transcript does not say” as a valid answer, not a failure.

List Artifacts

Get an Artifact

Poll the artifact until status is completed or failed. A failed artifact includes a failure_reason. The artifact.completed and artifact.failed webhooks also fire. Generation currently reads at most the first 10,000 transcript segments, so an exceptionally long meeting can produce an incomplete artifact, and model context limits can still cause a failure. An automatic summarize_on_end attempt that is skipped (for example, on an empty transcript) creates no artifact row at all.

Recordings

Sessions record automatically, so a recording is coming. It is not ready the moment the meeting ends, though — the provider still has to process it, and this endpoint returns an empty data array until it does. Wait for the recording.available webhook rather than assuming data[0] exists, or poll if you are not receiving webhooks. GET /v2/meeting_sessions/{id}/recordings returns the available recordings with short-lived download URLs:
The full response schema is on List meeting session recordings. url is a short-lived signed link on the recording provider’s storage; re-fetch this endpoint whenever you need a current URL rather than treating it as durable storage. The current adapter returns expires_at: null — the API does not expose the URL’s actual expiry, and the link still expires. The recording.available webhook fires when a recording is ready; it carries only recording_types and never URLs, so always fetch them from this endpoint.

Delete Recording Media

DELETE /v2/meeting_sessions/{id}/recording_media permanently deletes the provider-hosted recording media for the session (recordings, audio, video, and debug media). This is irreversible and returns 202 Accepted:
provider identifies the media host (for example recall). deletion_status is requested or already_in_progress. Deletion removes the provider-hosted media only — the session, its transcript, events, and artifacts remain intact.