Export inspection PDFs
Generate an inspection PDF with shared export options, using either GET or POST.
Generate an inspection PDF with one export request by calling either GET /v3/inspections/{inspectionId}/export or POST /v3/inspections/{inspectionId}/export.
Before you start
- Get the inspection ID for the inspection you want to export.
- Set your Vision API base URL, such as
https://vision-api.truepic.com/v3. - Send requests with your Bearer token.
- Choose the request style that matches your integration:
- Use GET for the shortest request when you are testing or exporting a smaller PDF.
- Use POST when you need to send more export options in a JSON request body.
- Add async export when your workflow can poll an operation or receive webhook events.
1. Choose GET or POST
| Method | Best for | How options are sent | Default response |
|---|---|---|---|
GET | Quick tests and smaller exports | Query parameters | 200 OK with the PDF, unless queued |
POST | Exports with several options or nested filter data | JSON request body | 200 OK with the PDF, unless queued |
Synchronous export is the default for backwards compatibility, but it is deprecated in favor of async export. Use async export for production workflows that can poll an operation or receive webhook events.
Queue the PDF asynchronously when your integration can support polling or webhooks. Use
async=1withGETor"async": truewithPOST, especially for large PDFs because synchronous requests time out after 2 minutes.
2. Configure the PDF export
Both export endpoints support the same export options. With GET, pass them as query parameters. With POST, pass the same fields in the JSON request body.
| Option | Type | Default | Details |
|---|---|---|---|
async | boolean | false or omitted | Optional. Queues the export instead of returning the PDF inline. For GET, set async=1 to queue the export. For POST, send "async": true to queue the export. If you omit it or send 0/false, the API returns the PDF synchronously. Synchronous export is deprecated in favor of async export. |
filter | object | include all photos and videos | Limits which photos or videos are included. Use filter.photos as an array of integer photo or video IDs. |
include | array of strings | none | Adds sections that are not included by default. Allowed value: inspectionNotes. The legacy alias inspectionNote is also accepted for existing integrations. |
exclude | array of strings | none | Removes sections that are included by default. Common values: inspectionItems, imageDetails, timeline, captureLocation, aiAnalysis, and captureDevices. Other accepted values are cover, contents, and inspectionNotes. Legacy values questions and thumbnails are also accepted; questions maps to inspectionItems, and thumbnails does not remove an active section. |
captureLocationMaps | array of strings | outside, within, and no_location | Controls which per-capture location maps appear in Image Details. Allowed values are outside, within, and no_location. Send an empty array ([]) to suppress all per-capture location maps. |
showUnansweredItems | boolean | true | Controls whether unanswered questions and captures with no upload appear in the Inspection Items section. Set this to false for a submitted-only report. |
tz | string | UTC | Sets the IANA time zone used for dates and times in the PDF, such as America/New_York. |
For array options:
- With
GET, passinclude[],exclude[], andcaptureLocationMaps[]as query parameters. - With
POST, sendinclude,exclude, andcaptureLocationMapsas JSON arrays. - If you need to send several array values or nested
filterdata, preferPOSTso you do not run into URL length limits.
Here is an example POST body that uses the shared export options:
{
"async": true,
"filter": {
"photos": [123, 456]
},
"include": ["inspectionNotes"],
"exclude": ["timeline", "captureDevices"],
"captureLocationMaps": ["outside", "within"],
"showUnansweredItems": false,
"tz": "America/New_York"
}Optional: Queue the export asynchronously
Use async export when your integration can poll an operation or receive webhook events. Async export returns an Operation (an object that tracks background work) and lets the worker fleet generate the PDF instead of application servers.
Use this option for production workflows and large PDFs. Synchronous requests time out after 2 minutes and are deprecated in favor of async export.
With POST, queue the export by setting async to true in the JSON request body:
curl --request POST \
--url 'https://vision-api.truepic.com/v3/inspections/{inspectionId}/export' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"async": true,
"filter": {
"photos": [123, 456]
},
"include": ["inspectionNotes"],
"exclude": ["timeline", "captureDevices"],
"captureLocationMaps": ["outside", "within"],
"showUnansweredItems": false,
"tz": "America/New_York"
}'What success looks like
202 Accepted- The export job is queued instead of completed inline
- The response body is a standard
ResponseDataenvelope with the operation underresult
Save the returned operation ID from result in the 202 response. You will use that ID to poll the operation status.
You can also queue an async export with GET by setting async=1 in the query string:
curl --request GET \
--url 'https://vision-api.truepic.com/v3/inspections/{inspectionId}/export?async=1' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Accept: application/json'Optional: Export synchronously
Use synchronous export only when you want the PDF returned directly in the response and you expect the export to finish in under 2 minutes.
Synchronous export is the default for backwards compatibility, but it is deprecated in favor of async export. Use this pattern for smaller exports or quick manual checks, and use async export for production workflows.
curl --request GET \
--url 'https://vision-api.truepic.com/v3/inspections/{inspectionId}/export' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Accept: application/pdf' \
--output inspection-{inspectionId}.pdfIf you want to queue the GET request instead of returning the PDF inline, add async=1 to the query string and expect an Operation response instead of a PDF.
What success looks like
200 OKwhen the export runs synchronously202 Acceptedwhen you setasync=1- The response body is either the generated PDF (
200) or a standardResponseDataenvelope with the operation underresult(202)
Optional: Poll the operation until it finishes
After an async export request returns an operation ID, poll GET /v3/operations/{operationId} to track progress. This applies whether you started the export with POST and "async": true or with GET and async=1.
curl --request GET \
--url 'https://vision-api.truepic.com/v3/operations/{operationId}' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Accept: application/json'Repeat that request until the operation indicates it has completed or failed. In most integrations, polling every few seconds is enough.
Polling flow
- Send
POST /v3/inspections/{inspectionId}/exportwith"async": true, or sendGET /v3/inspections/{inspectionId}/export?async=1. - Read the returned operation ID from the
202 Acceptedresponse. - Call
GET /v3/operations/{operationId}on a short interval. - Stop polling when the operation shows completion or failure.
- If the operation succeeds, download the finished PDF from
operation.result.urlin the completed operation response. - If the operation fails, log the failure and retry or surface the error to your team.
Do not hold open a single long-running export request while waiting for a large PDF. Synchronous requests time out after 2 minutes. Queue the export, poll the operation, and download the completed PDF from the URL returned by the finished operation.
Optional: Use webhooks instead of polling
If your integration already receives webhooks, you can track PDF generation through webhook events instead of relying only on polling:
ACTION_PDF_READYACTION_PDF_FAILED
Use polling when you need an immediate request-response workflow. Use webhooks when you want your system to react after the export finishes without repeatedly calling the operations endpoint.
When you receive ACTION_PDF_READY, the PDF is ready to download. Download the completed PDF from operation.result.url in the webhook payload. The top-level webhook result mirrors the operation result, but operation.result.url is the download link to use.
After you receive
ACTION_PDF_READY, do not callGET /v3/inspections/{inspectionId}/exportto download the file. Calling the export endpoint again starts a new PDF generation request. Use the URL returned inoperation.result.urlinstead.
Troubleshooting
The export request times out
Queue the export asynchronously. Use POST /v3/inspections/{inspectionId}/export with "async": true, or use GET /v3/inspections/{inspectionId}/export?async=1. This is required for large PDFs because synchronous requests time out after 2 minutes.
The export request returns 202 Accepted
202 AcceptedThat means the export was queued successfully. Read the operation ID from result in the response and poll GET /v3/operations/{operationId} until it completes, or wait for an ACTION_PDF_READY webhook event.
The client receives ACTION_PDF_READY, but the next PDF request is still slow
ACTION_PDF_READY, but the next PDF request is still slowAfter ACTION_PDF_READY, download the PDF from operation.result.url in the webhook payload. Do not call GET /v3/inspections/{inspectionId}/export again to fetch the file, because that starts a new PDF generation request.
The API returns 400
400Check the request body or query parameters. This usually means the export options could not be parsed. For GET, verify your query parameters, especially array values and nested filter data. For POST, verify the JSON body shape.
The API returns 401 or 403
401 or 403Verify the Bearer token and make sure the calling client has permission to access that inspection.
The API returns 404
404Confirm that the inspection ID or operation ID exists and belongs to the right environment.
The API returns 412
412Check for a missing required parameter or property.
API reference
- Export a PDF of an inspection (GET)
- Export a PDF of an inspection (POST)
- Get an existing operation to track its progress
- Webhook Actions
Updated 25 days ago

