---
url: /orchestration/reference/operations/UploadConsumerBlob.md
description: 'POST /v2/consumer/blobs — Upload a blob directly with on-the-fly moderation'
---

> Documentation index: https://developer.civitai.com/llms.txt — every page on this site has a markdown version at its URL + `.md`.

# Upload a blob directly with on-the-fly moderation

`POST https://orchestration.civitai.com/v2/consumer/blobs`

Operation `UploadConsumerBlob` · Blobs · Civitai Orchestration API, generated from the published OpenAPI spec ([v2-consumers.json](https://developer.civitai.com/openapi/v2-consumers.json)); the interactive HTML page is this URL without `.md`.

Upload a blob directly with on-the-fly moderation.
Supports both authenticated requests (Bearer token) and presigned URLs (sig query param).

## Authentication

Send `Authorization: Bearer <token>` (the spec's `ApiKey` scheme); this operation documents `401 Unauthorized` for a missing or invalid token. See [Authentication](https://developer.civitai.com/orchestration/guide/authentication.md).

## Parameters

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `public` | query | boolean | no | Store the blob in the public tier and return a durable, unsigned URL for it. Privileged callers only: nothing gates a read of that URL, so a block decided after the fact cannot take it back. |

## Responses

### 201 Created

Content type: `application/json`.

Schema `Blob`.

Polymorphic: the `type` field selects the concrete type — `image` → `ImageBlob`, `video` → `VideoBlob`, `audio` → `AudioBlob`, `model3d` → `Model3DBlob`.

| Field | Type | Required | Description |
|---|---|---|---|
| `type` | string | yes |  |
| `id` | string | yes |  |
| `available` | boolean | yes |  |
| `url` | string (uri), nullable | no |  |
| `urlExpiresAt` | string (date-time), nullable | no |  |
| `jobId` | string, nullable | no |  |
| `nsfwLevel` | `NSFWLevel` (one of `pg`, `pg13`, `r`, `x`, `xxx`, `na`) | no |  |
| `blockedReason` | string, nullable | no |  |
| `tier` | string, nullable | no | Deprecated: use `publicUrl` to tell a public blob. Get the storage tier holding this blob, when one was declared. Null resolves to the private managed tier, falling back to the classic one for blobs written before producers moved off it. |
| `publicUrl` | string (uri), nullable | no | The durable, unsigned url of a blob requested public, which a CDN can cache. Set as soon as the blob is requested, so it may 404 until the workflow that produces it completes; `url` waits instead. |

### 400 Bad Request

Content type: `application/json`.

Schema `ProblemDetails`.

| Field | Type | Required | Description |
|---|---|---|---|
| `type` | string, nullable | no |  |
| `title` | string, nullable | no |  |
| `status` | integer (int32), nullable | no |  |
| `detail` | string, nullable | no |  |
| `instance` | string, nullable | no |  |

### 401 Unauthorized

Content type: `application/json`.

Schema `ProblemDetails` — fields as listed above.

### 413 Content Too Large

Content type: `application/json`.

Schema `ProblemDetails` — fields as listed above.

### 415 Unsupported Media Type

Content type: `application/json`.

Schema `ProblemDetails` — fields as listed above.

### 422 Unprocessable Content

Content type: `application/json`.

Schema `ProblemDetails` — fields as listed above.
