# Complete Upload

```
POST 
/v1/:slug/assets/upload_complete
```

**Final Step of Asset Upload Process**

This endpoint completes the asset upload process by creating the Asset record in Playbook's database. Call this after successfully uploading the file to cloud storage.

## What this endpoint does:[​](#what-this-endpoint-does "Direct link to What this endpoint does:")

1. Verifies the signed\_gcs\_id from upload\_prepare
2. For Backblaze multipart: completes the multipart upload using multipart\_upload\_id
3. Confirms the file exists in cloud storage
4. Creates the Asset record in Playbook's database
5. Triggers background processing (thumbnails, transcoding, etc.)
6. Returns the complete Asset object with URLs and metadata

***

## For GCS Organizations[​](#for-gcs-organizations "Direct link to For GCS Organizations")

After completing the 4-step GCS upload flow:

```
POST /v1/{org_slug}/assets/upload_complete

Headers:

  Authorization: Bearer {your_access_token}

  Content-Type: application/json

Body:

  {

    "asset": {

      "signed_gcs_id": "{value_from_upload_prepare}",

      "title": "my-image.jpg",

      "description": "Optional description",

      "collection_token": "optional_collection_token"

    }

  }
```

***

## For Backblaze Organizations[​](#for-backblaze-organizations "Direct link to For Backblaze Organizations")

### Single-Part Upload (no multipart\_upload\_id):[​](#single-part-upload-no-multipart_upload_id "Direct link to Single-Part Upload (no multipart_upload_id):")

```
POST /v1/{org_slug}/assets/upload_complete

Body:

  {

    "asset": {

      "signed_gcs_id": "{value_from_upload_prepare}",

      "title": "my-image.jpg"

    }

  }
```

### Multipart Upload (has multipart\_upload\_id):[​](#multipart-upload-has-multipart_upload_id "Direct link to Multipart Upload (has multipart_upload_id):")

```
POST /v1/{org_slug}/assets/upload_complete

Body:

  {

    "asset": {

      "signed_gcs_id": "{value_from_upload_prepare}",

      "multipart_upload_id": "{value_from_upload_prepare}",

      "title": "my-large-video.mp4"

    }

  }
```

***

## Required Parameters:[​](#required-parameters "Direct link to Required Parameters:")

* **signed\_gcs\_id**: Always required - exact value from upload\_prepare response
* **multipart\_upload\_id**: Required only for Backblaze multipart uploads (files >= 5MB)

## Important:[​](#important "Direct link to Important:")

* Do not URL-encode or modify the signed\_gcs\_id
* This step is **required** - without it, the file exists in storage but not in Playbook
* For Backblaze multipart: ensure all parts uploaded before calling this endpoint

## Request[​](#request "Direct link to request")

## Responses[​](#responses "Direct link to Responses")

* 200
* 401
* 404
* 422

Asset upload completed successfully

unauthenticated

file not found in storage

invalid signed\_gcs\_id
