# Get an upload

> Fetch one upload record by id, with fresh signed URLs.

Canonical page: https://www.rundiffusion.com/docs/api/uploads/get
Endpoint: GET /api/v2/uploads/{upload_id}
Authorization: OAuth device flow or Personal API Access Token or Company API Access Token

---

One upload, by the `id` from [List uploads](/docs/api/uploads/list) or the
[create response](/docs/api/uploads/create#response). The `url` and `thumb_url`
are signed and expire after 7 days, which is the main reason to call this:
re-fetching mints fresh ones.

`GET /api/v2/uploads/{upload_id}`

Authorization: OAuth device flow or Personal API Access Token or Company API Access Token

## Request

**Headers**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `Authorization` | string | Yes | Bearer token. This endpoint accepts an OAuth device flow token, a Personal API Access Token, or a Company API Access Token. See [Authentication](/docs/api/authentication). |

**Path parameters**

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `upload_id` | string | Yes | The upload id, as returned by the [list](/docs/api/uploads/list) or the [create](/docs/api/uploads/create) response. |

cURL:

```bash
curl https://api2.rundiffusion.com/api/v2/uploads/$UPLOAD_ID \
  -H "Authorization: Bearer $RUNDIFFUSION_TOKEN"
```

JavaScript:

```javascript
const upload = await fetch(
  `https://api2.rundiffusion.com/api/v2/uploads/${uploadId}`,
  { headers: { Authorization: `Bearer ${process.env.RUNDIFFUSION_TOKEN}` } },
).then(r => r.json());
```

Python:

```python
upload = requests.get(
    f"{BASE}/uploads/{upload_id}",
    headers=HEADERS,
).json()
```

## Response

`200 OK` with one
[Upload object](/docs/api/uploads/list#upload-object), exactly as the listing
returns it.

```json
{
  "id": "Yb3kQ9…",
  "name": "fa9c1e22-….png",
  "mime_type": "image/png",
  "size_bytes": 1863245,
  "width": 1024,
  "height": 1024,
  "url": "https://rundiffusion.com/...",
  "thumb_url": "https://rundiffusion.com/...",
  "created": "2026-07-23T09:31:02Z"
}
```

Uploads belong to the user who made them, whichever account is selected: a team
does not share an upload library.

## Errors

**Status codes**

| Name | Type | Description |
| --- | --- | --- |
| `401` | TOKEN_INVALID | Missing or invalid credential. |
| `404` | UPLOAD_NOT_FOUND | No such upload, or not yours. An upload owned by somebody else reads the same as an id that never existed, deliberately. |
| `429` | RATE_LIMITED | Too many requests. See [Rate limits](/docs/api/rate-limits#uploads). |
