Skip to main content
POST
Upload an asset (single-call multipart)

承認

Authorization
string
header
必須

Authorization: Bearer <credential>. The credential is one of: an account-scoped API key (comfyui-…), accepted on Cloud and serverless; a Comfy Cloud session JWT; or an OAuth access token issued for the Comfy Cloud resource. Which kinds a given deployment accepts is deployment configuration — an API key always works on Cloud and serverless, and a deployment that does not accept JWT bearers answers 401 with a message saying so. Self-hosted accepts unauthenticated requests by default and can be configured with a static bearer token.

ヘッダー

Idempotency-Key
string

Client-generated UUID (recommended). Single-use: the first request to present a key is processed; any later request with the same key is rejected 422 idempotency_key_reuse (reject-on-duplicate, no response replay). Keys expire after 24h.

ボディ

multipart/form-data
file
file
必須

The raw bytes.

content_type
string
必須
例:

"image/png"

file_path
string
必須

Placement path / filename (global-namespace-root form, e.g. photo.png or models/checkpoints/x.safetensors).

例:

"photo.png"

expected_hash
string

Optional client-computed blake3 (blake3:<hex>). Verified against the server-computed hash; mismatch is rejected with 409 hash_mismatch and no asset is minted.

例:

"blake3:9f8a1c0d..."

tags
string[]

Category tags (e.g. input).

expires_in
integer

Optional retention override in seconds (60s–7d): the asset's expires_at becomes now + expires_in, replacing the platform's default retention. Implementations without configurable retention ignore it. The bounds apply to this override only — the platform default is operator-configured and may lie outside them.

必須範囲: 60 <= x <= 604800
例:

86400

レスポンス

Bytes deduped to an existing blob; asset minted over it.

A user-owned record identified by a server-assigned UUID, backing an immutable blob whose content carries a server-computed blake3 hash. hash may be computed lazily: an asset record (and its retrievable bytes) can exist before its hash is filled in. On an output, job_metadata carries the labels its producing job was submitted with, so code holding only the asset knows which run it came from. It is absent for assets no job produced, for outputs of a job sent without labels, where the serving surface keeps no job labels, and when the labels could not be read: so job_id without job_metadata does not prove the job had no labels. A create whose file path and bytes match an existing output answers with that output, so its job_id and job_metadata are the output's.

id
string
必須
例:

"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b"

hash
string | null
必須

blake3:<hex>; null while lazily computed.

例:

"blake3:9f8a1c0d..."

size_bytes
integer<int64>
必須
例:

4816293

content_type
string
必須
例:

"image/png"

created_at
string<date-time>
必須
url
string<uri>
必須

Short-lived content URL (signed, or proxy-served).

url_expires_at
string<date-time>
必須
file_path
string | null
例:

"photo.png"

created_new
boolean

On create responses: distinguishes a brand-new blob (true) from a dedup hit against bytes the platform already had (false).

expires_at
string<date-time> | null

Retention deadline for the asset itself (distinct from url_expires_at, the signed URL's validity). Null or absent means the asset is non-expiring. On a dedup-hit create response the deadline may be later than now + the requested/default retention: re-referencing content extends its retention, never shortens it.

job_id
string | null

ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.

job_metadata
object

The labels the producing job was submitted with, read through job_id on each read. Absent for assets no job produced, for outputs of a job sent without labels, where the serving surface keeps no job labels, when the job is gone, and when the labels could not be read: so job_id without job_metadata does not prove the job had no labels.

例: