Beta
List a Finding’s Attachments
The finding’s attachments, each with its download link. A finding itself carries only hasAttachments; this call lists them.
A removed attachment no longer appears here at all; there is no deleted flag to check. A finding with no attachments returns a 200 with an empty array.
Read-only and safe to poll.
Sample
url="https://api.pointservices.com/riskinsight-services-ws/resources/v1/findings/workflows/wfpop_0000000000002082611/findings/fndg_0000000000006051384/attachments"
curl -X GET "${url}" \
-H "Authorization: Bearer your_access_token_here"
Header Properties
| Property | Value | Required? |
|---|---|---|
| Authorization | Bearer your token | true |
Path Parameters
| Property | Description | Type |
|---|---|---|
| workflowId | The workflow’s id, exactly as this API returned it. | string |
| findingId | The finding’s id, exactly as published in findingId. | string |
workflowId, findingId and attachmentId are opaque. Send each one back exactly as this API returned it: don’t parse it, build one yourself, or add or remove its prefix. A findingId or attachmentId that isn’t exactly as published, including one with its prefix removed, returns a 404 as if it didn’t exist.
Responses
200
| Property | Description | Type |
|---|---|---|
| workflowId | The workflow’s id. | string |
| findingId | The finding’s id. | string |
| attachments | The finding’s attachments. [] when it has none, never null. | array |
Attachment
| Property | Description | Type |
|---|---|---|
| attachmentId | The attachment’s opaque id. It resolves only under the finding it belongs to. Always present. | string |
| name | The document’s file name: a display value, not an identifier. Two attachments on one finding may share a name. Omitted when it can’t be resolved; the attachment is still listed. | string |
| contentType | The document’s media type, so you can decide how to render or store it before downloading. For a document you uploaded, it is the Content-Type you sent on the file part. Omitted when none was recorded. | string |
| modifiable | Whether a user may change or remove this document: true for a user’s own upload, false for a document the system captured. Always present. | boolean |
| updatedAt | When this attachment last changed. Omitted when none was recorded. | string |
| links.download | Where the document’s bytes are served from, in src: see Download an Attachment. An ordinary authenticated endpoint, never a signed or expiring URL. | object |
{
"workflowId": "wfpop_0000000000002082611",
"findingId": "fndg_0000000000006051384",
"attachments": [
{
"attachmentId": "jattmt_0000000000006099213",
"name": "paystub-august.pdf",
"contentType": "application/pdf",
"modifiable": true,
"updatedAt": "2026-08-07T15:01:12Z",
"links": {
"download": {
"src": "https://api.pointservices.com/riskinsight-services-ws/resources/v1/findings/workflows/wfpop_0000000000002082611/findings/fndg_0000000000006051384/attachments/jattmt_0000000000006099213/content"
}
}
}
]
}
links.download carries its address in a src key. src means “fetch this for the content” (as in HTML’s <img src>): following links.download returns the document’s raw bytes, not JSON.
401
No credential the service could accept reached it. The body is an RFC 9457 problem document, served as application/problem+json, and the response carries a WWW-Authenticate challenge. The request body is never read, so a 401 says nothing about whether the rest of your request would have been accepted.
Two problem types tell the cases apart:
type | Meaning | WWW-Authenticate |
|---|---|---|
about:blank | No credential was presented. | Bearer realm="Helix" |
https://pointservices.com/problems/invalid-token | A credential was presented and rejected. The response doesn’t say why: an expired, revoked, badly signed and malformed token all look the same. | Bearer realm="Helix", error="invalid_token" |
{
"type": "https://pointservices.com/problems/invalid-token",
"title": "The access token was not accepted",
"status": 401,
"detail": "The access token was rejected.",
"instance": "urn:pps:request:0000000000000000000000000000000000000000000000000000"
}
Refresh your token on a 401, and only on a 401. An expiring token moves a call from 200 to 401, never to 403, so a fresh token is the fix here and never the fix for a 403.
403
You may not read this workflow.
You are authenticated, and the answer is still no. This is an authorization decision, not a statement about your token, so refreshing the token won’t turn it into a 200.
The body is an RFC 9457 problem document, served as application/problem+json. Two problem types tell the cases apart:
type | Meaning |
|---|---|
about:blank | The request was refused before the operation ran. |
https://pointservices.com/problems/not-authorized | The operation ran, and policy won’t let you act on the workflow or finding you named. |
{
"type": "https://pointservices.com/problems/not-authorized",
"title": "Not authorized",
"status": 403,
"detail": "The authenticated identity is not permitted to perform this action.",
"instance": "urn:pps:request:0000000000000000000000000000000000000000000000000000"
}
A 403 can also come from the edge, before the service is reached: for example, when a request value resembles SQL injection or cross-site scripting. Those refusals carry no problem document. Write your client to handle an error response it can’t parse, rather than assuming every failure has a JSON body.
404
Unknown workflowId or unknown findingId.
The body is an RFC 9457 problem document, served as application/problem+json. Two problem types tell the cases apart:
type | Meaning |
|---|---|
https://pointservices.com/problems/not-found | An id in the path isn’t one this API knows. Check that you sent it exactly as the API returned it. |
about:blank | The URL or method isn’t one this API serves at all. Check the path. |
| Property | Description | Type |
|---|---|---|
| type | An absolute URI identifying the problem type. This is the stable value to match on; compare it as a string. | string |
| title | A short summary, written for a person. | string |
| status | The HTTP status code, repeated in the body. | number |
| detail | An explanation of this occurrence, written for your logs. Never match on it. | string |
| instance | A URI identifying this occurrence, written as urn:pps:request:<id>. The id is the same value as the x-pps-request-id response header. Quote it when you report a problem to PPS. | string |
{
"type": "https://pointservices.com/problems/not-found",
"title": "No such resource",
"status": 404,
"detail": "Finding[fndg_0000000000006051384] not found",
"instance": "urn:pps:request:8d3a1f56-6c94-4e20-b7f8-0a5e9c2d4b73"
}
Branch on type, never on the text of title or detail.