List feature requests
const url = 'https://api.usesonora.com/v1/feature-requests?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/feature-requests?includeArchived=true&sort=-createdAt&limit=25' \ --header 'Authorization: Bearer <token>'Feature requests across every customer, newest first, or — with sort=updatedAt — oldest change first, to keep another system in step. Requests of archived customers are left out unless includeArchived=true.
Requires the feature-requests:read scope.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Only this customer’s feature requests, by Sonora id. To name the customer by your own system’s id, use GET /customers/{customerId}/… with idType.
Comma-separated statuses, matched without regard to case; feature requests in any of them match.
Comma-separated priorities, matched without case.
Also list feature requests of archived customers. A sync should set it.
Only feature requests Sonora recorded at or after this instant (createdAt).
Only feature requests 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, quotes.
Responses
Section titled “Responses”A page of feature requests.
object
A capability a customer asked for.
object
The customer a record belongs to; GET /customers/{customerId} has the rest of it.
object
open, pending and in_review are still waiting on an answer; others vary.
Who asked, where the source names them; otherwise what found it (Meeting Transcript Analysis).
What the request is worth, in your workspace’s currency, where one was set.
Every source, oldest link first.
A ticket, email, call or conversation an issue or feature request was found in.
object
Where Sonora found it: zendesk_support_tickets, salesforce_support_cases, intercom_tickets, pylon_issues, gmail, gong_calls, slack_conversations, aha_ideas, … New types are added as Sonora reads new systems.
The record’s id in that system — a ticket, case, message or idea id. Null where Sonora keeps none.
Only with ?include=quotes: the customer’s own words, source by source.
A customer’s own words behind an issue or feature request.
object
What the person said or wrote, verbatim.
A person at the customer, where Sonora knows their address.
When Sonora recorded the request.
Moves when the request itself changes. A new source being linked may not move it.
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", "summary": "example", "category": "example", "status": "example", "priority": "example", "requestedAt": "2026-04-15T12:00:00Z", "requestedBy": "example", "estimatedValue": 1, "occurredAt": "2026-04-15T12:00:00Z", "lastActivityAt": "2026-04-15T12:00:00Z", "sourceCount": 1, "sources": [ { "type": "example", "externalId": "example" } ], "quotes": [ { "text": "example", "personName": "example", "personTitle": "example", "personEmail": "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" }}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.