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

# Get recordings

> Get recordings

Returns a paginated list of recordings. By default each item contains the recording's core fields; opt into the enrichment blocks below to also pull CRM links, the AI summary, and entity extractions for every recording in the page.

## Enriching the response

The org-scoped recordings endpoints can optionally hydrate three extra blocks of data, each behind an opt-in query flag:

| Flag                    | Adds                                                                | Use it to                                                                       |
| ----------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| `showCrmLinks`          | `crm` — external IDs for the CRM records linked to the recording    | Map a recording back to the appointment / account / contact in your CRM         |
| `showSummary`           | `summary` — the recording's AI summary sections                     | Pull conversation summaries into your pipeline (e.g. post-call personalization) |
| `showEntityExtractions` | `entityExtractions` — extracted values and their CRM field mappings | Write extracted fields back to your CRM                                         |

They are **off by default** and additive — omit them and the response is unchanged. Pass `=true` to enable.

### `crm` — CRM link IDs

When `showCrmLinks=true`, `crm` contains the external IDs of the CRM records the recording is linked to. Every linked object is returned as a pair:

* **`id`** — Siro's internal ID for the object
* **`externalId`** — that object's ID **in your CRM** (use this to join)

| Field                     | Shape                       | CRM object                                          |
| ------------------------- | --------------------------- | --------------------------------------------------- |
| `integrationConnectionId` | `string`                    | The Siro integration connection the links came from |
| `users`                   | array of `{id, externalId}` | CRM user(s) who own the recording (the rep)         |
| `engagement`              | `{id, externalId}`          | The CRM engagement / **appointment**                |
| `opportunity`             | `{id, externalId}`          | The opportunity                                     |
| `contacts`                | array of `{id, externalId}` | Contact(s)                                          |
| `account`                 | `{id, externalId}`          | Account                                             |
| `lead`                    | `{id, externalId}`          | Lead                                                |

This is the same shape emitted by the `integrations.recordingProcessed` webhook, so pull-based polling and push-based webhooks give you identical CRM references.

<Note>
  `crm` is `null` when the recording has no confirmed CRM link yet. Because links can be established after a recording is created, poll the [list endpoint](/api-references/get-recordings) with the `updatedAt` filters to pick up recordings as they become linked.
</Note>

<Warning>
  `engagement` (the appointment) is only populated when the recording is linked to a **CRM-sourced** engagement. Recordings linked only to a Siro-side calendar event return `engagement: null` while still returning `account` / `contact`. To map on the appointment ID, ensure your appointments sync to Siro as CRM engagements. Any field with no linked record is `null`.
</Warning>

### `summary`

When `showSummary=true`, `summary` is the recording's AI summary as an ordered array of sections:

| Field     | Description                       |
| --------- | --------------------------------- |
| `id`      | Summary section ID                |
| `name`    | Section title (the prompt header) |
| `content` | Generated summary text            |

Returns `[]` if the recording has no summary yet.

### `entityExtractions`

When `showEntityExtractions=true`, `entityExtractions` is a flat list of the values extracted from the conversation, including the CRM field each maps to:

| Field      | Description                                                                                    |
| ---------- | ---------------------------------------------------------------------------------------------- |
| `name`     | The extracted field name                                                                       |
| `value`    | The extracted value                                                                            |
| `mappings` | CRM target(s): `[{ crmModelName, crmFieldName }]` — which object and field to write `value` to |

Only successfully completed extractions are included; in-progress or failed extractions are omitted. Returns `[]` if there are none. Use `mappings` to write each `value` to the corresponding field on the CRM record from the `crm` block.

### Example

```bash theme={null}
curl --request GET \
  --url 'https://functions.siro.ai/api-externalApi/v1/core/recordings?updatedAt:gte=2026-06-23T00:00:00.000Z&showCrmLinks=true&showSummary=true&showEntityExtractions=true' \
  --header 'Authorization: Bearer <organization-api-token>'
```

```json theme={null}
{
  "data": [
    {
      "id": "1234-1234-1234-1234-1234",
      "organizationId": "000000000001234",
      "title": "Appointment to Win",
      "result": "WON",
      "createdAt": "2026-06-23T15:42:30.992Z",
      "updatedAt": "2026-06-23T15:47:05.438Z",
      "links": { "web": { "self": "https://app.siro.ai/#/recordings/1234-..." } },

      "crm": {
        "integrationConnectionId": "1234-1234-12345",
        "users":      [{ "id": "1234-...", "externalId": "22222" }],
        "engagement":  { "id": "1234-...", "externalId": "1111" },
        "contacts":   [{ "id": "1234-...", "externalId": "123" }],
        "account":     { "id": "1234-...", "externalId": "1234" },
        "opportunity": null,
        "lead": null
      },

      "summary": [
        { "id": "111111-...", "name": "Meeting Booked", "content": "Yes" }
      ],

      "entityExtractions": [
        {
          "name": "Tech Systems",
          "value": "None",
          "mappings": [{ "crmModelName": "Contact", "crmFieldName": "customer_notes" }]
        }
      ]
    }
  ]
}
```

### Putting it together

A typical pipeline poll:

1. Call `GET /v1/core/recordings?updatedAt:gte=<last_poll>&showCrmLinks=true` to fetch recordings linked since your last poll, with their CRM IDs.
2. Join each recording to your CRM using `crm.engagement.externalId` (appointment) / `crm.account.externalId` / etc.
3. For recordings you want to enrich, request `showSummary` / `showEntityExtractions` (on this list call or the [single-recording endpoint](/api-references/get-recording)) and write `entityExtractions` values back using their `mappings`.


## OpenAPI

````yaml specs/openapi-externalApi.json get /v1/core/recordings
openapi: 3.0.0
info:
  version: 1.0.0
  title: Swagger API
servers:
  - url: https://functions.siro.ai/api-externalApi
    description: Siro API external API endpoint
security: []
externalDocs:
  description: View the raw OpenAPI Specification in JSON format
  url: /swagger.json
paths:
  /v1/core/recordings:
    get:
      summary: Get recordings
      description: Get recordings
      parameters:
        - schema:
            type: string
            nullable: true
            description: >-
              Return results created strictly after the given date (exclusive).
              Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
              2024-06-13T04:00:00.592Z
          required: false
          description: >-
            Return results created strictly after the given date (exclusive).
            Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
            2024-06-13T04:00:00.592Z
          name: createdAt:gt
          in: query
        - schema:
            type: string
            nullable: true
            description: >-
              Return results created strictly before the given date (exclusive).
              Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
              2024-06-13T04:00:00.592Z
          required: false
          description: >-
            Return results created strictly before the given date (exclusive).
            Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
            2024-06-13T04:00:00.592Z
          name: createdAt:lt
          in: query
        - schema:
            type: string
            nullable: true
            description: >-
              Return results updated at or after the given date (inclusive). Use
              this for incremental polling. Format: ISO 8601 timestamp
              (YYYY-MM-DDTHH:mm:ss.sssZ). Example: 2024-06-13T04:00:00.592Z
          required: false
          description: >-
            Return results updated at or after the given date (inclusive). Use
            this for incremental polling. Format: ISO 8601 timestamp
            (YYYY-MM-DDTHH:mm:ss.sssZ). Example: 2024-06-13T04:00:00.592Z
          name: updatedAt:gte
          in: query
        - schema:
            type: string
            nullable: true
            description: >-
              Return results updated strictly after the given date (exclusive).
              Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
              2024-06-13T04:00:00.592Z
          required: false
          description: >-
            Return results updated strictly after the given date (exclusive).
            Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
            2024-06-13T04:00:00.592Z
          name: updatedAt:gt
          in: query
        - schema:
            type: string
            nullable: true
            description: >-
              Return results updated strictly before the given date (exclusive).
              Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
              2024-06-13T04:00:00.592Z
          required: false
          description: >-
            Return results updated strictly before the given date (exclusive).
            Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
            2024-06-13T04:00:00.592Z
          name: updatedAt:lt
          in: query
        - schema:
            type: string
            nullable: true
            description: >-
              Return results updated at or before the given date (inclusive).
              Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
              2024-06-13T04:00:00.592Z
          required: false
          description: >-
            Return results updated at or before the given date (inclusive).
            Format: ISO 8601 timestamp (YYYY-MM-DDTHH:mm:ss.sssZ). Example:
            2024-06-13T04:00:00.592Z
          name: updatedAt:lte
          in: query
        - schema:
            type: string
            description: Number of results to return per page (default is 25).
          required: false
          description: Number of results to return per page (default is 25).
          name: pageSize
          in: query
        - schema:
            type: string
            description: Cursor for pagination.
          required: false
          description: Cursor for pagination.
          name: cursor
          in: query
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
            description: Filter by processing status.
          required: false
          description: Filter by processing status.
          name: isProcessingDone
          in: query
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
            description: Filter by entity extraction status.
          required: false
          description: Filter by entity extraction status.
          name: isEntityExtractionDone
          in: query
        - schema:
            type: string
            enum:
              - 'true'
              - 'false'
            description: Filter by summary status.
          required: false
          description: Filter by summary status.
          name: isSummaryDone
          in: query
      responses:
        '200':
          description: Get recordings
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                        organizationId:
                          type: string
                        userId:
                          type: string
                        title:
                          type: string
                        durationInMilliseconds:
                          type: number
                        latitude:
                          type: number
                        longitude:
                          type: number
                        result:
                          type: string
                          enum:
                            - OPEN
                            - WON
                            - LOST
                        createdAt:
                          type: string
                        updatedAt:
                          type: string
                        rootDataPurgedAt:
                          type: string
                          nullable: true
                        links:
                          type: object
                          properties:
                            web:
                              type: object
                              properties:
                                self:
                                  type: string
                              required:
                                - self
                          required:
                            - web
                        isProcessingDone:
                          type: boolean
                        isEntityExtractionDone:
                          type: boolean
                        isSummaryDone:
                          type: boolean
                      required:
                        - id
                        - organizationId
                        - userId
                        - title
                        - durationInMilliseconds
                        - latitude
                        - longitude
                        - result
                        - createdAt
                        - updatedAt
                        - links
                  cursor:
                    type: string
                    nullable: true
                    description: Opaque cursor for pagination
                required:
                  - data
                  - cursor
      security:
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Organization API token
      description: >-
        Organization integration token from Siro admin (Person icon → API
        Tokens). Send Authorization: Bearer <organization-api-token>. This is
        not the OAuth access token used with api.siro.ai user-scoped endpoints.
      x-default: <organization-api-token>

````