---
title: "Get a media-library upload session"
canonical: "https://bird.com/docs/api/reference/get-asset-upload-session"
---

# Get a media-library upload session

`GET /v1/asset-upload-sessions/{upload_id}`

Returns the upload session and its saved publication receipt. Requires current asset write access and the connection that created the session. Status checks do not issue another upload capability.

## Servers

- `https://{region}.platform.bird.com`: Regional API endpoint. Use the host for the region your organization is hosted in. Official Bird SDKs and the CLI select it automatically from your API key, so you rarely need to set it by hand.
  - `region`: `us1`, `eu1`. Default: `us1`. The region your organization's data is hosted in.
- `https://platform.bird.com`: Region-independent endpoint for authentication and account administration.
- `http://localhost:8080`: Local development.

## Authentication

Use one authentication option:

- `BearerAuth`: HTTP bearer authentication. Pass the API key as a bearer token in the `Authorization` header. Workspace
keys use `bk_{region}_*`; organization master keys use `bm_{region}_*`.
The prefix identifies the region and selects the
API endpoint. Official Bird SDKs and the CLI derive the region from the key.

## Code samples

**TypeScript**

```ts
const upload = await bird.assets.uploads.get("aus_01krdgeqcxet5s7t44vh8rt9mg");
console.log(upload.state);
```

Examples: [TypeScript](/docs/api/reference/get-asset-upload-session.ts.md) · [Python](/docs/api/reference/get-asset-upload-session.py.md) · [Go](/docs/api/reference/get-asset-upload-session.go.md) · [PHP](/docs/api/reference/get-asset-upload-session.php.md) · [CLI](/docs/api/reference/get-asset-upload-session.cli.md) · [MCP](/docs/api/reference/get-asset-upload-session.mcp.md) · [cURL](/docs/api/reference/get-asset-upload-session.curl.md)

## Example response `200`

```json
{
  "id": "aus_01krdgeqcxet5s7t44vh8rt9mg",
  "state": "pending",
  "folder_id": "asf_01krdgeqcxet5s7t44vh8rt9mg",
  "file": {
    "filename": "invoice.pdf",
    "content_type": "application/pdf",
    "size_bytes": 1024,
    "sha256": "4e2090a479f7ce6b17ad31f991988f12571bcafbd4a441cc4063644fc1400ae0"
  },
  "result": {
    "asset_id": "ast_01krdgeqcxet5s7t44vh8rt9mg"
  },
  "next": [
    {
      "kind": "operation"
    }
  ],
  "asset": {
    "id": "ast_01krdgeqcxet5s7t44vh8rt9mg",
    "url": "https://us1.assets.birdusercontent.com/6fcy8y6a483sewgnjk2g35y2qz/01krdgeqcxet5s7t44vh8rt9mg/document.pdf",
    "thumbnail_url": null,
    "name": "document.pdf",
    "content_type": "application/pdf",
    "kind": "document",
    "size_bytes": 48210,
    "width": null,
    "height": null,
    "alt_text": null,
    "folder_id": null,
    "deleted_at": null,
    "created_at": "2026-05-20T09:14:52Z",
    "updated_at": "2026-05-20T09:14:52Z"
  }
}
```

## Path parameters

- `upload_id` (string, required): ID of the media-library upload session.

## Header parameters

- `X-Workspace-Id` (string, optional): Workspace context for the request. Required for dashboard authentication and master keys. Workspace keys and access tokens already identify their workspace; send that workspace or omit the header. A different one is rejected.
- `X-Organization-Id` (string, optional): Organization context for the request. Required for dashboard authentication. An API key or access token carries its own organization, so send either that organization or no header at all; a different one is rejected.

## Response body

- `id` (string, required)
- `state` (string, required)

  Upload progress. Pending accepts a transfer; finalizing is checking and publishing it. Completed has a saved result. Rejected, cancelled and expired allow no new upload instruction or publication. An already issued upload URL can remain usable until its expiry.

  Possible values: `pending`, `finalizing`, `completed`, `rejected`, `cancelled`, `expired`
- `expires_at` (string, required): Absolute session expiry. Completion must finish before this deadline; starting it or refreshing an upload instruction does not extend it.
- `name` (string, required): Frozen display name for a newly published asset.
- `alt_text` (nullable string, required): Frozen alternative text, or null when omitted.
- `folder_id` (nullable string, required): Frozen destination folder, or null for the library root.
- `file` (object, required): Exact properties of the original file. Calculate size and SHA-256 from its bytes before creating a session. Images allow up to 5,242,880 bytes; other supported media allow up to 25,000,000 bytes.
- `file.filename` (string, required): Original filename, including its extension.
- `file.content_type` (string, required)

  Media type of the original file. Supported values are `image/png`, `image/jpeg`, `image/gif`, `video/mp4`, `video/webm`, `video/quicktime`, `audio/mpeg`, `audio/mp4`, `audio/ogg`, `audio/wav`, and `application/pdf`.

  Supply the exact value without parameters. Unsupported values return `E20001`. Completion checks this against the file's contents.
- `file.size_bytes` (integer, required): Exact size of the original file in bytes.
- `file.sha256` (string, required): SHA-256 of the original bytes, encoded as lowercase hexadecimal.
- `result` (nullable object, required): Saved publication receipt, or null until completed.
- `result.asset_id` (string, required)
- `result.reused_existing` (boolean, required): Whether the upload reused an existing active asset with identical source bytes. Reused assets keep their original metadata and folder.
- `result.completed_at` (string, required): When publication completed.
- `last_error` (nullable object, required): Last completion error, or null when no failure is recorded.
- `last_error.code` (string, required): Bird error code for the failed attempt.
- `next` (array of object, required): Available next steps for this session.
- `next.kind` (string, required)

  What you do about this step.

  - `operation`: call the operation named in `operation`, then
    read again.
  - `external`: act somewhere this API does not reach, then read
    again.
  - `wait`: nothing is asked of you, so read again later.
  - `terminal`: nothing you do resolves this, so stop retrying.

  Tolerate a value you do not recognize: show the `description` and
  offer no action.

  Possible values (may grow over time): `operation`, `external`, `wait`, `terminal`
- `next.description` (string, required): A short, human-readable label for the step, suitable for display.
- `next.operation` (string): The operationId to call. Present only when `kind` is `operation`. The operation's own schema says how to call it; this says only which one, and what to address it with.
- `next.params` (object): The parameters that address the operation, by name: `{"sender_id": "…"}` for an operation on `/v1/sms/senders/{sender_id}/requirements`. A parameter the operation takes in its query string is given the same way, so an operation addressed as `?subject_id=` carries `{"subject_id": "…"}`. Every parameter the call needs is here, whether its value came from the thing you were acting on or is fixed for this step, so you can make the call from this object alone. Present only when `kind` is `operation` and the operation names a subject. A request body, when the operation takes one, is described by the operation's own schema and never appears here.
- `next.url` (string): A URL to open. Present only when `kind` is `external`, and only when the step has one. An external step whose `description` says to go and do something with no URL to open is normal.
- `asset` (nullable object, required): Canonical asset when available, or null before completion or when unavailable.
- `asset.created_at` (string, required)
- `asset.updated_at` (string, required)
- `asset.id` (string, required)
- `asset.url` (string, required): The asset's permanent public URL. Safe to embed or link in sent messages; for a document the usable form is a link.
- `asset.thumbnail_url` (nullable string, required): A small preview of the asset, for rendering a picker or a grid. Intended for your own interfaces rather than for embedding in messages. Null for every kind but `image`: generating a preview of a video, an audio file, or a document would mean rendering its contents, which the library does not do. Show an icon for the `kind` instead.
- `asset.name` (string, required): The asset's display name. Defaults to the uploaded file's name.
- `asset.content_type` (string, required): The stored file's media type, determined from its contents.
- `asset.kind` (string, required)

  The category a media-library asset's type falls into. Use it to group or filter a
  mixed library.

  - `image`: covers PNG, JPEG, and GIF.
  - `video`: covers MP4, WebM, and QuickTime.
  - `audio`: covers MP3, M4A, Ogg, and WAV.
  - `document`: covers PDF.

  Possible values (may grow over time): `image`, `video`, `audio`, `document`
- `asset.size_bytes` (integer, required): The stored file's size in bytes. Images are re-encoded on upload, so for those this can differ from the size of the file you sent. Every other kind is stored byte-for-byte.
- `asset.width` (nullable integer, required): The stored image's width in pixels. Null for every kind but `image`.
- `asset.height` (nullable integer, required): The stored image's height in pixels. Null for every kind but `image`.
- `asset.alt_text` (nullable string, required): Default alternative text for the asset. Use it as the starting point for an image description when inserting the asset into content. Updating this field does not update descriptions already copied into saved content.
- `asset.folder_id` (nullable string, required): The folder the asset is filed in, or null when it sits at the top level of the library. Filing an asset never changes its URL.
- `asset.deleted_at` (nullable string, required): When the asset was removed from the library, or null if it is still listed. A removed asset keeps serving at its original URL.

## Related resources

- [Should I use a Bird SDK or call the API directly?](/explained/platform/should-i-use-an-sdk-or-call-the-api-directly) (answer)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=api-basics)
