Retrieving Issues
Retrieve Issue data from SpeakUp for reporting, analytics, or to keep an external system in sync. The API returns case details, custom field values, form responses, and report metadata.
Two endpoints provide this. The list endpoint returns IDs and timestamps for every Issue your integration can access. The detail endpoint returns one Issue in full. Start with the list to find the id you need, then fetch that Issue by ID.
To update an Issue in SpeakUp, see Updating Issues.
On this page: Endpoints · Permissions · List Issues · Get an Issue · Errors
Endpoints
| Method and path | What it does |
|---|---|
GET /v1/public/issues |
Lists Issues with basic information. |
GET /v1/public/issues/{id} |
Returns one Issue in full. |
Permissions
Requires an App Integration with read only or full access for Issues. See how do I create an App Integration and get API credentials?
List Issues
GET /v1/public/issues
Returns an array of Issues with basic information only. Use the returned id to fetch an Issue in full.
curl -X GET '{API_BASE_URL}/v1/public/issues' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
Example response:
[
{
"id": 1,
"customId": "SUP-2024-01",
"createdAt": "2025-05-26T07:15:48.663Z",
"updatedAt": "2025-07-20T00:00:51.522Z"
},
{
"id": 2,
"customId": "SUP-2024-02",
"createdAt": "2025-05-26T07:16:09.739Z",
"updatedAt": "2025-07-21T10:14:44.036Z"
}
]
| Field | Type | Description |
|---|---|---|
id |
Number | Unique identifier for the Issue. |
customId |
String | Custom identifier, for example SUP-2024-01. |
createdAt |
String | ISO 8601 timestamp of creation. |
updatedAt |
String | ISO 8601 timestamp of the last update. |
Get an Issue
GET /v1/public/issues/{id}
Returns full detail for one Issue, including its custom fields, forms, and report details.
| Path parameter | Required | Description |
|---|---|---|
id |
Yes | The unique identifier of the Issue. |
curl -X GET '{API_BASE_URL}/v1/public/issues/1001' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
Example response, with the nested arrays collapsed. Each is described in its own section below.
{
"id": 1001,
"summary": "Security incident involving unauthorized access",
"description": "A comprehensive security incident report.",
"type": "Case",
"status": "Closed",
"resolution": "Resolved",
"assignee": "Sarah Johnson",
"assigneeId": 45,
"domain": "IT Security",
"labels": ["Security", "High Priority"],
"customId": "SEC-2024-001",
"dueDate": "2024-12-15T17:00:00.000Z",
"parentId": null,
"acknowledgedAt": "2024-12-01T09:15:30.123Z",
"receivedAt": "2024-12-01T09:10:15.456Z",
"closedAt": "2024-12-10T16:45:22.789Z",
"createdAt": "2024-12-01T09:10:15.456Z",
"updatedAt": "2024-12-10T16:45:22.789Z",
"issueFields": [ ... ],
"issueForms": [ ... ],
"reportForms": [ ... ],
"reportDetails": { ... }
}
Query parameters
By default the response contains the Issue only. Set any of these parameters to true to include related data. They can be combined in a single request.
| Parameter | Adds | Read more |
|---|---|---|
messages=true |
A messages key containing the Issue's messages. |
Retrieving messages |
attachments=true |
An attachments key. Attachment IDs come from here, and are needed to request a download URL. |
Downloading attachments |
links=true |
A links key containing Issues linked to this one. |
See below |
When a parameter is not supplied, its key is absent from the response. Values are case sensitive, so use lowercase true.
Each parameter can be used on its own:
curl -X GET '{API_BASE_URL}/v1/public/issues/1001?messages=true' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
Or combined in one request:
curl -X GET '{API_BASE_URL}/v1/public/issues/1001?messages=true&attachments=true&links=true' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
Response fields
| Field | Type | Description |
|---|---|---|
id |
Number | Unique identifier for the Issue. |
summary |
String | Brief summary. |
description |
String | Full description. |
type |
String | Issue type, for example Case or Task. |
status |
String | Current status, for example In progress or Closed. |
resolution |
String or null | Resolution, or null if unresolved. |
assignee |
String or null | Name of the assigned User. |
assigneeId |
Number or null | ID of the assigned User. Use this value when reassigning. |
domain |
String | Domain the Issue belongs to. |
labels |
Array of strings | Names of the labels applied to the Issue. Empty array if none. |
customId |
String | Custom identifier. |
dueDate |
String or null | ISO 8601 due date. |
parentId |
Number or null | ID of the parent Issue, if any. |
acknowledgedAt |
String or null | ISO 8601 timestamp of acknowledgement. |
receivedAt |
String or null | ISO 8601 timestamp of receipt. |
closedAt |
String or null | ISO 8601 timestamp of closure. |
createdAt |
String | ISO 8601 timestamp of creation. |
updatedAt |
String | ISO 8601 timestamp of the last update. |
issueFields |
Array | Custom field values. Empty array if the Issue type defines none. See below. |
issueForms |
Array | Forms attached to the Issue by case handlers. Empty array if none. See below. |
reportForms |
Array | Forms submitted by the reporter. Empty array if none. See below. |
reportDetails |
Object or null | Details of the associated report. Null when the Issue did not originate from a report. |
Timestamps are ISO 8601. Any field that is not set is returned as null. Custom field and form values are returned as strings, including numbers and booleans.
issueFields
Every field defined for the Issue type is returned, including those not yet filled in, so you can see everything available to read or update. Unfilled fields return a value of null.
| Field | Type | Description |
|---|---|---|
issueFieldId |
Number | Identifier for the field. Use this value when updating. |
fieldSystemName |
String | Internal name of the field. |
fieldLabel |
String | Label shown to users. |
fieldType |
String | One of short text, long text, number, boolean, option list, multiple option list, date, or date time. |
fieldWidget |
String | Interface control used, for example dropdown, checkbox, or radio group. |
value |
String or null | The field value, or null if not set. |
This response is where you find valid issueFieldId values and their types. You need both before updating custom fields.
issueForms
Forms attached to the Issue by case handlers. An Issue with no forms returns an empty array.
| Field | Type | Description |
|---|---|---|
formInstanceId |
Number | Identifier for this instance of the form. |
formTemplateName |
String | Name of the form template. |
fields |
Array | The form's fields. See below. |
Each entry in fields contains:
| Field | Type | Description |
|---|---|---|
fieldSystemName |
String | Internal name of the field. |
fieldLabel |
String | Label shown to users. |
fieldType |
String | Field type, for example short text, long text, option list, number, or date. |
value |
String or null | The submitted value, or null if not set. |
reportForms
Forms submitted by the reporter. An Issue with no report forms returns an empty array.
| Field | Type | Description |
|---|---|---|
formInstanceId |
Number | Identifier for this instance of the form. |
formTemplateName |
String | Name of the report form template. |
fields |
Array | The form's fields. See below. |
Report form fields carry one field that Issue form fields do not, translatedValue:
| Field | Type | Description |
|---|---|---|
fieldSystemName |
String | Internal name of the field. |
fieldLabel |
String | Label shown to the reporter. |
fieldType |
String | Field type, for example short text, long text, option list, or date. |
value |
String or null | The value as the reporter submitted it, in their own language. |
translatedValue |
String or null | The value translated into your organisation's default language. Null when no translation exists. |
reportDetails
Present only when the Issue originated from a report. Issues that did not come from a report return null.
Name and ID pairs are listed together below. Both are returned as separate keys, for example reportLanguage and reportLanguageId.
| Field | Type | Description |
|---|---|---|
status |
String | Status of the report, for example New or Closed. |
source |
String | How the report was submitted, for example Web, Phone, or App. |
type |
String | Report type, for example Confidential Report or Identified Report. |
intakeType |
String or null | Intake method used, for example AI Agent or Voice Drop. |
country |
String or null | Country associated with the report. |
reportLanguage / reportLanguageId |
String / Number | Language the reporter selected. |
systemLanguage / systemLanguageId |
String / Number | Language used to process the report. |
reporterName / reporterId |
String / Number or null | Display name and identifier of the reporter. |
closerName / closerId |
String or null / Number or null | User who closed the report. |
channelName / channelId |
String / Number | Reporting Channel the report came through. |
outcomeName |
String or null | Outcome recorded on the report, if one is defined. |
consentGiven |
Boolean or null | Whether the reporter gave consent. |
blocked |
Boolean | Whether the report is blocked from further action. |
lastSeen |
String | ISO 8601 timestamp of the reporter's last interaction. |
createdAt |
String | ISO 8601 timestamp of when the report was created. |
updatedAt |
String | ISO 8601 timestamp of the last update. |
closedAt |
String or null | ISO 8601 timestamp of when the report was closed. |
Linked Issues
With links=true, the response gains a links key. Each entry describes one relationship between two Issues. An Issue with no links returns an empty array.
| Field | Type | Description |
|---|---|---|
id |
Number | Identifier for the link itself, not for either Issue. |
fromIssueId |
Number | One of the two linked Issues. |
toIssueId |
Number | The other linked Issue. |
createdAt |
String | ISO 8601 timestamp of when the link was created. |
updatedAt |
String | ISO 8601 timestamp of the last update. |
Links are bidirectional. Querying an Issue returns every link in which it appears, whether as fromIssueId or as toIssueId, and the same link record appears on both Issues.
Do not assume toIssueId is the related Issue. To find the Issue at the other end of a link, compare both fields against the ID you requested and take whichever does not match.
Errors
See the API error reference for the full list.
| Status | Cause | What to do |
|---|---|---|
| 401 | The token is missing, invalid, or expired. | Request a new token. Tokens are valid for 1 hour. |
| 403 | The Public API package is not enabled. | Contact your Customer Success Manager. |
| 404 | No Issue exists with that ID, or the integration cannot access it. | Check the ID against the list endpoint. |