## TL;DR

Export file URLs are signed and short-lived; a slow agent that fetches the URL late gets an expired link. Do not retry the dead URL: check the export status, and if the file is gone, request a new export and download it promptly. Fetch fast after generation.

## Error

```text
HTTP 403: The export file URL has expired.
```

## Steps

1. Check the export job status. Expected: you see whether the file still exists.
2. If expired, submit a new export request for the same definition. Expected: a fresh export job.
3. Poll for completion, then download immediately when ready. Expected: the download starts before expiry.
4. Stream the download to disk instead of holding it in memory. Expected: large files download reliably.
5. In the agent, chain export-ready to download with no long pauses between. Expected: no more expiry races.

## When to use

- Export downloads fail with expired URL errors.
- An agent queues the download for much later.
- Large exports that take a while to fetch.

## When not to use

- Export generation failures (fix the export definition).
- 403s on non-expired URLs (permissions).

## Tool compatibility

- HubSpot exports API; signed file URLs.
- Streaming downloads in the agent.

## Variant phrasings

### export url expired

Request a new export; download promptly.

### 403 on export download

Check whether the URL expired before assuming permissions.

## Why it happens

Signed URLs trade longevity for security. The export API assumes prompt download, but agents that defer the fetch lose the race.

## Edge cases

- Very large exports may need resumable download logic; check content length.
- Export definitions can change between requests; pin the definition.
- Retrying the same expired URL never works; always re-request.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_zpbIJUkhVwGnbc5HZoUMxg
