Skip to content

Resolve or reopen an issue

PATCH
/issues/{issueId}
curl --request PATCH \
--url https://api.usesonora.com/v1/issues/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "status": "open" }'

Mark an issue resolved, or reopen it, as the issue panel in Sonora does. Only for an issue no support ticket backs: a ticket’s own status sets its issue’s on every sync, so changing it here is 409 status_managed_by_source. Setting the status the issue already has changes nothing. A resolved issue still reopens on its own when a conversation raises it again.

Requires the issues:write scope. API keys only.

issueId
required
string format: uuid
Media typeapplication/json

The status to set. Only open and resolved: the statuses a person can set in Sonora.

object
status
required

resolved to mark the issue resolved; open to reopen it.

string
Allowed values: open resolved

The issue, with its new status.

Media typeapplication/json

A problem a customer raised.

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
category
required
string | null
status
required

As the source system spells it (open, Pending, Closed - Duplicate, …); null when it gave none.

string | null
priority
required

As the source system or Sonora’s analysis set it.

string | 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, in the issue’s order.

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 issue.

string format: date-time
updatedAt
required

Moves on any change to the issue, including a new source being linked.

string format: date-time
links
required
object
self
required

This resource’s canonical URL on the API host.

string
Examplegenerated
{
"id": "example",
"customer": {
"id": "example",
"name": "example"
},
"title": "example",
"summary": "example",
"category": "example",
"status": "example",
"priority": "example",
"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"
}
}

invalid_json: The request body is not valid JSON.

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"
}
}

issue_not_found: No issue with that id.

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"
}
}

status_managed_by_source: A support ticket backs the issue, and the ticket’s own status sets the issue’s. Change it in the support tool.

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"
}
}

payload_too_large: The request body is too large; details.maxBytes gives the limit.

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

Try it runs the reference's read endpoints, and this one changes data, so it needs an API key with the issues:write scope. Create a key in Sonora under Settings → API and call it from your own code.