---
title: "Get one media asset"
method: GET
path: "/v1/workspace/assets/{asset_id}"
tags: ["workspace"]
---

# Get one media asset

`GET /v1/workspace/assets/{asset_id}`

## Request

- Base URL: `https://api.framelane.io`
- URL: `https://api.framelane.io/v1/workspace/assets/{asset_id}`
- Auth: HTTP bearer

Returns a single asset, **including one the list does not show yet**.

This is how you confirm an upload landed. `POST /v1/uploads` mints the asset row when it reserves the slot, and the bytes then travel from your client straight to storage without passing through this API — so a `201` there proves a slot exists, never that a file arrived. `bytes_uploaded` answers that by checking storage; `false` means the transfer never completed and the row is a reservation you should re-upload or `DELETE`.

## Path parameters

- `asset_id` string, required

## Response `200`

Successful Response

- MediaAssetDetailOut: One asset by id, with the two facts a listing cannot carry. The list route is ready-only by construction, so `ready` is implied there and `bytes_uploaded` is unanswerable — checking storage per row would mean a bucket round-trip per item. Both are worth their cost for a single asset, and without them there is no way to tell a completed upload from a reserved slot.
  - `id` string, required: Unique asset ID.
  - `source_url` string, required: CDN URL of the uploaded file. Pass as source_url in render requests.
  - `kind` string, required: Media kind, derived from the file extension: `video`, `audio` or `image`.
  - `filename` string, nullable: The file's original name, for display. Null for assets uploaded before names were recorded; derive one from `source_url` in that case.
  - `duration` number, nullable: Duration in seconds. Always null for images.
  - `width` integer, nullable: Pixel width (video or image).
  - `height` integer, nullable: Pixel height (video or image).
  - `created_at` string, date-time, required: When the asset was uploaded.
  - `ready` boolean, required: Whether this asset can be used in a render. False while a video or audio duration probe is still running.
  - `bytes_uploaded` boolean, required: Whether the file is actually in storage. False means the upload never completed and this row is only a reservation — re-upload it. This is the one reliable confirmation for a direct upload, because those bytes go straight to storage without passing through the API.

## Other responses

- `401`: Missing or invalid API key.
- `404`: Asset not found.
- `422`: Validation Error

---

[API](https://skmtc.dev/framelane/apis/framelane-api.md) · [All operations](https://skmtc.dev/framelane/apis/framelane-api/llms.txt) · [OpenAPI document](https://skmtc.dev/framelane/apis/framelane-api/revisions/a223001ca8e5?raw)
