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.
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.
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.
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:
promptis required whentypeiscustom, and rejected with400on any named type.- It is trimmed before storage, and echoed back on every artifact —
prompt: nullfor a named type — including in theartifact.completedwebhook 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
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 emptydata 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:
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.
Related
- Join a Meeting — create a meeting session and send the bot
- Live Transcript — follow the transcript stream in real time
- Webhooks — receive session events on your own endpoint