---
title: "Complete Asset Upload"
method: POST
path: "/v3/assets/{asset_id}/complete"
tags: ["Assets"]
---

# Complete Asset Upload

`POST /v3/assets/{asset_id}/complete`

## Request

- Base URL: `https://api.heygen.com`
- URL: `https://api.heygen.com/v3/assets/{asset_id}/complete`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

Finalize a direct-to-S3 upload into a reusable asset. Call after the upload PUT returns 200. Idempotent: repeated calls return the same finalized asset.

## Path parameters

- `asset_id` string, required

## Request body

- CompleteAssetUploadRequest: Finalize a presigned upload (POST /v3/assets/{asset_id}/complete).
  - `checksum_sha256` string, nullable: Optional SHA256 (hex) cross-check.

## Response `200`

Successful response

- object
  - `data` CompleteAssetUploadResponse: Result of finalizing an upload.
    - `asset_id` string, required: The reusable asset identifier.
    - `url` string, required: Public URL of the finalized asset.
    - `mime_type` string, required: MIME type detected from the stored bytes.
    - `size_bytes` integer, required: Size of the stored object in bytes.
    - `status` 'processing', required: Asset status, e.g. 'processing'.

## Other responses

- `400`: Invalid request parameters
- `401`: Authentication failed
- `404`: Resource not found
- `409`: Conflict
- `429`: Rate limit exceeded

## Changes

- **2026-11-03** `7dfa5e59b4f5`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/heygen/apis/heygen-external-api/changes/v3/assets/:asset_id/complete/post.md)

---

[API](https://skmtc.dev/heygen/apis/heygen-external-api.md) - [All operations](https://skmtc.dev/heygen/apis/heygen-external-api/llms.txt) - [OpenAPI document](https://skmtc.dev/heygen/apis/heygen-external-api/revisions/7dfa5e59b4f5?raw)
