> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daily.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Access links

> How signed download links work for recordings, transcripts, and batch processor outputs.

The `/access-link` endpoints give you a signed URL for a file that Daily stores for you. This applies to recordings, transcripts, and batch processor outputs.

A signed URL works for a short time and then stops working. It is not a permanent address for the file.

```json theme={null}
{
  "download_link": "https://b.daily.co/recordings/api-demo/hello/1548790973821?dl=api-demo%2Fhello%2F1548790973821.webm&Expires=1548809176&Signature=EXAMPLE_SIGNATURE&Key-Pair-Id=K1EXAMPLEKEYPAIR",
  "expires": 1548809176
}
```

## Use the URL exactly as returned

The query string is what authorizes the download. `Expires`, `Signature`, and `Key-Pair-Id` are all part of a signature that is checked on every request.

If you add a query parameter, drop one, reorder them, or re-encode them, the signature no longer matches. The download then fails with a `403`, even though the API call that gave you the link returned a `200`.

Pass the whole URL through unchanged. Do not run it through a URL builder, a proxy that rewrites query strings, or an encoder.

## Read the host from the response

<Warning>
  Do not build your own download URL from your bucket name. Read the host from the response.
</Warning>

The host in the link is not always the storage bucket host, and it can change over time. Code that hard-codes a bucket hostname and appends the file path will start returning `403` when the host changes, with no other warning.

Files kept in your own S3 bucket are served from your bucket instead. That is one more reason to read the host from the response rather than assume one.

## Links expire

Request a fresh link when you need the file. Do not store a link in your database and reuse it later.

For recordings, the `expires` field is the Unix timestamp when the link stops working. Call the endpoint again to get a new one.

## Troubleshooting

You called the access-link endpoint and got a `200`, but downloading the file returns a `403`. Common causes:

| Symptom | Cause |
| - | - |
| `403` on download, link was passed through a URL builder or proxy | A query parameter was added, dropped, reordered, or re-encoded. |
| `403` on download, URL was built from a bucket name | The link host is not the bucket host. Use the host in the response. |
| `403` on download after the link sat in a queue or database | The link expired. Request a new one. |
| `403` only for some files | Those files live in a different bucket. Use the host in each response. |

## Related

* [Errors](/docs/rest-api/errors)
* [Authentication](/docs/rest-api/authentication)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.