List a customer's meetings
const url = 'https://api.usesonora.com/v1/customers/example/meetings?limit=25';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.usesonora.com/v1/customers/example/meetings?limit=25' \ --header 'Authorization: Bearer <token>'One customer’s meetings, most recent first. Name the customer by its Sonora id, or by your own system’s id with idType.
Requires the meetings:read scope.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The customer’s Sonora id — or, with idType, its id in another system, or its domain.
Query Parameters
Section titled “Query Parameters”How id names the account: sonora (the default; Sonora’s customer id), salesforce, hubspot, domain, or custom_field:<key>.
Meetings starting at or after this instant. A meeting with no start time goes by when Sonora recorded it.
Meetings starting before this instant.
Page size, 1–100.
The previous page’s nextCursor, unchanged. Omit for the first page.
Comma-separated optional parts of the response: totalCount.
Responses
Section titled “Responses”A page of meetings.
object
A meeting with a customer.
object
The customer a record belongs to; GET /customers/{customerId} has the rest of it.
object
What was discussed: your call recorder’s summary, or Sonora’s own from the transcript.
The next steps the summary drew from the meeting.
Organizer first.
Someone invited to a meeting.
object
The Sonora contact this attendee is; null for your own team and anyone unmatched.
object
This resource’s canonical URL on the API host.
Only with ?include=totalCount: every match under the same filters.
Pass as cursor for the next page; null on the last page.
Examplegenerated
{ "data": [ { "id": "example", "customer": { "id": "example", "name": "example" }, "title": "example", "startTime": "2026-04-15T12:00:00Z", "endTime": "2026-04-15T12:00:00Z", "durationSeconds": 1, "summary": "example", "nextSteps": "example", "owner": { "name": "example", "email": "example" }, "attendees": [ { "name": "example", "email": "example", "isOrganizer": true, "contactId": "example" } ], "createdAt": "2026-04-15T12:00:00Z", "updatedAt": "2026-04-15T12:00:00Z", "links": { "self": "example" } } ], "totalCount": 1, "nextCursor": "example"}invalid_request: A parameter or body field is missing, malformed or unknown; details.issues names each.
The one error shape every endpoint answers with.
object
object
Stable snake_case code to branch on; see the error table.
For humans; may change.
object
Quote it when asking for help.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": { "additionalProperty": "example" }, "requestId": "example" }}unauthorized: The Authorization header is missing, or the key is invalid, revoked or expired.
The one error shape every endpoint answers with.
object
object
Stable snake_case code to branch on; see the error table.
For humans; may change.
object
Quote it when asking for help.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": { "additionalProperty": "example" }, "requestId": "example" }}insufficient_scope: The key or token lacks the scope this endpoint needs, and details.required names it; or an OAuth access token called an endpoint only an API key can.
The one error shape every endpoint answers with.
object
object
Stable snake_case code to branch on; see the error table.
For humans; may change.
object
Quote it when asking for help.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": { "additionalProperty": "example" }, "requestId": "example" }}customer_not_found: No customer matches the id (and idType) in the path.
The one error shape every endpoint answers with.
object
object
Stable snake_case code to branch on; see the error table.
For humans; may change.
object
Quote it when asking for help.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": { "additionalProperty": "example" }, "requestId": "example" }}rate_limited: Too many requests for this key; retry after Retry-After seconds.
The one error shape every endpoint answers with.
object
object
Stable snake_case code to branch on; see the error table.
For humans; may change.
object
Quote it when asking for help.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": { "additionalProperty": "example" }, "requestId": "example" }}internal_error: Something went wrong on Sonora’s side. Retry, and quote requestId if it persists.
The one error shape every endpoint answers with.
object
object
Stable snake_case code to branch on; see the error table.
For humans; may change.
object
Quote it when asking for help.
Examplegenerated
{ "error": { "code": "example", "message": "example", "details": { "additionalProperty": "example" }, "requestId": "example" }}Try it
Run this request against your own Sonora workspace. Sign in, pick the workspace, and the page gets an access token that only reads, only what your role covers, for an hour.
Signed in.
As curl
$SONORA_TOKEN is your access token or an API key; the page never shows the token.