{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
assets
Upload an asset (single-call multipart)
Single-call multipart/form-data upload. The platform streams the
bytes through its trusted byte-path, dedups by the server-computed
hash, and mints the asset record.
The blake3 hash is always computed server-side from the received
bytes — a client-declared expected_hash is verified, never trusted
(on Comfy Cloud and serverless, only when sent before file — see below).
If location metadata (GPS, XMP, IPTC) is removed from an image before
it is stored, the asset’s hash is the hash of the stored bytes and
can differ from expected_hash. On Comfy Cloud, an upload whose
bytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based
camera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that
is over 50 MiB is refused with 422 validation_error, whatever its
content_type and whether or not it carries location metadata. A
request that declares a Content-Length over Comfy Cloud’s 200 MB
(200,000,000-byte) body limit is refused before that check with a
plain 413 that does not use the ErrorEnvelope shape. A body sent
without a declared length is cut off when it passes that limit, and
no 413 is sent: a cut-off while the fields before file are read
fails with 422 invalid_body, and a cut-off inside the file usually
fails with 500 upstream_error. Nothing after the file field is
read, so a body that only passes the limit there is uploaded
normally.
Deployment-scoped surfaces neither strip location metadata nor apply
the 50 MiB image cap; they limit the request body to 110 MB
(110,000,000 bytes). A request that declares a Content-Length over
that limit is refused with the same plain 413; a body sent without a
declared length is cut off when it passes the limit, and the upload
then fails with an error response that is not guaranteed to be a 413.
The uploaded asset is referenceable immediately; any content scanning
runs in the background and does not block the response.
Send file as the last part. Comfy Cloud and serverless deployments
stream it straight into storage and read the other fields only up to
it, so a part sent after file is never read: a content_type or
file_path sent only after it is refused as missing (422); an
optional field (expected_hash or tags) is silently ignored — the
upload succeeds without the hash check or the caller’s tags; on
serverless deployments, a trailing expires_in is likewise ignored,
losing the retention override; and a second file part is dropped,
so only the first part’s bytes are stored. Comfy Cloud ignores
expires_in wherever it is sent, before or after file. The
response does not say any of these were skipped.
An upload is a single request. v1 expects files of up to ~100 MB;
the hard cap is the body limit of the surface it is sent to (above).
Chunked/resumable large uploads are a deliberate open question.
Cloud’s hosted API caps every part sent before file at 8 KiB,
including a part it does not recognise (which it otherwise
ignores), so an extra field over 8 KiB, such as file bytes sent
under a misspelled name, is refused with 422 invalid_body. Parts
sent after file are never read: the 8 KiB cap does not apply to
them, and a metadata field sent there is treated as absent, so send
every metadata field before file. A declared Content-Length
still counts those bytes toward the size limit above; without one,
a body that only exceeds the limit there is uploaded normally,
since nothing after file is read.
On Comfy Cloud an upload fails with 422 upload_timed_out when no
request bytes arrive for 30 seconds, or when the whole request takes
longer than 10 minutes, however steadily bytes keep arriving.
On Comfy Cloud an upload can also be refused with 503 upload_busy
and Retry-After when the server is busy with other uploads: nothing
was stored, so the same upload can be sent again after Retry-After.
On a Developer Platform deployment the same 422 upload_timed_out
applies when no request bytes arrive for 30 seconds, or when the whole
request takes longer than 20 minutes.
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
{
"error": {
"code": "invalid_workflow",
"message": "Node 12 (KSampler): required input 'model' is not connected",
"organization_id": "org_01HXYZEXAMPLE",
"details": {
"node_errors": {
"12": {
"class_type": "SomeCustomNode",
"errors": [
{
"type": "unknown_node_class",
"message": "this deployment's build does not contain the node class SomeCustomNode."
}
]
}
},
"unknown_node_classes": [
"SomeCustomNode"
]
}
}
}
Autorizaciones
Authorization
string
header
requerido
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.
Encabezados
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 422idempotency_key_reuse (reject-on-duplicate, no response replay). Keys expire after 24h.
Cuerpo
multipart/form-data
content_type
string
requerido
The asset's media type. On Comfy Cloud it must be valid UTF-8, not blank, at most 255 bytes, must not start or end with whitespace, and must not contain control characters (C0, DEL, C1, U+2028, U+2029) or any invisible format or default-ignorable character (every Unicode general category Cf character, including the zero-width joiners and direction marks, and the other default-ignorable code points); otherwise the request is refused with 422 invalid_body before anything is stored. An accepted value is stored as sent. A deployment refuses a content_type that is blank, is not valid UTF-8 or contains a control character (C0 other than tab, DEL, C1) or a bidi embedding, override or isolate (U+202A-U+202E, U+2066-U+2069), has a tab outside the whitespace that opens a parameter after a ;, or whose part before its first ; is not type/subtype (two RFC 9110 tokens, optionally followed by spaces), with 422 invalid_request before anything is stored.
Ejemplo:
"image/png"
file_path
string
requerido
Placement path / filename (global-namespace-root form, e.g. photo.png or models/checkpoints/x.safetensors). On Comfy Cloud the last segment becomes the asset name, so it must be valid UTF-8, at most 255 bytes, must not start with ., and must not contain control characters (C0, DEL, C1, U+2028, U+2029) or invisible format and default-ignorable characters (Unicode general category Cf, which includes the bidi embedding, override and isolate controls, soft hyphen, zero-width space, word joiner, BOM and tag characters, plus the other default-ignorable code points such as U+034F, U+2065 and the Hangul fillers); otherwise the request is refused with 422 invalid_body before anything is stored. ZWNJ/ZWJ (U+200C, U+200D) are allowed only between two visible non-ASCII characters (so not first, last, next to ASCII or next to another of these invisible characters, though one may follow an allowed variation selector, one right after an Indic virama on a letter of the same script may end a word, and a ZWJ after an Arabic-script letter that joins on both sides, or after that letter's marks, may precede ASCII such as a '.' or end the name), for Persian, Indic and emoji names. The direction marks U+200E, U+200F and U+061C are allowed, for right-to-left names, and so are the visible Arabic number signs (prepended concatenation marks such as U+0600, but not U+070F); the direction marks can still change how a name is displayed. The emoji presentation selectors U+FE0E and U+FE0F are allowed only after an ASCII digit, # or * that U+20E3 (the keycap) follows, after U+2139, the punctuation emoji U+203C, U+2049, U+3030 and U+303D or the math symbols U+2194, U+25FB-U+25FE, U+2934 and U+2935, and after any other symbol of category So except a regional indicator, a skin-tone modifier, a hair component or U+2800. Other variation selectors are allowed only after a base that can have variants: the Mongolian ones after a Mongolian letter, the rest after a unified Han ideograph, plus U+FE00 after the Myanmar and Phags-pa characters it is registered for. The Mongolian and Han rules follow scripts, not the registered sequence list. The tag characters are allowed only as the tag run of the England, Scotland and Wales flag emoji. These allowed invisible characters, white space, U+2800 and combining marks must not make up the whole segment or come before a leading .. A deployment keeps the whole file_path as the asset name, so it must be valid UTF-8 and must not contain a control character (C0 U+0000-U+001F, including tab, CR and LF; DEL U+007F; C1 U+0080-U+009F) or a bidi embedding, override or isolate (U+202A-U+202E, U+2066-U+2069); otherwise the request is refused with 422 invalid_request before anything is stored. Directory segments and other characters stay allowed there.
Ejemplo:
"photo.png"
file
file
requerido
The raw bytes. The order of properties in this schema does not set the order of parts on the wire: file must be the last part sent (see the field-order rule above).
expected_hash
string
Optional client-computed blake3 (blake3:<hex>) of the bytes sent. Omit the part to skip verification: on Comfy Cloud and on a deployment a part sent empty is refused with 422 as malformed. Send it before file: nothing after the file field is read, so a trailing expected_hash is neither verified nor refused, and the response does not say the check was skipped. Verified against the server-computed blake3 of the received bytes, not of the stored bytes; mismatch is rejected with 409 hash_mismatch. On serverless deployments no asset is minted and no existing asset's retention is changed; elsewhere the upload is stored before the check, so the 409 returns no asset and a retry with the corrected expectation (and the same file extension) dedups onto it. On Comfy Cloud nothing removes that asset, so when the bytes themselves were wrong they stay stored: as an asset named after the last segment of file_path (x.safetensors for models/checkpoints/x.safetensors), or, when the bytes deduped onto an asset you already had, as that asset under its earlier name. The rest of file_path is not recorded. On Comfy Cloud and on a deployment, when expected_hash is sent more than once before file only the last value is checked, but an empty one among them is still refused with 422.
Ejemplo:
"blake3:9f8a1c0d..."
tags
string[]
Category tags (e.g. input). A create carries at most 64 tags, each a non-empty UTF-8 string of at most 256 bytes (surrounding whitespace included) with no NUL byte. A deployment adds input to every asset and counts it, so it takes at most 63 of the caller's own; the model_type: tags derived for a model asset are not counted. A tag set breaking a limit is refused with 422. The rest of this paragraph describes Cloud's hosted API and a deployment, not the self-hosted proxy. Both cap the bytes of all tags parts sent before file combined: 8 KiB on Cloud's hosted API (422 invalid_body) and 64 KiB on a deployment (422 invalid_request). The cap counts duplicates before they are removed and JSON escapes before they are decoded, and is checked before the count and 256-byte limits above, so a tag set within them can still be refused. A quoted-printable part is counted and read after it is decoded; a part in any other Content-Transfer-Encoding is read as sent, so a base64 part is stored as one tag holding its encoded text, while a 7bit, 8bit or binary part is read like a part with no encoding. A part is read as a JSON array when it starts with [ (after leading whitespace) and is valid JSON or continues, after optional whitespace, with ": ["a","b"] is two tags, [] adds no tags (nor does an empty part), and a malformed array such as [1] or ["a is refused with 422. Any other non-empty part is one bare tag, kept as literal text, so foo\ud800 sent as a bare part is stored as written. Invalid UTF-8 in a tags part, or a lone surrogate escape (e.g. \ud800) in a JSON-array tags part, is refused with 422 (invalid_body on Cloud, invalid_request on a deployment).
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.
Rango requerido: 60 <= x <= 604800
Ejemplo:
86400
Respuesta
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
requerido
Ejemplo:
"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b"
hash
string | null
requerido
blake3:<hex>; null while lazily computed.
Ejemplo:
"blake3:9f8a1c0d..."
size_bytes
integer<int64>
requerido
Ejemplo:
4816293
content_type
string
requerido
Ejemplo:
"image/png"
created_at
string<date-time>
requerido
url
string<uri>
requerido
Short-lived content URL (signed, or proxy-served).
url_expires_at
string<date-time>
requerido
file_path
string | null
Ejemplo:
"photo.png"
created_new
boolean
On POST /api/v2/assets responses, distinguishes a brand-new blob (true) from a dedup hit against bytes the platform already had (false). On POST /api/v2/assets/from-hash responses, true means a new asset reference was created over existing bytes (201); false means an existing asset was reused (200).
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.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ComfyUI","colors":{"primary":"#49378B","light":"#F2FF59","dark":"#F2FF59"},"logo":{"light":"https://mintcdn.com/dripart/WCFdTagRdhtvk9-o/logo/light.svg?fit=max\u0026auto=format\u0026n=WCFdTagRdhtvk9-o\u0026q=85\u0026s=ec112de87239058f5a931a7e4b594965","dark":"https://mintcdn.com/dripart/QzWbjSCBG7w61rR3/logo/dark.svg?fit=max\u0026auto=format\u0026n=QzWbjSCBG7w61rR3\u0026q=85\u0026s=62b4d879fb3aadbd7a468d1539032d6f","href":"/"},"favicon":"https://mintcdn.com/dripart/maKDA164-rrTfyxY/favicon.ico?fit=max\u0026auto=format\u0026n=maKDA164-rrTfyxY\u0026q=85\u0026s=94f3a697cf4c9a1ee3961b69219d0942","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://blog.comfy.org/?utm_source=docs","label":"Blog"},{"href":"/tutorials/partner-nodes/pricing","label":"Pricing"},{"href":"https://platform.comfy.org/?utm_source=docs","label":"Platform"},{"href":"https://comfy.org/download?utm_source=docs","label":"Download"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"Resources","items":[{"label":"installation","href":"/installation/system_requirements"},{"label":"Tutorials","href":"/tutorials/basic/text-to-image"},{"label":"Development","href":"/development/overview"}]},{"header":"Products","items":[{"label":"Features","href":"https://www.comfy.org/?utm_source=docs"},{"label":"Gallery","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"Download","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"Company","items":[{"label":"About","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"Careers","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"Terms of Service","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"Privacy Policy","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"search":{"prompt":"Search Comfy documentation..."},"seo":{"metatags":{"googlebot":"max-video-preview:0"}},"icons":{"library":"fontawesome"},"integrations":{"ga4":{"measurementId":"G-MXC01ZDDHQ"},"posthog":{"apiKey":"phc_iKfK86id4xVYws9LybMje0h44eGtfwFgRPIBehmy8rO"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":""},{"language":"zh","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"资源","items":[{"label":"安装","href":"/zh/installation/system_requirements"},{"label":"教程","href":"/zh/tutorials/basic/text-to-image"},{"label":"开发","href":"/zh/development/overview"}]},{"header":"产品","items":[{"label":"功能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"画廊","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"下载","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"公司","items":[{"label":"关于","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"招聘","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"服务条款","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"隐私政策","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"href":"zh"},{"language":"ja","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"リソース","items":[{"label":"インストール","href":"/ja/installation/system_requirements"},{"label":"チュートリアル","href":"/ja/tutorials/basic/text-to-image"},{"label":"開発","href":"/ja/development/overview"}]},{"header":"プロダクト","items":[{"label":"機能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"ギャラリー","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"ダウンロード","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"会社情報","items":[{"label":"概要","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"採用情報","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"利用規約","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"プライバシーポリシー","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ja/tutorials/partner-nodes/pricing","label":"料金"},{"href":"https://comfy.org/download?utm_source=docs","label":"ダウンロード"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"href":"ja"},{"language":"ko","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"리소스","items":[{"label":"설치","href":"/ko/installation/system_requirements"},{"label":"튜토리얼","href":"/ko/tutorials/basic/text-to-image"},{"label":"개발","href":"/ko/development/overview"}]},{"header":"제품","items":[{"label":"기능","href":"https://www.comfy.org/?utm_source=docs"},{"label":"갤러리","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"다운로드","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"회사 정보","items":[{"label":"소개","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"채용","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"이용약관","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"개인정보 처리방침","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ko/tutorials/partner-nodes/pricing","label":"가격 정책"},{"href":"https://comfy.org/download?utm_source=docs","label":"다운로드"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"href":"ko"},{"language":"es","href":"es"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"dripart","hasAudioNarration":false,"actualSubdomain":"dripart","customDomains":["docs.comfy.org"],"gitSource":{"type":"github","owner":"comfy-org","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6af94007df163b1980475567","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"en","tag":"Built-in Nodes","count":1183},{"language":"ja","tag":"組み込みノード","count":1183},{"language":"zh","tag":"内置节点","count":1183},{"language":"en","tag":"Nodes","count":1182},{"language":"ja","tag":"ノード","count":1182},{"language":"zh","tag":"节点","count":1182},{"language":"ko","tag":"내장 노드 (Built-in Nodes)","count":1141},{"language":"ko","tag":"노드","count":1140},{"language":"es","tag":"Nodos integrados","count":1075},{"language":"es","tag":"Nodos","count":1074},{"language":"en","tag":"Tutorials","count":427},{"language":"es","tag":"Tutoriales","count":427},{"language":"en","tag":"Model","count":382},{"language":"ja","tag":"Model","count":382},{"language":"ko","tag":"Model","count":382},{"language":"zh","tag":"Model","count":382},{"language":"es","tag":"Modelo","count":378},{"language":"en","tag":"Image","count":360},{"language":"en","tag":"Partner","count":359},{"language":"ja","tag":"Partner","count":359},{"language":"ko","tag":"Partner","count":359},{"language":"zh","tag":"Partner","count":359},{"language":"es","tag":"Partner","count":357},{"language":"es","tag":"Imagen","count":329},{"language":"ja","tag":"API 開発","count":326},{"language":"ko","tag":"API 개발","count":326},{"language":"zh","tag":"API 开发","count":326},{"language":"ja","tag":"はじめに","count":318},{"language":"ko","tag":"시작하기","count":318},{"language":"zh","tag":"开始使用","count":318},{"language":"en","tag":"Comfy Router","count":303},{"language":"en","tag":"Video","count":297},{"language":"ja","tag":"Comfy Router","count":289},{"language":"ko","tag":"Comfy Router","count":289},{"language":"zh","tag":"Comfy Router","count":289},{"language":"en","tag":"Models","count":273},{"language":"es","tag":"Video","count":272},{"language":"en","tag":"All Models","count":270},{"language":"es","tag":"Comfy Router","count":266},{"language":"ja","tag":"Models","count":259},{"language":"ko","tag":"Models","count":259},{"language":"zh","tag":"Models","count":259},{"language":"es","tag":"Models","count":227},{"language":"es","tag":"All Models","count":224},{"language":"ja","tag":"画像","count":211},{"language":"ko","tag":"이미지","count":211},{"language":"zh","tag":"图像","count":211},{"language":"ja","tag":"Video","count":197},{"language":"zh","tag":"Video","count":197},{"language":"ko","tag":"Video","count":180}],"searchSettings":{"maxResults":10}},"assistantConfig":{"enableStarterQuestions":false},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":":root{--ink-900: #151417;--hub-shell-light: #f7f6f9;--accent-purple: #49378b;--accent-yellow: #f2ff59;--primary: 73 55 139 !important;--primary-light: 242 255 89 !important;--primary-dark: 242 255 89 !important}html.dark{--primary: 242 255 89 !important;--background-dark: 14 14 13 !important}html.dark body{background-color:#0e0e0d!important}html.dark #navbar,html.dark #navbar-transition{background-color:var(--ink-900)!important}html.dark #sidebar,html.dark #sidebar-content{background-color:rgb(var(--background-dark))!important}html.dark #navbar,html.dark #navbar-transition{box-shadow:none!important;filter:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important}html.dark #navbar-transition{border-bottom:1px solid rgba(255, 255, 255, 0.08)!important;opacity:1!important}html.dark img.nav-logo{filter:none}html.dark #sidebar-content a:not([aria-current=\"page\"]){color:rgba(255, 255, 255, 0.72)!important}html.dark #sidebar-content a:not([aria-current=\"page\"]) *{color:inherit!important}html.dark #sidebar-content a[aria-current=\"page\"]{color:var(--accent-yellow)!important;background-color:rgba(242, 255, 89, 0.10)!important}html.dark #sidebar-content a[aria-current=\"page\"] *{color:inherit!important}html.dark .nav-tabs-item[data-active],html.dark mobile-nav-tabs-item[data-active]{color:var(--accent-yellow)!important}html.dark #navbar a[href*=\"comfy.org/cloud\"] span.absolute{background-color:var(--accent-yellow)!important}html.dark #navbar a[href*=\"comfy.org/cloud\"] span.text-white{color:#151417!important}html:not(.dark) #background-color,html:not(.dark) #navbar,html:not(.dark) #navbar-transition,html:not(.dark) #sidebar,html:not(.dark) #sidebar-content{background-color:var(--hub-shell-light)!important}html:not(.dark) .nav-tabs-item[data-active],html:not(.dark) mobile-nav-tabs-item[data-active],html:not(.dark) nav-dropdown-item[data-active]{background-color:transparent!important;box-shadow:none!important;color:var(--accent-purple)!important;font-weight:600!important}html:not(.dark) .nav-tabs-item[data-active] *,html:not(.dark) mobile-nav-tabs-item[data-active] *,html:not(.dark) nav-dropdown-item[data-active] *{color:inherit!important}html:not(.dark) #sidebar-content li:has(>a[aria-current=\"page\"]){background-color:transparent!important;box-shadow:none!important}html:not(.dark) #sidebar-content a[aria-current=\"page\"]{color:var(--accent-purple)!important;background-color:rgba(73, 55, 139, 0.1)!important;font-weight:600!important}html:not(.dark) #sidebar-content a[aria-current=\"page\"] *{color:inherit!important}html:not(.dark) toc-item[data-active],html:not(.dark) toc-item[data-active-deepest],html:not(.dark) toc-item[data-active] a,html:not(.dark) toc-item[data-active-deepest] a{background-color:transparent!important;color:var(--accent-purple)!important;font-weight:600!important}html:not(.dark) #header :where(h1,h2,h3,h4,h5,h6),html:not(.dark) #content-area :where(h1,h2,h3,h4,h5,h6){color:#151417!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"]{background-color:transparent!important;color:var(--accent-purple)!important;border-radius:0.75rem;box-shadow:inset 0 0 0 1px var(--accent-purple)!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"] span.absolute{background-color:transparent!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"] *{color:inherit!important}#sidebar .sticky.top-0.pointer-events-none.bg-linear-to-b{background-image:none!important}@media (min-width: 1024px){#navbar.is-not-custom.is-not-center+div:has(>#sidebar),.max-w-8xl.mx-auto.relative,.max-w-8xl.mx-auto{max-width:none!important;width:100%!important;margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important}#navbar [class*=\"px-12\"],#navbar [class*=\"mx-4\"]{padding-left:0!important;padding-right:1.5rem!important;margin-left:0!important;margin-right:0!important}#navbar a.select-none,#navbar .nav-logo{margin-left:1rem!important}#navbar .nav-tabs{padding-left:2rem!important}#sidebar{left:0!important;margin-left:0!important;box-shadow:none!important}#sidebar-content{margin-left:0!important;padding-left:1rem!important;box-sizing:border-box!important}#navbar,#navbar-transition{left:0!important;right:0!important;width:100%!important;max-width:none!important}#content-area{margin-left:0!important;max-width:none!important;width:100%!important;padding-left:18rem!important}#sidebar.sticky~#content-container #content-area{padding-left:2rem!important;padding-right:2rem!important}#content-container,#body-content{max-width:none!important;width:100%!important}:root{--content-width: 100%;--sidebar-width: 18rem}}@media (min-width: 1024px){nav#sidebar,#sidebar[style]{left:0!important;right:auto!important;margin-left:0!important;transform:none!important}#navbar li.navbar-link:has(a[href*=\"comfy.org/download\"]){margin-right:0!important}#navbar a[href*=\"comfy.org/download\"]{box-sizing:border-box;border:1px solid rgb(255 255 255 / 0.22);border-radius:0.75rem;padding:7px 0.875rem!important;color:#fff!important;font-size:0.875rem;line-height:1.25rem}html:not(.dark) #navbar a[href*=\"comfy.org/download\"]{border-color:rgb(0 0 0 / 0.16);color:#151417!important}#navbar a[href*=\"comfy.org/download\"]:hover{background:rgb(255 255 255 / 0.06)}html:not(.dark) #navbar a[href*=\"comfy.org/download\"]:hover{background:rgb(0 0 0 / 0.04)}#navbar li.navbar-link:has(a[href*=\"comfy.org/download\"])+.whitespace-nowrap,#navbar .flex.space-x-6>.whitespace-nowrap.hidden{margin-left:0.5rem!important}}body:has(.router-api-reference-marker) #content,body:has(.router-api-reference-marker) #header{max-width:48rem}body:has(.router-api-reference-marker) #content-area table{width:100%;table-layout:auto}body:has(.router-api-reference-marker) #content-area th,body:has(.router-api-reference-marker) #content-area td{min-width:4rem!important;overflow-wrap:anywhere}body:has(.router-api-reference-marker) #content-area table:has(th:nth-child(6)) th:nth-child(3),body:has(.router-api-reference-marker) #content-area table:has(th:nth-child(6)) td:nth-child(3){min-width:5rem!important}@media (max-width: 1535px){body:has(.router-api-reference-marker) #content-side-layout{display:none!important}}body:has(.router-provider-coverage-marker) #content,body:has(.router-provider-coverage-marker) #header{max-width:64rem}body:has(.router-provider-coverage-marker) #content-area table{width:100%;table-layout:auto}body:has(.router-provider-coverage-marker) #content-area th,body:has(.router-provider-coverage-marker) #content-area td{min-width:5rem!important;overflow-wrap:anywhere}body:has(.router-provider-coverage-marker) #content-area th:first-child,body:has(.router-provider-coverage-marker) #content-area td:first-child{min-width:12rem!important}body:has(.router-quickstart-marker) [data-component-part=\"card-content\"] [data-component-part=\"code-block-root\"][style*=\"height:190px\"],body:has(.router-quickstart-marker) [data-component-part=\"card-content\"] [data-component-part=\"code-block-root\"][style*=\"height: 190px\"]{height:86px!important}"},{"filePath":"samples-cards.css","content":".sample-card-grid{display:grid;gap:20px;grid-template-columns:repeat(2, minmax(0, 1fr));margin-top:28px}.sample-card{min-width:0;perspective:1200px}.sample-card-inner{height:565px;position:relative;transform-style:preserve-3d;transition:transform 560ms cubic-bezier(.2, .75, .3, 1)}.sample-card[data-flipped=\"true\"] .sample-card-inner{transform:rotateY(180deg)}.sample-card-face{backface-visibility:hidden;background:#fff;border:1px solid #e5e1eb;border-radius:12px;box-sizing:border-box;height:100%;inset:0;overflow:hidden;position:absolute;width:100%}.sample-card-front{display:flex;flex-direction:column}.sample-card-back{opacity:0;pointer-events:none;transform:rotateY(180deg);visibility:hidden}.sample-card[data-flipped=\"true\"] .sample-card-front{pointer-events:none;transition:visibility 0s linear 280ms;visibility:hidden}.sample-card[data-flipped=\"true\"][data-active-path=\"api\"] .sample-card-back[data-sample-path=\"api\"],.sample-card[data-flipped=\"true\"][data-active-path=\"endpoint\"] .sample-card-back[data-sample-path=\"endpoint\"]{opacity:1;pointer-events:auto;visibility:visible}.sample-card-preview{border-bottom:1px solid #e5e1eb;cursor:pointer;display:block;width:100%}.sample-card-body{display:flex;flex:1;flex-direction:column;padding:20px}.sample-card-body h2,.sample-path-body h2{color:#49378b;font-size:18px;font-weight:700;letter-spacing:-.02em;margin:0 0 8px}.sample-path-body h2{text-align:center}.sample-card-body>p{color:#5f5966;font-size:14px;line-height:1.55;margin:0;min-height:66px}.sample-card-actions{display:flex;gap:8px;margin-top:20px}.sample-card-actions button{background:#fff;border:1px solid #cfc8de;border-radius:6px;color:#49378b;cursor:pointer;flex:1;font-size:13px;font-weight:700;padding:10px 12px}.sample-card-links{border-top:1px solid #eeeaf1;display:flex;gap:8px;margin-top:16px;padding-top:12px}.sample-card-links a{color:#625b6c;font-size:12px;font-weight:650;text-decoration:none}.sample-card-links span{color:#b3adba}.sample-path-body{padding:20px}.sample-path-body>button{background:transparent;border:0;color:#625b6c;cursor:pointer;font-size:12px;font-weight:700;padding:0}.sample-path-eyebrow{color:#857a9e;font-size:10px;font-weight:700;letter-spacing:.08em;margin:19px 0 5px;text-align:center;text-transform:uppercase}.sample-path-body>p:not(.sample-path-eyebrow){color:#5f5966;font-size:12px;line-height:1.5;margin:0 0 15px}.sample-path-steps{display:grid;gap:8px}.sample-path-step{align-items:center;background:#faf9fc;border:1px solid #e5e1ea;border-radius:8px;display:flex;gap:10px;padding:10px 11px}.sample-path-number{align-items:center;background:#49378b;border-radius:999px;color:#fff;display:inline-flex;flex:0 0 21px;font-size:11px;font-weight:700;height:21px;justify-content:center}.sample-path-copy{flex:1;min-width:0}.sample-path-copy strong{color:#312c36;display:block;font-size:12px}.sample-path-copy span{color:#706a75;display:block;font-size:11px;line-height:1.35;margin-top:2px}.sample-path-step a{color:#49378b;flex:0 0 auto;font-size:11px;font-weight:700;text-decoration:none}@media (max-width: 768px){.sample-card-grid{grid-template-columns:1fr}.sample-card-inner{height:clamp(620px, 180vw, 760px)}}"}],"page":{"pagePath":"es/api-reference/v2/assets/upload-an-asset-single-call-multipart","slug":"/es/api-reference/v2/assets/upload-an-asset-single-call-multipart","pageMetadata":{"title":"Upload an asset (single-call multipart)","description":"Single-call `multipart/form-data` upload. The platform streams the\nbytes through its trusted byte-path, dedups by the server-computed\nhash, and mints the asset record.\n\nThe blake3 hash is always computed server-side from the received\nbytes — a client-declared `expected_hash` is verified, never trusted\n(on Comfy Cloud and serverless, only when sent before `file` — see below).\nIf location metadata (GPS, XMP, IPTC) is removed from an image before\nit is stored, the asset's `hash` is the hash of the stored bytes and\ncan differ from `expected_hash`. On Comfy Cloud, an upload whose\nbytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based\ncamera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that\nis over 50 MiB is refused with 422 `validation_error`, whatever its\n`content_type` and whether or not it carries location metadata. A\nrequest that declares a `Content-Length` over Comfy Cloud's 200 MB\n(200,000,000-byte) body limit is refused before that check with a\nplain 413 that does not use the `ErrorEnvelope` shape. A body sent\nwithout a declared length is cut off when it passes that limit, and\nno 413 is sent: a cut-off while the fields before `file` are read\nfails with 422 `invalid_body`, and a cut-off inside the file usually\nfails with 500 `upstream_error`. Nothing after the `file` field is\nread, so a body that only passes the limit there is uploaded\nnormally.\nDeployment-scoped surfaces neither strip location metadata nor apply\nthe 50 MiB image cap; they limit the request body to 110 MB\n(110,000,000 bytes). A request that declares a `Content-Length` over\nthat limit is refused with the same plain 413; a body sent without a\ndeclared length is cut off when it passes the limit, and the upload\nthen fails with an error response that is not guaranteed to be a 413.\nThe uploaded asset is referenceable immediately; any content scanning\nruns in the background and does not block the response.\n\nSend `file` as the last part. Comfy Cloud and serverless deployments\nstream it straight into storage and read the other fields only up to\nit, so a part sent after `file` is never read: a `content_type` or\n`file_path` sent only after it is refused as missing (422); an\noptional field (`expected_hash` or `tags`) is silently ignored — the\nupload succeeds without the hash check or the caller's tags; on\nserverless deployments, a trailing `expires_in` is likewise ignored,\nlosing the retention override; and a second `file` part is dropped,\nso only the first part's bytes are stored. Comfy Cloud ignores\n`expires_in` wherever it is sent, before or after `file`. The\nresponse does not say any of these were skipped.\n\nAn upload is a single request. v1 expects files of up to ~100 MB;\nthe hard cap is the body limit of the surface it is sent to (above).\nChunked/resumable large uploads are a deliberate open question.\n\nCloud's hosted API caps every part sent before `file` at 8 KiB,\nincluding a part it does not recognise (which it otherwise\nignores), so an extra field over 8 KiB, such as file bytes sent\nunder a misspelled name, is refused with 422 `invalid_body`. Parts\nsent after `file` are never read: the 8 KiB cap does not apply to\nthem, and a metadata field sent there is treated as absent, so send\nevery metadata field before `file`. A declared `Content-Length`\nstill counts those bytes toward the size limit above; without one,\na body that only exceeds the limit there is uploaded normally,\nsince nothing after `file` is read.\n\nOn Comfy Cloud an upload fails with 422 `upload_timed_out` when no\nrequest bytes arrive for 30 seconds, or when the whole request takes\nlonger than 10 minutes, however steadily bytes keep arriving.\nOn Comfy Cloud an upload can also be refused with 503 `upload_busy`\nand `Retry-After` when the server is busy with other uploads: nothing\nwas stored, so the same upload can be sent again after `Retry-After`.\nOn a Developer Platform deployment the same 422 `upload_timed_out`\napplies when no request bytes arrive for 30 seconds, or when the whole\nrequest takes longer than 20 minutes.\n","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets","href":"/es/api-reference/v2/assets/upload-an-asset-single-call-multipart","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Single-call \", _jsx(_components.code, {\n children: \"multipart/form-data\"\n }), \" upload. The platform streams the\\nbytes through its trusted byte-path, dedups by the server-computed\\nhash, and mints the asset record.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"The blake3 hash is always computed server-side from the received\\nbytes — a client-declared \", _jsx(_components.code, {\n children: \"expected_hash\"\n }), \" is verified, never trusted\\n(on Comfy Cloud and serverless, only when sent before \", _jsx(_components.code, {\n children: \"file\"\n }), \" — see below).\\nIf location metadata (GPS, XMP, IPTC) is removed from an image before\\nit is stored, the asset’s \", _jsx(_components.code, {\n children: \"hash\"\n }), \" is the hash of the stored bytes and\\ncan differ from \", _jsx(_components.code, {\n children: \"expected_hash\"\n }), \". On Comfy Cloud, an upload whose\\nbytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based\\ncamera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that\\nis over 50 MiB is refused with 422 \", _jsx(_components.code, {\n children: \"validation_error\"\n }), \", whatever its\\n\", _jsx(_components.code, {\n children: \"content_type\"\n }), \" and whether or not it carries location metadata. A\\nrequest that declares a \", _jsx(_components.code, {\n children: \"Content-Length\"\n }), \" over Comfy Cloud’s 200 MB\\n(200,000,000-byte) body limit is refused before that check with a\\nplain 413 that does not use the \", _jsx(_components.code, {\n children: \"ErrorEnvelope\"\n }), \" shape. A body sent\\nwithout a declared length is cut off when it passes that limit, and\\nno 413 is sent: a cut-off while the fields before \", _jsx(_components.code, {\n children: \"file\"\n }), \" are read\\nfails with 422 \", _jsx(_components.code, {\n children: \"invalid_body\"\n }), \", and a cut-off inside the file usually\\nfails with 500 \", _jsx(_components.code, {\n children: \"upstream_error\"\n }), \". Nothing after the \", _jsx(_components.code, {\n children: \"file\"\n }), \" field is\\nread, so a body that only passes the limit there is uploaded\\nnormally.\\nDeployment-scoped surfaces neither strip location metadata nor apply\\nthe 50 MiB image cap; they limit the request body to 110 MB\\n(110,000,000 bytes). A request that declares a \", _jsx(_components.code, {\n children: \"Content-Length\"\n }), \" over\\nthat limit is refused with the same plain 413; a body sent without a\\ndeclared length is cut off when it passes the limit, and the upload\\nthen fails with an error response that is not guaranteed to be a 413.\\nThe uploaded asset is referenceable immediately; any content scanning\\nruns in the background and does not block the response.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Send \", _jsx(_components.code, {\n children: \"file\"\n }), \" as the last part. Comfy Cloud and serverless deployments\\nstream it straight into storage and read the other fields only up to\\nit, so a part sent after \", _jsx(_components.code, {\n children: \"file\"\n }), \" is never read: a \", _jsx(_components.code, {\n children: \"content_type\"\n }), \" or\\n\", _jsx(_components.code, {\n children: \"file_path\"\n }), \" sent only after it is refused as missing (422); an\\noptional field (\", _jsx(_components.code, {\n children: \"expected_hash\"\n }), \" or \", _jsx(_components.code, {\n children: \"tags\"\n }), \") is silently ignored — the\\nupload succeeds without the hash check or the caller’s tags; on\\nserverless deployments, a trailing \", _jsx(_components.code, {\n children: \"expires_in\"\n }), \" is likewise ignored,\\nlosing the retention override; and a second \", _jsx(_components.code, {\n children: \"file\"\n }), \" part is dropped,\\nso only the first part’s bytes are stored. Comfy Cloud ignores\\n\", _jsx(_components.code, {\n children: \"expires_in\"\n }), \" wherever it is sent, before or after \", _jsx(_components.code, {\n children: \"file\"\n }), \". The\\nresponse does not say any of these were skipped.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"An upload is a single request. v1 expects files of up to ~100 MB;\\nthe hard cap is the body limit of the surface it is sent to (above).\\nChunked/resumable large uploads are a deliberate open question.\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Cloud’s hosted API caps every part sent before \", _jsx(_components.code, {\n children: \"file\"\n }), \" at 8 KiB,\\nincluding a part it does not recognise (which it otherwise\\nignores), so an extra field over 8 KiB, such as file bytes sent\\nunder a misspelled name, is refused with 422 \", _jsx(_components.code, {\n children: \"invalid_body\"\n }), \". Parts\\nsent after \", _jsx(_components.code, {\n children: \"file\"\n }), \" are never read: the 8 KiB cap does not apply to\\nthem, and a metadata field sent there is treated as absent, so send\\nevery metadata field before \", _jsx(_components.code, {\n children: \"file\"\n }), \". A declared \", _jsx(_components.code, {\n children: \"Content-Length\"\n }), \"\\nstill counts those bytes toward the size limit above; without one,\\na body that only exceeds the limit there is uploaded normally,\\nsince nothing after \", _jsx(_components.code, {\n children: \"file\"\n }), \" is read.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"On Comfy Cloud an upload fails with 422 \", _jsx(_components.code, {\n children: \"upload_timed_out\"\n }), \" when no\\nrequest bytes arrive for 30 seconds, or when the whole request takes\\nlonger than 10 minutes, however steadily bytes keep arriving.\\nOn Comfy Cloud an upload can also be refused with 503 \", _jsx(_components.code, {\n children: \"upload_busy\"\n }), \"\\nand \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \" when the server is busy with other uploads: nothing\\nwas stored, so the same upload can be sent again after \", _jsx(_components.code, {\n children: \"Retry-After\"\n }), \".\\nOn a Developer Platform deployment the same 422 \", _jsx(_components.code, {\n children: \"upload_timed_out\"\n }), \"\\napplies when no request bytes arrive for 30 seconds, or when the whole\\nrequest takes longer than 20 minutes.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Upload an asset (single-call multipart)","description":"Single-call `multipart/form-data` upload. The platform streams the\nbytes through its trusted byte-path, dedups by the server-computed\nhash, and mints the asset record.\n\nThe blake3 hash is always computed server-side from the received\nbytes — a client-declared `expected_hash` is verified, never trusted\n(on Comfy Cloud and serverless, only when sent before `file` — see below).\nIf location metadata (GPS, XMP, IPTC) is removed from an image before\nit is stored, the asset's `hash` is the hash of the stored bytes and\ncan differ from `expected_hash`. On Comfy Cloud, an upload whose\nbytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based\ncamera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that\nis over 50 MiB is refused with 422 `validation_error`, whatever its\n`content_type` and whether or not it carries location metadata. A\nrequest that declares a `Content-Length` over Comfy Cloud's 200 MB\n(200,000,000-byte) body limit is refused before that check with a\nplain 413 that does not use the `ErrorEnvelope` shape. A body sent\nwithout a declared length is cut off when it passes that limit, and\nno 413 is sent: a cut-off while the fields before `file` are read\nfails with 422 `invalid_body`, and a cut-off inside the file usually\nfails with 500 `upstream_error`. Nothing after the `file` field is\nread, so a body that only passes the limit there is uploaded\nnormally.\nDeployment-scoped surfaces neither strip location metadata nor apply\nthe 50 MiB image cap; they limit the request body to 110 MB\n(110,000,000 bytes). A request that declares a `Content-Length` over\nthat limit is refused with the same plain 413; a body sent without a\ndeclared length is cut off when it passes the limit, and the upload\nthen fails with an error response that is not guaranteed to be a 413.\nThe uploaded asset is referenceable immediately; any content scanning\nruns in the background and does not block the response.\n\nSend `file` as the last part. Comfy Cloud and serverless deployments\nstream it straight into storage and read the other fields only up to\nit, so a part sent after `file` is never read: a `content_type` or\n`file_path` sent only after it is refused as missing (422); an\noptional field (`expected_hash` or `tags`) is silently ignored — the\nupload succeeds without the hash check or the caller's tags; on\nserverless deployments, a trailing `expires_in` is likewise ignored,\nlosing the retention override; and a second `file` part is dropped,\nso only the first part's bytes are stored. Comfy Cloud ignores\n`expires_in` wherever it is sent, before or after `file`. The\nresponse does not say any of these were skipped.\n\nAn upload is a single request. v1 expects files of up to ~100 MB;\nthe hard cap is the body limit of the surface it is sent to (above).\nChunked/resumable large uploads are a deliberate open question.\n\nCloud's hosted API caps every part sent before `file` at 8 KiB,\nincluding a part it does not recognise (which it otherwise\nignores), so an extra field over 8 KiB, such as file bytes sent\nunder a misspelled name, is refused with 422 `invalid_body`. Parts\nsent after `file` are never read: the 8 KiB cap does not apply to\nthem, and a metadata field sent there is treated as absent, so send\nevery metadata field before `file`. A declared `Content-Length`\nstill counts those bytes toward the size limit above; without one,\na body that only exceeds the limit there is uploaded normally,\nsince nothing after `file` is read.\n\nOn Comfy Cloud an upload fails with 422 `upload_timed_out` when no\nrequest bytes arrive for 30 seconds, or when the whole request takes\nlonger than 10 minutes, however steadily bytes keep arriving.\nOn Comfy Cloud an upload can also be refused with 503 `upload_busy`\nand `Retry-After` when the server is busy with other uploads: nothing\nwas stored, so the same upload can be sent again after `Retry-After`.\nOn a Developer Platform deployment the same 422 `upload_timed_out`\napplies when no request bytes arrive for 30 seconds, or when the whole\nrequest takes longer than 20 minutes.\n","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets","href":"/es/api-reference/v2/assets/upload-an-asset-single-call-multipart","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/dripart/9d6bf2b2531e904c/giscus-comments.js","/_mintlify/custom/dripart/bd0341946f3c75a6/syft.js","/_mintlify/custom/dripart/042392a43b5e681e/samples-cards.js"],"openApiReferenceData":{"operation":{"operationId":"postAssets","tags":["assets"],"summary":"Upload an asset (single-call multipart)","description":"Single-call `multipart/form-data` upload. The platform streams the\nbytes through its trusted byte-path, dedups by the server-computed\nhash, and mints the asset record.\n\nThe blake3 hash is always computed server-side from the received\nbytes — a client-declared `expected_hash` is verified, never trusted\n(on Comfy Cloud and serverless, only when sent before `file` — see below).\nIf location metadata (GPS, XMP, IPTC) is removed from an image before\nit is stored, the asset's `hash` is the hash of the stored bytes and\ncan differ from `expected_hash`. On Comfy Cloud, an upload whose\nbytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based\ncamera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that\nis over 50 MiB is refused with 422 `validation_error`, whatever its\n`content_type` and whether or not it carries location metadata. A\nrequest that declares a `Content-Length` over Comfy Cloud's 200 MB\n(200,000,000-byte) body limit is refused before that check with a\nplain 413 that does not use the `ErrorEnvelope` shape. A body sent\nwithout a declared length is cut off when it passes that limit, and\nno 413 is sent: a cut-off while the fields before `file` are read\nfails with 422 `invalid_body`, and a cut-off inside the file usually\nfails with 500 `upstream_error`. Nothing after the `file` field is\nread, so a body that only passes the limit there is uploaded\nnormally.\nDeployment-scoped surfaces neither strip location metadata nor apply\nthe 50 MiB image cap; they limit the request body to 110 MB\n(110,000,000 bytes). A request that declares a `Content-Length` over\nthat limit is refused with the same plain 413; a body sent without a\ndeclared length is cut off when it passes the limit, and the upload\nthen fails with an error response that is not guaranteed to be a 413.\nThe uploaded asset is referenceable immediately; any content scanning\nruns in the background and does not block the response.\n\nSend `file` as the last part. Comfy Cloud and serverless deployments\nstream it straight into storage and read the other fields only up to\nit, so a part sent after `file` is never read: a `content_type` or\n`file_path` sent only after it is refused as missing (422); an\noptional field (`expected_hash` or `tags`) is silently ignored — the\nupload succeeds without the hash check or the caller's tags; on\nserverless deployments, a trailing `expires_in` is likewise ignored,\nlosing the retention override; and a second `file` part is dropped,\nso only the first part's bytes are stored. Comfy Cloud ignores\n`expires_in` wherever it is sent, before or after `file`. The\nresponse does not say any of these were skipped.\n\nAn upload is a single request. v1 expects files of up to ~100 MB;\nthe hard cap is the body limit of the surface it is sent to (above).\nChunked/resumable large uploads are a deliberate open question.\n\nCloud's hosted API caps every part sent before `file` at 8 KiB,\nincluding a part it does not recognise (which it otherwise\nignores), so an extra field over 8 KiB, such as file bytes sent\nunder a misspelled name, is refused with 422 `invalid_body`. Parts\nsent after `file` are never read: the 8 KiB cap does not apply to\nthem, and a metadata field sent there is treated as absent, so send\nevery metadata field before `file`. A declared `Content-Length`\nstill counts those bytes toward the size limit above; without one,\na body that only exceeds the limit there is uploaded normally,\nsince nothing after `file` is read.\n\nOn Comfy Cloud an upload fails with 422 `upload_timed_out` when no\nrequest bytes arrive for 30 seconds, or when the whole request takes\nlonger than 10 minutes, however steadily bytes keep arriving.\nOn Comfy Cloud an upload can also be refused with 503 `upload_busy`\nand `Retry-After` when the server is busy with other uploads: nothing\nwas stored, so the same upload can be sent again after `Retry-After`.\nOn a Developer Platform deployment the same 422 `upload_timed_out`\napplies when no request bytes arrive for 30 seconds, or when the whole\nrequest takes longer than 20 minutes.\n","x-streaming-upload":true,"x-idempotency-key":"recommended","parameters":["e3cf825a-f0e8-4c66-a07f-0d28786a1a75"],"requestBody":"29d88922-9f78-4179-81bd-aa0bbddcaf5c","responses":{"200":"47167d56-342a-4e51-8ae9-aae886412343","201":"aa0f7bf4-ae8c-4e0a-8de8-baeac9ac600f","401":"e00c7609-c4db-4abf-b200-171ce71aad5a","403":"f167ea77-39d5-486d-916a-960771071258","409":"70cc1e03-6226-4ec2-bf93-34a7ea36e234","413":"4a48d35c-e58e-4dc2-8dd5-0eabca802fab","422":"c0c05033-aa5f-48d6-b134-a1915add6e90","429":"84776165-d9a9-4ed8-9e86-2c8c4f827939","500":"c62d078a-c87d-4592-b88e-69e92bbacce1","503":"f9c5ead0-37c3-49f3-aa11-669e981e636c"},"method":"post","type":"path","servers":["5880df41-df35-42d5-af1f-b10683e2b6ec","23833202-7920-4a4a-be1e-e814d04b634b","0a14b1ef-11b5-46cd-bbf5-d1127b0d328f"],"security":["4d3e24cd-a836-4eab-b087-4e01af02d0ee","a8cf7881-dac3-45b7-8744-6efea457f3db"],"path":"/api/v2/assets","baseUrlOptions":["http://127.0.0.1:8189","https://cloud.comfy.org","https://{deployment}.run.comfy.app"],"title":"Upload an asset (single-call multipart)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"e3cf825a-f0e8-4c66-a07f-0d28786a1a75":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","isRequired":false,"description":"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.","uniqueKey":"","typeLabel":"string"},"description":"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."}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file","content_type","file_path"],"properties":{"content_type":{"type":"string","example":"image/png","description":"The asset's media type. On Comfy Cloud it must be valid UTF-8, not blank, at most 255 bytes, must not start or end with whitespace, and must not contain control characters (C0, DEL, C1, U+2028, U+2029) or any invisible format or default-ignorable character (every Unicode general category Cf character, including the zero-width joiners and direction marks, and the other default-ignorable code points); otherwise the request is refused with 422 `invalid_body` before anything is stored. An accepted value is stored as sent. A deployment refuses a `content_type` that is blank, is not valid UTF-8 or contains a control character (C0 other than tab, DEL, C1) or a bidi embedding, override or isolate (U+202A-U+202E, U+2066-U+2069), has a tab outside the whitespace that opens a parameter after a `;`, or whose part before its first `;` is not `type/subtype` (two RFC 9110 tokens, optionally followed by spaces), with 422 `invalid_request` before anything is stored.","isRequired":true,"uniqueKey":"content_type","typeLabel":"string"},"file_path":{"type":"string","description":"Placement path / filename (global-namespace-root form, e.g. `photo.png` or `models/checkpoints/x.safetensors`). On Comfy Cloud the last segment becomes the asset name, so it must be valid UTF-8, at most 255 bytes, must not start with `.`, and must not contain control characters (C0, DEL, C1, U+2028, U+2029) or invisible format and default-ignorable characters (Unicode general category Cf, which includes the bidi embedding, override and isolate controls, soft hyphen, zero-width space, word joiner, BOM and tag characters, plus the other default-ignorable code points such as U+034F, U+2065 and the Hangul fillers); otherwise the request is refused with 422 `invalid_body` before anything is stored. ZWNJ/ZWJ (U+200C, U+200D) are allowed only between two visible non-ASCII characters (so not first, last, next to ASCII or next to another of these invisible characters, though one may follow an allowed variation selector, one right after an Indic virama on a letter of the same script may end a word, and a ZWJ after an Arabic-script letter that joins on both sides, or after that letter's marks, may precede ASCII such as a '.' or end the name), for Persian, Indic and emoji names. The direction marks U+200E, U+200F and U+061C are allowed, for right-to-left names, and so are the visible Arabic number signs (prepended concatenation marks such as U+0600, but not U+070F); the direction marks can still change how a name is displayed. The emoji presentation selectors U+FE0E and U+FE0F are allowed only after an ASCII digit, `#` or `*` that U+20E3 (the keycap) follows, after U+2139, the punctuation emoji U+203C, U+2049, U+3030 and U+303D or the math symbols U+2194, U+25FB-U+25FE, U+2934 and U+2935, and after any other symbol of category So except a regional indicator, a skin-tone modifier, a hair component or U+2800. Other variation selectors are allowed only after a base that can have variants: the Mongolian ones after a Mongolian letter, the rest after a unified Han ideograph, plus U+FE00 after the Myanmar and Phags-pa characters it is registered for. The Mongolian and Han rules follow scripts, not the registered sequence list. The tag characters are allowed only as the tag run of the England, Scotland and Wales flag emoji. These allowed invisible characters, white space, U+2800 and combining marks must not make up the whole segment or come before a leading `.`. A deployment keeps the whole `file_path` as the asset name, so it must be valid UTF-8 and must not contain a control character (C0 U+0000-U+001F, including tab, CR and LF; DEL U+007F; C1 U+0080-U+009F) or a bidi embedding, override or isolate (U+202A-U+202E, U+2066-U+2069); otherwise the request is refused with 422 `invalid_request` before anything is stored. Directory segments and other characters stay allowed there.","example":"photo.png","isRequired":true,"uniqueKey":"file_path","typeLabel":"string"},"file":{"type":"string","format":"binary","description":"The raw bytes. The order of properties in this schema does not set the order of parts on the wire: `file` must be the last part sent (see the field-order rule above).","isRequired":true,"uniqueKey":"file","typeLabel":"file"},"expected_hash":{"type":"string","description":"Optional client-computed blake3 (`blake3:\u003chex>`) of the bytes sent. Omit the part to skip verification: on Comfy Cloud and on a deployment a part sent empty is refused with 422 as malformed. Send it before `file`: nothing after the `file` field is read, so a trailing `expected_hash` is neither verified nor refused, and the response does not say the check was skipped. Verified against the server-computed blake3 of the received bytes, not of the stored bytes; mismatch is rejected with 409 `hash_mismatch`. On serverless deployments no asset is minted and no existing asset's retention is changed; elsewhere the upload is stored before the check, so the 409 returns no asset and a retry with the corrected expectation (and the same file extension) dedups onto it. On Comfy Cloud nothing removes that asset, so when the bytes themselves were wrong they stay stored: as an asset named after the last segment of `file_path` (`x.safetensors` for `models/checkpoints/x.safetensors`), or, when the bytes deduped onto an asset you already had, as that asset under its earlier name. The rest of `file_path` is not recorded. On Comfy Cloud and on a deployment, when `expected_hash` is sent more than once before `file` only the last value is checked, but an empty one among them is still refused with 422.","example":"blake3:9f8a1c0d...","uniqueKey":"expected_hash","typeLabel":"string"},"tags":{"type":"array","items":{"type":"string","uniqueKey":"tags.items.[INDEX]","typeLabel":"string"},"description":"Category tags (e.g. `input`). A create carries at most 64 tags, each a non-empty UTF-8 string of at most 256 bytes (surrounding whitespace included) with no NUL byte. A deployment adds `input` to every asset and counts it, so it takes at most 63 of the caller's own; the `model_type:` tags derived for a model asset are not counted. A tag set breaking a limit is refused with 422. The rest of this paragraph describes Cloud's hosted API and a deployment, not the self-hosted proxy. Both cap the bytes of all `tags` parts sent before `file` combined: 8 KiB on Cloud's hosted API (422 `invalid_body`) and 64 KiB on a deployment (422 `invalid_request`). The cap counts duplicates before they are removed and JSON escapes before they are decoded, and is checked before the count and 256-byte limits above, so a tag set within them can still be refused. A `quoted-printable` part is counted and read after it is decoded; a part in any other `Content-Transfer-Encoding` is read as sent, so a `base64` part is stored as one tag holding its encoded text, while a `7bit`, `8bit` or `binary` part is read like a part with no encoding. A part is read as a JSON array when it starts with `[` (after leading whitespace) and is valid JSON or continues, after optional whitespace, with `\"`: `[\"a\",\"b\"]` is two tags, `[]` adds no tags (nor does an empty part), and a malformed array such as `[1]` or `[\"a` is refused with 422. Any other non-empty part is one bare tag, kept as literal text, so `foo\\ud800` sent as a bare part is stored as written. Invalid UTF-8 in a `tags` part, or a lone surrogate escape (e.g. `\\ud800`) in a JSON-array `tags` part, is refused with 422 (`invalid_body` on Cloud, `invalid_request` on a deployment).","uniqueKey":"tags","typeLabel":"string[]"},"expires_in":{"type":"integer","minimum":60,"maximum":604800,"description":"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.","example":86400,"uniqueKey":"expires_in","typeLabel":"integer"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"content_type":"image/png","file_path":"photo.png","file":"\u003cstring>","expected_hash":"blake3:9f8a1c0d...","tags":["\u003cstring>"],"expires_in":86400}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"47167d56-342a-4e51-8ae9-aae886412343":{"description":"Bytes deduped to an existing blob; asset minted over it.","content":{"application/json":{"schema":{"type":"object","description":"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.","required":["id","hash","size_bytes","content_type","created_at","url","url_expires_at"],"properties":{"id":{"type":"string","example":"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"hash":{"oneOf":[{"type":"string","description":"`blake3:\u003chex>`; null while lazily computed.","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash.oneOf.0","typeLabel":"string"},{"type":"null","description":"`blake3:\u003chex>`; null while lazily computed.","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hash","typeLabel":"string | null"},"size_bytes":{"type":"integer","format":"int64","example":4816293,"isRequired":true,"uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"content_type":{"type":"string","example":"image/png","isRequired":true,"uniqueKey":"content_type","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"url":{"type":"string","format":"uri","description":"Short-lived content URL (signed, or proxy-served).","isRequired":true,"uniqueKey":"url","typeLabel":"string\u003curi>"},"url_expires_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"url_expires_at","typeLabel":"string\u003cdate-time>"},"file_path":{"oneOf":[{"type":"string","example":"photo.png","uniqueKey":"file_path.oneOf.0","typeLabel":"string"},{"type":"null","example":"photo.png","uniqueKey":"file_path.oneOf.1","typeLabel":"null"}],"uniqueKey":"file_path","typeLabel":"string | null"},"created_new":{"type":"boolean","description":"On `POST /api/v2/assets` responses, distinguishes a brand-new blob (true) from a dedup hit against bytes the platform already had (false). On `POST /api/v2/assets/from-hash` responses, true means a new asset reference was created over existing bytes (201); false means an existing asset was reused (200).","uniqueKey":"created_new","typeLabel":"boolean"},"expires_at":{"oneOf":[{"type":"string","format":"date-time","description":"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.","uniqueKey":"expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"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.","uniqueKey":"expires_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"expires_at","typeLabel":"string\u003cdate-time> | null"},"job_id":{"oneOf":[{"type":"string","description":"ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_metadata":{"type":"object","description":"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.","example":{"client":"acme"},"additionalProperties":{"type":"string","uniqueKey":"job_metadata.additionalProperties","typeLabel":"string"},"uniqueKey":"job_metadata","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b","hash":"blake3:9f8a1c0d...","size_bytes":4816293,"content_type":"image/png","created_at":"2023-11-07T05:31:56Z","url":"\u003cstring>","url_expires_at":"2023-11-07T05:31:56Z","file_path":"photo.png","created_new":true,"expires_at":"2023-11-07T05:31:56Z","job_id":"\u003cstring>","job_metadata":{"client":"acme"}}}},"exampleType":"generated"}},"exampleType":"generated"},"aa0f7bf4-ae8c-4e0a-8de8-baeac9ac600f":{"description":"New blob stored; asset minted.","content":{"application/json":{"schema":{"type":"object","description":"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.","required":["id","hash","size_bytes","content_type","created_at","url","url_expires_at"],"properties":{"id":{"type":"string","example":"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"hash":{"oneOf":[{"type":"string","description":"`blake3:\u003chex>`; null while lazily computed.","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash.oneOf.0","typeLabel":"string"},{"type":"null","description":"`blake3:\u003chex>`; null while lazily computed.","example":"blake3:9f8a1c0d...","isRequired":true,"uniqueKey":"hash.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"hash","typeLabel":"string | null"},"size_bytes":{"type":"integer","format":"int64","example":4816293,"isRequired":true,"uniqueKey":"size_bytes","typeLabel":"integer\u003cint64>"},"content_type":{"type":"string","example":"image/png","isRequired":true,"uniqueKey":"content_type","typeLabel":"string"},"created_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"created_at","typeLabel":"string\u003cdate-time>"},"url":{"type":"string","format":"uri","description":"Short-lived content URL (signed, or proxy-served).","isRequired":true,"uniqueKey":"url","typeLabel":"string\u003curi>"},"url_expires_at":{"type":"string","format":"date-time","isRequired":true,"uniqueKey":"url_expires_at","typeLabel":"string\u003cdate-time>"},"file_path":{"oneOf":[{"type":"string","example":"photo.png","uniqueKey":"file_path.oneOf.0","typeLabel":"string"},{"type":"null","example":"photo.png","uniqueKey":"file_path.oneOf.1","typeLabel":"null"}],"uniqueKey":"file_path","typeLabel":"string | null"},"created_new":{"type":"boolean","description":"On `POST /api/v2/assets` responses, distinguishes a brand-new blob (true) from a dedup hit against bytes the platform already had (false). On `POST /api/v2/assets/from-hash` responses, true means a new asset reference was created over existing bytes (201); false means an existing asset was reused (200).","uniqueKey":"created_new","typeLabel":"boolean"},"expires_at":{"oneOf":[{"type":"string","format":"date-time","description":"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.","uniqueKey":"expires_at.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","format":"date-time","description":"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.","uniqueKey":"expires_at.oneOf.1","typeLabel":"null"}],"uniqueKey":"expires_at","typeLabel":"string\u003cdate-time> | null"},"job_id":{"oneOf":[{"type":"string","description":"ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.","uniqueKey":"job_id.oneOf.0","typeLabel":"string"},{"type":"null","description":"ID of the job that produced this asset. Absent for assets no job produced, such as a fresh upload.","uniqueKey":"job_id.oneOf.1","typeLabel":"null"}],"uniqueKey":"job_id","typeLabel":"string | null"},"job_metadata":{"type":"object","description":"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.","example":{"client":"acme"},"additionalProperties":{"type":"string","uniqueKey":"job_metadata.additionalProperties","typeLabel":"string"},"uniqueKey":"job_metadata","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"9f8a1c0d-2b3e-4f56-8a7b-1c2d3e4f5a6b","hash":"blake3:9f8a1c0d...","size_bytes":4816293,"content_type":"image/png","created_at":"2023-11-07T05:31:56Z","url":"\u003cstring>","url_expires_at":"2023-11-07T05:31:56Z","file_path":"photo.png","created_new":true,"expires_at":"2023-11-07T05:31:56Z","job_id":"\u003cstring>","job_metadata":{"client":"acme"}}}},"exampleType":"generated"}},"exampleType":"generated"},"e00c7609-c4db-4abf-b200-171ce71aad5a":{"description":"`unauthorized`: missing or invalid credentials. A credential that could not be checked answers `auth_unavailable` (503) instead.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"f167ea77-39d5-486d-916a-960771071258":{"description":"`forbidden` — authenticated but not allowed. On a serverless deployment, also `sso_required` — the key is valid, but the account must sign in through its organization's single sign-on, which does not accept this key; it can come back on any operation.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"70cc1e03-6226-4ec2-bf93-34a7ea36e234":{"description":"`hash_mismatch`.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"4a48d35c-e58e-4dc2-8dd5-0eabca802fab":{"description":"The upload is over the body limit. On Comfy Cloud (200 MB, 200,000,000 bytes) and on deployment-scoped surfaces (110 MB, 110,000,000 bytes) the request declared a `Content-Length` over it; the server's body limit sends this before the upload is handled, so the body is not an `ErrorEnvelope` and its shape is not part of this contract. The self-hosted proxy instead refuses a file over its configured cap (100 MiB by default) with an `ErrorEnvelope` whose code is `payload_too_large`.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"c0c05033-aa5f-48d6-b134-a1915add6e90":{"description":"`idempotency_key_reuse`, `input_blocked` (the bytes are already stored and flagged by content moderation, so `file_path` is not registered for them), `upload_timed_out` (the client stopped sending or sent too slowly; the server cannot recover the upload, so retry it from a faster connection), or validation failure — including a `tags` set over the limits above or a disallowed tag (`invalid_request` on a deployment or the self-hosted proxy; a deployment answers a body that is not `multipart/form-data` with a boundary with a plain 500 instead). On a deployment that includes a truncated `file` part: the body ends inside the part, before the delimiter that ends it. A body that stops right at that delimiter, without the final `--`, is not rejected: the part reads as complete and is stored. Comfy Cloud's asset upload answers validation failure instead with `invalid_content_type` (the request is not `multipart/form-data` with a boundary), `invalid_body` (a malformed multipart body or upload field) or `validation_error` (the platform refused the upload, for example an image over the size cap or a disallowed tag). Cloud refuses a malformed multipart body with `invalid_body` when the fault is found before the `file` part. Cloud stops parsing at `file`, so parts after it are never read, and a body that ends inside the streamed file currently gets 500 `upstream_error` instead. The exception is an upload with `expected_hash`: if Cloud accepts the upload before the whole file is read, it reads the rest. A body that ends inside the `file` part, before its delimiter, then gets `invalid_body`, and a complete body gets 500 `upstream_error` instead of 201 or 409; in both cases the asset is already stored, holding only the part of the file read before the upload was accepted. `invalid_body` also covers `tags` parts over the 8 KiB combined cap described under `tags`, and a body sent without a declared length that is cut off at the body limit, as described for this operation. Cloud uses the same code for a missing `file`; a missing `content_type`, or one that breaks the rules under `content_type`; a missing `file_path`, or one that is absolute, starts with `.`, contains `..`, is not already in clean form (no `//`, no `.` segment such as `/./`, and no trailing `/`) or breaks the rules under `file_path`; a `content_type`, `file_path` or `expected_hash` part over 8 KiB; and a non-empty `expected_hash` that is not `blake3:` followed by 64 lowercase hex characters. A `content_type` or `file_path` sent only after `file` counts as missing (see the field-order rule above). Any Content-Type other than `multipart/form-data` with a `boundary` (including a missing or unparseable one) gets `invalid_content_type` on Cloud. On Comfy Cloud and on a deployment, an `expected_hash` part that is present but empty is a malformed field (`invalid_body` on Comfy Cloud, `invalid_request` on a deployment), not an omitted hash.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"84776165-d9a9-4ed8-9e86-2c8c4f827939":{"description":"`rate_limited` — the caller has exceeded a request rate limit for this account. Account/rate-scoped, not resource-specific — this can be returned even for a job, asset or deployment the caller doesn't own or that doesn't exist.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"c62d078a-c87d-4592-b88e-69e92bbacce1":{"description":"`upstream_error` — an unexpected failure reaching or processing the request in this implementation's backing services. The message is always a generic, safe-to-display string; implementation detail (the specific upstream, its error text, transport failures) is never included here — see each implementation's own error-mapping notes. Every operation in this contract can fail this way.","content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"},"f9c5ead0-37c3-49f3-aa11-669e981e636c":{"description":"On deployment-scoped surfaces, `deployment_lookup_unavailable`: the deployment this address names could not be looked up just now. The request was refused before it did anything (nothing was created, read, changed or canceled), so the same request can be sent again after `Retry-After`. Every operation at a deployment's address can answer this way. A job submit can also answer this 503 with `database_unavailable`: the job could not be saved just now and nothing was started, so the same request can be sent again after `Retry-After`. No other operation answers `database_unavailable`. On Comfy Cloud an asset upload can also answer this 503 with `upload_busy`: the server is busy with other uploads and nothing was stored, so the same upload can be sent again after `Retry-After`. Any operation can also answer this 503 with `auth_unavailable`: the credential could not be checked just now, so the same request can be sent again after `Retry-After`. A job status read can also answer it with `output_unavailable`: an output of the job could not be prepared just now, and the job is unchanged. A transient storage failure clears on a later read after `Retry-After`; an output whose stored address is broken answers it on every read until the platform repairs the output.","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"type":"object","description":"Shared error envelope with machine-readable codes. Core codes (v1):\n`invalid_workflow` (422), `workflow_format_ui` (422),\n`missing_asset` (422), `hash_mismatch` (409), `blob_not_found`\n(404), `idempotency_key_reuse` (422), `upload_timed_out` (422: an\nasset upload stopped sending or was too slow; retry from a faster\nconnection),\n`queue_full` (429 + Retry-After), `rate_limited` (429 + Retry-After:\nthe caller is past a request rate limit; retry), `insufficient_credits`\n(402), `not_found` (404), `unauthorized` (401), `forbidden` (403).\nDeployment-scoped surfaces add: `deployment_not_ready` (429 +\nRetry-After — the deployment can still reach ready; retry),\n`deployment_unavailable` (429 + Retry-After: the deployment is ready\nbut its GPU provider is not taking work on it yet; retry),\n`deployment_lookup_unavailable` (503 + Retry-After, on any\noperation: the deployment the address names could not be looked up\njust now; nothing was done, so retry), `database_unavailable` (503 +\nRetry-After, only on a job submit: the job could not be saved just\nnow and nothing was started, so retry), `auth_unavailable` (503 +\nRetry-After, on any operation: the credential could not be checked\njust now, which says nothing about the credential, so retry),\n`output_unavailable` (503 + Retry-After, only on a job status read: an\noutput of the job could not be prepared just now; the job is\nunchanged, so retry after `Retry-After`, and report the job if it\nkeeps answering),\n`deployment_stopped` (422 — terminal deployment state; a retry\ncannot succeed without operator action), `invalid_request` (422:\na malformed asset upload or asset-from-hash field, or a jobs-list\n`limit` that is not a positive integer), `validation_error` (422,\nCloud: an asset upload or asset-from-hash field was refused, e.g. a\ntag over the tag limits), `content_blocked` (451:\ncontent moderation flagged the asset's bytes) and `sso_required` (403:\nthe key is valid, but the account must sign in through its\norganization's single sign-on, which does not accept this key).\nComfy Cloud's asset upload adds `invalid_content_type` (422: the\nrequest is not `multipart/form-data` with a boundary),\n`invalid_body` (422: a malformed multipart body or upload field),\n`validation_error` (422: the platform refused the upload, for example\nan image over the size cap or a disallowed tag) and `upload_busy`\n(503 + Retry-After: the server is busy with other uploads and nothing\nwas stored, so retry).\nJob labels add: `metadata_invalid` (422: a submitted `metadata` breaks a\nlimit; `details.key` names the key, except for too many pairs, which\nhas no `details`), `metadata_not_supported` (422:\nthis surface keeps no job labels yet), `invalid_metadata_filter` (400)\nand `invalid_cursor` (400). A surface that does not list jobs yet\nanswers `not_implemented` (501). A 429 is disambiguated\nby `error.code` alone; clients should treat any 429 + Retry-After\nas \"back off and retry\".\n","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","example":"invalid_workflow","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","example":"Node 12 (KSampler): required input 'model' is not connected","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"organization_id":{"type":"string","description":"On `sso_required`: the organization whose single sign-on governs this key, the one that holds the account, else the one that holds the key's workspace. It is the `organization` query parameter of Comfy Cloud's single sign-on start; treat it as opaque. Absent when the organization is unknown, and on every other code.","example":"org_01HXYZEXAMPLE","uniqueKey":"error.organization_id","typeLabel":"string"},"details":{"oneOf":[{"type":"object","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.0","typeLabel":"object"},{"type":"null","additionalProperties":true,"description":"Machine-readable detail for the code. When it carries `node_errors`, that is keyed by node id and each value is a `JobNodeError`, the same shape as a job's `error.node_errors`, whether the refusal came at submit (for example `unknown_node_class`, a node class the deployment's build does not contain) or from ComfyUI after dispatch. With `unknown_node_class` errors it carries `unknown_node_classes`, the missing classes; with `waits_for_browser` errors, `browser_wait_node_classes`, the classes that wait for a browser. A submit refusal names at most fifty nodes. For `invalid_node`, `invalid_inputs` and `invalid_class_type`, when it found more than fifty, `node_errors_truncated` is true and `malformed_node_count` carries the full count; for `waits_for_browser`, `browser_wait_node_count` does. For `unknown_node_class` it names only nodes whose class is one of the at most ten listed in `unknown_node_classes`; when those nodes number more than fifty, `node_errors_truncated` is true and `unknown_node_count` is how many nodes have a listed class. Nodes whose class is past those ten are neither named nor counted.","example":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]},"uniqueKey":"error.details.oneOf.1","typeLabel":"null"}],"uniqueKey":"error.details","typeLabel":"object | null"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"invalid_workflow","message":"Node 12 (KSampler): required input 'model' is not connected","organization_id":"org_01HXYZEXAMPLE","details":{"node_errors":{"12":{"class_type":"SomeCustomNode","errors":[{"type":"unknown_node_class","message":"this deployment's build does not contain the node class SomeCustomNode."}]}},"unknown_node_classes":["SomeCustomNode"]}}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"4d3e24cd-a836-4eab-b087-4e01af02d0ee":{"bearerAuth":{"type":"http","scheme":"bearer","description":"`Authorization: Bearer \u003ccredential>`. 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.","scopes":[],"schemeName":"bearerAuth"}},"a8cf7881-dac3-45b7-8744-6efea457f3db":{}},"servers":{"5880df41-df35-42d5-af1f-b10683e2b6ec":{"url":"http://127.0.0.1:8189","description":"Self-hosted (comfy-api-proxy)"},"23833202-7920-4a4a-be1e-e814d04b634b":{"url":"https://cloud.comfy.org","description":"Comfy Cloud"},"0a14b1ef-11b5-46cd-bbf5-d1127b0d328f":{"url":"https://{deployment}.run.comfy.app","description":"Serverless deployment","variables":{"deployment":{"description":"DNS-safe deployment id (subdomain label). Staging uses {deployment}.stg.run.comfy.app.","default":"dep-1234abcd-56ef-7890-abcd-ef1234567890"}}}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"`Authorization: Bearer \u003ccredential>`. 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.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"`Authorization: Bearer \u003ccredential>`. 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.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"openapi-v2.yaml"},"subdomain":"dripart","siteName":"ComfyUI","title":"Upload an asset (single-call multipart) - ComfyUI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/api-reference/v2/assets/upload-an-asset-single-call-multipart","matchLevel":1},"zh":{"href":"/zh/api-reference/v2/assets/upload-an-asset-single-call-multipart","matchLevel":1},"ja":{"href":"/ja/api-reference/v2/assets/upload-an-asset-single-call-multipart","matchLevel":1},"ko":{"href":"/ko/api-reference/v2/assets/upload-an-asset-single-call-multipart","matchLevel":1},"es":{"href":"/es/api-reference/v2/assets/upload-an-asset-single-call-multipart","matchLevel":0}}},"lastModified":"2026-11-12T18:40:09.698Z","originalFileLocation":"es/api-reference/v2/assets/upload-an-asset-single-call-multipart.mdx","locale":"es"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Single-call multipart/form-data upload. The platform streams the bytes through its trusted byte-path, dedups by the server-computed hash, and mints the asset record. The blake3 hash is always computed server-side from the received bytes — a client-declared expected_hash is verified, never trusted (on Comfy Cloud and serverless, only when sent before file — see below). If location metadata (GPS, XMP, IPTC) is removed from an image before it is stored, the asset\u0026#x27;s hash is the hash of the stored bytes and can differ from expected_hash. On Comfy Cloud, an upload whose bytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based camera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that is over 50 MiB is refused with 422 validation_error, whatever its content_type and whether or not it carries location metadata. A request that declares a Content-Length over Comfy Cloud\u0026#x27;s 200 MB (200,000,000-byte) body limit is refused before that check with a plain 413 that does not use the ErrorEnvelope shape. A body sent without a declared length is cut off when it passes that limit, and no 413 is sent: a cut-off while the fields before file are read fails with 422 invalid_body, and a cut-off inside the file usually fails with 500 upstream_error. Nothing after the file field is read, so a body that only passes the limit there is uploaded normally. Deployment-scoped surfaces neither strip location metadata nor apply the 50 MiB image cap; they limit the request body to 110 MB (110,000,000 bytes). A request that declares a Content-Length over that limit is refused with the same plain 413; a body sent without a declared length is cut off when it passes the limit, and the upload then fails with an error response that is not guaranteed to be a 413. The uploaded asset is referenceable immediately; any content scanning runs in the background and does not block the response. Send file as the last part. Comfy Cloud and serverless deployments stream it straight into storage and read the other fields only up to it, so a part sent after file is never read: a content_type or file_path sent only after it is refused as missing (422); an optional field (expected_hash or tags) is silently ignored — the upload succeeds without the hash check or the caller\u0026#x27;s tags; on serverless deployments, a trailing expires_in is likewise ignored, losing the retention override; and a second file part is dropped, so only the first part\u0026#x27;s bytes are stored. Comfy Cloud ignores expires_in wherever it is sent, before or after file. The response does not say any of these were skipped. An upload is a single request. v1 expects files of up to ~100 MB; the hard cap is the body limit of the surface it is sent to (above). Chunked/resumable large uploads are a deliberate open question. Cloud\u0026#x27;s hosted API caps every part sent before file at 8 KiB, including a part it does not recognise (which it otherwise ignores), so an extra field over 8 KiB, such as file bytes sent under a misspelled name, is refused with 422 invalid_body. Parts sent after file are never read: the 8 KiB cap does not apply to them, and a metadata field sent there is treated as absent, so send every metadata field before file. A declared Content-Length still counts those bytes toward the size limit above; without one, a body that only exceeds the limit there is uploaded normally, since nothing after file is read. On Comfy Cloud an upload fails with 422 upload_timed_out when no request bytes arrive for 30 seconds, or when the whole request takes longer than 10 minutes, however steadily bytes keep arriving. On Comfy Cloud an upload can also be refused with 503 upload_busy and Retry-After when the server is busy with other uploads: nothing was stored, so the same upload can be sent again after Retry-After. On a Developer Platform deployment the same 422 upload_timed_out applies when no request bytes arrive for 30 seconds, or when the whole request takes longer than 20 minutes.\">\u003cmeta data-mint-head name=\"application-name\" content=\"ComfyUI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Upload an asset (single-call multipart) - ComfyUI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Single-call multipart/form-data upload. The platform streams the bytes through its trusted byte-path, dedups by the server-computed hash, and mints the asset record. The blake3 hash is always computed server-side from the received bytes — a client-declared expected_hash is verified, never trusted (on Comfy Cloud and serverless, only when sent before file — see below). If location metadata (GPS, XMP, IPTC) is removed from an image before it is stored, the asset\u0026#x27;s hash is the hash of the stored bytes and can differ from expected_hash. On Comfy Cloud, an upload whose bytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based camera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that is over 50 MiB is refused with 422 validation_error, whatever its content_type and whether or not it carries location metadata. A request that declares a Content-Length over Comfy Cloud\u0026#x27;s 200 MB (200,000,000-byte) body limit is refused before that check with a plain 413 that does not use the ErrorEnvelope shape. A body sent without a declared length is cut off when it passes that limit, and no 413 is sent: a cut-off while the fields before file are read fails with 422 invalid_body, and a cut-off inside the file usually fails with 500 upstream_error. Nothing after the file field is read, so a body that only passes the limit there is uploaded normally. Deployment-scoped surfaces neither strip location metadata nor apply the 50 MiB image cap; they limit the request body to 110 MB (110,000,000 bytes). A request that declares a Content-Length over that limit is refused with the same plain 413; a body sent without a declared length is cut off when it passes the limit, and the upload then fails with an error response that is not guaranteed to be a 413. The uploaded asset is referenceable immediately; any content scanning runs in the background and does not block the response. Send file as the last part. Comfy Cloud and serverless deployments stream it straight into storage and read the other fields only up to it, so a part sent after file is never read: a content_type or file_path sent only after it is refused as missing (422); an optional field (expected_hash or tags) is silently ignored — the upload succeeds without the hash check or the caller\u0026#x27;s tags; on serverless deployments, a trailing expires_in is likewise ignored, losing the retention override; and a second file part is dropped, so only the first part\u0026#x27;s bytes are stored. Comfy Cloud ignores expires_in wherever it is sent, before or after file. The response does not say any of these were skipped. An upload is a single request. v1 expects files of up to ~100 MB; the hard cap is the body limit of the surface it is sent to (above). Chunked/resumable large uploads are a deliberate open question. Cloud\u0026#x27;s hosted API caps every part sent before file at 8 KiB, including a part it does not recognise (which it otherwise ignores), so an extra field over 8 KiB, such as file bytes sent under a misspelled name, is refused with 422 invalid_body. Parts sent after file are never read: the 8 KiB cap does not apply to them, and a metadata field sent there is treated as absent, so send every metadata field before file. A declared Content-Length still counts those bytes toward the size limit above; without one, a body that only exceeds the limit there is uploaded normally, since nothing after file is read. On Comfy Cloud an upload fails with 422 upload_timed_out when no request bytes arrive for 30 seconds, or when the whole request takes longer than 10 minutes, however steadily bytes keep arriving. On Comfy Cloud an upload can also be refused with 503 upload_busy and Retry-After when the server is busy with other uploads: nothing was stored, so the same upload can be sent again after Retry-After. On a Developer Platform deployment the same 422 upload_timed_out applies when no request bytes arrive for 30 seconds, or when the whole request takes longer than 20 minutes.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ComfyUI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://dripart.mintlify.site/_mintlify/api/og/v2?division=assets\u0026amp;title=Upload+an+asset+%28single-call+multipart%29\u0026amp;description=Single-call+%60multipart%2Fform-data%60+upload.+The+platform+streams+the%0Abytes+through+its+trusted+byte-path%2C+dedups+by+the+server-computed%0Ahash%2C+and+mints+the+asset+\u0026amp;theme=b252c39adf72ba65053766a0\u0026amp;signature=63d53bacb0013923852d41c2c904a58202fb6d67e5eac25328a5c57813d41b04\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Upload an asset (single-call multipart) - ComfyUI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Single-call multipart/form-data upload. The platform streams the bytes through its trusted byte-path, dedups by the server-computed hash, and mints the asset record. The blake3 hash is always computed server-side from the received bytes — a client-declared expected_hash is verified, never trusted (on Comfy Cloud and serverless, only when sent before file — see below). If location metadata (GPS, XMP, IPTC) is removed from an image before it is stored, the asset\u0026#x27;s hash is the hash of the stored bytes and can differ from expected_hash. On Comfy Cloud, an upload whose bytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based camera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that is over 50 MiB is refused with 422 validation_error, whatever its content_type and whether or not it carries location metadata. A request that declares a Content-Length over Comfy Cloud\u0026#x27;s 200 MB (200,000,000-byte) body limit is refused before that check with a plain 413 that does not use the ErrorEnvelope shape. A body sent without a declared length is cut off when it passes that limit, and no 413 is sent: a cut-off while the fields before file are read fails with 422 invalid_body, and a cut-off inside the file usually fails with 500 upstream_error. Nothing after the file field is read, so a body that only passes the limit there is uploaded normally. Deployment-scoped surfaces neither strip location metadata nor apply the 50 MiB image cap; they limit the request body to 110 MB (110,000,000 bytes). A request that declares a Content-Length over that limit is refused with the same plain 413; a body sent without a declared length is cut off when it passes the limit, and the upload then fails with an error response that is not guaranteed to be a 413. The uploaded asset is referenceable immediately; any content scanning runs in the background and does not block the response. Send file as the last part. Comfy Cloud and serverless deployments stream it straight into storage and read the other fields only up to it, so a part sent after file is never read: a content_type or file_path sent only after it is refused as missing (422); an optional field (expected_hash or tags) is silently ignored — the upload succeeds without the hash check or the caller\u0026#x27;s tags; on serverless deployments, a trailing expires_in is likewise ignored, losing the retention override; and a second file part is dropped, so only the first part\u0026#x27;s bytes are stored. Comfy Cloud ignores expires_in wherever it is sent, before or after file. The response does not say any of these were skipped. An upload is a single request. v1 expects files of up to ~100 MB; the hard cap is the body limit of the surface it is sent to (above). Chunked/resumable large uploads are a deliberate open question. Cloud\u0026#x27;s hosted API caps every part sent before file at 8 KiB, including a part it does not recognise (which it otherwise ignores), so an extra field over 8 KiB, such as file bytes sent under a misspelled name, is refused with 422 invalid_body. Parts sent after file are never read: the 8 KiB cap does not apply to them, and a metadata field sent there is treated as absent, so send every metadata field before file. A declared Content-Length still counts those bytes toward the size limit above; without one, a body that only exceeds the limit there is uploaded normally, since nothing after file is read. On Comfy Cloud an upload fails with 422 upload_timed_out when no request bytes arrive for 30 seconds, or when the whole request takes longer than 10 minutes, however steadily bytes keep arriving. On Comfy Cloud an upload can also be refused with 503 upload_busy and Retry-After when the server is busy with other uploads: nothing was stored, so the same upload can be sent again after Retry-After. On a Developer Platform deployment the same 422 upload_timed_out applies when no request bytes arrive for 30 seconds, or when the whole request takes longer than 20 minutes.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://dripart.mintlify.site/_mintlify/api/og/v2?division=assets\u0026amp;title=Upload+an+asset+%28single-call+multipart%29\u0026amp;description=Single-call+%60multipart%2Fform-data%60+upload.+The+platform+streams+the%0Abytes+through+its+trusted+byte-path%2C+dedups+by+the+server-computed%0Ahash%2C+and+mints+the+asset+\u0026amp;theme=b252c39adf72ba65053766a0\u0026amp;signature=63d53bacb0013923852d41c2c904a58202fb6d67e5eac25328a5c57813d41b04\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ComfyUI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#49378B\">\u003cmeta data-mint-head name=\"googlebot\" content=\"max-video-preview:0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/es/api-reference/v2/assets/upload-an-asset-single-call-multipart.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.comfy.org/api-reference/v2/assets/upload-an-asset-single-call-multipart\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://docs.comfy.org/zh/api-reference/v2/assets/upload-an-asset-single-call-multipart\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.comfy.org/ja/api-reference/v2/assets/upload-an-asset-single-call-multipart\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://docs.comfy.org/ko/api-reference/v2/assets/upload-an-asset-single-call-multipart\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.comfy.org/api-reference/v2/assets/upload-an-asset-single-call-multipart\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.comfy.org/#organization\",\"name\":\"ComfyUI\",\"url\":\"https://docs.comfy.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/dripart/WCFdTagRdhtvk9-o/logo/light.svg?fit=max\u0026auto=format\u0026n=WCFdTagRdhtvk9-o\u0026q=85\u0026s=ec112de87239058f5a931a7e4b594965\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.comfy.org#website\",\"name\":\"ComfyUI\",\"url\":\"https://docs.comfy.org\",\"publisher\":{\"@id\":\"https://docs.comfy.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart#webpage\",\"url\":\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart\",\"name\":\"Upload an asset (single-call multipart)\",\"description\":\"Single-call multipart/form-data upload. The platform streams the bytes through its trusted byte-path, dedups by the server-computed hash, and mints the asset record. The blake3 hash is always computed server-side from the received bytes — a client-declared expected_hash is verified, never trusted (on Comfy Cloud and serverless, only when sent before file — see below). If location metadata (GPS, XMP, IPTC) is removed from an image before it is stored, the asset's hash is the hash of the stored bytes and can differ from expected_hash. On Comfy Cloud, an upload whose bytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based camera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that is over 50 MiB is refused with 422 validation_error, whatever its content_type and whether or not it carries location metadata. A request that declares a Content-Length over Comfy Cloud's 200 MB (200,000,000-byte) body limit is refused before that check with a plain 413 that does not use the ErrorEnvelope shape. A body sent without a declared length is cut off when it passes that limit, and no 413 is sent: a cut-off while the fields before file are read fails with 422 invalid_body, and a cut-off inside the file usually fails with 500 upstream_error. Nothing after the file field is read, so a body that only passes the limit there is uploaded normally. Deployment-scoped surfaces neither strip location metadata nor apply the 50 MiB image cap; they limit the request body to 110 MB (110,000,000 bytes). A request that declares a Content-Length over that limit is refused with the same plain 413; a body sent without a declared length is cut off when it passes the limit, and the upload then fails with an error response that is not guaranteed to be a 413. The uploaded asset is referenceable immediately; any content scanning runs in the background and does not block the response. Send file as the last part. Comfy Cloud and serverless deployments stream it straight into storage and read the other fields only up to it, so a part sent after file is never read: a content_type or file_path sent only after it is refused as missing (422); an optional field (expected_hash or tags) is silently ignored — the upload succeeds without the hash check or the caller's tags; on serverless deployments, a trailing expires_in is likewise ignored, losing the retention override; and a second file part is dropped, so only the first part's bytes are stored. Comfy Cloud ignores expires_in wherever it is sent, before or after file. The response does not say any of these were skipped. An upload is a single request. v1 expects files of up to ~100 MB; the hard cap is the body limit of the surface it is sent to (above). Chunked/resumable large uploads are a deliberate open question. Cloud's hosted API caps every part sent before file at 8 KiB, including a part it does not recognise (which it otherwise ignores), so an extra field over 8 KiB, such as file bytes sent under a misspelled name, is refused with 422 invalid_body. Parts sent after file are never read: the 8 KiB cap does not apply to them, and a metadata field sent there is treated as absent, so send every metadata field before file. A declared Content-Length still counts those bytes toward the size limit above; without one, a body that only exceeds the limit there is uploaded normally, since nothing after file is read. On Comfy Cloud an upload fails with 422 upload_timed_out when no request bytes arrive for 30 seconds, or when the whole request takes longer than 10 minutes, however steadily bytes keep arriving. On Comfy Cloud an upload can also be refused with 503 upload_busy and Retry-After when the server is busy with other uploads: nothing was stored, so the same upload can be sent again after Retry-After. On a Developer Platform deployment the same 422 upload_timed_out applies when no request bytes arrive for 30 seconds, or when the whole request takes longer than 20 minutes.\",\"dateModified\":\"2026-11-12T18:40:09.698Z\",\"isPartOf\":{\"@id\":\"https://docs.comfy.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Desplegar ComfyUI\",\"item\":\"https://docs.comfy.org/es/development/deploy/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ejecutar flujos de trabajo\",\"item\":\"https://docs.comfy.org/es/development/run-workflows/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Comfy API Reference\",\"item\":\"https://docs.comfy.org/es/development/comfy-api/overview\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"v2\",\"item\":\"https://docs.comfy.org/es/api-reference/v2/overview\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"Upload an asset (single-call multipart)\",\"item\":\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart#apireference\",\"headline\":\"Upload an asset (single-call multipart)\",\"name\":\"Upload an asset (single-call multipart)\",\"description\":\"Single-call multipart/form-data upload. The platform streams the bytes through its trusted byte-path, dedups by the server-computed hash, and mints the asset record. The blake3 hash is always computed server-side from the received bytes — a client-declared expected_hash is verified, never trusted (on Comfy Cloud and serverless, only when sent before file — see below). If location metadata (GPS, XMP, IPTC) is removed from an image before it is stored, the asset's hash is the hash of the stored bytes and can differ from expected_hash. On Comfy Cloud, an upload whose bytes open as a JPEG, PNG, WebP or classic TIFF (including TIFF-based camera RAW such as DNG, NEF, ARW and CR2, but not BigTIFF) and that is over 50 MiB is refused with 422 validation_error, whatever its content_type and whether or not it carries location metadata. A request that declares a Content-Length over Comfy Cloud's 200 MB (200,000,000-byte) body limit is refused before that check with a plain 413 that does not use the ErrorEnvelope shape. A body sent without a declared length is cut off when it passes that limit, and no 413 is sent: a cut-off while the fields before file are read fails with 422 invalid_body, and a cut-off inside the file usually fails with 500 upstream_error. Nothing after the file field is read, so a body that only passes the limit there is uploaded normally. Deployment-scoped surfaces neither strip location metadata nor apply the 50 MiB image cap; they limit the request body to 110 MB (110,000,000 bytes). A request that declares a Content-Length over that limit is refused with the same plain 413; a body sent without a declared length is cut off when it passes the limit, and the upload then fails with an error response that is not guaranteed to be a 413. The uploaded asset is referenceable immediately; any content scanning runs in the background and does not block the response. Send file as the last part. Comfy Cloud and serverless deployments stream it straight into storage and read the other fields only up to it, so a part sent after file is never read: a content_type or file_path sent only after it is refused as missing (422); an optional field (expected_hash or tags) is silently ignored — the upload succeeds without the hash check or the caller's tags; on serverless deployments, a trailing expires_in is likewise ignored, losing the retention override; and a second file part is dropped, so only the first part's bytes are stored. Comfy Cloud ignores expires_in wherever it is sent, before or after file. The response does not say any of these were skipped. An upload is a single request. v1 expects files of up to ~100 MB; the hard cap is the body limit of the surface it is sent to (above). Chunked/resumable large uploads are a deliberate open question. Cloud's hosted API caps every part sent before file at 8 KiB, including a part it does not recognise (which it otherwise ignores), so an extra field over 8 KiB, such as file bytes sent under a misspelled name, is refused with 422 invalid_body. Parts sent after file are never read: the 8 KiB cap does not apply to them, and a metadata field sent there is treated as absent, so send every metadata field before file. A declared Content-Length still counts those bytes toward the size limit above; without one, a body that only exceeds the limit there is uploaded normally, since nothing after file is read. On Comfy Cloud an upload fails with 422 upload_timed_out when no request bytes arrive for 30 seconds, or when the whole request takes longer than 10 minutes, however steadily bytes keep arriving. On Comfy Cloud an upload can also be refused with 503 upload_busy and Retry-After when the server is busy with other uploads: nothing was stored, so the same upload can be sent again after Retry-After. On a Developer Platform deployment the same 422 upload_timed_out applies when no request bytes arrive for 30 seconds, or when the whole request takes longer than 20 minutes.\",\"url\":\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart\",\"mainEntityOfPage\":{\"@id\":\"https://docs.comfy.org/es/api-reference/v2/assets/upload-an-asset-single-call-multipart#webpage\"},\"dateModified\":\"2026-11-12T18:40:09.698Z\",\"publisher\":{\"@id\":\"https://docs.comfy.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.comfy.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ComfyUI\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"ComfyUI\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/es/api-reference/v2/assets/upload-an-asset-single-call-multipart.md","siteName":"ComfyUI","nav":{"global":null,"languages":[{"language":"en","pages":[{"title":"en","href":"/api-reference/v2/assets/upload-an-asset-single-call-multipart"}]},{"language":"zh","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"资源","items":[{"label":"安装","href":"/zh/installation/system_requirements"},{"label":"教程","href":"/zh/tutorials/basic/text-to-image"},{"label":"开发","href":"/zh/development/overview"}]},{"header":"产品","items":[{"label":"功能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"画廊","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"下载","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"公司","items":[{"label":"关于","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"招聘","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"服务条款","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"隐私政策","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"pages":[{"title":"zh","href":"/zh/api-reference/v2/assets/upload-an-asset-single-call-multipart"}]},{"language":"ja","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"リソース","items":[{"label":"インストール","href":"/ja/installation/system_requirements"},{"label":"チュートリアル","href":"/ja/tutorials/basic/text-to-image"},{"label":"開発","href":"/ja/development/overview"}]},{"header":"プロダクト","items":[{"label":"機能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"ギャラリー","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"ダウンロード","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"会社情報","items":[{"label":"概要","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"採用情報","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"利用規約","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"プライバシーポリシー","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ja/tutorials/partner-nodes/pricing","label":"料金"},{"href":"https://comfy.org/download?utm_source=docs","label":"ダウンロード"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"pages":[{"title":"ja","href":"/ja/api-reference/v2/assets/upload-an-asset-single-call-multipart"}]},{"language":"ko","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"리소스","items":[{"label":"설치","href":"/ko/installation/system_requirements"},{"label":"튜토리얼","href":"/ko/tutorials/basic/text-to-image"},{"label":"개발","href":"/ko/development/overview"}]},{"header":"제품","items":[{"label":"기능","href":"https://www.comfy.org/?utm_source=docs"},{"label":"갤러리","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"다운로드","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"회사 정보","items":[{"label":"소개","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"채용","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"이용약관","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"개인정보 처리방침","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ko/tutorials/partner-nodes/pricing","label":"가격 정책"},{"href":"https://comfy.org/download?utm_source=docs","label":"다운로드"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"pages":[{"title":"ko","href":"/ko/api-reference/v2/assets/upload-an-asset-single-call-multipart"}]},{"language":"es","tabs":[{"tab":"Empezar","pages":[{"title":"Empezar","href":"/es"}]},{"tab":"Tutoriales","pages":[{"title":"Tutoriales","href":"/es/basic-concepts/workflow"}]},{"tab":"Comfy Router","pages":[{"title":"Comfy Router","href":"/es/development/comfy-router/quickstart"}]},{"tab":"Herramientas para agentes","pages":[{"title":"Herramientas para agentes","href":"/es/agent-tools"}]},{"tab":"Nodos integrados","pages":[{"title":"Nodos integrados","href":"/es/built-in-nodes/overview"}]},{"tab":"Desarrollo","pages":[{"group":"Desarrollar con Comfy","pages":[{"title":"ComfyUI para desarrolladores: SDK, API de servidor y nube","sidebarTitle":"Descripción general para desarrolladores","href":"/es/development/overview"},{"title":"Obtener una clave API","sidebarTitle":"Claves API","icon":"key","href":"/es/development/api-development/getting-an-api-key"},{"title":"Ejemplos de Comfy API y Router","sidebarTitle":"Ejemplos","icon":"code","mode":"wide","href":"/es/development/examples"}]},{"group":"Desplegar ComfyUI","pages":[{"title":"Implementar ComfyUI","sidebarTitle":"Descripción general","icon":"map","href":"/es/development/deploy/overview"},{"group":"API de Comfy","pages":[{"title":"Inicio rápido de Comfy API","sidebarTitle":"Inicio rápido","icon":"cloud-arrow-up","href":"/es/development/serverless/quickstart"},{"title":"Otras formas de crear un Build de Comfy API","sidebarTitle":"Fuentes del Build","icon":"layer-group","href":"/es/development/serverless/build-sources"},{"title":"Guía de despliegue de Comfy API","sidebarTitle":"Guía de despliegue","icon":"cloud-arrow-up","href":"/es/development/serverless/overview"}]},{"group":"Comfy Cloud","pages":[{"title":"Inicio rápido de Comfy Cloud","sidebarTitle":"Inicio rápido","icon":"cloud","href":"/es/development/deploy/cloud"},{"title":"Uso y límites","sidebarTitle":"Uso y límites","icon":"gauge","href":"/es/development/deploy/cloud-usage"}]},{"group":"Opciones de autoalojamiento","pages":[{"title":"Opciones de autoalojamiento","sidebarTitle":"Opciones de alojamiento","icon":"server","href":"/es/development/deploy/self-hosting"},{"group":"Self-Hosted Server API","pages":[{"title":"Descripción general del servidor","sidebarTitle":"Descripción general del servidor","href":"/es/development/comfyui-server/comms_overview"},{"title":"Ejemplos de la API de ComfyUI Server: HTTP, WebSocket e historial","sidebarTitle":"Ejemplos de API","href":"/es/development/comfyui-server/api-examples"},{"title":"Rutas del servidor de ComfyUI (API HTTP y WebSocket)","sidebarTitle":"Rutas HTTP y WebSocket","icon":"route","href":"/es/development/comfyui-server/comms_routes"},{"title":"Mensajes del servidor de ComfyUI (API WebSocket)","sidebarTitle":"Mensajes de WebSocket","icon":"comment","href":"/es/development/comfyui-server/comms_messages"},{"title":"Flags de inicio de ComfyUI: referencia de línea de comandos","sidebarTitle":"Flags de inicio","icon":"terminal","href":"/es/development/comfyui-server/startup-flags"},{"title":"Integración de la clave API de la cuenta de ComfyUI","sidebarTitle":"Integración de clave API","icon":"puzzle-piece","href":"/es/development/comfyui-server/api-key-integration"}]}]},{"group":"Ejecutar flujos de trabajo","pages":[{"title":"Ejecutar flujos de trabajo","sidebarTitle":"Descripción general","icon":"play","href":"/es/development/run-workflows/overview"},{"title":"Ejecuta tu primer flujo de trabajo","sidebarTitle":"Primer flujo de trabajo","href":"/es/development/api-development/quickstart"},{"title":"SDK de Comfy: clientes de Python y TypeScript para ComfyUI","sidebarTitle":"SDK","icon":"code","href":"/es/development/api-development/sdks"},{"title":"Proxy de API para ComfyUI autoalojado","sidebarTitle":"Proxy de API","icon":"plug","href":"/es/development/comfyui-server/api-proxy"},{"title":"Formato de API de flujos de trabajo","icon":"file-code","href":"/es/development/api-development/workflow-api-format"},{"title":"Metadatos de flujos de trabajo en archivos de salida de ComfyUI","sidebarTitle":"Metadatos de flujos","icon":"file-code","href":"/es/development/api-development/workflow-metadata"},{"group":"Comfy API Reference","boost":10,"pages":[{"title":"Versiones de Comfy API: v2 y la API v1 de Cloud obsoleta","sidebarTitle":"Descripción general","href":"/es/development/comfy-api/overview"},{"group":"v2","pages":[{"title":"Descripción general de Comfy API v2","sidebarTitle":"Descripción general","href":"/es/api-reference/v2/overview"},{"title":"Notas de diseño","description":"Por qué existe Comfy API v2, cómo se relaciona con las APIs de ComfyUI existentes y qué viene después","sidebarTitle":"Notas de diseño","icon":"compass","href":"/es/development/api-development/sdks-design"},{"group":"Referencia de la API","pages":[{"group":"assets","pages":[{"title":"Upload an asset (single-call multipart)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets","href":"/es/api-reference/v2/assets/upload-an-asset-single-call-multipart"},{"title":"Create or reuse an asset over existing bytes","description":"Zero-byte fast-path: creates or reuses an asset over a blob the\nplatform already has, identified by its blake3 hash.\n\nOn Comfy Cloud, the caller must already own the content in the\ncurrent workspace. Content owned only by another member of that\nworkspace does not satisfy the ownership check and returns `404`\n`blob_not_found`, just like an absent hash. A matching caller-owned\nCloud asset is reused with `200`, `created_new: false` and its UUID,\nname and tags, even when the request supplies a different valid\n`file_path` or `tags`.\n\nOn a deployment, reuse matches both the hash and the exact path in\nthe build's scope. A match returns `200` with `created_new: false`;\na different path over content the caller may use creates a new\nreference with `201` and `created_new: true`. The self-hosted proxy\nreturns its existing hash-indexed record with `200` and\n`created_new: false`, without applying the requested path or tags.\n\nReuse keeps the existing name and tags. Cloud and deployment\nvalidation still applies to submitted metadata before reuse;\nmetadata is not exempt from validation because it will not replace\nstored values. Retention may refresh, and content URLs are generated\nfor the response, so reuse does not promise an unchanged response.\n\nTrust boundary: resolves only against blobs the platform itself\ningested and hashed, and only those the calling account is authorized\nto use — the client hash is a lookup key, never an authority to\nregister new content. A miss and \"exists but not yours\" are\ndeliberately indistinguishable (`404` `blob_not_found`).\n\nThe lookup key is the `hash` an upload returned, which is the hash of\nthe stored bytes. When location metadata was removed from an image\nbefore it was stored, that differs from the client's digest of the\nfile it sent, and the client's digest finds nothing.\n","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/assets/from-hash","href":"/es/api-reference/v2/assets/create-or-reuse-an-asset-over-existing-bytes"},{"title":"Existence check for a blob by blake3 hash","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml head /api/v2/assets/by-hash/{hash}","href":"/es/api-reference/v2/assets/existence-check-for-a-blob-by-blake3-hash"},{"title":"Asset metadata","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/assets/{id}","href":"/es/api-reference/v2/assets/asset-metadata"},{"title":"Delete an asset record","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml delete /api/v2/assets/{id}","href":"/es/api-reference/v2/assets/delete-an-asset-record"},{"title":"Asset bytes","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/assets/{id}/content","href":"/es/api-reference/v2/assets/asset-bytes"}]},{"group":"jobs","pages":[{"title":"List jobs, newest first","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs","href":"/es/api-reference/v2/jobs/list-jobs-newest-first"},{"title":"Submit a workflow for execution","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/jobs","href":"/es/api-reference/v2/jobs/submit-a-workflow-for-execution"},{"title":"Job status (the polling workhorse)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}","href":"/es/api-reference/v2/jobs/job-status-the-polling-workhorse"},{"title":"The workflow behind a job — authoring version if pinned, executed graph otherwise","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/workflow","href":"/es/api-reference/v2/jobs/the-workflow-behind-a-job-—-authoring-version-if-pinned-executed-graph-otherwise"},{"title":"What the run printed","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/logs","href":"/es/api-reference/v2/jobs/what-the-run-printed"},{"title":"Live event stream (SSE)","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml get /api/v2/jobs/{id}/events","href":"/es/api-reference/v2/jobs/live-event-stream-sse"},{"title":"Request cancellation","deprecated":null,"version":null,"openapi":"/openapi-v2.yaml post /api/v2/jobs/{id}/cancel","href":"/es/api-reference/v2/jobs/request-cancellation"}]}]}]},{"group":"v1 Cloud API (deprecated)","pages":[{"title":"Descripción general de la API de Cloud v1","sidebarTitle":"Descripción general","href":"/es/development/cloud/overview"},{"title":"Referencia de la API de Cloud","sidebarTitle":"Ejemplos de código","icon":"book-open","href":"/es/development/cloud/api-reference"},{"title":"Especificación OpenAPI","icon":"file-lines","openapi":"/openapi-cloud.yaml","href":"/es/development/cloud/openapi"},{"group":"Referencia de la API de Cloud","pages":[{"group":"workflow","pages":[{"title":"Get information about current prompt executions","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/prompt","href":"/es/api-reference/cloud/workflow/get-information-about-current-prompt-executions"},{"title":"Submit a workflow for execution","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/prompt","href":"/es/api-reference/cloud/workflow/submit-a-workflow-for-execution"},{"title":"Get available workflow templates","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/workflow_templates","href":"/es/api-reference/cloud/workflow/get-available-workflow-templates"},{"title":"Get available subgraph blueprints","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/global_subgraphs","href":"/es/api-reference/cloud/workflow/get-available-subgraph-blueprints"},{"title":"Get a specific subgraph blueprint","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/global_subgraphs/{id}","href":"/es/api-reference/cloud/workflow/get-a-specific-subgraph-blueprint"}]},{"group":"node","pages":[{"title":"Get all node information","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/object_info","href":"/es/api-reference/cloud/node/get-all-node-information"},{"title":"Get server feature flags","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/features","href":"/es/api-reference/cloud/node/get-server-feature-flags"}]},{"group":"model","pages":[{"title":"Get available model folders","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/experiment/models","href":"/es/api-reference/cloud/model/get-available-model-folders"},{"title":"Get models in a specific folder","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/experiment/models/{folder}","href":"/es/api-reference/cloud/model/get-models-in-a-specific-folder"},{"title":"Get model preview image","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/experiment/models/preview/{folder}/{path_index}/{filename}","href":"/es/api-reference/cloud/model/get-model-preview-image"}]},{"group":"job","pages":[{"title":"Manage execution history","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/history","href":"/es/api-reference/cloud/job/manage-execution-history"},{"title":"Get execution history (v2)","deprecated":true,"version":null,"openapi":"/openapi-cloud.yaml get /api/history_v2","href":"/es/api-reference/cloud/job/get-execution-history-v2"},{"title":"Get history for specific prompt","deprecated":true,"version":null,"openapi":"/openapi-cloud.yaml get /api/history_v2/{prompt_id}","href":"/es/api-reference/cloud/job/get-history-for-specific-prompt"},{"title":"List jobs with pagination and filtering","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/jobs","href":"/es/api-reference/cloud/job/list-jobs-with-pagination-and-filtering"},{"title":"Get full job details","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/jobs/{job_id}","href":"/es/api-reference/cloud/job/get-full-job-details"},{"title":"Get queue information","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/queue","href":"/es/api-reference/cloud/job/get-queue-information"},{"title":"Manage queue operations","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/queue","href":"/es/api-reference/cloud/job/manage-queue-operations"},{"title":"Interrupt currently running jobs","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/interrupt","href":"/es/api-reference/cloud/job/interrupt-currently-running-jobs"},{"title":"Get job status","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/job/{job_id}/status","href":"/es/api-reference/cloud/job/get-job-status"}]},{"group":"file","pages":[{"title":"View a file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/view","href":"/es/api-reference/cloud/file/view-a-file"},{"title":"Get related mask layer files","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/files/mask-layers","href":"/es/api-reference/cloud/file/get-related-mask-layer-files"},{"title":"Upload an image file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/upload/image","href":"/es/api-reference/cloud/file/upload-an-image-file"},{"title":"Upload a mask image","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/upload/mask","href":"/es/api-reference/cloud/file/upload-a-mask-image"}]},{"group":"asset","pages":[{"title":"List user assets","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/assets","href":"/es/api-reference/cloud/asset/list-user-assets"},{"title":"Upload a new asset","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/assets","href":"/es/api-reference/cloud/asset/upload-a-new-asset"},{"title":"Create asset reference from existing hash","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/assets/from-hash","href":"/es/api-reference/cloud/asset/create-asset-reference-from-existing-hash"},{"title":"Get asset metadata from remote URL","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/assets/remote-metadata","href":"/es/api-reference/cloud/asset/get-asset-metadata-from-remote-url"},{"title":"Initiate background download for large files","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/assets/download","href":"/es/api-reference/cloud/asset/initiate-background-download-for-large-files"},{"title":"Get asset details","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/assets/{id}","href":"/es/api-reference/cloud/asset/get-asset-details"},{"title":"Update asset metadata","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml put /api/assets/{id}","href":"/es/api-reference/cloud/asset/update-asset-metadata"},{"title":"Delete asset","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml delete /api/assets/{id}","href":"/es/api-reference/cloud/asset/delete-asset"},{"title":"Add tags to asset","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/assets/{id}/tags","href":"/es/api-reference/cloud/asset/add-tags-to-asset"},{"title":"Remove tags from asset","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml delete /api/assets/{id}/tags","href":"/es/api-reference/cloud/asset/remove-tags-from-asset"},{"title":"List all tags","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/tags","href":"/es/api-reference/cloud/asset/list-all-tags"},{"title":"Get tag histogram for filtered assets","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/assets/tags/refine","href":"/es/api-reference/cloud/asset/get-tag-histogram-for-filtered-assets"},{"title":"Check if asset exists by hash","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml head /api/assets/hash/{hash}","href":"/es/api-reference/cloud/asset/check-if-asset-exists-by-hash"}]},{"group":"user","pages":[{"title":"List user data files","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/userdata","href":"/es/api-reference/cloud/user/list-user-data-files"},{"title":"Get user data file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/userdata/{file}","href":"/es/api-reference/cloud/user/get-user-data-file"},{"title":"Upload or update a user data file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml post /api/userdata/{file}","href":"/es/api-reference/cloud/user/upload-or-update-a-user-data-file"},{"title":"Delete a user data file","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml delete /api/userdata/{file}","href":"/es/api-reference/cloud/user/delete-a-user-data-file"},{"title":"Get current user information","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/user","href":"/es/api-reference/cloud/user/get-current-user-information"}]},{"group":"system","pages":[{"title":"Get system statistics","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/system_stats","href":"/es/api-reference/cloud/system/get-system-statistics"}]},{"group":"billing","pages":[{"title":"Get workspace usage over time","deprecated":null,"version":null,"openapi":"/openapi-cloud.yaml get /api/billing/usage/timeseries","href":"/es/api-reference/cloud/billing/get-workspace-usage-over-time"}]}]}]}]}]}]},{"group":"Comfy CLI","pages":[{"title":"Empezar con Comfy CLI","sidebarTitle":"Empezar","href":"/es/comfy-cli/getting-started"},{"title":"Referencia de comandos de Comfy CLI","sidebarTitle":"Referencia de comandos","href":"/es/comfy-cli/reference"},{"title":"Solución de problemas de Comfy CLI: instalación y entorno","sidebarTitle":"Solución de problemas","href":"/es/comfy-cli/troubleshooting"}]},{"group":"Specifications","pages":[{"group":"Workflow JSON","pages":[{"title":"Workflow JSON","href":"/es/specs/workflow_json"},{"title":"Workflow JSON 0.4","href":"/es/specs/workflow_json_0.4"}]},{"group":"Node Definitions","pages":[{"title":"JSON de definición de nodo","href":"/es/specs/nodedef_json"},{"title":"JSON de definición de nodo 1.0","href":"/es/specs/nodedef_json_1_0"}]}]},{"group":"Nodos personalizados","pages":[{"title":"Nodos personalizados","sidebarTitle":"Descripción general","href":"/es/custom-nodes/intro"},{"group":"Crear nodos personalizados","pages":[{"title":"Tipos y arquitectura de nodos personalizados de ComfyUI","sidebarTitle":"Tipos de nodos","href":"/es/custom-nodes/overview"},{"title":"Crear nodos personalizados en ComfyUI","sidebarTitle":"Crea tu primer nodo","href":"/es/custom-nodes/walkthrough"},{"group":"Python (backend)","pages":[{"title":"Propiedades de un nodo personalizado","sidebarTitle":"Propiedades del nodo","href":"/es/custom-nodes/backend/server_overview"},{"title":"Ciclo de vida de los nodos personalizados de ComfyUI","sidebarTitle":"Ciclo de vida del nodo","href":"/es/custom-nodes/backend/lifecycle"},{"title":"Tipos de datos de nodos personalizados de ComfyUI","sidebarTitle":"Tipos de datos","href":"/es/custom-nodes/backend/datatypes"},{"title":"Imágenes, latentes y máscaras","sidebarTitle":"Imágenes, latentes y máscaras","href":"/es/custom-nodes/backend/images_and_masks"},{"title":"Entradas ocultas y flexibles","sidebarTitle":"Entradas ocultas y flexibles","href":"/es/custom-nodes/backend/more_on_inputs"},{"title":"Evaluación diferida en nodos personalizados de ComfyUI","sidebarTitle":"Evaluación diferida","href":"/es/custom-nodes/backend/lazy_evaluation"},{"title":"Expansión de nodos","href":"/es/custom-nodes/backend/expansion"},{"title":"Listas de datos y procesamiento de listas en ComfyUI","sidebarTitle":"Listas y procesamiento de listas","href":"/es/custom-nodes/backend/lists"},{"title":"Trabajar con torch.Tensor","sidebarTitle":"Tensores","href":"/es/custom-nodes/backend/tensors"},{"title":"Fragmentos de Python para nodos de ComfyUI","sidebarTitle":"Fragmentos Python","href":"/es/custom-nodes/backend/snippets"},{"title":"Guía de inversión del modelo de ejecución","sidebarTitle":"Modelo de ejecución","icon":"code-branch","href":"/es/development/comfyui-server/execution_model_inversion_guide"}]},{"group":"JavaScript (UI)","pages":[{"title":"Extensiones de JavaScript","sidebarTitle":"Extensiones de JavaScript","href":"/es/custom-nodes/js/javascript_overview"},{"title":"Ganchos de JavaScript de ComfyUI","sidebarTitle":"Ganchos","href":"/es/custom-nodes/js/javascript_hooks"},{"title":"Objetos de Comfy","href":"/es/custom-nodes/js/javascript_objects_and_hijacking"},{"title":"API de configuraciones","href":"/es/custom-nodes/js/javascript_settings"},{"title":"API de diálogos de ComfyUI","sidebarTitle":"API de diálogos","href":"/es/custom-nodes/js/javascript_dialog"},{"title":"API de Toast de ComfyUI","sidebarTitle":"API de Toast","href":"/es/custom-nodes/js/javascript_toast"},{"title":"Insignias del panel Acerca de","href":"/es/custom-nodes/js/javascript_about_panel_badges"},{"title":"Pestañas del panel inferior","href":"/es/custom-nodes/js/javascript_bottom_panel_tabs"},{"title":"Pestañas de la barra lateral","href":"/es/custom-nodes/js/javascript_sidebar_tabs"},{"title":"Cuadro de herramientas de selección","href":"/es/custom-nodes/js/javascript_selection_toolbox"},{"title":"Comandos y atajos de teclado","href":"/es/custom-nodes/js/javascript_commands_keybindings"},{"title":"API del menú de la barra superior de ComfyUI","sidebarTitle":"API del menú de la barra superior","href":"/es/custom-nodes/js/javascript_topbar_menu"},{"title":"Subgrafos de ComfyUI","sidebarTitle":"Subgrafos","href":"/es/custom-nodes/js/subgraphs"},{"title":"API de puntero del lienzo para widgets y cursores","sidebarTitle":"API de puntero del lienzo","href":"/es/custom-nodes/js/canvas-pointer-api"},{"title":"Ejemplos de extensiones JavaScript de ComfyUI","sidebarTitle":"Ejemplos JavaScript","href":"/es/custom-nodes/js/javascript_examples"}]},{"title":"i18n de nodos personalizados de ComfyUI: traducir definiciones","sidebarTitle":"Soporte i18n","href":"/es/custom-nodes/i18n"},{"group":"Migration Guides","pages":[{"title":"Migración a V3","href":"/es/custom-nodes/v3_migration"},{"title":"Migrar a la API del menú contextual en ComfyUI: lienzo y nodos","sidebarTitle":"Migración del menú contextual","href":"/es/custom-nodes/js/context-menu-migration"},{"title":"Migración de ID de nodo para extensiones del frontend","sidebarTitle":"Migración de ID de nodo","href":"/es/custom-nodes/js/node-id-migration"},{"title":"Migración del registro de enlaces para extensiones del frontend","sidebarTitle":"Registro de enlaces","href":"/es/custom-nodes/js/link-registration-migration"},{"title":"Migración del sistema de widgets para extensiones del frontend","sidebarTitle":"Migración del sistema de widgets","href":"/es/custom-nodes/js/widgets-migration"},{"title":"Migración de callbacks de conexión para extensiones del frontend","sidebarTitle":"Callbacks de conexión","href":"/es/custom-nodes/js/connection-callbacks-migration"},{"title":"Migración de callbacks de serialización para extensiones del frontend","sidebarTitle":"Callbacks de serialización","href":"/es/custom-nodes/js/serialization-callbacks-migration"},{"title":"Migración de geometría de nodos para extensiones del frontend","sidebarTitle":"Migración de geometría de nodos","href":"/es/custom-nodes/js/node-geometry-migration"},{"title":"Migración tras eliminar PrimeVue en extensiones del frontend","sidebarTitle":"Eliminación de PrimeVue","href":"/es/custom-nodes/js/primevue-removal-migration"},{"title":"Reemplazo de nodos","href":"/es/custom-nodes/backend/node-replacement"}]}]},{"group":"Package \u0026 Publish","pages":[{"title":"Añadir documentación de nodos para tu nodo personalizado de ComfyUI","sidebarTitle":"Documentación de nodos","href":"/es/custom-nodes/help_page"},{"title":"Plantillas de flujos de trabajo","href":"/es/custom-nodes/workflow_templates"},{"title":"Planos de subgrafos","href":"/es/custom-nodes/subgraph_blueprints"},{"title":"Comfy Registry: publica y versiona nodos personalizados","sidebarTitle":"Descripción general del Registry","href":"/es/registry/overview"},{"title":"Publicar nodos personalizados en Comfy Registry","sidebarTitle":"Publicar nodos","href":"/es/registry/publishing"},{"title":"Publicar en ComfyUI Manager","sidebarTitle":"Publicar en Manager","href":"/es/custom-nodes/backend/manager"},{"title":"Reclamar un nodo personalizado en el Comfy Registry","sidebarTitle":"Reclamar nodo","href":"/es/registry/claim-my-node"},{"title":"Estándares de calidad y seguridad de nodos del Registro de Comfy","sidebarTitle":"Calidad y seguridad","href":"/es/registry/standards"},{"title":"CI/CD de nodos personalizados","sidebarTitle":"CI/CD","href":"/es/registry/cicd"},{"title":"pyproject.toml","href":"/es/registry/specifications"},{"title":"Descripción general de la API","href":"/es/registry/api-reference/overview"},{"group":"Registry API Reference","pages":[{"group":"Admin","pages":[{"title":"Generate a short-lived JWT admin token","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /admin/generate-token","href":"/es/registry/api-reference/admin/generate-a-short-lived-jwt-admin-token"}]},{"group":"Registry","pages":[{"title":"Retrieve multiple node versions in a single request","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /bulk/nodes/versions","href":"/es/registry/api-reference/registry/retrieve-multiple-node-versions-in-a-single-request"},{"title":"list all comfy-nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /comfy-nodes","href":"/es/registry/api-reference/registry/list-all-comfy-nodes"},{"title":"Retrieve a node by ComfyUI node name","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /comfy-nodes/{comfyNodeName}/node","href":"/es/registry/api-reference/registry/retrieve-a-node-by-comfyui-node-name"},{"title":"Get server feature flags","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /features","href":"/es/registry/api-reference/registry/get-server-feature-flags"},{"title":"Retrieves a list of nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes","href":"/es/registry/api-reference/registry/retrieves-a-list-of-nodes"},{"title":"Retrieves a list of nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/search","href":"/es/registry/api-reference/registry/retrieves-a-list-of-nodes-1"},{"title":"Retrieve a specific node by ID","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}","href":"/es/registry/api-reference/registry/retrieve-a-specific-node-by-id"},{"title":"Returns a node version to be installed.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/install","href":"/es/registry/api-reference/registry/returns-a-node-version-to-be-installed"},{"title":"Add review to a specific version of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /nodes/{nodeId}/reviews","href":"/es/registry/api-reference/registry/add-review-to-a-specific-version-of-a-node"},{"title":"Create Node Translations","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /nodes/{nodeId}/translations","href":"/es/registry/api-reference/registry/create-node-translations"},{"title":"List all versions of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/versions","href":"/es/registry/api-reference/registry/list-all-versions-of-a-node"},{"title":"Retrieve a specific version of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/versions/{versionId}","href":"/es/registry/api-reference/registry/retrieve-a-specific-version-of-a-node"},{"title":"list comfy-nodes for node version","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/versions/{version}/comfy-nodes","href":"/es/registry/api-reference/registry/list-comfy-nodes-for-node-version"},{"title":"create comfy-nodes for certain node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /nodes/{nodeId}/versions/{version}/comfy-nodes","href":"/es/registry/api-reference/registry/create-comfy-nodes-for-certain-node"},{"title":"get specify comfy-node based on its id","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /nodes/{nodeId}/versions/{version}/comfy-nodes/{comfyNodeName}","href":"/es/registry/api-reference/registry/get-specify-comfy-node-based-on-its-id"},{"title":"Update a specific comfy-node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /nodes/{nodeId}/versions/{version}/comfy-nodes/{comfyNodeName}","href":"/es/registry/api-reference/registry/update-a-specific-comfy-node"},{"title":"Retrieve all publishers","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers","href":"/es/registry/api-reference/registry/retrieve-all-publishers"},{"title":"Create a new publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers","href":"/es/registry/api-reference/registry/create-a-new-publisher"},{"title":"Validate if a publisher username is available","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/validate","href":"/es/registry/api-reference/registry/validate-if-a-publisher-username-is-available"},{"title":"Retrieve a publisher by ID","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}","href":"/es/registry/api-reference/registry/retrieve-a-publisher-by-id"},{"title":"Update a publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /publishers/{publisherId}","href":"/es/registry/api-reference/registry/update-a-publisher"},{"title":"Delete a publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi delete /publishers/{publisherId}","href":"/es/registry/api-reference/registry/delete-a-publisher"},{"title":"Retrieve all nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}/nodes","href":"/es/registry/api-reference/registry/retrieve-all-nodes"},{"title":"Create a new custom node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers/{publisherId}/nodes","href":"/es/registry/api-reference/registry/create-a-new-custom-node"},{"title":"Retrieve all nodes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}/nodes/v2","href":"/es/registry/api-reference/registry/retrieve-all-nodes-1"},{"title":"Update a specific node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /publishers/{publisherId}/nodes/{nodeId}","href":"/es/registry/api-reference/registry/update-a-specific-node"},{"title":"Delete a specific node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi delete /publishers/{publisherId}/nodes/{nodeId}","href":"/es/registry/api-reference/registry/delete-a-specific-node"},{"title":"Claim nodeId into publisherId for the authenticated publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers/{publisherId}/nodes/{nodeId}/claim-my-node","href":"/es/registry/api-reference/registry/claim-nodeid-into-publisherid-for-the-authenticated-publisher"},{"title":"Retrieve permissions the user has for a given publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}/nodes/{nodeId}/permissions","href":"/es/registry/api-reference/registry/retrieve-permissions-the-user-has-for-a-given-publisher"},{"title":"Publish a new version of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers/{publisherId}/nodes/{nodeId}/versions","href":"/es/registry/api-reference/registry/publish-a-new-version-of-a-node"},{"title":"Update changelog and deprecation status of a node version","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /publishers/{publisherId}/nodes/{nodeId}/versions/{versionId}","href":"/es/registry/api-reference/registry/update-changelog-and-deprecation-status-of-a-node-version"},{"title":"Unpublish (delete) a specific version of a node","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi delete /publishers/{publisherId}/nodes/{nodeId}/versions/{versionId}","href":"/es/registry/api-reference/registry/unpublish-delete-a-specific-version-of-a-node"},{"title":"Retrieve permissions the user has for a given publisher","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /publishers/{publisherId}/permissions","href":"/es/registry/api-reference/registry/retrieve-permissions-the-user-has-for-a-given-publisher-1"},{"title":"Create a new personal access token","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /publishers/{publisherId}/tokens","href":"/es/registry/api-reference/registry/create-a-new-personal-access-token"},{"title":"Delete a specific personal access token","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi delete /publishers/{publisherId}/tokens/{tokenId}","href":"/es/registry/api-reference/registry/delete-a-specific-personal-access-token"},{"title":"Get information about the calling user.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /users","href":"/es/registry/api-reference/registry/get-information-about-the-calling-user"},{"title":"Retrieve all publishers for a given user","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /users/publishers/","href":"/es/registry/api-reference/registry/retrieve-all-publishers-for-a-given-user"},{"title":"List all node versions given some filters.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /versions","href":"/es/registry/api-reference/registry/list-all-node-versions-given-some-filters"}]},{"group":"Freepik","pages":[{"title":"Relight an image","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/freepik/v1/ai/image-relight","href":"/es/registry/api-reference/freepik/relight-an-image"},{"title":"Get the status of the relight task","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /proxy/freepik/v1/ai/image-relight/{task_id}","href":"/es/registry/api-reference/freepik/get-the-status-of-the-relight-task"},{"title":"Style transfer an image","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/freepik/v1/ai/image-style-transfer","href":"/es/registry/api-reference/freepik/style-transfer-an-image"},{"title":"Get the status of the style transfer task","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /proxy/freepik/v1/ai/image-style-transfer/{task_id}","href":"/es/registry/api-reference/freepik/get-the-status-of-the-style-transfer-task"},{"title":"Upscale an image with Magnific","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/freepik/v1/ai/image-upscaler","href":"/es/registry/api-reference/freepik/upscale-an-image-with-magnific"},{"title":"Upscale an image with Precision V2","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/freepik/v1/ai/image-upscaler-precision-v2","href":"/es/registry/api-reference/freepik/upscale-an-image-with-precision-v2"},{"title":"Get the status of the Precision V2 upscaling task","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /proxy/freepik/v1/ai/image-upscaler-precision-v2/{task_id}","href":"/es/registry/api-reference/freepik/get-the-status-of-the-precision-v2-upscaling-task"},{"title":"Get the status of the upscaling task","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /proxy/freepik/v1/ai/image-upscaler/{task_id}","href":"/es/registry/api-reference/freepik/get-the-status-of-the-upscaling-task"},{"title":"Skin enhancer using AI (Creative)","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/freepik/v1/ai/skin-enhancer/creative","href":"/es/registry/api-reference/freepik/skin-enhancer-using-ai-creative"},{"title":"Skin enhancer using AI (Faithful)","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/freepik/v1/ai/skin-enhancer/faithful","href":"/es/registry/api-reference/freepik/skin-enhancer-using-ai-faithful"},{"title":"Skin enhancer using AI (Flexible)","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/freepik/v1/ai/skin-enhancer/flexible","href":"/es/registry/api-reference/freepik/skin-enhancer-using-ai-flexible"},{"title":"Get the status of one skin enhancer task","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /proxy/freepik/v1/ai/skin-enhancer/{task_id}","href":"/es/registry/api-reference/freepik/get-the-status-of-one-skin-enhancer-task"}]},{"group":"Sonilo","pages":[{"title":"Generate music from text prompt","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/sonilo/t2m/generate","href":"/es/registry/api-reference/sonilo/generate-music-from-text-prompt"},{"title":"Get a Sonilo task","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /proxy/sonilo/v1/tasks/{task_id}","href":"/es/registry/api-reference/sonilo/get-a-sonilo-task"},{"title":"Generate a song with lyrics from a text prompt","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/sonilo/v1/text-to-music-l","href":"/es/registry/api-reference/sonilo/generate-a-song-with-lyrics-from-a-text-prompt"},{"title":"Generate music from video","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/sonilo/v2m/generate","href":"/es/registry/api-reference/sonilo/generate-music-from-video"}]},{"group":"API Nodes","pages":[{"title":"Post proxyviduextend","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/vidu/extend","href":"/es/registry/api-reference/api-nodes/post-proxyviduextend"},{"title":"Post proxyviduimg2video","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/vidu/img2video","href":"/es/registry/api-reference/api-nodes/post-proxyviduimg2video"},{"title":"Post proxyvidumultiframe","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/vidu/multiframe","href":"/es/registry/api-reference/api-nodes/post-proxyvidumultiframe"},{"title":"Post proxyvidureference2video","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/vidu/reference2video","href":"/es/registry/api-reference/api-nodes/post-proxyvidureference2video"},{"title":"Post proxyvidustart end2video","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/vidu/start-end2video","href":"/es/registry/api-reference/api-nodes/post-proxyvidustart-end2video"},{"title":"Get proxyvidutasks creations","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /proxy/vidu/tasks/{id}/creations","href":"/es/registry/api-reference/api-nodes/get-proxyvidutasks-creations"},{"title":"Post proxyvidutext2video","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /proxy/vidu/text2video","href":"/es/registry/api-reference/api-nodes/post-proxyvidutext2video"}]},{"group":"Releases","pages":[{"title":"Get release notes","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /releases","href":"/es/registry/api-reference/releases/get-release-notes"}]},{"group":"Comfy Router","pages":[{"title":"List the models Comfy Router can run.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /v2/models","href":"/es/registry/api-reference/comfy-router/list-the-models-comfy-router-can-run"},{"title":"Read one partner model's catalog entry by canonical model ID.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /v2/models/{provider}/{model}","href":"/es/registry/api-reference/comfy-router/read-one-partner-models-catalog-entry-by-canonical-model-id"},{"title":"Run a partner model synchronously by canonical model ID.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /v2/models/{provider}/{model}","href":"/es/registry/api-reference/comfy-router/run-a-partner-model-synchronously-by-canonical-model-id"},{"title":"Price a model call before running it, without running it.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /v2/models/{provider}/{model}/estimate","href":"/es/registry/api-reference/comfy-router/price-a-model-call-before-running-it-without-running-it"},{"title":"Read one partner model's input and output schemas as an OpenAPI document.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /v2/models/{provider}/{model}/openapi.json","href":"/es/registry/api-reference/comfy-router/read-one-partner-models-input-and-output-schemas-as-an-openapi-document"},{"title":"Submit a partner model run to the queue and return immediately.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi post /v2/models/{provider}/{model}/requests","href":"/es/registry/api-reference/comfy-router/submit-a-partner-model-run-to-the-queue-and-return-immediately"},{"title":"Collect the result of one submitted request.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /v2/models/{provider}/{model}/requests/{request_id}","href":"/es/registry/api-reference/comfy-router/collect-the-result-of-one-submitted-request"},{"title":"Ask for one submitted request to be cancelled.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi put /v2/models/{provider}/{model}/requests/{request_id}/cancel","href":"/es/registry/api-reference/comfy-router/ask-for-one-submitted-request-to-be-cancelled"},{"title":"Read the queue state of one submitted request.","deprecated":null,"version":null,"openapi":"https://api.comfy.org/openapi get /v2/models/{provider}/{model}/requests/{request_id}/status","href":"/es/registry/api-reference/comfy-router/read-the-queue-state-of-one-submitted-request"}]}]}]}]}]},{"tab":"Soporte","pages":[{"title":"Soporte","href":"/es/support/contact-support"}]}]}]},"basePath":"","title":"Upload an asset (single-call multipart) - ComfyUI","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DdEMm2kG.js","utils-BMo572L7.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-C-4m9KAx.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-DPLK2Oq9.js","snippetPresets-BKjfJMC9.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-DTsgtCEj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C8vmhyQM.js","shallow-r9w8LQGS.js","getApiPlaygroundDisplay-DjPI64HQ.js","CodeSnippet-C8Bvhl16.js","CodeSnippets-BtWUwcMy.js","Page-BIYvYBgk.js","getPastedJson-Dcm_3Pgl.js","icon-BXwrTpjc.js","MethodPill-CcjfVmmy.js","DuplicateIcon-BuKIbXAQ.js","createIcon-DaL9yXsO.js","DynamicMarkdown-Co5nikxh.js","SectionHeading-P4UNTsMZ.js","axios-vUo_bRtp.js","Markdown-CEfymfIH.js","clsx-Dq9TQuNi.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-D2J8knkn.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BgZ2ThuU.js"]}