---
title: "Create a HeyGen asset upload (for auto-mode file_asset_ids)"
method: POST
path: "/v1/assets"
tags: ["Assets"]
---

# Create a HeyGen asset upload (for auto-mode file_asset_ids)

`POST /v1/assets`

## Request

- Base URL: `https://api.vivideo.ai`
- URL: `https://api.vivideo.ai/v1/assets`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/vivideo/apis/vivideo-api/docs/v1/assets/post.ts> (a function with typed inputs; its response is checked against the schema)

Returns a presigned `upload_url` + `asset_id`. PUT your file bytes to `upload_url` with the returned `upload_headers`, then call POST /v1/assets/{id}/complete. Use `asset_id` as an auto-mode `file_asset_ids` entry, an avatar `asset_id`, or a brand `logo_asset_id`.

## Request body

- object
  - `filename` string, required
  - `content_type` string, required
  - `size_bytes` integer, required

## Response `201`

Asset upload created.

- Asset
  - `id` string: Our stable asset id (for complete/delete).
  - `object` string
  - `asset_id` string: HeyGen asset id — use in file_asset_ids / avatar asset_id / brand logo_asset_id.
  - `upload_url` string
  - `upload_headers` object
  - `status` 'uploading' | 'processing' | 'ready' | 'deleted'
  - `asset_type` string
  - `url` string
  - `content_type` string
  - `size_bytes` integer

## Other responses

- `400`: Invalid parameters (`invalid_request`, `unknown_model`, `invalid_url`).
- `401`: Missing, malformed or revoked API key (`missing_api_key`, `invalid_api_key`, `api_key_revoked`).
- `429`: Rate limit hit (`rate_limited`). Honor the `Retry-After` header / `retry_after_seconds` field.

---

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