---
title: "Download a file"
method: GET
path: "/v1/files/{file_id}/download"
tags: ["Files"]
---

# Download a file

`GET /v1/files/{file_id}/download`

## Request

- Base URL: `https://dovetail.com/api`
- URL: `https://dovetail.com/api/v1/files/{file_id}/download`
- Auth: HTTP bearer

Get a presigned URL to download the content of a file by its unique identifier.

The response includes a short-lived URL that can be used to download the file directly from cloud storage without additional authentication. The URL is valid for 1 hour; call this endpoint again to mint a fresh URL when needed.

Download availability is based on upload completion and redaction/obfuscation readiness. It is separate from processing status: a file can still report `pending` or `failed` from the **Get file by id** endpoint while the original bytes are available for download.

**Images:** for privacy, once an uploaded image has been re-encoded to strip embedded metadata (EXIF, XMP, GPS location, camera details) and bake in orientation, this endpoint serves that sanitized derivative instead of the original uploaded bytes. A newly uploaded image downloads as the original (still subject to the readiness rules above) until the sanitized derivative is ready, typically seconds; images in formats that cannot be sanitized (e.g. SVG, HEIC, AVIF) continue to download as the original.

**Required scope:** `file:read`

## Path parameters

- `file_id` string, required

## Response `200`

200

- object
  - `data` object, required
    - `url` string, uri, required: Short-lived presigned URL pointing at cloud storage. Fetch this URL with no extra authentication to download the file bytes. Valid for 1 hour.
    - `expires_at` string, date-time, required: ISO 8601 timestamp when the presigned URL expires.

## Other responses

- `400`: 400
- `401`: 401
- `403`: 403
- `404`: 404
- `422`: 422
- `429`: 429
- `500`: 500

## Changes

- **2026-11-03** `8abea327e6b9`: 4 breaking, 1 warning
  - added `subschema #1, subschema #2` to the `errors/items/` response property `oneOf` list for the response status `403`
  - the `errors/items/` response's property type changed from `object` to no type for status `403`
  - removed the required property `errors/items/code` from the response with the `403` status
  - removed the required property `errors/items/title` from the response with the `403` status
  - …1 more

[Operation history](https://skmtc.dev/dovetail/apis/dovetail-public-api/changes/v1/files/:file_id/download/get.md)

---

[API](https://skmtc.dev/dovetail/apis/dovetail-public-api.md) - [All operations](https://skmtc.dev/dovetail/apis/dovetail-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/dovetail/apis/dovetail-public-api/revisions/8abea327e6b9?raw)
