Skip to main content
GET
/
v1
/
core
/
recordings
Get recordings
curl --request GET \
  --url https://functions.siro.ai/api-externalApi/v1/core/recordings \
  --header 'Authorization: Bearer <token>'
{
  "data": [
    {
      "id": "<string>",
      "organizationId": "<string>",
      "userId": "<string>",
      "title": "<string>",
      "durationInMilliseconds": 123,
      "latitude": 123,
      "longitude": 123,
      "createdAt": "<string>",
      "updatedAt": "<string>",
      "links": {
        "web": {
          "self": "<string>"
        }
      },
      "rootDataPurgedAt": "<string>",
      "isProcessingDone": true,
      "isEntityExtractionDone": true,
      "isSummaryDone": true
    }
  ],
  "cursor": "<string>"
}
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:
FlagAddsUse it to
showCrmLinkscrm — external IDs for the CRM records linked to the recordingMap a recording back to the appointment / account / contact in your CRM
showSummarysummary — the recording’s AI summary sectionsPull conversation summaries into your pipeline (e.g. post-call personalization)
showEntityExtractionsentityExtractions — extracted values and their CRM field mappingsWrite extracted fields back to your CRM
They are off by default and additive — omit them and the response is unchanged. Pass =true to enable. 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)
FieldShapeCRM object
integrationConnectionIdstringThe Siro integration connection the links came from
usersarray of {id, externalId}CRM user(s) who own the recording (the rep)
engagement{id, externalId}The CRM engagement / appointment
opportunity{id, externalId}The opportunity
contactsarray 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.
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 with the updatedAt filters to pick up recordings as they become linked.
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.

summary

When showSummary=true, summary is the recording’s AI summary as an ordered array of sections:
FieldDescription
idSummary section ID
nameSection title (the prompt header)
contentGenerated 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:
FieldDescription
nameThe extracted field name
valueThe extracted value
mappingsCRM 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

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>'
{
  "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) and write entityExtractions values back using their mappings.

Authorizations

Authorization
string
header
default:<organization-api-token>
required

Organization integration token from Siro admin (Person icon → API Tokens). Send Authorization: Bearer . This is not the OAuth access token used with api.siro.ai user-scoped endpoints.

Query Parameters

createdAt:gt
string | null

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

createdAt:lt
string | null

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

updatedAt:gte
string | null

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

updatedAt:gt
string | null

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

updatedAt:lt
string | null

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

updatedAt:lte
string | null

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

pageSize
string

Number of results to return per page (default is 25).

cursor
string

Cursor for pagination.

isProcessingDone
enum<string>

Filter by processing status.

Available options:
true,
false
isEntityExtractionDone
enum<string>

Filter by entity extraction status.

Available options:
true,
false
isSummaryDone
enum<string>

Filter by summary status.

Available options:
true,
false

Response

200 - application/json

Get recordings

data
object[]
required
cursor
string | null
required

Opaque cursor for pagination