Skip to content

List a customer's feature requests

GET
/customers/{customerId}/feature-requests
curl --request GET \
--url 'https://api.usesonora.com/v1/customers/example/feature-requests?sort=-createdAt&limit=25' \
--header 'Authorization: Bearer <token>'

One customer’s feature requests, archived customer or not, with the filters and order of GET /feature-requests. Name the customer by its Sonora id, or by your own system’s id with idType.

Requires the feature-requests:read scope.

customerId
required
string

The customer’s Sonora id — or, with idType, its id in another system, or its domain.

status
string

Comma-separated statuses, matched without regard to case; feature requests in any of them match.

priority
string

Comma-separated priorities, matched without case.

createdAfter
string format: date-time

Only feature requests Sonora recorded at or after this instant (createdAt).

updatedAfter
string format: date-time

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.

sort
string
default: -createdAt
Allowed values: -createdAt updatedAt

-createdAt: newest first (the default). updatedAt: oldest change first, for syncing.

limit
integer
default: 25 >= 1 <= 100

Page size, 1–100.

cursor
string
<= 200 characters

The previous page’s nextCursor, unchanged. Omit for the first page.

include
string

Comma-separated optional parts of the response: totalCount, quotes.

idType
string

How id names the account: sonora (the default; Sonora’s customer id), salesforce, hubspot, domain, or custom_field:<key>. So GET /customers/001Ab…?idType=salesforce finds a customer by its Salesforce Account id.

A page of the customer’s feature requests.

Media typeapplication/json
object
data
required
Array<object>

A capability a customer asked for.

object
id
required
string
customer
required

The customer a record belongs to; GET /customers/{customerId} has the rest of it.

object
id
required
string
name
required
string
title
required
string
summary
required
string | null
category
required
string | null
status
required

open, pending and in_review are still waiting on an answer; others vary.

string
priority
required
string | null
requestedAt
required
Any of:
string format: date-time
requestedBy
required

Who asked, where the source names them; otherwise what found it (Meeting Transcript Analysis).

string | null
estimatedValue
required

What the request is worth, in your workspace’s currency, where one was set.

number | null
occurredAt
required
Any of:
string format: date-time
lastActivityAt
required
Any of:
string format: date-time
sourceCount
required
integer
sources
required

Every source, oldest link first.

Array<object>

A ticket, email, call or conversation an issue or feature request was found in.

object
type
required

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.

string
externalId
required

The record’s id in that system — a ticket, case, message or idea id. Null where Sonora keeps none.

string | null
quotes

Only with ?include=quotes: the customer’s own words, source by source.

Array<object>

A customer’s own words behind an issue or feature request.

object
text
required

What the person said or wrote, verbatim.

string
personName
required
string | null
personTitle
required
string | null
personEmail
required

A person at the customer, where Sonora knows their address.

string | null
createdAt
required

When Sonora recorded the request.

string format: date-time
updatedAt
required

Moves when the request itself changes. A new source being linked may not move it.

string format: date-time
links
required
object
self
required

This resource’s canonical URL on the API host.

string
totalCount

Only with ?include=totalCount: every match under the same filters.

integer
nextCursor
required

Pass as cursor for the next page; null on the last page.

string | null
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.

Media typeapplication/json

The one error shape every endpoint answers with.

object
error
required
object
code
required

Stable snake_case code to branch on; see the error table.

string
message
required

For humans; may change.

string
details
object
key
additional properties
requestId
required

Quote it when asking for help.

string | null
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.

Media typeapplication/json

The one error shape every endpoint answers with.

object
error
required
object
code
required

Stable snake_case code to branch on; see the error table.

string
message
required

For humans; may change.

string
details
object
key
additional properties
requestId
required

Quote it when asking for help.

string | null
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.

Media typeapplication/json

The one error shape every endpoint answers with.

object
error
required
object
code
required

Stable snake_case code to branch on; see the error table.

string
message
required

For humans; may change.

string
details
object
key
additional properties
requestId
required

Quote it when asking for help.

string | null
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {
"additionalProperty": "example"
},
"requestId": "example"
}
}

customer_not_found: No customer matches the id (and idType) in the path.

Media typeapplication/json

The one error shape every endpoint answers with.

object
error
required
object
code
required

Stable snake_case code to branch on; see the error table.

string
message
required

For humans; may change.

string
details
object
key
additional properties
requestId
required

Quote it when asking for help.

string | null
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": {
"additionalProperty": "example"
},
"requestId": "example"
}
}

rate_limited: Too many requests for this key; retry after Retry-After seconds.

Media typeapplication/json

The one error shape every endpoint answers with.

object
error
required
object
code
required

Stable snake_case code to branch on; see the error table.

string
message
required

For humans; may change.

string
details
object
key
additional properties
requestId
required

Quote it when asking for help.

string | null
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.

Media typeapplication/json

The one error shape every endpoint answers with.

object
error
required
object
code
required

Stable snake_case code to branch on; see the error table.

string
message
required

For humans; may change.

string
details
object
key
additional properties
requestId
required

Quote it when asking for help.

string | null
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.

GEThttps://api.usesonora.com/v1/customers/{customerId}/feature-requests

As curl

$SONORA_TOKEN is your access token or an API key; the page never shows the token.