List customers
const url = 'https://api.usesonora.com/v1/customers?includeArchived=true&sort=-createdAt&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?includeArchived=true&sort=-createdAt&limit=25' \ --header 'Authorization: Bearer <token>'Customers newest first, or — with sort=updatedAt — oldest change first, to keep another system in step with Sonora. Archived customers are left out unless includeArchived=true.
Requires the customers:read scope.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Matches the name, website or an email domain, as the customers page’s search does.
Comma-separated stages, matched exactly (ignoring case); a customer in any of them matches.
Comma-separated tiers, matched exactly (ignoring case).
The owner’s email address.
Also list archived customers. A sync should set it, so it sees a customer leave.
Customers changed at or after this instant. With sort=updatedAt, resume a sync from the last updatedAt you saw, a few minutes back.
-createdAt: newest first (the default). updatedAt: oldest change first, for syncing.
Page size, 1–100.
The previous page’s nextCursor, unchanged. Omit for the first page.
Comma-separated optional parts of the response: totalCount, enrichments.
Responses
Section titled “Responses”A page of customers.
object
A customer account.
object
Domains whose email addresses belong to this customer.
Annual recurring revenue.
Sonora’s running summary of the account.
Your workspace’s custom fields, by key — only fields visible in Sonora.
object
As the field’s type says (GET /customer-fields). A user field is a list of people: [{ name, email }].
The record’s id in another system.
object
The system the id is from: salesforce, hubspot, zendesk, intercom, …
The customer’s health, as the customers page shows it.
object
The state’s key on your workspace’s health scale — by default thriving, healthy, emerging_concerns or at_risk — or no_data when nothing could be scored.
The state as Sonora shows it: Thriving, At Risk, …
0–10, higher is healthier. Null when there is nothing to score (no_data).
Whether your scale counts this state as at risk.
ECSAT: satisfaction Sonora estimates from what the customer says, averaged over recent touchpoints.
object
The average estimated satisfaction of the customer’s scored calls, emails and tickets, 0–10, to one decimal.
The days back the average covers.
Only with ?include=enrichments: the latest value of each enrichment that has one, in GET /enrichment-configs order.
A record’s latest value of one enrichment.
object
The enrichment’s id (GET /enrichment-configs/{configId}).
What the value is: short_text/long_text a string, number a number, score 1–10 (10 strongest), boolean, date YYYY-MM-DD, email, url, or select one of options (a list of them with multiple).
As outputType says. Null when there wasn’t enough to go on, for any outputType.
Why the AI gave this value, when it said.
Calls, emails, meetings and tickets Sonora has seen.
Moves on any change to the record, including Sonora’s own bookkeeping (engagement counts), so a sync may see a customer again with no field you read changed.
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.
Example
{ "data": [ { "ecsat": { "windowDays": 90 }, "enrichments": [ { "outputType": "short_text" } ] } ]}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" }}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.