> ## Documentation Index
> Fetch the complete documentation index at: https://developers.telnyx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Collect Results

> Read the finalized transcript, generated artifacts, and recordings after a meeting ends.

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](/api-reference/meeting-session-data/list-meeting-session-transcript).

```bash theme={null}
curl -H "Authorization: Bearer $TELNYX_API_KEY" \
  "https://api.telnyx.com/v2/meeting_sessions/mtgsess_9b2f.../transcript?after=0&limit=1000"
```

```json theme={null}
{
  "data": [
    {
      "seq": 41,
      "text": "let's ship it",
      "speaker_label": "Ada L.",
      "confidence": 0.94,
      "relative_ts": 1240.5,
      "occurred_at": "2026-06-16T09:00:42Z"
    }
  ],
  "meta": {
    "next_after": 41
  }
}
```

The `transcript.completed` webhook fires when the transcript is finalized. See [Webhooks](/docs/meeting/webhooks).

## Artifacts

Artifacts are generated outputs with type `summary` or `action_items`; each type requires 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.

```bash theme={null}
curl -X POST https://api.telnyx.com/v2/meeting_sessions/mtgsess_9b2f.../artifacts \
  -H "Authorization: Bearer $TELNYX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "type": "summary" }'
```

`type` is `summary` (decisions, recap) or `action_items` (owned tasks); the full request schema is on [Create a meeting session artifact](/api-reference/meeting-session-artifacts/create-a-meeting-session-artifact).

### List Artifacts

```bash theme={null}
curl -H "Authorization: Bearer $TELNYX_API_KEY" \
  "https://api.telnyx.com/v2/meeting_sessions/mtgsess_9b2f.../artifacts"
```

### Get an Artifact

```bash theme={null}
curl -H "Authorization: Bearer $TELNYX_API_KEY" \
  "https://api.telnyx.com/v2/meeting_sessions/mtgsess_9b2f.../artifacts/mtgart_..."
```

```json theme={null}
{
  "data": {
    "id": "mtgart_4e7c...",
    "session_id": "mtgsess_9b2f...",
    "type": "summary",
    "status": "completed",
    "content": {
      "text": "Decisions: ... Actions: ..."
    },
    "model_provenance": {
      "model": "example-model",
      "provider": "telnyx"
    },
    "failure_reason": null,
    "created_at": "2026-06-16T09:05:10Z",
    "updated_at": "2026-06-16T09:05:16Z"
  }
}
```

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

If the session records, `GET /v2/meeting_sessions/{id}/recordings` returns the available recordings with short-lived download URLs:

```bash theme={null}
curl -H "Authorization: Bearer $TELNYX_API_KEY" \
  "https://api.telnyx.com/v2/meeting_sessions/mtgsess_9b2f.../recordings"
```

```json theme={null}
{
  "data": [
    {
      "type": "video_mixed",
      "url": "https://...",
      "expires_at": null
    }
  ]
}
```

The full response schema is on [List meeting session recordings](/api-reference/meeting-session-data/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

<Note>
  This endpoint is not yet available in production; calling it currently returns a generic `404`. It is documented ahead of rollout.
</Note>

`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`:

```bash theme={null}
curl -X DELETE https://api.telnyx.com/v2/meeting_sessions/mtgsess_9b2f.../recording_media \
  -H "Authorization: Bearer $TELNYX_API_KEY"
```

```json theme={null}
{
  "data": {
    "meeting_session_id": "mtgsess_9b2f...",
    "provider": "recall",
    "scope": "provider_recording_media",
    "deletion_status": "requested"
  }
}
```

`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](/docs/meeting/join-meeting) -- create a meeting session and send the bot
* [Live Transcript](/docs/meeting/live-transcript) -- follow the transcript stream in real time
* [Webhooks](/docs/meeting/webhooks) -- receive session events on your own endpoint
