The signed record and its PDF are created in separate stages. A successful signing submission can return while PDF rendering is still pending. Build this as a normal state in your integration, not as a failed signature.
Observe the record first
Use retrieve waiver to inspect the record's PDF status. When it is ready, call download PDF. A successful download returns binary content with an application/pdf content type.
Do not parse that successful response as JSON. Stream it to the intended authorized destination, set a sensible filename in your application and keep the file associated with its original record ID.
Allow for a signed event arriving first
The waiver.signed webhook can arrive before rendering finishes. A worker that immediately downloads the PDF may encounter an unavailable-file response. Queue the download for a later bounded attempt and recheck the record's status.
Do not submit the waiver again to obtain a PDF. That creates a different operation and can confuse the participant history. The existing record is the object whose file you need.
Distinguish pending from unavailable
A 404 alone does not explain every reason a file cannot be downloaded. Confirm the waiver ID and organization, inspect the record and consider whether the data has been purged. When purgedAt is set, retained proof and downloadable personal content have different availability.
A retry that is reasonable during rendering is not reasonable forever after a purge. Set a retry limit, preserve the request IDs and surface a clear state to the staff member instead of leaving an endless spinner.
Keep exports accountable
A downloaded PDF is another copy of participant information. Apply your organization's access and retention procedures to the destination. Do not make a public link just because the file is convenient to share internally.
For a synchronization worker, save the source waiver ID, download state and last attempt independently. That lets a failed file transfer resume without recreating signed records. See record access and purging and webhook delivery handling.