
## Available content {#overview}

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 {#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](/images/docs/outbound/request-success-en.jpg)

*Use separate controls for the original body and attempt response; Response state shows response completeness. Demonstration dashboard, English interface.* [Open full-size screenshot](/images/docs/outbound/request-success-en.jpg).

## Select an attempt {#attempt}

Read the [summary](/en/docs/outbound/diagnostics), 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 {#request-body}

```bash
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 {#response-body}

```bash
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 {#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 {#unavailable}

| 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 {#retention}

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](/en/docs/outbound/quickstart), [diagnostics](/en/docs/outbound/diagnostics), [storage](/en/docs/common/storage), [traffic](/en/docs/common/traffic).
