Downloading attachments
Retrieve all files associated with an Issue, then request a time-limited URL to download each one. The API returns two types of attachments:
- Reporter attachments: Files uploaded by reporters through messages, such as documents, images, and videos
- Issue attachments: Files uploaded by case managers directly to the Issue
Downloading a file takes two steps. First list the attachments on the Issue to get their IDs, then request a download URL for the ID you want.
On this page: Query parameter · Response structure · Attachment types · Response scenarios · Download URLs
Query parameter
To retrieve Issue attachments along with Issue data, include the attachments=true query parameter.
GET /v1/public/issues/{id}?attachments=true
If the attachments parameter is not provided or set to false, Issue-related attachments will not be included in the response.
curl -X GET '{API_BASE_URL}/v1/public/issues/1001?attachments=true' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
The attachments key is added to the Issue response. For the rest of that response, see Retrieving Issues.
Response structure
The attachments object contains two arrays:
reporter: attachments from the reporterissue: attachments from the case handler
Both arrays share the same object structure.
| Field | Type | Description |
|---|---|---|
id |
Integer | Unique identifier for the attachment. Use this to request a download URL. |
type |
String | MIME type of the file. |
creator |
String | Name of the user who uploaded the file, or "Reporter" for anonymous uploads. |
fileExists |
Boolean | Whether the file is currently available in storage. |
name |
String | Original filename of the attachment. |
size |
Integer | File size in bytes. |
description |
String or null | Optional description of the file. |
folderId |
Integer or null | ID of the folder containing this file. |
createdAt |
String | ISO 8601 timestamp when the attachment was created. |
issueId |
Integer | ID of the Issue. Issue attachments only. |
messageId |
Integer | ID of the message. Reporter attachments only. |
Attachment types
Reporter attachments
Reporter attachments are files uploaded by reporters via the web or app.
The following message item types are excluded from the API response:
- Text messages
- Audio recordings
- Conversation transcripts
- Questions
Issue attachments
Issue attachments are files uploaded directly to Issues by case handlers.
Response scenarios
Each example shows the attachments object only. It appears alongside the other Issue fields in the full response.
Reporter attachments only
"attachments": {
"reporter": [
{
"id": 15,
"messageId": 42,
"name": "evidence_photo.jpg",
"size": 245760,
"type": "image/jpeg",
"creator": "Reporter",
"description": null,
"fileExists": true,
"folderId": null,
"createdAt": "2025-11-15T14:30:22.123Z"
},
{
"id": 16,
"messageId": 42,
"name": "incident_report.pdf",
"size": 512000,
"type": "application/pdf",
"creator": "Reporter",
"description": null,
"fileExists": true,
"folderId": null,
"createdAt": "2025-11-15T14:31:05.456Z"
}
],
"issue": []
}
Both reporter and Issue attachments
Files from both the reporter and case handlers. Issue attachments carry issueId and often a description and folderId.
"attachments": {
"reporter": [
{
"id": 20,
"messageId": 55,
"name": "screenshot.png",
"size": 102400,
"type": "image/png",
"creator": "Reporter",
"description": null,
"fileExists": true,
"folderId": null,
"createdAt": "2025-11-10T09:15:33.789Z"
}
],
"issue": [
{
"id": 8,
"issueId": 1002,
"name": "investigation_notes.docx",
"size": 48128,
"type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"creator": "Jane Smith",
"description": "Initial investigation findings",
"fileExists": true,
"folderId": 3,
"createdAt": "2025-11-12T16:45:12.345Z"
}
]
}
No attachments
An Issue where no files have been uploaded returns both arrays empty.
"attachments": {
"reporter": [],
"issue": []
}
Multiple file types from a reporter
Reporters can attach any file type. Note the sizes: video attachments are considerably larger than documents.
"attachments": {
"reporter": [
{
"id": 25,
"messageId": 67,
"name": "damage_video.mp4",
"size": 5242880,
"type": "video/mp4",
"creator": "Reporter",
"description": null,
"fileExists": true,
"folderId": null,
"createdAt": "2025-11-16T11:22:33.456Z"
},
{
"id": 26,
"messageId": 67,
"name": "damage_photo_1.jpg",
"size": 307200,
"type": "image/jpeg",
"creator": "Reporter",
"description": null,
"fileExists": true,
"folderId": null,
"createdAt": "2025-11-16T11:22:34.567Z"
},
{
"id": 28,
"messageId": 67,
"name": "repair_estimate.xlsx",
"size": 15360,
"type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"creator": "Reporter",
"description": null,
"fileExists": true,
"folderId": null,
"createdAt": "2025-11-16T11:23:15.789Z"
}
],
"issue": []
}
Attachments in folders
Issue attachments organised within folders share a folderId.
"attachments": {
"reporter": [],
"issue": [
{
"id": 12,
"issueId": 1005,
"name": "audit_report_q4.pdf",
"size": 1024000,
"type": "application/pdf",
"creator": "Sarah Johnson",
"description": "Q4 audit findings",
"fileExists": true,
"folderId": 5,
"createdAt": "2025-11-14T14:30:00.000Z"
},
{
"id": 13,
"issueId": 1005,
"name": "corrective_action_plan.docx",
"size": 40960,
"type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"creator": "Michael Brown",
"description": "Proposed corrective actions",
"fileExists": true,
"folderId": 5,
"createdAt": "2025-11-15T09:15:30.000Z"
}
]
}
Identified reports
On identified reports, such as those from the Employee Hub, creator holds the reporter's name rather than "Reporter".
"attachments": {
"reporter": [
{
"id": 35,
"messageId": 82,
"name": "policy_question.pdf",
"size": 102400,
"type": "application/pdf",
"creator": "Emily Davis",
"description": null,
"fileExists": true,
"folderId": null,
"createdAt": "2025-11-17T10:45:00.000Z"
}
],
"issue": []
}
Files removed by data retention
On a closed Issue where data retention has run, the physical files are removed but the attachment metadata is preserved for audit purposes.
Every attachment then has fileExists: false, folderId: null, an empty name, and size: 0. The id, type, creator, and timestamps remain.
"attachments": {
"reporter": [
{
"id": 35,
"messageId": 31,
"name": "",
"size": 0,
"type": "image/png",
"creator": "Reporter",
"description": null,
"fileExists": false,
"folderId": null,
"createdAt": "2025-12-16T03:46:46.365Z"
}
],
"issue": [
{
"id": 10,
"issueId": 10,
"name": "",
"size": 0,
"type": "image/png",
"creator": "Jane Smith",
"description": null,
"fileExists": false,
"folderId": null,
"createdAt": "2025-12-16T03:55:24.497Z"
}
]
}
An attachment still appears in the response after its file has been removed. A download URL is only issued when fileExists is true.
Download URLs
The Public API provides secure, time-limited download URLs for attachments. There are two endpoints, one for each attachment type. In both, the id is the ID of the attachment as returned in the attachments object.
| Attachment type | Endpoint |
|---|---|
| Reporter | GET /v1/public/reporter-attachments/{id}/download-url |
| Issue | GET /v1/public/issue-attachments/{id}/download-url |
| Path parameter | Type | Required | Description |
|---|---|---|---|
id |
Integer | Yes | The attachment ID. |
Take the id from the attachment you want. For an attachment with "id": 25 in the reporter array, the request is:
curl -X GET '{API_BASE_URL}/v1/public/reporter-attachments/25/download-url' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
For an attachment with "id": 12 in the issue array:
curl -X GET '{API_BASE_URL}/v1/public/issue-attachments/12/download-url' \
-H 'Authorization: Bearer <ACCESS_TOKEN>'
Response
{
"url": "https://s3.amazonaws.com/bucket/path/to/file?X-Amz-Algorithm=...",
"expiresAt": "2025-11-18T10:15:30.000Z"
}
| Field | Type | Description |
|---|---|---|
url |
String | Pre-signed URL for downloading the file. |
expiresAt |
String | ISO 8601 expiration timestamp for the download URL. |
Download URL properties
- Download URLs are valid for 10 minutes from the time of generation.
- The
expiresAttimestamp is in UTC, indicated by the Z suffix. - After expiration, you must request a new download URL.
- URLs are pre-signed and do not require additional authentication. Do not log them or pass them to systems that should not have access to the file.
- A download URL is only issued if the attachment's
fileExistsfield istrue.
Errors
See the API error reference for the full list, and Retrieving Issues for errors on the get Issue endpoint.