Back to documentation

Outbound HTTP data and downloads

Original bodies, stored attempt responses, unavailability and download completeness checks.

View as Markdown
On this page

Available content

The original request body and a particular attempt's response body are different files. Responses are stored only if the submission enabled save_response_body=true. The flag defaults to off; enabling it for a new job does not recover an old unstored response.

Diagnostics and headers load separately from bodies. A displayed size does not mean the body has already downloaded or is available.

Dashboard

Open a card under Outbound → Requests. Download request body retrieves the original body. Download on a finished attempt retrieves its stored response. For an unstored or unavailable body, the button may be absent and a state shown instead.

During a download, Cancel download cancels file reading only, not a job or HTTP attempt. Refresh and leaving the page also cancel active loads. Downloaded files are not embedded as recipient HTML in the page.

Download request body for the original body and Download for an Outbound attempt response

Use separate controls for the original body and attempt response; Response state shows response completeness. Demonstration dashboard, English interface. Open full-size screenshot.

Select an attempt

Read the summary, find a finished attempt in snapshot.attempts, and take its attempt_id. Do not substitute the attempt number for its UUID. Check body_bytes_stored, body_bytes_read, body_truncated and read_complete.

Request body API

curl --fail --silent --show-error \ --header "Authorization: Bearer $ADAL_API_TOKEN" \ --output request-body.bin \ "$ADAL_API_URL/outbound/requests/$ADAL_REQUEST_ID/body"

The response contains original binary bytes, not JSON or base64. The quickstart file contains hello, not aGVsbG8=. An empty original body is valid.

Attempt response API

curl --fail --silent --show-error \ --header "Authorization: Bearer $ADAL_API_TOKEN" \ --output response-body.bin \ "$ADAL_API_URL/outbound/requests/$ADAL_REQUEST_ID/attempts/$ADAL_ATTEMPT_ID/response/body"

Both GETs require an API token and accept neither query parameters nor a nonempty request body. HEAD is also supported on body paths to read headers, but it does not establish that the client received a complete file.

Completeness

Do not trust a file as complete merely because it exists on disk. Check client completion, expected length where Content-Length exists and absence of stream interruption. Do not use a partially written file after an error as a finished result. Absence of Content-Length is not inherently an error: chunked transfer is allowed.

Separately inspect the summary: a stored body can be truncated and the original response incompletely read. Successfully downloading a stored fragment does not turn it into the recipient's complete response. Failed-attempt responses can also be stored and contribute to usage.

Unavailability and errors

Read response Meaning and action
409 response_body_not_saved Storage was off; the body will not appear later
409 not_yet_available Not ready; inspect the attempt and retry reading later
409 with duplicate_of Read the original's data, not the duplicate's
410 HTTP data retention expired
404 Check request/attempt IDs, ownership and data existence
503 before the response starts Temporary read failure; retry reading, not submission

Once streaming starts, errors can appear as an interrupted connection without a JSON error appended to the file. Do not rely only on the initial HTTP 200.

Retention, usage and security

Downloads do not extend retention or create new submissions. Expiry does not refund recorded bytes. Stored responses from all attempts contribute to usage when enabled. Keep files protected, do not open unknown content as trusted HTML, and keep tokens, bodies and personal data out of public screenshots.

Quickstart, diagnostics, storage, traffic.

Related documentation