---
url: /orchestration/reference/operations/IngestConsumerBlob.md
description: 'POST /v2/consumer/blobs/ingest — Copy a trusted url into a blob named after that source, so the caller can ask for it again'
---

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

# Copy a trusted url into a blob named after that source, so the caller can ask for it again

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

Operation `IngestConsumerBlob` · 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`.

Copy a trusted url into a blob named after that source, so the caller can ask for it again
without holding the bytes. 200 when it already existed, 201 when copied.

## Authentication

The spec marks this operation anonymous (`security: []`): no token is needed, although it still documents a `401 Unauthorized` response.

## Parameters

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `sourceUrl` | query | string | no | Object to copy; must resolve to a configured trusted source. |
| `public` | query | boolean | no | Store in the public tier and return a durable, unsigned URL. |

## Responses

### 200 OK

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. |

### 201 Created

Content type: `application/json`.

Schema `Blob` — fields as listed above.

### 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.

### 403 Forbidden

Content type: `application/json`.

Schema `ProblemDetails` — fields as listed above.

### 404 Not Found

Content type: `application/json`.

Schema `ProblemDetails` — fields as listed above.

### 422 Unprocessable Content

Content type: `application/json`.

Schema `ProblemDetails` — fields as listed above.

### 502 Bad Gateway

No body.
