---
title: "What an upload link has produced"
method: GET
path: "/v1/uploads/links/{link_id}"
tags: ["uploads"]
---

# What an upload link has produced

`GET /v1/uploads/links/{link_id}`

## Request

- Base URL: `https://api.framelane.io`
- URL: `https://api.framelane.io/v1/uploads/links/{link_id}`
- Auth: HTTP bearer

## Path parameters

- `link_id` string, required

## Response `200`

Successful Response

- UploadLinkStatusOut: Response from GET /v1/uploads/links/{id}: what the link has produced so far.
  - `id` string, required: The link id; poll `GET /v1/uploads/links/{id}` for the asset it produces.
  - `url` string, required: Open this in a browser to upload one file into the workspace. Valid for one hour; the file's type and duration are taken from the file itself.
  - `expires_at` string, date-time, required: When the link stops accepting uploads.
  - `asset_id` string, nullable: The asset the person uploaded through this link; null until they have.
  - `asset` 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`: No such link.
- `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)
