{"components":{"responses":{"SessionForbidden":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenError"}}},"description":"A refused request. For a web session, `code` is `workspace_access_denied` (the selected workspace is unknown, deleted, or the user is not a member; the three look the same), `no_workspace_access` (the account has no personal workspace and is a member of no live workspace), `origin_not_allowed` or `cross_site_request`; see the `WebSessionAuth` scheme. For any credential, `sso_required` means an SSO organization holds the account (its email is on the organization's verified domains) and the credential is not an SSO sign-in, or the workspace is an SSO organization's and the account is not on its domains or the credential is not an SSO sign-in; `organization_id`, when present, names the organization to sign in with. `account_outside_organization` means the workspace is an SSO organization's and the account is on none of its domains, so no sign-in admits it; `organization_id` names the workspace's organization. `FORBIDDEN` is the route's own authorization check failing, such as an unverified email. On `GET /api/billing/churnkey/auth`, `NOT_ORIGINAL_OWNER` means the caller is not the workspace's creator; it is returned only when the rollout mode is `creator`. A credential this route does not take gets AuthTypeNotAllowedError instead, and so does the session while `web_session_enabled` is off for the user, unless the operation says it takes the session whatever `web_session_enabled` says."},"SessionUnauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"No valid credential, or an `Authorization` header, `X-API-Key` header or `?token=` next to the session cookie that could not be read, which is refused rather than answered with the session. `code` is `UNAUTHORIZED`."},"SessionWorkspaceIDInvalid":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"`code` is `workspace_id_invalid`: the `X-Comfy-Workspace-ID` header or `workspace_id` query value is malformed, or conflicts with another value or with the workspace the credential resolves to. Answered only while `web_session_enabled` is on for the user. See the `WebSessionAuth` scheme."},"SessionWriteForbidden":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForbiddenError"}}},"description":"A refused request that changes data. For a web session, `code` is `csrf_invalid` (no `X-CSRF-Token`, or not the session's), `workspace_access_denied` (the selected workspace is unknown, deleted, or the user is not a member; the three look the same), `no_workspace_access` (the account has no personal workspace and is a member of no live workspace), `origin_not_allowed` or `cross_site_request`; see the `WebSessionAuth` scheme. For any credential, `sso_required` means an SSO organization holds the account (its email is on the organization's verified domains) and the credential is not an SSO sign-in, or the workspace is an SSO organization's and the account is not on its domains or the credential is not an SSO sign-in; `organization_id`, when present, names the organization to sign in with. `account_outside_organization` means the workspace is an SSO organization's and the account is on none of its domains, so no sign-in admits it; `organization_id` names the workspace's organization. `FORBIDDEN` is the route's own authorization check failing, such as an unverified email, or, on `POST /api/workspaces`, an account an SSO organization holds (its organization manages its workspaces; signing in again does not change it). On the plan-lifecycle writes (`POST /api/billing/subscribe`, `POST /api/billing/subscription/cancel`, `POST /api/billing/subscription/resubscribe`, `POST /api/billing/subscription/revert-scheduled-change`, `POST /api/billing/ops/{id}/cancel` and the `/api/billing/retention/*` routes), `NOT_ORIGINAL_OWNER` means the caller is an owner but not the workspace's creator, and only the creator may change the plan; it is returned only when the rollout mode is `creator`. A credential this route does not take gets AuthTypeNotAllowedError instead, and so does the session while `web_session_enabled` is off for the user, unless the operation says it takes the session whatever the flag."}},"schemas":{"AuthTypeNotAllowedError":{"description":"403 for a credential the route does not take. `accepted` names the ones it does, as `WWW-Authenticate` does.","properties":{"accepted":{"items":{"type":"string"},"type":"array"},"error":{"properties":{"message":{"type":"string"},"type":{"enum":["auth_type_not_allowed"],"type":"string"}},"required":["message","type"],"type":"object"}},"required":["error","accepted"],"type":"object"},"CCCAccountProfile":{"additionalProperties":false,"properties":{"account_id":{"description":"Canonical Comfy account ID; never a profile-record ID.","minLength":1,"type":"string"},"avatar_url":{"description":"Server-returned public avatar URL; never writable input.","readOnly":true,"type":"string"},"description":{"maxLength":5000,"type":"string"},"display_name":{"maxLength":100,"type":"string"},"username":{"maxLength":42,"minLength":3,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","type":"string"},"version":{"pattern":"^[a-f0-9]{64}$","type":"string"},"website_urls":{"items":{"type":"string"},"maxItems":8,"type":"array"}},"required":["account_id","username","display_name","description","avatar_url","website_urls","version"],"type":"object"},"CCCAuthoringContext":{"additionalProperties":false,"properties":{"actor_uid":{"minLength":1,"type":"string"},"can_apply":{"type":"boolean"},"can_edit":{"type":"boolean"},"owner_uid":{"minLength":1,"type":"string"},"state":{"$ref":"#/components/schemas/CCCCatalogState"}},"required":["actor_uid","owner_uid","can_edit","can_apply","state"],"type":"object"},"CCCCatalogState":{"additionalProperties":false,"properties":{"draft_generation":{"format":"int64","minimum":0,"type":"integer"},"draft_rev":{"format":"int64","minimum":1,"type":"integer"},"live_rev":{"format":"int64","minimum":1,"type":"integer"},"next_rev":{"format":"int64","minimum":1,"type":"integer"},"previous_live_rev":{"format":"int64","minimum":1,"nullable":true,"type":"integer"}},"required":["live_rev","draft_rev","previous_live_rev","draft_generation","next_rev"],"type":"object"},"CCCCheckedReviewReceipt":{"additionalProperties":false,"properties":{"publish_enabled":{"type":"boolean"},"receipt_version":{"enum":[1],"type":"integer"},"selected_count":{"maximum":5000,"minimum":1,"type":"integer"},"selected_versions_digest":{"pattern":"^[0-9a-f]{64}$","type":"string"},"selection_digest":{"pattern":"^[0-9a-f]{64}$","type":"string"},"state":{"$ref":"#/components/schemas/CCCCatalogState"},"unchecked_count":{"maximum":5000,"minimum":0,"type":"integer"}},"required":["receipt_version","state","selected_count","unchecked_count","selected_versions_digest","selection_digest","publish_enabled"],"type":"object"},"CCCJSON":{"additionalProperties":true,"description":"Flat type-versioned CCC JSON. Domain schemas (/api/v1/catalog/schemas/{type}/{version}) constrain authored fields. The readOnly properties are server metadata returned by reads; a save may send them back unchanged and they are ignored, never applied. expected_draft_rev and expected_revision_uid are the save concurrency tokens.","properties":{"catalog_rev":{"description":"Catalog revision of this edit; may be older than the working Draft.","format":"int64","readOnly":true,"type":"integer"},"creator_uid":{"description":"Immutable account that created the resource.","readOnly":true,"type":"string"},"digest":{"description":"SHA-256 of the canonical authored document.","readOnly":true,"type":"string"},"draft_generation":{"format":"int64","readOnly":true,"type":"integer"},"edit_sequence":{"format":"int64","readOnly":true,"type":"integer"},"is_deleted":{"description":"Tombstone flag. false may be sent back; true is refused (use restore).","readOnly":true,"type":"boolean"},"owner_uid":{"description":"Fixed organization owner; never transferred by a save.","readOnly":true,"type":"string"},"revision_uid":{"description":"This immutable edit; send it back as expected_revision_uid.","format":"uuid","readOnly":true,"type":"string"},"saved_at":{"description":"RFC3339 UTC save time of this exact edit.","format":"date-time","readOnly":true,"type":"string"},"saved_by_uid":{"description":"Account that saved this edit.","readOnly":true,"type":"string"},"uid":{"description":"Server-assigned logical resource UID.","format":"uuid","readOnly":true,"type":"string"}},"type":"object","x-go-type":"map[string]interface{}"},"CCCProfileChoices":{"additionalProperties":false,"properties":{"items":{"items":{"additionalProperties":false,"properties":{"avatar_url":{"format":"uri","maxLength":4000,"type":"string"},"id":{"description":"Canonical Comfy account ID (users.id).","minLength":1,"type":"string"},"label":{"maxLength":100,"minLength":1,"type":"string"},"username":{"maxLength":42,"minLength":3,"type":"string"}},"required":["id","label","username"],"type":"object"},"maxItems":20,"type":"array"}},"required":["items"],"type":"object"},"CCCProfileEdit":{"additionalProperties":false,"properties":{"avatar_token":{"description":"Optional actor-bound token from a deployed verified avatar uploader. Omit to retain the current avatar; empty clears it. If no verified uploader is deployed, retain the avatar and report that capability unavailable. Never submit a raw avatar URL.","maxLength":4096,"pattern":"^$|^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$","type":"string"},"description":{"maxLength":5000,"type":"string"},"display_name":{"maxLength":100,"minLength":1,"type":"string"},"expected_version":{"pattern":"^$|^[a-f0-9]{64}$","type":"string"},"username":{"maxLength":42,"minLength":3,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","type":"string"},"website_urls":{"items":{"maxLength":4000,"minLength":1,"type":"string"},"maxItems":8,"type":"array"}},"required":["username","display_name"],"type":"object"},"CCCPublicItemsPage":{"allOf":[{"$ref":"#/components/schemas/ContentCatalogProjection"},{"properties":{"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque continuation bound to this query and publication identity; omitted on the last page.","type":"string"},"page_size":{"maximum":100,"minimum":1,"type":"integer"}},"required":["page_size","has_more"],"type":"object"}]},"ContentCatalogProjection":{"properties":{"generation":{"format":"int64","type":"integer"},"items":{"items":{"$ref":"#/components/schemas/ContentCatalogRecord"},"type":"array"},"revision_id":{"format":"int64","minimum":1,"type":"integer"}},"required":["revision_id","generation","items"],"type":"object"},"ContentCatalogRecord":{"properties":{"data":{"additionalProperties":true,"type":"object"},"deleted":{"type":"boolean"},"edit_version":{"type":"string"},"enabled":{"type":"boolean"},"kind":{"enum":["MODEL","WORKFLOW","APP","TEMPLATE_SET"],"type":"string"},"revision":{"description":"Integer revision supplying this entity; may precede the requested catalog revision.","format":"int64","minimum":1,"type":"integer"},"slug":{"description":"Canonical website pathname for page content; native slug for template sets. Identity is always UID.","type":"string"},"uid":{"type":"string"},"visibility":{"enum":["PUBLIC","STAFF"],"type":"string"},"visible_from":{"format":"date-time","type":"string"}},"required":["uid","revision","edit_version","kind","slug","enabled","visibility","deleted","data"],"type":"object"},"ErrorResponse":{"description":"Standard error response with a machine-readable code and human-readable message.","properties":{"code":{"type":"string"},"details":{"additionalProperties":true,"description":"Optional open object carrying structured, machine-readable context about the error (e.g. offending field names, validation specifics). Absent for most errors; consumers must not assume any particular shape.","type":"object"},"message":{"type":"string"},"organization_id":{"description":"On `sso_required`: the SSO organization the caller must sign in with (its WorkOS id, `org_...`), the value `GET /api/auth/sso/start?organization=` takes: the organization that owns the account's email domain, else the workspace's. Absent when no sign-in would admit the caller (an account another organization holds, in an SSO organization's workspace), when unknown, and on every other code but `account_outside_organization`, where it is the workspace's organization, which no sign-in of the account joins.","type":"string"}},"required":["code","message"],"type":"object"},"ForbiddenError":{"description":"A 403 body: ErrorResponse, or AuthTypeNotAllowedError for a credential the route does not take.","oneOf":[{"$ref":"#/components/schemas/ErrorResponse"},{"$ref":"#/components/schemas/AuthTypeNotAllowedError"}]}},"securitySchemes":{"ApiKeyAuth":{"description":"API key authentication. Keys are prefixed with 'comfyui-' and can be\ngenerated from user account settings. Example: 'comfyui-abc123...'\n","in":"header","name":"X-API-Key","type":"apiKey"},"BearerAuth":{"bearerFormat":"JWT","description":"A token in the `Authorization: Bearer` header: a Firebase ID token, a\nCloud JWT from `POST /api/auth/token`, or an access token that\n`POST /oauth/token` minted for a resource served here. A `comfyui-` key sent\nhere counts as `ApiKeyAuth`.\n","scheme":"bearer","type":"http"},"WebSessionAuth":{"description":"Server-side web session, set by `POST /api/auth/session`. The media\nroutes, the short-link redirect, OAuth consent, the custom-node proxy\nand the admins' asynqmon UI accept it whatever `web_session_enabled`\nsays. The user-facing API groups accept it too, for users with the\nflag on; machine, admin API and service-token routes never do. A credential in a header always wins and never falls back to\nthe cookie.\n\nWherever the cookie is accepted, the request is checked before the\nhandler runs (403 with the `code` shown):\n- `cross_site_request`: the browser labels it `Sec-Fetch-Site:\n  cross-site`, other than a top-level GET navigation to the short-link\n  redirect or OAuth consent.\n- `origin_not_allowed`: an `Origin` that is not on the trusted-origins\n  list, unless the call is labelled same-origin; a POST, PUT, PATCH or\n  DELETE with no `Origin`; or, on API routes, a request without\n  `X-Comfy-Client`, which SDK clients send with their name and version.\n  The OAuth consent POST takes the session only from this host's own\n  origin, so a trusted `Origin` is refused there too.\n- `csrf_invalid`: a POST, PUT, PATCH or DELETE without the session's\n  CSRF token in `X-CSRF-Token`, except on OAuth consent, which checks\n  its own token, and the asynqmon UI, which cannot send one and is\n  not checked for it today.\n\nWith the flag on, `X-Comfy-Workspace-ID` (or `?workspace_id=` where a\nheader cannot go) selects the workspace; absent means the personal\nworkspace. A malformed or conflicting id is 400 `workspace_id_invalid`.\nAn unknown or deleted workspace, or one the user is not a member of, is\n403 `workspace_access_denied`. An account with no personal workspace\n(one SSO created) that is no longer a member of any live workspace,\nfor example after its directory removed its last membership, is 403\n`no_workspace_access` on every route that reads the session. All\nthree are answered on routes that also\nserve anonymous callers; there, the other refusals fall back to an\nanonymous request, except on the OAuth consent POST, which answers\n`origin_not_allowed` and `cross_site_request` too. Today the\nshort-link redirect and the OAuth consent GET, which a link may\nopen, do not select a workspace for the session.\n\nA token or API key whose workspace selector names another workspace\nthan the one it resolves to is 400 `workspace_id_invalid` on these\nroutes, while the flag is on for its user. A service token, which has\nno workspace, ignores the selector.\n","in":"cookie","name":"__Host-comfy_session","type":"apiKey"}}},"info":{"title":"Comfy Content Catalog","version":"1"},"openapi":"3.0.3","paths":{"/api/v1/catalog/agents":{"get":{"operationId":"GetCatalogAgentInstructions","responses":{"200":{"content":{"text/plain":{"schema":{"type":"string"}}},"description":"Editing instructions from this deployed catalog API build"},"503":{"description":"Catalog disabled or unavailable"}},"security":[],"summary":"Agent instructions for editing Comfy Content Catalog JSON","tags":["site-catalog"],"x-required-permissions":[]}},"/api/v1/catalog/authoring-context":{"get":{"description":"Read-only private staff verification for authoring clients. Returns the verified actor, canonical owner scope, independent edit/apply grants and current catalog tokens. Creates or refreshes no session, cookie, credential, content or approval. Does not return a legacy review projection. Every mutation must still reauthorize and check exact CAS. No query parameters.","operationId":"GetCCCAuthoringContext","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCAuthoringContext"}}},"description":"Current verified authoring context; private no-store"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unsupported query parameters; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Verify current staff authoring permissions and catalog state","tags":["site-catalog"],"x-permission-match":"any","x-required-permissions":["comfy_site.edit","comfy_site.apply"]}},"/api/v1/catalog/docs":{"get":{"description":"Read-only HTML rendered from the deployed catalog contract. No credential collection or execution console.","operationId":"GetCatalogDocs","responses":{"200":{"content":{"text/html":{"schema":{"type":"string"}}},"description":"Build-coupled catalog instructions, permissions and endpoint contracts"},"503":{"description":"Catalog disabled or unavailable"}},"security":[],"summary":"Readable catalog-only API documentation","tags":["site-catalog"],"x-required-permissions":[]}},"/api/v1/catalog/draft/batch":{"post":{"description":"One expected Draft and 1–100 flat documents. Omit uid for creates; existing items require uid and expected_revision_uid. Duplicate targets and per-item Draft overrides are rejected. Any failure rolls back every item, generation, audit and idempotency result. Media upload remains separate.","operationId":"BatchCCCItems","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"expected_draft_rev":{"format":"int64","minimum":1,"type":"integer"},"items":{"items":{"$ref":"#/components/schemas/CCCJSON"},"maxItems":100,"minItems":1,"type":"array"}},"required":["expected_draft_rev","items"],"type":"object","x-go-type":"CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CCCJSON"},"type":"array"}}},"description":"Flat immutable edits in request order; retry returns identical UIDs/tokens"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Structured validation failure with item field paths"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Existing target absent from owner-scoped Draft"},"409":{"description":"Stale Draft/edit token or idempotency mismatch"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Save bounded Content edits atomically","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/draft/discard-changes":{"post":{"description":"Requires comfy_site.edit, an explicit confirmed selection of at most 100 unique UID/exact-version pairs, reviewed Live/Draft/generation, full matching filter/count/digest and Idempotency-Key. Restores selected Live JSON and exact media reference metadata through new immutable Draft saves; never-published additions become retained tombstones. No hard deletion, blob deletion, publication, inherited approval or change to Live/projection/unselected saves. Remaining Draft dependencies and pins are validated in the same state-locked transaction; conflicts fail all changes with field errors. Effective cancellations/restores leave the pending queue. No query parameters. Request maximum256KiB. Private/no-store.","operationId":"DiscardCCCChanges","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}},{"in":"header","name":"Prefer","schema":{"enum":["return=minimal"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Updated complete unfiltered private staging snapshot and global unresolved_count"},"400":{"$ref":"#/components/responses/SessionWorkspaceIDInvalid"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"409":{"description":"Stale state/selection/exact version or idempotency mismatch; no partial discard"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid confirmed selection or remaining Draft dependency/pin conflict; no partial discard"},"503":{"description":"Catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Atomically discard selected Draft changes without deleting Live content","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/draft/final-review":{"get":{"description":"Read-only publisher review of the complete selective candidate. Deferred changes are listed separately and restored to Live values for structural/reference checks. Returns state and selection_digest binding every exact save and decision. Any unfinished review or invalid dependency rejects the candidate. Does not publish, certify external delivery or functional evidence, or start paid execution. No query parameters are supported. Change items carry saved_at, the RFC3339 UTC save time of their exact revision (display only, not in the digest).","operationId":"GetCCCFinalReview","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Private exact approved changes, deferred work, state and selection digest"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unsupported query parameters; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"422":{"description":"Unreviewed work, no approved changes, or invalid selective candidate"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Review the exact approved additions, modifications and deletions","tags":["site-catalog"],"x-required-permissions":["comfy_site.apply"]},"post":{"description":"Body contains exact review state and a nonempty unique selected_uids set bounded to 5000. Stored editorial decisions are ignored. Changes contains only checked pending saves; deferred contains all unchecked work. The digest binds the canonical checked set and exact selected versions at this state. Invalid selected dependencies reject the whole candidate. No authoring, approval, audit, retry or publication writes. Private/no-store. Change items carry saved_at, the RFC3339 UTC save time of their exact revision (display only, not in the digest).","operationId":"ReviewCCCCheckedPublication","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Exact checked changes and unchecked private work with state and selection digest"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unsupported query parameters; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"409":{"description":"Stale reviewed state or selected item no longer pending"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid explicit selection or candidate dependencies; bounded field_errors include the affected resource_uid when known"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Read-only review of an explicit checked publication candidate","tags":["site-catalog"],"x-required-permissions":["comfy_site.apply"]}},"/api/v1/catalog/draft/final-review/receipt":{"post":{"description":"Same strict review state and selected_uids input and complete candidate validation as POST final-review. Returns no documents, presentation or unchecked IDs. selected_versions_digest is lowercase SHA256 of compact JSON [\"ccc-checked-review-receipt-v1\",[live_rev,draft_rev,draft_generation],[[uid,revision_uid],...]] with canonical UUID pairs sorted by ASCII UID. Clients must compare state, count and this digest against their frozen checked snapshot before displaying confirmation. selection_digest binds the existing publish request; publication revalidates state and candidate. Read-only, private/no-store; no approval, audit, retry or publication writes. Maximum request256KiB; response below16KiB.","operationId":"ReviewCCCCheckedReceipt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCCheckedReviewReceipt"}}},"description":"Exact checked-version receipt after complete candidate validation"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unsupported query parameters; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"409":{"description":"Stale reviewed state or selected item no longer pending"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid explicit selection or candidate dependencies; bounded field_errors include affected resource_uid"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Validate checked publication and return a compact exact-version receipt","tags":["site-catalog"],"x-required-permissions":["comfy_site.apply"]}},"/api/v1/catalog/draft/items":{"post":{"description":"Flat typed document with expected_draft_rev, type and schema_version. Server assigns UID and fixed organization owner; author_uid is editable versioned account attribution, defaulting to the creator. CONTENT v2 adds a short title/description, long_description, FAQ, runs/downloads and workflow facts. Exact type schemas and field values are validated before saving; historical v1 remains readable. Media requires verified upload instead. Private; no implicit paid validation.","operationId":"CreateCCCItem","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Flat immutable Content edit with exact concurrency tokens"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Structured document or token validation errors"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"409":{"description":"Stale Draft/edit token or idempotency payload mismatch"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Create a Content identity and immutable Draft edit","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/draft/items/{uid}":{"delete":{"operationId":"DeleteCCCItem","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"expected_draft_rev":{"format":"int64","minimum":1,"type":"integer"},"expected_revision_uid":{"format":"uuid","type":"string"}},"required":["expected_draft_rev","expected_revision_uid"],"type":"object","x-go-type":"CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Flat retained Content with is_deleted=true and new exact edit token"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid tokens; generic Media mutation refused"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Resource absent from owner-scoped Draft"},"409":{"description":"Stale Draft/edit token or idempotency mismatch"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Append a Draft tombstone without erasing history","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]},"get":{"description":"Owner-scoped private read, including retained tombstones. Returns flat authored JSON plus read-only metadata and expected_draft_rev/expected_revision_uid from a single snapshot. The record catalog_rev may be older than Draft; use expected_draft_rev for saves. The response saves back unchanged, since PUT accepts this exact body, and its read-only metadata (uid, owner_uid, creator_uid, revision_uid, catalog_rev, edit_sequence, digest, saved_by_uid, draft_generation, saved_at, is_deleted false) is ignored, never applied; author_uid is the authored credited author. saved_at is this exact edit's save time (RFC3339 UTC). Reading does not invalidate approval or create history. No query parameters.","operationId":"GetCCCDraftItem","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Current complete authored JSON with exact working-save tokens and read-only metadata"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid UID or unsupported query parameters; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"404":{"description":"Resource missing or outside canonical owner scope"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Fetch current Draft JSON and exact save tokens without making a copy","tags":["site-catalog"],"x-permission-match":"any","x-required-permissions":["comfy_site.edit","comfy_site.apply"]},"put":{"description":"Complete authored JSON plus expected_draft_rev, expected_revision_uid, type and schema_version. The exact getCCCDraftItem body is a valid request (GET then PUT). Read-only metadata keys from that read are accepted and ignored, never applied; owner, creator, editor and identity stay server-assigned. is_deleted true is refused (use restore). Unknown authored fields are rejected.","operationId":"ReplaceCCCItem","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"New immutable edit; owner stays fixed, author attribution is versioned and saved_by_uid records the actual editor"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Structured document or token validation errors"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Resource not found in the selected Draft/owner scope"},"409":{"description":"Stale Draft/edit token or idempotency payload mismatch"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Append a complete flat JSON replacement to Draft","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/draft/items/{uid}/restore":{"post":{"description":"Source edit must belong to the same UID and organization. Append and revalidate a new immutable Draft save; never edit history or publish. Generic Media restore remains unavailable until verified media authoring is connected.","operationId":"RestoreCCCItemVersion","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"expected_draft_rev":{"format":"int64","minimum":1,"type":"integer"},"expected_revision_uid":{"format":"uuid","type":"string"},"source_revision_uid":{"format":"uuid","type":"string"}},"required":["expected_draft_rev","expected_revision_uid","source_revision_uid"],"type":"object","x-go-type":"CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"New immutable forward Draft save and exact concurrency tokens"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid tokens or unsupported historical schema"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Current or source edit not found in the target UID/owner scope"},"409":{"description":"Stale Draft/edit token or idempotency mismatch"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Restore an exact retained Content save into Draft","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/draft/media":{"post":{"description":"Staff edit permission required. Multipart with exactly one file or upload_token; server verifies SHA-256, MIME, size and dimensions. upload_token finalizes bytes sent through upload-url directly to private storage, up to the configured 300 MiB limit. Inline multipart bytes retain the 65 MiB HTTP envelope. New UID per intentional upload even for identical bytes; idempotent retry returns original result. Private storage required. Videos include verified duration and dimensions. No public URL or paid execution.","operationId":"UploadCCCMedia","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"additionalProperties":false,"oneOf":[{"required":["file"]},{"required":["upload_token"]}],"properties":{"change_id":{"description":"Optional case-sensitive editorial batch label; not identity or approval.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"expected_draft_rev":{"minimum":1,"type":"integer"},"file":{"format":"binary","type":"string"},"name":{"description":"Safe contextual filename/path; normally entity-slug/filename.","maxLength":500,"minLength":1,"type":"string"},"originating_entity_uid":{"format":"uuid","type":"string"},"role":{"maxLength":500,"minLength":1,"type":"string"},"upload_token":{"maxLength":8192,"minLength":1,"type":"string"}},"required":["expected_draft_rev","originating_entity_uid","role","name"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Private verified media metadata and exact Draft/edit tokens; bytes remain unreleased"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Malformed multipart request; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Origin is absent or outside owner scope"},"409":{"description":"Stale Draft or reused retry key with different input"},"413":{"description":"Request body exceeds bounded upload envelope"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid fields or unsupported/unsafe bytes"},"503":{"description":"Private storage or dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Upload verified bytes as an independent Draft media use","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/draft/media/{uid}":{"delete":{"operationId":"DeleteCCCMedia","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"New tombstone version and Draft generation; history bytes retained"},"400":{"$ref":"#/components/responses/SessionWorkspaceIDInvalid"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Logical media is absent or outside owner scope"},"409":{"description":"Stale Draft/edit token or retry mismatch"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid exact edit tokens or non-Media target"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Append a Draft Media tombstone without deleting bytes","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/draft/media/{uid}/file":{"put":{"description":"Multipart with exactly one file or upload_token from upload-url; independent uses and old Live bytes are unchanged. Safe name is explicit to keep retries deterministic. Server verifies staged bytes before finalization; no caller-supplied storage key, verified MIME or owner metadata accepted.","operationId":"ReplaceCCCMediaFile","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"additionalProperties":false,"oneOf":[{"required":["file"]},{"required":["upload_token"]}],"properties":{"change_id":{"description":"Optional case-sensitive editorial batch label; not identity or approval.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"expected_draft_rev":{"minimum":1,"type":"integer"},"expected_revision_uid":{"format":"uuid","type":"string"},"file":{"format":"binary","type":"string"},"name":{"maxLength":500,"minLength":1,"type":"string"},"upload_token":{"maxLength":8192,"minLength":1,"type":"string"}},"required":["expected_draft_rev","expected_revision_uid","name"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"New immutable Draft file-version metadata under the same media UID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Malformed multipart request; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Logical media is absent or outside owner scope"},"409":{"description":"Stale Draft/edit token or retry mismatch"},"413":{"description":"Request body exceeds bounded upload envelope"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid fields or unsupported/unsafe bytes"},"503":{"description":"Private storage or dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Replace one logical media use in Draft with verified bytes","tags":["site-catalog"],"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/draft/publish":{"post":{"description":"Requires catalog publish permission. Body contains review.expected_live_rev, review.expected_draft_rev, review.expected_draft_generation, expected_selection_digest from POST Final review, and selected_uids (nonempty unique set, at most 5000, matching that review). Publishes exactly the checked changes; unchecked changes are carried into the next Draft unchanged (same version IDs). Stored approvals are ignored. Invalid references roll back everything. Dormant unless the catalog is enabled; never active in production. No query parameters, no paid validation. Idempotency-Key retries do not publish twice. Private/no-store. An API key gets 403 FORBIDDEN; publishing needs a signed-in session.","operationId":"PublishCCCDraft","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"New Live, previous Live and fresh Draft state after atomic commit"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unsupported query parameters; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"409":{"description":"Stale reviewed state or decisions or conflicting retry; nothing published"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Invalid review, unfinished decisions or reference/dependency validation failed; nothing published. Bounded field_errors include the affected resource_uid when known."},"503":{"description":"Catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Publish the checked Draft changes and open the next Draft","tags":["site-catalog"],"x-required-permissions":["comfy_site.apply"]}},"/api/v1/catalog/draft/staging":{"get":{"description":"Without representation, returns the legacy complete matching review. representation=page returns at most limit sparse rows. Cursors bind the complete Live/Draft/generation snapshot, filters, sort, and limit; stale snapshots return 409. representation=selection requires a snapshot cursor and returns sparse exact-version pins for all matching rows (at most 5000), only for explicit select-all. representation=detail requires that cursor and a matching uid and returns one complete change. Staff-only constrained search/filter. Credited author at the selected version is not the latest editor. unresolved_count counts every pending Draft entry whose exact-save decision is neither APPROVED nor DEFERRED, independently of display filters, including undecided deletions. It binds the same repeatable snapshot as the returned generation. Bulk operations cover explicit selected versions across all pages. Each item's saved_at is the RFC3339 UTC save time of its exact change; it is not part of selection_digest.","operationId":"GetCCCStaging","parameters":[{"in":"query","name":"representation","schema":{"enum":["page","selection","detail"],"type":"string"}},{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"cursor","schema":{"maxLength":2048,"type":"string"}},{"in":"query","name":"sort","schema":{"default":"name","enum":["name","latest"],"type":"string"}},{"in":"query","name":"change","schema":{"enum":["new","updates"],"type":"string"}},{"in":"query","name":"uid","schema":{"format":"uuid","type":"string"}},{"in":"query","name":"search","schema":{"maxLength":300,"type":"string"}},{"in":"query","name":"author_uid","schema":{"minLength":1,"type":"string"}},{"in":"query","name":"change_id","schema":{"maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"}},{"explode":true,"in":"query","name":"tags","schema":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":30,"type":"array"},"style":"form"},{"explode":true,"in":"query","name":"types","schema":{"items":{"enum":["model","workflow","app","media","template_set"],"type":"string"},"maxItems":5,"type":"array"},"style":"form"},{"explode":true,"in":"query","name":"statuses","schema":{"items":{"enum":["NEW","APPROVED","DEFERRED","DELETED"],"type":"string"},"maxItems":4,"type":"array"},"style":"form"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Private review with exact Draft generation and optional sparse page metadata"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unknown, repeated scalar or invalid filter; bounded result exceeded; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"409":{"description":"The frozen page, selection or detail belongs to a stale Draft generation"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Read Draft changes for editorial staging","tags":["site-catalog"],"x-permission-match":"any","x-required-permissions":["comfy_site.edit","comfy_site.apply"]},"post":{"description":"Requires review with expected_live_rev, expected_draft_rev and expected_draft_generation, the exact returned filter and expected_selection_digest, status NEW/APPROVED/DEFERRED and expected_count of the complete frozen matching set. Optional selected_uids is a nonempty list of at most 5000 distinct UUIDs from that set; omitted means all matching records. The operation is atomic, never a loop of separately committed decisions. The digest binds the full filter and exact matching versions; the selected UIDs are bound to the idempotent mutation request. An unfiltered action affecting every matching record additionally requires confirm_all, including when all are checked explicitly. Approval applies only to the exact immutable saves; later edits become NEW. Deleted changes remain explicit and require approval. No publication, functional validation or paid execution. Maximum request body 256 KiB. An API key gets 403 FORBIDDEN; staging needs a signed-in session.","operationId":"StageCCCChanges","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":200,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Atomic matching-set decisions and updated private staging state"},"400":{"$ref":"#/components/responses/SessionWorkspaceIDInvalid"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"409":{"description":"Stale review, changed matching count or conflicting retry"},"422":{"description":"Invalid status/filter/tokens/count or missing unfiltered confirmation"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Approve or defer reviewed changes, optionally a checked subset","tags":["site-catalog"],"x-required-permissions":["comfy_site.apply"]}},"/api/v1/catalog/items":{"get":{"description":"Public bounded LIVE page (default 20, maximum 100). Filters run before keyset pagination. Unknown or repeated parameters and invalid cursors return 400; publication or revert invalidates prior cursors (409). Every request, including conditional GET, rechecks real UTC eligibility; browser caching requires revalidation and shared CDN caching is disabled. Never returns DRAFT, disabled, deleted, staff-only, or future content.","operationId":"ListContentCatalogItems","parameters":[{"description":"Optional exact public-authority token for a workflow_slug detail fill only. Collections and cursors with this header return 409. The token is checked before and after all presentation and file reads, including misses and conditional responses. Guarded responses are no-store; unavailable author or selected API-file reads return 503.","in":"header","name":"X-Comfy-Catalog-Authority","schema":{"type":"string"}},{"in":"query","name":"q","schema":{"maxLength":300,"type":"string"}},{"in":"query","name":"slug","schema":{"type":"string"}},{"in":"query","name":"kind","schema":{"enum":["MODEL","WORKFLOW","APP"],"type":"string"}},{"in":"query","name":"type","schema":{"enum":["model","workflow","app","template_set"],"type":"string"}},{"in":"query","name":"surface","schema":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"}},{"in":"query","name":"tag","schema":{"maxLength":200,"type":"string"}},{"in":"query","name":"use_case","schema":{"maxLength":200,"type":"string"}},{"in":"query","name":"sort","schema":{"default":"sort_order","enum":["sort_order","title"],"type":"string"}},{"in":"query","name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"cursor","schema":{"maxLength":4096,"type":"string"}},{"description":"Compatibility detail lookup, exclusive with all other query parameters. Select at most one eligible record by canonical path, UID or website detail slug, expanding the verified primary API file for that workflow only. A miss returns an empty page, never the collection. Collection reads never open API blobs. kind is a legacy alias for type and cannot be combined with type; slug accepts a canonical Hub pathname or native slug.","in":"query","name":"workflow_slug","schema":{"maxLength":300,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCPublicItemsPage"}}},"description":"Bounded LIVE page with continuation metadata"},"304":{"description":"Current eligible representation matches If-None-Match after fresh validation"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid, repeated, unsupported or conflicting query parameters or malformed cursor"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Cursor publication identity or public authority changed, or a guarded request was not a single detail lookup"},"503":{"description":"Catalog disabled or unavailable"}},"security":[],"summary":"Read eligible LIVE website content","tags":["site-catalog"],"x-required-permissions":[]}},"/api/v1/catalog/items/{uid}":{"get":{"operationId":"GetContentCatalogItem","parameters":[{"description":"Optional exact public-authority token checked before and after complete detail presentation, including a not-found result. Malformed or superseded tokens return 409; unavailable author or selected API-file reads return 503. Responses are no-store and grant no private access.","in":"header","name":"X-Comfy-Catalog-Authority","schema":{"type":"string"}},{"in":"path","name":"uid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentCatalogRecord"}}},"description":"Website content record"},"404":{"description":"Not found or not publicly eligible"},"409":{"description":"Public authority changed; select the current version before filling"},"503":{"description":"Catalog disabled or unavailable"}},"security":[],"summary":"Read an eligible LIVE record by UID","tags":["site-catalog"],"x-required-permissions":[]}},"/api/v1/catalog/items/{uid}/history":{"get":{"description":"Keyset pagination by descending per-resource edit_sequence, including intermediate and archived saves. This is not the public workflow-file version list. No total count or arbitrary query fields. Private no-store.","operationId":"GetCCCItemHistory","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"query","name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"cursor","schema":{"maxLength":256,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Flat immutable items with catalog_status and saved_at, has_more and optional opaque next_cursor; no total"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid limit, cursor or unsupported query parameter; or `code` `workspace_id_invalid` (see SessionWorkspaceIDInvalid)."},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"404":{"description":"Resource outside organization scope or absent"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Read bounded staff-only immutable save history","tags":["site-catalog"],"x-permission-match":"any","x-required-permissions":["comfy_site.edit","comfy_site.apply"]}},"/api/v1/catalog/media/{uid}/{version}":{"get":{"operationId":"GetCCCPublicMediaBytes","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"path","name":"version","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"Exact current LIVE bytes; authority checked before byte access; no-store"},"206":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"Requested byte range (Range header) of the same LIVE bytes, after the same checks"},"404":{"description":"Missing or unverifiable authority, unpublished/scheduled/private, or query alias"},"416":{"description":"Requested range is outside the file"}},"security":[],"summary":"Stream currently eligible LIVE bytes after authority lookup","tags":["site-catalog","runtime-only"],"x-required-permissions":[]},"head":{"operationId":"HeadCCCPublicMediaBytes","parameters":[{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"path","name":"version","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Headers of the current LIVE bytes; no-store; no body"},"404":{"description":"Missing or unverifiable authority, unpublished/scheduled/private, or query alias; no body"}},"security":[],"summary":"Report public byte headers after the same checks as GET, without a body","tags":["site-catalog","runtime-only"],"x-required-permissions":[]}},"/api/v1/catalog/openapi.json":{"get":{"description":"Public discovery grants no editing authority and does not replace the Cloud API specification.","operationId":"GetCatalogOpenAPI","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Catalog OpenAPI with contract fingerprint and environment"},"503":{"description":"Catalog disabled or unavailable"}},"security":[],"summary":"Catalog-only deployed OpenAPI contract","tags":["site-catalog"],"x-required-permissions":[]}},"/api/v1/catalog/preview-media/{rev}/{uid}/{version}":{"get":{"operationId":"GetCCCPreviewMediaBytes","parameters":[{"in":"path","name":"rev","required":true,"schema":{"minimum":1,"type":"integer"}},{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"path","name":"version","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"Verified selected bytes; private no-store; no origin redirect"},"206":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"Requested byte range (Range header) of the same bytes, after the same checks"},"400":{"$ref":"#/components/responses/SessionWorkspaceIDInvalid"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"404":{"description":"Unauthorized, unavailable, unselected, or query alias"},"416":{"description":"Requested range is outside the file"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Stream privately selected bytes after fresh staff authorization","tags":["site-catalog","runtime-only"],"x-permission-match":"any","x-required-permissions":["comfy_site.edit","comfy_site.apply"]},"head":{"operationId":"HeadCCCPreviewMediaBytes","parameters":[{"in":"path","name":"rev","required":true,"schema":{"minimum":1,"type":"integer"}},{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}},{"in":"path","name":"version","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"description":"Headers of the selected bytes; private no-store; no body"},"400":{"description":"Session workspace selector refused (workspace_id_invalid); no body on HEAD"},"401":{"description":"No valid credential (see SessionUnauthorized); no body on HEAD"},"403":{"description":"Refused (see SessionForbidden); no body on HEAD"},"404":{"description":"Unauthorized, unavailable, unselected, or query alias; no body"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Report private byte headers after the same checks as GET, without a body","tags":["site-catalog","runtime-only"],"x-permission-match":"any","x-required-permissions":["comfy_site.edit","comfy_site.apply"]}},"/api/v1/catalog/profiles":{"get":{"description":"Current verified admin only. Searches public display name or username and exact canonical account ID. Returns at most 20 active accounts' personal profiles; never email or private account fields. No arbitrary filters or total count. Private no-store with a 750ms directory deadline.","operationId":"SearchCCCAccountProfiles","parameters":[{"description":"Name or username text or exact account ID; no email addresses or control characters.","in":"query","name":"q","required":true,"schema":{"maxLength":100,"minLength":2,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCProfileChoices"}}},"description":"Bounded public profile choices keyed by canonical account ID"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Missing or repeated q or undeclared query or unsupported search text"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"503":{"description":"Catalog or Cloud profile directory unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Search existing public profile names for the author picker","tags":["site-catalog","runtime-only"],"x-internal":true,"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/profiles/{account_id}":{"delete":{"description":"Admin-only; exact expected_version required. Refuses any profile referenced by retained published workflow versions. Never deletes accounts, workspaces, workflow history, catalog content/media or files. Private no-store.","operationId":"DeleteCCCAccountProfile","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"expected_version":{"pattern":"^[a-f0-9]{64}$","type":"string"}},"required":["expected_version"],"type":"object"}}},"required":true},"responses":{"204":{"description":"Unreferenced profile deleted; account and all catalog data retained"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Malformed JSON, unknown fields, query parameters or missing version"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Existing account, personal workspace or profile not found"},"409":{"description":"Stale profile version or retained workflow reference; nothing deleted"},"413":{"description":"Request exceeds 64 KiB transport limit"},"415":{"description":"application/json required"},"422":{"description":"Invalid account ID or version"},"503":{"description":"Catalog or Cloud profile directory unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Delete an unreferenced Hub profile without deleting its account","tags":["site-catalog","runtime-only"],"x-internal":true,"x-required-permissions":["comfy_site.edit"]},"get":{"description":"Requires a current verified Comfy admin. Uses the account's personal workspace and existing indexed Cloud Hub profile. Returns only public display metadata; no email or private account settings. Private no-store; no query parameters.","operationId":"GetCCCAccountProfile","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCAccountProfile"}}},"description":"Existing profile metadata and exact edit version"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unsupported query parameters"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"404":{"description":"Account, personal workspace or Hub profile does not exist"},"422":{"description":"Invalid canonical account ID"},"503":{"description":"Catalog or Cloud profile directory unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Look up an existing Cloud Hub profile by canonical account ID","tags":["site-catalog","runtime-only"],"x-internal":true,"x-required-permissions":["comfy_site.edit"]},"parameters":[{"description":"Exact canonical Comfy account ID (users.id), not a Hub profile UUID, workspace ID, username or email. Preserve case.","in":"path","name":"account_id","required":true,"schema":{"minLength":1,"type":"string"}}],"post":{"description":"Admin-only create; never creates an account or changes content attribution. Uses existing Cloud Hub storage, so an activated write is also visible to the old Hub. expected_version must be omitted or empty. Username is immutable after creation. HTTPS display URLs are not fetched or granted media access. Private no-store.","operationId":"CreateCCCAccountProfile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCProfileEdit"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCAccountProfile"}}},"description":"Profile created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Malformed JSON, unknown fields, query parameters or nonempty create version"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Existing account or personal workspace not found; no identity is created"},"409":{"description":"Profile already exists or username is taken"},"413":{"description":"Request exceeds 64 KiB transport limit"},"415":{"description":"application/json required"},"422":{"description":"Invalid canonical account ID or profile field values"},"503":{"description":"Catalog or Cloud profile directory unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Create a Hub profile for an existing canonical account","tags":["site-catalog","runtime-only"],"x-internal":true,"x-required-permissions":["comfy_site.edit"]},"put":{"description":"Admin-only full replacement of profile fields. Supply the exact version from GET in expected_version; stale edits fail, never overwrite. Username cannot change. An activated write affects the existing Cloud Hub profile, not catalog revision history or content attribution. Private no-store.","operationId":"ReplaceCCCAccountProfile","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/CCCProfileEdit"}],"required":["expected_version"]}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCAccountProfile"}}},"description":"Updated profile and new exact version"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Malformed JSON, unknown fields, query parameters or missing version"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionWriteForbidden"},"404":{"description":"Existing account, personal workspace or profile not found"},"409":{"description":"Profile changed since the supplied version or a storage constraint conflicts"},"413":{"description":"Request exceeds 64 KiB transport limit"},"415":{"description":"application/json required"},"422":{"description":"Invalid profile values or attempted username change"},"503":{"description":"Catalog or Cloud profile directory unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Replace existing Hub profile display metadata with version checking","tags":["site-catalog","runtime-only"],"x-internal":true,"x-required-permissions":["comfy_site.edit"]}},"/api/v1/catalog/revisions/{rev}/items/{uid}":{"get":{"description":"Resolve heads before filtering. Explicit archived candidate review never makes it eligible in Live. Private no-store.","operationId":"GetCCCRevisionItem","parameters":[{"in":"path","name":"rev","required":true,"schema":{"format":"int64","minimum":1,"type":"integer"}},{"in":"path","name":"uid","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Flat Content and exact edit/revision context"},"400":{"$ref":"#/components/responses/SessionWorkspaceIDInvalid"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"404":{"description":"Resource/revision not found in organization scope"},"503":{"description":"Dedicated catalog unavailable"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Read an exact retained staff Content view","tags":["site-catalog"],"x-permission-match":"any","x-required-permissions":["comfy_site.edit","comfy_site.apply"]}},"/api/v1/catalog/schemas/{type}/{schema_version}":{"get":{"description":"Author new Content as schema_version 2; v1 stays readable but skips input, binding and translation checks. Media is server-created (uploads are media/1, recorded Cloud-asset references media/2); generic JSON authoring cannot create or replace Media, and upload/finalization routes are separate. Media references use src \"media\" (\"r2\" is a legacy alias) and file_version_uid = the upload's revision_uid. static_thumb is recommended and must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px per side; reviewed policy requires it at publish but the current runtime does not enforce that yet. Direct uploads support up to 300 MiB, subject to CATALOG_MAX_DIRECT_UPLOAD_BYTES; images remain capped at 50 MiB, JSON at 64 MiB and API workflow JSON at 1 MiB.","operationId":"GetCCCTypeSchema","parameters":[{"in":"path","name":"type","required":true,"schema":{"enum":["model","workflow","app","template_set","media"],"type":"string"}},{"in":"path","name":"schema_version","required":true,"schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Build-coupled OpenAPI 3.0 schema object, type, version and API environment"},"404":{"description":"Unsupported type or schema version"},"503":{"description":"Catalog disabled or unavailable"}},"security":[],"summary":"Type schema used by this deployed authoring validator","tags":["site-catalog"],"x-required-permissions":[]}},"/api/v1/catalog/state":{"get":{"operationId":"GetCCCState","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CCCJSON"}}},"description":"Private state; never cacheable"},"400":{"$ref":"#/components/responses/SessionWorkspaceIDInvalid"},"401":{"$ref":"#/components/responses/SessionUnauthorized"},"403":{"$ref":"#/components/responses/SessionForbidden"},"503":{"description":"Dedicated catalog unavailable; no legacy fallback"}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]},{"WebSessionAuth":[]}],"summary":"Read dedicated CCC Live and Draft state","tags":["site-catalog"],"x-permission-match":"any","x-required-permissions":["comfy_site.edit","comfy_site.apply"]}}},"servers":[{"url":"/"}],"x-ccc-contract-version":"ccc-v1-d3b0b7a25fbdb7d24162","x-ccc-credential-mode":"verified-account-admin","x-ccc-environment":"prod","x-ccc-type-schemas":{"app/v1":{"additionalProperties":false,"properties":{"author_uid":{"description":"Existing canonical Comfy account ID (users.id), not a display name or a new catalog UUID.","minLength":1,"type":"string"},"available_surfaces":{"items":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"compatibility":{"type":"object"},"configuration":{"type":"object"},"description":{"maxLength":20000,"type":"string"},"documentation_url":{"description":"Optional absolute HTTPS documentation link without embedded credentials; omit if absent.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"downloads":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"enabled":{"type":"boolean"},"examples":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"media":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":300,"type":"string"},"presentation":{"type":"object"},"reference_media":{"items":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"maxItems":20,"type":"array"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for this example. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"title":{"maxLength":300,"type":"string"},"values":{"type":"object"}},"type":"object"},"maxItems":100,"type":"array"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"generation_type":{"enum":["generate-images","edit-images","generate-videos","animate-images","edit-videos","text","3d","audio"],"type":"string"},"hero":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"hero_poster":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"implementation_ref":{"maxLength":500,"minLength":1,"type":"string"},"inputBindings":{"type":"object"},"inputSchema":{"type":"object"},"inputs":{"type":"object"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"description":"Authored search-engine snippet, separate from the card summary; preserve existing localized copy on import.","maxLength":20000,"type":"string"},"related_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"runs":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"slug":{"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"sort_order":{"maximum":9999999999,"minimum":-9999999999,"nullable":true,"type":"number"},"source":{"maxLength":200,"type":"string"},"source_locale":{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$","type":"string"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for Hub cards and publish rows; never the original video. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"thumbnail":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_comparison":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"title":{"maxLength":300,"minLength":1,"type":"string"},"translations":{"type":"object"},"use_cases":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"visibility":{"enum":["public","staff"],"type":"string"},"visible_from":{"format":"date-time","nullable":true,"type":"string"},"workflow_uid":{"format":"uuid","type":"string"}},"required":["title","slug","enabled","visibility","available_surfaces"],"type":"object"},"app/v2":{"additionalProperties":false,"properties":{"author_uid":{"description":"Existing canonical Comfy account ID (users.id), not a display name or a new catalog UUID.","minLength":1,"type":"string"},"available_surfaces":{"items":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"compatibility":{"additionalProperties":true,"description":"Website/Cloud compatibility data. Not execution proof and starts no paid run.","properties":{"import":{"type":"object"},"website":{"additionalProperties":true,"description":"Website presentation read by the Hub. Unlisted keys are preserved for imported pages.","properties":{"execution":{"additionalProperties":true,"description":"Router run contract. A model shows a Run form only when this exists (and the website enables Router runs). inputSchema/inputs come from the record itself.","properties":{"advancedFields":{"items":{"type":"string"},"type":"array"},"creator":{"type":"object"},"creatorVariants":{"type":"object"},"defaultInput":{"type":"object"},"id":{"description":"Router provider/model id, normally router_model_id.","pattern":"^[\\w.-]+/[\\w.-]+$","type":"string"},"media":{"items":{"type":"object"},"type":"array"},"output":{"additionalProperties":true,"properties":{"format":{"enum":["auto","json","binary"],"type":"string"}},"required":["format"],"type":"object"},"rehostUrlInputs":{"type":"boolean"},"sourceCommit":{"description":"Exact 40-hex source commit of the Router contract this was derived from. Never invent one.","pattern":"^[a-f0-9]{40}$","type":"string"}},"required":["id","sourceCommit","output"],"type":"object"},"slug":{"description":"Legacy detail-URL alias.","maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"type":{"description":"Legacy page kind; RUNNABLE is legacy. Prefer runnable on workflows.","enum":["CLOUD","APP","RUNNABLE"],"type":"string"},"workflow":{"additionalProperties":true,"description":"Website run presentation for a workflow. The Run panel reads results ONLY from outputs here, not from top-level outputs.","properties":{"cloud":{"description":"Legacy inline graph. Ignored when workflow_versions exists; do not author it.","type":"object"},"definitionVersion":{"description":"Legacy website definition version.","maxLength":500,"minLength":1,"type":"string"},"id":{"description":"Legacy website workflow id.","maxLength":500,"minLength":1,"type":"string"},"outputs":{"items":{"additionalProperties":false,"properties":{"id":{"description":"Stable output id.","maxLength":500,"minLength":1,"type":"string"},"key":{"description":"Output key on that node, for example \"images\" (also used for video frames) or \"gifs\".","maxLength":500,"minLength":1,"type":"string"},"kind":{"enum":["image","video","audio"],"type":"string"},"nodeId":{"description":"API graph output node id.","maxLength":500,"minLength":1,"type":"string"}},"required":["id","nodeId","key","kind"],"type":"object"},"maxItems":100,"minItems":1,"type":"array"},"template":{"type":"object"}},"type":"object"}},"type":"object"}},"type":"object"},"configuration":{"type":"object"},"description":{"maxLength":160,"type":"string"},"documentation_url":{"description":"Optional absolute HTTPS documentation link without embedded credentials; omit if absent.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"downloads":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"enabled":{"type":"boolean"},"examples":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"media":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":300,"type":"string"},"presentation":{"type":"object"},"reference_media":{"items":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"maxItems":20,"type":"array"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for this example. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"title":{"maxLength":300,"type":"string"},"values":{"type":"object"}},"type":"object"},"maxItems":100,"type":"array"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"generation_type":{"enum":["generate-images","edit-images","generate-videos","animate-images","edit-videos","text","3d","audio"],"type":"string"},"hero":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"hero_poster":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"implementation_ref":{"description":"Website app the page opens. Only these ids render; any other value would break the app list.","enum":["studio","reshoot","openjutsu"],"type":"string"},"inputBindings":{"additionalProperties":{"additionalProperties":false,"anyOf":[{"not":{"required":["mediaKind"]},"properties":{"encoding":{"enum":["scalar"]}}},{"properties":{"encoding":{"enum":["cloud-asset"]}},"required":["mediaKind"]}],"description":"Writes one declared parameter into the API graph. scalar copies the value; cloud-asset uploads a media value (the parameter must be a string) and requires mediaKind. Keys must be declared inputSchema properties, and two parameters must not write the same {nodeId,inputName} target. Targets must exist in workflow_versions[0].api; the server checks shape only.","properties":{"encoding":{"enum":["scalar","cloud-asset"],"type":"string"},"mediaKind":{"description":"Only with encoding cloud-asset (required there).","enum":["image","video","audio"],"type":"string"},"targets":{"items":{"additionalProperties":false,"properties":{"inputName":{"minLength":1,"pattern":"\\S","type":"string"},"nodeId":{"minLength":1,"pattern":"\\S","type":"string"}},"required":["nodeId","inputName"],"type":"object"},"maxItems":100,"minItems":1,"type":"array","uniqueItems":true}},"required":["encoding","targets"],"type":"object"},"description":"Parameter name to graph binding for runnable workflows. Router models need none.","maxProperties":200,"type":"object"},"inputSchema":{"additionalProperties":true,"description":"JSON Schema (Draft 7) for the page's parameters. type must be object with at most 200 properties; required may list only declared names. Only acyclic root-local $ref pointers (#/...) are allowed; remote, dynamic or recursive references and nested $id are rejected, and the schema must stay within a 20,000-node work budget. Formats byte (base64), uint32 and http-image-url are checked. OpenAPI nullable and boolean exclusiveMinimum/exclusiveMaximum are normalized. Each default must satisfy its property and minimum must not exceed maximum. The website playground also expects required to be present and additionalProperties false.","properties":{"properties":{"additionalProperties":{"type":"object"},"maxProperties":200,"type":"object"},"required":{"items":{"type":"string"},"type":"array"},"type":{"enum":["object"],"type":"string"}},"required":["type","properties"],"type":"object"},"inputs":{"additionalProperties":{"additionalProperties":false,"properties":{"advanced":{"type":"boolean"},"control":{"enum":["text-box","text-area","dialogue","dropdown","slider","number","toggle","media"],"type":"string"},"defaultSource":{"enum":["router","curated"],"type":"string"},"formConstraint":{"additionalProperties":false,"properties":{"error":{"enum":["required","incompatible"],"type":"string"},"schema":{"type":"object"}},"required":["schema","error"],"type":"object"},"help":{"maxLength":140,"type":"string"},"hidden":{"type":"boolean"},"imageAspectRatio":{"additionalProperties":false,"properties":{"maximum":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"minimum":{"exclusiveMinimum":true,"minimum":0,"type":"number"}},"required":["minimum","maximum"],"type":"object"},"imageSource":{"enum":["url"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"},"maxUploadBytes":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"maxVideoDurationSeconds":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"optionLabels":{"additionalProperties":{"maxLength":200,"minLength":1,"type":"string"},"maxProperties":200,"type":"object"},"randomize":{"enum":[true],"type":"boolean"},"unit":{"enum":["seconds","pixels","fps"],"type":"string"},"urlUpload":{"enum":["image","video","audio","image-or-video","file"],"type":"string"},"videoWidthPixels":{"additionalProperties":false,"properties":{"maximum":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"minimum":{"exclusiveMinimum":true,"minimum":0,"type":"number"}},"required":["minimum","maximum"],"type":"object"}},"required":["label","control"],"type":"object"},"maxProperties":200,"type":"object"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"description":"Authored search-engine snippet, separate from the card summary; preserve existing localized copy on import.","maxLength":20000,"type":"string"},"related_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"runs":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"slug":{"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"sort_order":{"maximum":9999999999,"minimum":-9999999999,"nullable":true,"type":"number"},"source":{"maxLength":200,"type":"string"},"source_locale":{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$","type":"string"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for Hub cards and publish rows; never the original video. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"thumbnail":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_comparison":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"title":{"maxLength":80,"minLength":1,"type":"string"},"translations":{"additionalProperties":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"how_to_use":{"items":{"maxLength":20000,"minLength":1,"type":"string"},"maxItems":100,"type":"array"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"maxLength":20000,"type":"string"},"review_state":{"enum":["machine","reviewed"],"type":"string"},"source_digest":{"pattern":"^[a-f0-9]{64}$","type":"string"},"suggested_use_cases":{"items":{"oneOf":[{"maxLength":20000,"minLength":1,"type":"string"},{"additionalProperties":false,"properties":{"subtitle":{"maxLength":20000,"type":"string"},"title":{"maxLength":300,"minLength":1,"type":"string"}},"required":["title","subtitle"],"type":"object"}]},"maxItems":100,"type":"array"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"template_category_title":{"description":"Localized template_category.title, not this resource's title.","maxLength":300,"type":"string"},"title":{"maxLength":300,"type":"string"}},"type":"object"},"description":"Locale-keyed authored display overrides (for example ja or zh-CN), never translated IDs or control/permission fields. Historical imported prose may exceed the new source short-summary limit; preserve it without truncation. Only reviewed translations are public-eligible; missing or machine text falls back to source outside authenticated Preview.","maxProperties":64,"type":"object"},"use_cases":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"visibility":{"enum":["public","staff"],"type":"string"},"visible_from":{"format":"date-time","nullable":true,"type":"string"},"workflow_uid":{"format":"uuid","type":"string"}},"required":["title","slug","enabled","visibility","available_surfaces"],"type":"object"},"media/v1":{"additionalProperties":false,"properties":{"byte_size":{"maximum":314572800,"minimum":1,"type":"integer"},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"content_hash":{"pattern":"^[a-f0-9]{64}$","type":"string"},"duration_seconds":{"maximum":86400,"minimum":0,"type":"number"},"hash_algorithm":{"enum":["sha256"],"type":"string"},"height":{"maximum":16384,"minimum":1,"type":"integer"},"legacy_public_url":{"maxLength":2000,"type":"string"},"mime_type":{"enum":["application/json","image/png","image/jpeg","image/webp","video/mp4","video/quicktime","video/webm","audio/mpeg"],"type":"string"},"name":{"maxLength":500,"minLength":1,"type":"string"},"original_filename":{"maxLength":500,"minLength":1,"type":"string"},"storage_key":{"pattern":"^ccc/blobs/sha256/[a-f0-9]{64}$","type":"string"},"width":{"maximum":16384,"minimum":1,"type":"integer"}},"readOnly":true,"required":["name","hash_algorithm","content_hash","storage_key","mime_type","byte_size","original_filename"],"type":"object"},"model/v1":{"additionalProperties":false,"properties":{"author_uid":{"description":"Existing canonical Comfy account ID (users.id), not a display name or a new catalog UUID.","minLength":1,"type":"string"},"available_surfaces":{"items":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"compatibility":{"type":"object"},"description":{"maxLength":20000,"type":"string"},"documentation_url":{"description":"Optional absolute HTTPS documentation link without embedded credentials; omit if absent.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"downloads":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"enabled":{"type":"boolean"},"examples":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"media":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":300,"type":"string"},"presentation":{"type":"object"},"reference_media":{"items":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"maxItems":20,"type":"array"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for this example. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"title":{"maxLength":300,"type":"string"},"values":{"type":"object"}},"type":"object"},"maxItems":100,"type":"array"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"hero":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"hero_poster":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"inputBindings":{"type":"object"},"inputSchema":{"type":"object"},"inputs":{"type":"object"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"description":"Authored search-engine snippet, separate from the card summary; preserve existing localized copy on import.","maxLength":20000,"type":"string"},"provider":{"maxLength":200,"type":"string"},"related_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"router_model_id":{"maxLength":300,"minLength":1,"type":"string"},"runs":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"slug":{"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"sort_order":{"maximum":9999999999,"minimum":-9999999999,"nullable":true,"type":"number"},"source":{"maxLength":200,"type":"string"},"source_locale":{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$","type":"string"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for Hub cards and publish rows; never the original video. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"task":{"maxLength":200,"type":"string"},"thumbnail":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_comparison":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"title":{"maxLength":300,"minLength":1,"type":"string"},"translations":{"type":"object"},"use_cases":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"visibility":{"enum":["public","staff"],"type":"string"},"visible_from":{"format":"date-time","nullable":true,"type":"string"}},"required":["title","slug","enabled","visibility","available_surfaces"],"type":"object"},"model/v2":{"additionalProperties":false,"properties":{"author_uid":{"description":"Existing canonical Comfy account ID (users.id), not a display name or a new catalog UUID.","minLength":1,"type":"string"},"available_surfaces":{"items":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"compatibility":{"additionalProperties":true,"description":"Website/Cloud compatibility data. Not execution proof and starts no paid run.","properties":{"import":{"type":"object"},"website":{"additionalProperties":true,"description":"Website presentation read by the Hub. Unlisted keys are preserved for imported pages.","properties":{"execution":{"additionalProperties":true,"description":"Router run contract. A model shows a Run form only when this exists (and the website enables Router runs). inputSchema/inputs come from the record itself.","properties":{"advancedFields":{"items":{"type":"string"},"type":"array"},"creator":{"type":"object"},"creatorVariants":{"type":"object"},"defaultInput":{"type":"object"},"id":{"description":"Router provider/model id, normally router_model_id.","pattern":"^[\\w.-]+/[\\w.-]+$","type":"string"},"media":{"items":{"type":"object"},"type":"array"},"output":{"additionalProperties":true,"properties":{"format":{"enum":["auto","json","binary"],"type":"string"}},"required":["format"],"type":"object"},"rehostUrlInputs":{"type":"boolean"},"sourceCommit":{"description":"Exact 40-hex source commit of the Router contract this was derived from. Never invent one.","pattern":"^[a-f0-9]{40}$","type":"string"}},"required":["id","sourceCommit","output"],"type":"object"},"slug":{"description":"Legacy detail-URL alias.","maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"type":{"description":"Legacy page kind; RUNNABLE is legacy. Prefer runnable on workflows.","enum":["CLOUD","APP","RUNNABLE"],"type":"string"},"workflow":{"additionalProperties":true,"description":"Website run presentation for a workflow. The Run panel reads results ONLY from outputs here, not from top-level outputs.","properties":{"cloud":{"description":"Legacy inline graph. Ignored when workflow_versions exists; do not author it.","type":"object"},"definitionVersion":{"description":"Legacy website definition version.","maxLength":500,"minLength":1,"type":"string"},"id":{"description":"Legacy website workflow id.","maxLength":500,"minLength":1,"type":"string"},"outputs":{"items":{"additionalProperties":false,"properties":{"id":{"description":"Stable output id.","maxLength":500,"minLength":1,"type":"string"},"key":{"description":"Output key on that node, for example \"images\" (also used for video frames) or \"gifs\".","maxLength":500,"minLength":1,"type":"string"},"kind":{"enum":["image","video","audio"],"type":"string"},"nodeId":{"description":"API graph output node id.","maxLength":500,"minLength":1,"type":"string"}},"required":["id","nodeId","key","kind"],"type":"object"},"maxItems":100,"minItems":1,"type":"array"},"template":{"type":"object"}},"type":"object"}},"type":"object"}},"type":"object"},"description":{"maxLength":160,"type":"string"},"documentation_url":{"description":"Optional absolute HTTPS documentation link without embedded credentials; omit if absent.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"downloads":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"enabled":{"type":"boolean"},"examples":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"media":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":300,"type":"string"},"presentation":{"type":"object"},"reference_media":{"items":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"maxItems":20,"type":"array"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for this example. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"title":{"maxLength":300,"type":"string"},"values":{"type":"object"}},"type":"object"},"maxItems":100,"type":"array"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"hero":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"hero_poster":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"inputBindings":{"additionalProperties":{"additionalProperties":false,"anyOf":[{"not":{"required":["mediaKind"]},"properties":{"encoding":{"enum":["scalar"]}}},{"properties":{"encoding":{"enum":["cloud-asset"]}},"required":["mediaKind"]}],"description":"Writes one declared parameter into the API graph. scalar copies the value; cloud-asset uploads a media value (the parameter must be a string) and requires mediaKind. Keys must be declared inputSchema properties, and two parameters must not write the same {nodeId,inputName} target. Targets must exist in workflow_versions[0].api; the server checks shape only.","properties":{"encoding":{"enum":["scalar","cloud-asset"],"type":"string"},"mediaKind":{"description":"Only with encoding cloud-asset (required there).","enum":["image","video","audio"],"type":"string"},"targets":{"items":{"additionalProperties":false,"properties":{"inputName":{"minLength":1,"pattern":"\\S","type":"string"},"nodeId":{"minLength":1,"pattern":"\\S","type":"string"}},"required":["nodeId","inputName"],"type":"object"},"maxItems":100,"minItems":1,"type":"array","uniqueItems":true}},"required":["encoding","targets"],"type":"object"},"description":"Parameter name to graph binding for runnable workflows. Router models need none.","maxProperties":200,"type":"object"},"inputSchema":{"additionalProperties":true,"description":"JSON Schema (Draft 7) for the page's parameters. type must be object with at most 200 properties; required may list only declared names. Only acyclic root-local $ref pointers (#/...) are allowed; remote, dynamic or recursive references and nested $id are rejected, and the schema must stay within a 20,000-node work budget. Formats byte (base64), uint32 and http-image-url are checked. OpenAPI nullable and boolean exclusiveMinimum/exclusiveMaximum are normalized. Each default must satisfy its property and minimum must not exceed maximum. The website playground also expects required to be present and additionalProperties false.","properties":{"properties":{"additionalProperties":{"type":"object"},"maxProperties":200,"type":"object"},"required":{"items":{"type":"string"},"type":"array"},"type":{"enum":["object"],"type":"string"}},"required":["type","properties"],"type":"object"},"inputs":{"additionalProperties":{"additionalProperties":false,"properties":{"advanced":{"type":"boolean"},"control":{"enum":["text-box","text-area","dialogue","dropdown","slider","number","toggle","media"],"type":"string"},"defaultSource":{"enum":["router","curated"],"type":"string"},"formConstraint":{"additionalProperties":false,"properties":{"error":{"enum":["required","incompatible"],"type":"string"},"schema":{"type":"object"}},"required":["schema","error"],"type":"object"},"help":{"maxLength":140,"type":"string"},"hidden":{"type":"boolean"},"imageAspectRatio":{"additionalProperties":false,"properties":{"maximum":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"minimum":{"exclusiveMinimum":true,"minimum":0,"type":"number"}},"required":["minimum","maximum"],"type":"object"},"imageSource":{"enum":["url"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"},"maxUploadBytes":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"maxVideoDurationSeconds":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"optionLabels":{"additionalProperties":{"maxLength":200,"minLength":1,"type":"string"},"maxProperties":200,"type":"object"},"randomize":{"enum":[true],"type":"boolean"},"unit":{"enum":["seconds","pixels","fps"],"type":"string"},"urlUpload":{"enum":["image","video","audio","image-or-video","file"],"type":"string"},"videoWidthPixels":{"additionalProperties":false,"properties":{"maximum":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"minimum":{"exclusiveMinimum":true,"minimum":0,"type":"number"}},"required":["minimum","maximum"],"type":"object"}},"required":["label","control"],"type":"object"},"maxProperties":200,"type":"object"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"description":"Authored search-engine snippet, separate from the card summary; preserve existing localized copy on import.","maxLength":20000,"type":"string"},"provider":{"maxLength":200,"type":"string"},"related_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"router_model_id":{"maxLength":300,"minLength":1,"type":"string"},"runs":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"slug":{"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"sort_order":{"maximum":9999999999,"minimum":-9999999999,"nullable":true,"type":"number"},"source":{"maxLength":200,"type":"string"},"source_locale":{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$","type":"string"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for Hub cards and publish rows; never the original video. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"task":{"maxLength":200,"type":"string"},"thumbnail":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_comparison":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"title":{"maxLength":80,"minLength":1,"type":"string"},"translations":{"additionalProperties":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"how_to_use":{"items":{"maxLength":20000,"minLength":1,"type":"string"},"maxItems":100,"type":"array"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"maxLength":20000,"type":"string"},"review_state":{"enum":["machine","reviewed"],"type":"string"},"source_digest":{"pattern":"^[a-f0-9]{64}$","type":"string"},"suggested_use_cases":{"items":{"oneOf":[{"maxLength":20000,"minLength":1,"type":"string"},{"additionalProperties":false,"properties":{"subtitle":{"maxLength":20000,"type":"string"},"title":{"maxLength":300,"minLength":1,"type":"string"}},"required":["title","subtitle"],"type":"object"}]},"maxItems":100,"type":"array"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"template_category_title":{"description":"Localized template_category.title, not this resource's title.","maxLength":300,"type":"string"},"title":{"maxLength":300,"type":"string"}},"type":"object"},"description":"Locale-keyed authored display overrides (for example ja or zh-CN), never translated IDs or control/permission fields. Historical imported prose may exceed the new source short-summary limit; preserve it without truncation. Only reviewed translations are public-eligible; missing or machine text falls back to source outside authenticated Preview.","maxProperties":64,"type":"object"},"use_cases":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"visibility":{"enum":["public","staff"],"type":"string"},"visible_from":{"format":"date-time","nullable":true,"type":"string"}},"required":["title","slug","enabled","visibility","available_surfaces"],"type":"object"},"template_set/v1":{"additionalProperties":false,"properties":{"author_uid":{"description":"Existing canonical Comfy account ID (users.id), not a display name or a new catalog UUID.","minLength":1,"type":"string"},"available_surfaces":{"items":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"compatibility":{"type":"object"},"description":{"maxLength":20000,"type":"string"},"documentation_url":{"description":"Optional absolute HTTPS documentation link without embedded credentials; omit if absent.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"downloads":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"enabled":{"type":"boolean"},"entries":{"items":{"additionalProperties":false,"properties":{"file":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"revision_uid":{"format":"uuid","type":"string"},"workflow_uid":{"format":"uuid","type":"string"}},"required":["workflow_uid","revision_uid","file"],"type":"object"},"maxItems":1000,"type":"array"},"examples":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"media":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":300,"type":"string"},"presentation":{"type":"object"},"reference_media":{"items":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"maxItems":20,"type":"array"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for this example. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"title":{"maxLength":300,"type":"string"},"values":{"type":"object"}},"type":"object"},"maxItems":100,"type":"array"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"hero":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"hero_poster":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"inputBindings":{"type":"object"},"inputSchema":{"type":"object"},"inputs":{"type":"object"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"description":"Authored search-engine snippet, separate from the card summary; preserve existing localized copy on import.","maxLength":20000,"type":"string"},"related_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"runs":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"slug":{"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"sort_order":{"maximum":9999999999,"minimum":-9999999999,"nullable":true,"type":"number"},"source":{"maxLength":200,"type":"string"},"source_locale":{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$","type":"string"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for Hub cards and publish rows; never the original video. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"thumbnail":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_comparison":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"title":{"maxLength":300,"minLength":1,"type":"string"},"translations":{"type":"object"},"use_cases":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"visibility":{"enum":["public","staff"],"type":"string"},"visible_from":{"format":"date-time","nullable":true,"type":"string"}},"required":["title","slug","enabled","visibility","available_surfaces"],"type":"object"},"template_set/v2":{"additionalProperties":false,"properties":{"author_uid":{"description":"Existing canonical Comfy account ID (users.id), not a display name or a new catalog UUID.","minLength":1,"type":"string"},"available_surfaces":{"items":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"compatibility":{"additionalProperties":true,"description":"Website/Cloud compatibility data. Not execution proof and starts no paid run.","properties":{"import":{"type":"object"},"website":{"additionalProperties":true,"description":"Website presentation read by the Hub. Unlisted keys are preserved for imported pages.","properties":{"execution":{"additionalProperties":true,"description":"Router run contract. A model shows a Run form only when this exists (and the website enables Router runs). inputSchema/inputs come from the record itself.","properties":{"advancedFields":{"items":{"type":"string"},"type":"array"},"creator":{"type":"object"},"creatorVariants":{"type":"object"},"defaultInput":{"type":"object"},"id":{"description":"Router provider/model id, normally router_model_id.","pattern":"^[\\w.-]+/[\\w.-]+$","type":"string"},"media":{"items":{"type":"object"},"type":"array"},"output":{"additionalProperties":true,"properties":{"format":{"enum":["auto","json","binary"],"type":"string"}},"required":["format"],"type":"object"},"rehostUrlInputs":{"type":"boolean"},"sourceCommit":{"description":"Exact 40-hex source commit of the Router contract this was derived from. Never invent one.","pattern":"^[a-f0-9]{40}$","type":"string"}},"required":["id","sourceCommit","output"],"type":"object"},"slug":{"description":"Legacy detail-URL alias.","maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"type":{"description":"Legacy page kind; RUNNABLE is legacy. Prefer runnable on workflows.","enum":["CLOUD","APP","RUNNABLE"],"type":"string"},"workflow":{"additionalProperties":true,"description":"Website run presentation for a workflow. The Run panel reads results ONLY from outputs here, not from top-level outputs.","properties":{"cloud":{"description":"Legacy inline graph. Ignored when workflow_versions exists; do not author it.","type":"object"},"definitionVersion":{"description":"Legacy website definition version.","maxLength":500,"minLength":1,"type":"string"},"id":{"description":"Legacy website workflow id.","maxLength":500,"minLength":1,"type":"string"},"outputs":{"items":{"additionalProperties":false,"properties":{"id":{"description":"Stable output id.","maxLength":500,"minLength":1,"type":"string"},"key":{"description":"Output key on that node, for example \"images\" (also used for video frames) or \"gifs\".","maxLength":500,"minLength":1,"type":"string"},"kind":{"enum":["image","video","audio"],"type":"string"},"nodeId":{"description":"API graph output node id.","maxLength":500,"minLength":1,"type":"string"}},"required":["id","nodeId","key","kind"],"type":"object"},"maxItems":100,"minItems":1,"type":"array"},"template":{"type":"object"}},"type":"object"}},"type":"object"}},"type":"object"},"description":{"maxLength":160,"type":"string"},"documentation_url":{"description":"Optional absolute HTTPS documentation link without embedded credentials; omit if absent.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"downloads":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"enabled":{"type":"boolean"},"entries":{"items":{"additionalProperties":false,"properties":{"file":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"revision_uid":{"format":"uuid","type":"string"},"workflow_uid":{"format":"uuid","type":"string"}},"required":["workflow_uid","revision_uid","file"],"type":"object"},"maxItems":1000,"type":"array"},"examples":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"media":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":300,"type":"string"},"presentation":{"type":"object"},"reference_media":{"items":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"maxItems":20,"type":"array"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for this example. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"title":{"maxLength":300,"type":"string"},"values":{"type":"object"}},"type":"object"},"maxItems":100,"type":"array"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"hero":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"hero_poster":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"inputBindings":{"additionalProperties":{"additionalProperties":false,"anyOf":[{"not":{"required":["mediaKind"]},"properties":{"encoding":{"enum":["scalar"]}}},{"properties":{"encoding":{"enum":["cloud-asset"]}},"required":["mediaKind"]}],"description":"Writes one declared parameter into the API graph. scalar copies the value; cloud-asset uploads a media value (the parameter must be a string) and requires mediaKind. Keys must be declared inputSchema properties, and two parameters must not write the same {nodeId,inputName} target. Targets must exist in workflow_versions[0].api; the server checks shape only.","properties":{"encoding":{"enum":["scalar","cloud-asset"],"type":"string"},"mediaKind":{"description":"Only with encoding cloud-asset (required there).","enum":["image","video","audio"],"type":"string"},"targets":{"items":{"additionalProperties":false,"properties":{"inputName":{"minLength":1,"pattern":"\\S","type":"string"},"nodeId":{"minLength":1,"pattern":"\\S","type":"string"}},"required":["nodeId","inputName"],"type":"object"},"maxItems":100,"minItems":1,"type":"array","uniqueItems":true}},"required":["encoding","targets"],"type":"object"},"description":"Parameter name to graph binding for runnable workflows. Router models need none.","maxProperties":200,"type":"object"},"inputSchema":{"additionalProperties":true,"description":"JSON Schema (Draft 7) for the page's parameters. type must be object with at most 200 properties; required may list only declared names. Only acyclic root-local $ref pointers (#/...) are allowed; remote, dynamic or recursive references and nested $id are rejected, and the schema must stay within a 20,000-node work budget. Formats byte (base64), uint32 and http-image-url are checked. OpenAPI nullable and boolean exclusiveMinimum/exclusiveMaximum are normalized. Each default must satisfy its property and minimum must not exceed maximum. The website playground also expects required to be present and additionalProperties false.","properties":{"properties":{"additionalProperties":{"type":"object"},"maxProperties":200,"type":"object"},"required":{"items":{"type":"string"},"type":"array"},"type":{"enum":["object"],"type":"string"}},"required":["type","properties"],"type":"object"},"inputs":{"additionalProperties":{"additionalProperties":false,"properties":{"advanced":{"type":"boolean"},"control":{"enum":["text-box","text-area","dialogue","dropdown","slider","number","toggle","media"],"type":"string"},"defaultSource":{"enum":["router","curated"],"type":"string"},"formConstraint":{"additionalProperties":false,"properties":{"error":{"enum":["required","incompatible"],"type":"string"},"schema":{"type":"object"}},"required":["schema","error"],"type":"object"},"help":{"maxLength":140,"type":"string"},"hidden":{"type":"boolean"},"imageAspectRatio":{"additionalProperties":false,"properties":{"maximum":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"minimum":{"exclusiveMinimum":true,"minimum":0,"type":"number"}},"required":["minimum","maximum"],"type":"object"},"imageSource":{"enum":["url"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"},"maxUploadBytes":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"maxVideoDurationSeconds":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"optionLabels":{"additionalProperties":{"maxLength":200,"minLength":1,"type":"string"},"maxProperties":200,"type":"object"},"randomize":{"enum":[true],"type":"boolean"},"unit":{"enum":["seconds","pixels","fps"],"type":"string"},"urlUpload":{"enum":["image","video","audio","image-or-video","file"],"type":"string"},"videoWidthPixels":{"additionalProperties":false,"properties":{"maximum":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"minimum":{"exclusiveMinimum":true,"minimum":0,"type":"number"}},"required":["minimum","maximum"],"type":"object"}},"required":["label","control"],"type":"object"},"maxProperties":200,"type":"object"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"description":"Authored search-engine snippet, separate from the card summary; preserve existing localized copy on import.","maxLength":20000,"type":"string"},"related_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"runs":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"slug":{"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"sort_order":{"maximum":9999999999,"minimum":-9999999999,"nullable":true,"type":"number"},"source":{"maxLength":200,"type":"string"},"source_locale":{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$","type":"string"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for Hub cards and publish rows; never the original video. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"thumbnail":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_comparison":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"title":{"maxLength":80,"minLength":1,"type":"string"},"translations":{"additionalProperties":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"how_to_use":{"items":{"maxLength":20000,"minLength":1,"type":"string"},"maxItems":100,"type":"array"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"maxLength":20000,"type":"string"},"review_state":{"enum":["machine","reviewed"],"type":"string"},"source_digest":{"pattern":"^[a-f0-9]{64}$","type":"string"},"suggested_use_cases":{"items":{"oneOf":[{"maxLength":20000,"minLength":1,"type":"string"},{"additionalProperties":false,"properties":{"subtitle":{"maxLength":20000,"type":"string"},"title":{"maxLength":300,"minLength":1,"type":"string"}},"required":["title","subtitle"],"type":"object"}]},"maxItems":100,"type":"array"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"template_category_title":{"description":"Localized template_category.title, not this resource's title.","maxLength":300,"type":"string"},"title":{"maxLength":300,"type":"string"}},"type":"object"},"description":"Locale-keyed authored display overrides (for example ja or zh-CN), never translated IDs or control/permission fields. Historical imported prose may exceed the new source short-summary limit; preserve it without truncation. Only reviewed translations are public-eligible; missing or machine text falls back to source outside authenticated Preview.","maxProperties":64,"type":"object"},"use_cases":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"visibility":{"enum":["public","staff"],"type":"string"},"visible_from":{"format":"date-time","nullable":true,"type":"string"}},"required":["title","slug","enabled","visibility","available_surfaces"],"type":"object"},"workflow/v1":{"additionalProperties":false,"properties":{"attachments":{"description":"Named page/input files with exact Media UID and file-version pins; not graph/API versions, execution bindings or source-byte authority.","items":{"additionalProperties":false,"properties":{"file":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"name":{"maxLength":500,"minLength":1,"type":"string"}},"required":["name","file"],"type":"object"},"maxItems":1000,"type":"array"},"author_uid":{"description":"Existing canonical Comfy account ID (users.id), not a display name or a new catalog UUID.","minLength":1,"type":"string"},"available_surfaces":{"items":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"cloud_share_url":{"description":"Existing Comfy Cloud root URL with only share=\u003creal 12-hex share ID\u003e; no new share is created.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"compatibility":{"type":"object"},"date":{"description":"Original editorial/template date; not a catalog publication timestamp or visibility schedule.","format":"date","type":"string"},"dependencies":{"items":{"type":"object"},"maxItems":1000,"type":"array"},"description":{"maxLength":20000,"type":"string"},"documentation_url":{"description":"Optional absolute HTTPS documentation link without embedded credentials; omit if absent.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"downloads":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"enabled":{"type":"boolean"},"examples":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"media":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":300,"type":"string"},"presentation":{"type":"object"},"reference_media":{"items":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"maxItems":20,"type":"array"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for this example. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"title":{"maxLength":300,"type":"string"},"values":{"type":"object"}},"type":"object"},"maxItems":100,"type":"array"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"generation_type":{"enum":["generate-images","edit-images","generate-videos","animate-images","edit-videos","text","3d","audio"],"type":"string"},"hero":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"hero_poster":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"how_to_use":{"items":{"maxLength":20000,"minLength":1,"type":"string"},"maxItems":100,"type":"array"},"include_on_distributions":{"description":"Preserved includeOnDistributions restriction. Omission and an explicit empty list remain distinct; mac/windows are OS selectors, not catalog available_surfaces or access grants. Consumers must enforce the original distribution semantics before cutover.","items":{"enum":["cloud","local","desktop","mac","windows"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"inputBindings":{"type":"object"},"inputSchema":{"type":"object"},"inputs":{"type":"object"},"io":{"additionalProperties":false,"description":"Preserved template sample-file/node metadata, not inputSchema/inputBindings or arbitrary downloadable URLs. A bundle export must supply the pinned files; this metadata alone authorizes no byte delivery.","properties":{"inputs":{"items":{"additionalProperties":false,"properties":{"file":{"maxLength":1000,"type":"string"},"mediaType":{"enum":["image","video","audio","3d"],"type":"string"},"nodeId":{"oneOf":[{"maximum":9007199254740991,"minimum":0,"type":"integer"},{"maxLength":200,"minLength":1,"type":"string"}]},"nodeType":{"maxLength":300,"minLength":1,"type":"string"},"sourceRevision":{"pattern":"^[a-f0-9]{40}$","type":"string"}},"required":["nodeId","nodeType","file","mediaType"],"type":"object"},"maxItems":1000,"type":"array"},"outputs":{"items":{"additionalProperties":false,"properties":{"file":{"maxLength":1000,"type":"string"},"mediaType":{"enum":["image","video","audio","3d"],"type":"string"},"nodeId":{"oneOf":[{"maximum":9007199254740991,"minimum":0,"type":"integer"},{"maxLength":200,"minLength":1,"type":"string"}]},"nodeType":{"maxLength":300,"minLength":1,"type":"string"},"sourceRevision":{"pattern":"^[a-f0-9]{40}$","type":"string"}},"required":["nodeId","nodeType","file","mediaType"],"type":"object"},"maxItems":1000,"type":"array"}},"type":"object"},"is_app":{"description":"Source template's default App Mode declaration, not the Content resource type or Runnable capability.","type":"boolean"},"logos":{"items":{"additionalProperties":false,"properties":{"gap":{"maximum":1000,"minimum":-1000,"type":"number"},"label":{"maxLength":300,"type":"string"},"opacity":{"maximum":1,"minimum":0,"type":"number"},"position":{"maxLength":200,"type":"string"},"provider":{"oneOf":[{"maxLength":200,"minLength":1,"type":"string"},{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true}]}},"required":["provider"],"type":"object"},"maxItems":100,"type":"array"},"long_description":{"maxLength":20000,"type":"string"},"media_subtype":{"description":"Legacy thumbnail format hint; never overrides verified Media MIME or grants access to a file.","maxLength":32,"pattern":"^[a-zA-Z0-9]+$","type":"string"},"meta_description":{"description":"Authored search-engine snippet, separate from the card summary; preserve existing localized copy on import.","maxLength":20000,"type":"string"},"min_comfyui_version":{"description":"Minimum supported ComfyUI core/application version as SemVer (for example 0.3.50), not the template package or catalog revision. Omit when unknown; no v prefix, range or latest. This declaration is not proof of Cloud compatibility or execution validation.","maxLength":100,"minLength":5,"pattern":"^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$","type":"string"},"model_labels":{"description":"Descriptive model-family/provider labels with stable source names and display text, NOT Model resource references or execution facts. Exact links belong only in model_uids; never infer one from a matching name or slug.","items":{"additionalProperties":false,"properties":{"display_name":{"maxLength":300,"minLength":1,"type":"string"},"name":{"maxLength":200,"minLength":1,"type":"string"}},"required":["name","display_name"],"type":"object"},"maxItems":100,"type":"array"},"model_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"open_source":{"description":"Preserved template openSource declaration, not evidence of execution or Cloud availability.","type":"boolean"},"output_type":{"enum":["image","video","audio","3d","text","mixed"],"type":"string"},"outputs":{"items":{"type":"object"},"maxItems":100,"type":"array"},"related_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"requires_custom_nodes":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"runnable":{"description":"Website playground opt-in; not Cloud compatibility, publication approval or API-code availability. No inputs means download-only.","type":"boolean"},"runs":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"script_code":{"additionalProperties":false,"description":"Inert fallback script text only when code cannot be inferred from the executable graph and inputs. Never executed or fetched by authoring validation.","minProperties":1,"properties":{"curl":{"maxLength":60000,"minLength":1,"type":"string"},"python":{"maxLength":60000,"minLength":1,"type":"string"},"typescript":{"maxLength":60000,"minLength":1,"type":"string"}},"type":"object"},"search_rank":{"description":"Preserved curator searchRank, including negative/fractional values. Consumers own ranking and saturation rules; this field does not change current sorting.","maximum":9007199254740991,"minimum":-9007199254740991,"type":"number"},"size":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"slug":{"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"sort_order":{"maximum":9999999999,"minimum":-9999999999,"nullable":true,"type":"number"},"source":{"maxLength":200,"type":"string"},"source_locale":{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$","type":"string"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for Hub cards and publish rows; never the original video. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"suggested_use_cases":{"items":{"oneOf":[{"maxLength":20000,"minLength":1,"type":"string"},{"additionalProperties":false,"properties":{"subtitle":{"maxLength":20000,"type":"string"},"title":{"maxLength":300,"minLength":1,"type":"string"}},"required":["title","subtitle"],"type":"object"}]},"maxItems":100,"type":"array"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"template_category":{"additionalProperties":false,"description":"Original enclosing template-category metadata. Its title/type describe the category, not this Content resource's identity, title or type. No new taxonomy/filter semantics are implied.","properties":{"category":{"maxLength":300,"type":"string"},"icon":{"maxLength":200,"type":"string"},"isEssential":{"type":"boolean"},"moduleName":{"maxLength":200,"pattern":"^[a-zA-Z0-9_-]+$","type":"string"},"title":{"maxLength":300,"type":"string"},"type":{"enum":["image","video","audio","3d","llm"],"type":"string"}},"type":"object"},"template_name":{"description":"Stable template file name the app loads by (?template=\u003cname\u003e); not a slug.","maxLength":200,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"thumbnail":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_comparison":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_variant":{"enum":["compareSlider","hoverDissolve","hoverZoom","zoomHover","video"],"type":"string"},"title":{"maxLength":300,"minLength":1,"type":"string"},"translations":{"type":"object"},"usage":{"description":"Original nonnegative template popularity score, not a runs/downloads counter or billing/execution fact.","maximum":9007199254740991,"minimum":0,"type":"number"},"use_cases":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"visibility":{"enum":["public","staff"],"type":"string"},"visible_from":{"format":"date-time","nullable":true,"type":"string"},"workflow_files":{"items":{"additionalProperties":false,"properties":{"file":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":200,"minLength":1,"type":"string"}},"required":["name","file"],"type":"object"},"maxItems":100,"type":"array"},"workflow_versions":{"items":{"additionalProperties":false,"properties":{"api":{"additionalProperties":false,"nullable":true,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"download":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"name":{"maxLength":200,"minLength":1,"type":"string"}},"required":["name","download"],"type":"object"},"maxItems":100,"type":"array"},"works_on_cloud":{"type":"boolean"}},"required":["title","slug","enabled","visibility","available_surfaces"],"type":"object"},"workflow/v2":{"additionalProperties":false,"properties":{"attachments":{"description":"Named page/input files with exact Media UID and file-version pins; not graph/API versions, execution bindings or source-byte authority.","items":{"additionalProperties":false,"properties":{"file":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"name":{"maxLength":500,"minLength":1,"type":"string"}},"required":["name","file"],"type":"object"},"maxItems":1000,"type":"array"},"author_uid":{"description":"Existing canonical Comfy account ID (users.id), not a display name or a new catalog UUID.","minLength":1,"type":"string"},"available_surfaces":{"items":{"enum":["hub","cloud_templates","local_templates","desktop_starters","nvidia_performance_tests"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"change_id":{"description":"Optional case-sensitive editorial batch label shared by related saves; not identity, approval, permission or CAS. Omit when absent.","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"cloud_share_url":{"description":"Existing Comfy Cloud root URL with only share=\u003creal 12-hex share ID\u003e; no new share is created.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"compatibility":{"additionalProperties":true,"description":"Website/Cloud compatibility data. Not execution proof and starts no paid run.","properties":{"import":{"type":"object"},"website":{"additionalProperties":true,"description":"Website presentation read by the Hub. Unlisted keys are preserved for imported pages.","properties":{"execution":{"additionalProperties":true,"description":"Router run contract. A model shows a Run form only when this exists (and the website enables Router runs). inputSchema/inputs come from the record itself.","properties":{"advancedFields":{"items":{"type":"string"},"type":"array"},"creator":{"type":"object"},"creatorVariants":{"type":"object"},"defaultInput":{"type":"object"},"id":{"description":"Router provider/model id, normally router_model_id.","pattern":"^[\\w.-]+/[\\w.-]+$","type":"string"},"media":{"items":{"type":"object"},"type":"array"},"output":{"additionalProperties":true,"properties":{"format":{"enum":["auto","json","binary"],"type":"string"}},"required":["format"],"type":"object"},"rehostUrlInputs":{"type":"boolean"},"sourceCommit":{"description":"Exact 40-hex source commit of the Router contract this was derived from. Never invent one.","pattern":"^[a-f0-9]{40}$","type":"string"}},"required":["id","sourceCommit","output"],"type":"object"},"slug":{"description":"Legacy detail-URL alias.","maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"type":{"description":"Legacy page kind; RUNNABLE is legacy. Prefer runnable on workflows.","enum":["CLOUD","APP","RUNNABLE"],"type":"string"},"workflow":{"additionalProperties":true,"description":"Website run presentation for a workflow. The Run panel reads results ONLY from outputs here, not from top-level outputs.","properties":{"cloud":{"description":"Legacy inline graph. Ignored when workflow_versions exists; do not author it.","type":"object"},"definitionVersion":{"description":"Legacy website definition version.","maxLength":500,"minLength":1,"type":"string"},"id":{"description":"Legacy website workflow id.","maxLength":500,"minLength":1,"type":"string"},"outputs":{"items":{"additionalProperties":false,"properties":{"id":{"description":"Stable output id.","maxLength":500,"minLength":1,"type":"string"},"key":{"description":"Output key on that node, for example \"images\" (also used for video frames) or \"gifs\".","maxLength":500,"minLength":1,"type":"string"},"kind":{"enum":["image","video","audio"],"type":"string"},"nodeId":{"description":"API graph output node id.","maxLength":500,"minLength":1,"type":"string"}},"required":["id","nodeId","key","kind"],"type":"object"},"maxItems":100,"minItems":1,"type":"array"},"template":{"type":"object"}},"type":"object"}},"type":"object"}},"type":"object"},"date":{"description":"Original editorial/template date; not a catalog publication timestamp or visibility schedule.","format":"date","type":"string"},"dependencies":{"items":{"type":"object"},"maxItems":1000,"type":"array"},"description":{"maxLength":160,"type":"string"},"documentation_url":{"description":"Optional absolute HTTPS documentation link without embedded credentials; omit if absent.","format":"uri","maxLength":2000,"minLength":1,"type":"string"},"downloads":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"enabled":{"type":"boolean"},"examples":{"items":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"media":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":300,"type":"string"},"presentation":{"type":"object"},"reference_media":{"items":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"maxItems":20,"type":"array"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for this example. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"title":{"maxLength":300,"type":"string"},"values":{"type":"object"}},"type":"object"},"maxItems":100,"type":"array"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"generation_type":{"enum":["generate-images","edit-images","generate-videos","animate-images","edit-videos","text","3d","audio"],"type":"string"},"hero":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"hero_poster":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"how_to_use":{"items":{"maxLength":20000,"minLength":1,"type":"string"},"maxItems":100,"type":"array"},"include_on_distributions":{"description":"Preserved includeOnDistributions restriction. Omission and an explicit empty list remain distinct; mac/windows are OS selectors, not catalog available_surfaces or access grants. Consumers must enforce the original distribution semantics before cutover.","items":{"enum":["cloud","local","desktop","mac","windows"],"type":"string"},"maxItems":5,"type":"array","uniqueItems":true},"inputBindings":{"additionalProperties":{"additionalProperties":false,"anyOf":[{"not":{"required":["mediaKind"]},"properties":{"encoding":{"enum":["scalar"]}}},{"properties":{"encoding":{"enum":["cloud-asset"]}},"required":["mediaKind"]}],"description":"Writes one declared parameter into the API graph. scalar copies the value; cloud-asset uploads a media value (the parameter must be a string) and requires mediaKind. Keys must be declared inputSchema properties, and two parameters must not write the same {nodeId,inputName} target. Targets must exist in workflow_versions[0].api; the server checks shape only.","properties":{"encoding":{"enum":["scalar","cloud-asset"],"type":"string"},"mediaKind":{"description":"Only with encoding cloud-asset (required there).","enum":["image","video","audio"],"type":"string"},"targets":{"items":{"additionalProperties":false,"properties":{"inputName":{"minLength":1,"pattern":"\\S","type":"string"},"nodeId":{"minLength":1,"pattern":"\\S","type":"string"}},"required":["nodeId","inputName"],"type":"object"},"maxItems":100,"minItems":1,"type":"array","uniqueItems":true}},"required":["encoding","targets"],"type":"object"},"description":"Parameter name to graph binding for runnable workflows. Router models need none.","maxProperties":200,"type":"object"},"inputSchema":{"additionalProperties":true,"description":"JSON Schema (Draft 7) for the page's parameters. type must be object with at most 200 properties; required may list only declared names. Only acyclic root-local $ref pointers (#/...) are allowed; remote, dynamic or recursive references and nested $id are rejected, and the schema must stay within a 20,000-node work budget. Formats byte (base64), uint32 and http-image-url are checked. OpenAPI nullable and boolean exclusiveMinimum/exclusiveMaximum are normalized. Each default must satisfy its property and minimum must not exceed maximum. The website playground also expects required to be present and additionalProperties false.","properties":{"properties":{"additionalProperties":{"type":"object"},"maxProperties":200,"type":"object"},"required":{"items":{"type":"string"},"type":"array"},"type":{"enum":["object"],"type":"string"}},"required":["type","properties"],"type":"object"},"inputs":{"additionalProperties":{"additionalProperties":false,"properties":{"advanced":{"type":"boolean"},"control":{"enum":["text-box","text-area","dialogue","dropdown","slider","number","toggle","media"],"type":"string"},"defaultSource":{"enum":["router","curated"],"type":"string"},"formConstraint":{"additionalProperties":false,"properties":{"error":{"enum":["required","incompatible"],"type":"string"},"schema":{"type":"object"}},"required":["schema","error"],"type":"object"},"help":{"maxLength":140,"type":"string"},"hidden":{"type":"boolean"},"imageAspectRatio":{"additionalProperties":false,"properties":{"maximum":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"minimum":{"exclusiveMinimum":true,"minimum":0,"type":"number"}},"required":["minimum","maximum"],"type":"object"},"imageSource":{"enum":["url"],"type":"string"},"label":{"maxLength":200,"minLength":1,"type":"string"},"maxUploadBytes":{"maximum":9007199254740991,"minimum":1,"type":"integer"},"maxVideoDurationSeconds":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"optionLabels":{"additionalProperties":{"maxLength":200,"minLength":1,"type":"string"},"maxProperties":200,"type":"object"},"randomize":{"enum":[true],"type":"boolean"},"unit":{"enum":["seconds","pixels","fps"],"type":"string"},"urlUpload":{"enum":["image","video","audio","image-or-video","file"],"type":"string"},"videoWidthPixels":{"additionalProperties":false,"properties":{"maximum":{"exclusiveMinimum":true,"minimum":0,"type":"number"},"minimum":{"exclusiveMinimum":true,"minimum":0,"type":"number"}},"required":["minimum","maximum"],"type":"object"}},"required":["label","control"],"type":"object"},"maxProperties":200,"type":"object"},"io":{"additionalProperties":false,"description":"Preserved template sample-file/node metadata, not inputSchema/inputBindings or arbitrary downloadable URLs. A bundle export must supply the pinned files; this metadata alone authorizes no byte delivery.","properties":{"inputs":{"items":{"additionalProperties":false,"properties":{"file":{"maxLength":1000,"type":"string"},"mediaType":{"enum":["image","video","audio","3d"],"type":"string"},"nodeId":{"oneOf":[{"maximum":9007199254740991,"minimum":0,"type":"integer"},{"maxLength":200,"minLength":1,"type":"string"}]},"nodeType":{"maxLength":300,"minLength":1,"type":"string"},"sourceRevision":{"pattern":"^[a-f0-9]{40}$","type":"string"}},"required":["nodeId","nodeType","file","mediaType"],"type":"object"},"maxItems":1000,"type":"array"},"outputs":{"items":{"additionalProperties":false,"properties":{"file":{"maxLength":1000,"type":"string"},"mediaType":{"enum":["image","video","audio","3d"],"type":"string"},"nodeId":{"oneOf":[{"maximum":9007199254740991,"minimum":0,"type":"integer"},{"maxLength":200,"minLength":1,"type":"string"}]},"nodeType":{"maxLength":300,"minLength":1,"type":"string"},"sourceRevision":{"pattern":"^[a-f0-9]{40}$","type":"string"}},"required":["nodeId","nodeType","file","mediaType"],"type":"object"},"maxItems":1000,"type":"array"}},"type":"object"},"is_app":{"description":"Source template's default App Mode declaration, not the Content resource type or Runnable capability.","type":"boolean"},"logos":{"items":{"additionalProperties":false,"properties":{"gap":{"maximum":1000,"minimum":-1000,"type":"number"},"label":{"maxLength":300,"type":"string"},"opacity":{"maximum":1,"minimum":0,"type":"number"},"position":{"maxLength":200,"type":"string"},"provider":{"oneOf":[{"maxLength":200,"minLength":1,"type":"string"},{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true}]}},"required":["provider"],"type":"object"},"maxItems":100,"type":"array"},"long_description":{"maxLength":20000,"type":"string"},"media_subtype":{"description":"Legacy thumbnail format hint; never overrides verified Media MIME or grants access to a file.","maxLength":32,"pattern":"^[a-zA-Z0-9]+$","type":"string"},"meta_description":{"description":"Authored search-engine snippet, separate from the card summary; preserve existing localized copy on import.","maxLength":20000,"type":"string"},"min_comfyui_version":{"description":"Minimum supported ComfyUI core/application version as SemVer (for example 0.3.50), not the template package or catalog revision. Omit when unknown; no v prefix, range or latest. This declaration is not proof of Cloud compatibility or execution validation.","maxLength":100,"minLength":5,"pattern":"^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9][0-9]*|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$","type":"string"},"model_labels":{"description":"Descriptive model-family/provider labels with stable source names and display text, NOT Model resource references or execution facts. Exact links belong only in model_uids; never infer one from a matching name or slug.","items":{"additionalProperties":false,"properties":{"display_name":{"maxLength":300,"minLength":1,"type":"string"},"name":{"maxLength":200,"minLength":1,"type":"string"}},"required":["name","display_name"],"type":"object"},"maxItems":100,"type":"array"},"model_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"open_source":{"description":"Preserved template openSource declaration, not evidence of execution or Cloud availability.","type":"boolean"},"output_type":{"enum":["image","video","audio","3d","text","mixed"],"type":"string"},"outputs":{"items":{"additionalProperties":false,"properties":{"id":{"maxLength":200,"minLength":1,"type":"string"},"key":{"maxLength":200,"minLength":1,"type":"string"},"kind":{"enum":["image","video","audio","3d","text"],"type":"string"},"nodeId":{"maxLength":200,"minLength":1,"type":"string"}},"required":["id","nodeId","key","kind"],"type":"object"},"maxItems":100,"type":"array"},"related_uids":{"items":{"format":"uuid","type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"requires_custom_nodes":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"runnable":{"description":"Website playground opt-in; not Cloud compatibility, publication approval or API-code availability. No inputs means download-only.","type":"boolean"},"runs":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"script_code":{"additionalProperties":false,"description":"Inert fallback script text only when code cannot be inferred from the executable graph and inputs. Never executed or fetched by authoring validation.","minProperties":1,"properties":{"curl":{"maxLength":60000,"minLength":1,"type":"string"},"python":{"maxLength":60000,"minLength":1,"type":"string"},"typescript":{"maxLength":60000,"minLength":1,"type":"string"}},"type":"object"},"search_rank":{"description":"Preserved curator searchRank, including negative/fractional values. Consumers own ranking and saturation rules; this field does not change current sorting.","maximum":9007199254740991,"minimum":-9007199254740991,"type":"number"},"size":{"maximum":9007199254740991,"minimum":0,"type":"integer"},"slug":{"maxLength":200,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"sort_order":{"maximum":9999999999,"minimum":-9999999999,"nullable":true,"type":"number"},"source":{"maxLength":200,"type":"string"},"source_locale":{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$","type":"string"},"static_thumb":{"additionalProperties":false,"description":"Exact still-image MEDIA reference for Hub cards and publish rows; never the original video. Recommended for every published page; it must be verified image/webp Media, 1 byte to 160 KiB, at most 960 px on each side (the website ignores a non-WebP still). Reviewed policy requires it at publish, but the current runtime does not enforce that yet.","properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"suggested_use_cases":{"items":{"oneOf":[{"maxLength":20000,"minLength":1,"type":"string"},{"additionalProperties":false,"properties":{"subtitle":{"maxLength":20000,"type":"string"},"title":{"maxLength":300,"minLength":1,"type":"string"}},"required":["title","subtitle"],"type":"object"}]},"maxItems":100,"type":"array"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"template_category":{"additionalProperties":false,"description":"Original enclosing template-category metadata. Its title/type describe the category, not this Content resource's identity, title or type. No new taxonomy/filter semantics are implied.","properties":{"category":{"maxLength":300,"type":"string"},"icon":{"maxLength":200,"type":"string"},"isEssential":{"type":"boolean"},"moduleName":{"maxLength":200,"pattern":"^[a-zA-Z0-9_-]+$","type":"string"},"title":{"maxLength":300,"type":"string"},"type":{"enum":["image","video","audio","3d","llm"],"type":"string"}},"type":"object"},"template_name":{"description":"Stable template file name the app loads by (?template=\u003cname\u003e); not a slug.","maxLength":200,"pattern":"^[A-Za-z0-9][A-Za-z0-9._-]*$","type":"string"},"thumbnail":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_comparison":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"thumbnail_variant":{"enum":["compareSlider","hoverDissolve","hoverZoom","zoomHover","video"],"type":"string"},"title":{"maxLength":80,"minLength":1,"type":"string"},"translations":{"additionalProperties":{"additionalProperties":false,"properties":{"description":{"maxLength":20000,"type":"string"},"faq":{"items":{"additionalProperties":false,"properties":{"answer":{"maxLength":20000,"minLength":1,"type":"string"},"question":{"maxLength":300,"minLength":1,"type":"string"}},"required":["question","answer"],"type":"object"},"maxItems":100,"type":"array"},"how_to_use":{"items":{"maxLength":20000,"minLength":1,"type":"string"},"maxItems":100,"type":"array"},"long_description":{"maxLength":20000,"type":"string"},"meta_description":{"maxLength":20000,"type":"string"},"review_state":{"enum":["machine","reviewed"],"type":"string"},"source_digest":{"pattern":"^[a-f0-9]{64}$","type":"string"},"suggested_use_cases":{"items":{"oneOf":[{"maxLength":20000,"minLength":1,"type":"string"},{"additionalProperties":false,"properties":{"subtitle":{"maxLength":20000,"type":"string"},"title":{"maxLength":300,"minLength":1,"type":"string"}},"required":["title","subtitle"],"type":"object"}]},"maxItems":100,"type":"array"},"tags":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"template_category_title":{"description":"Localized template_category.title, not this resource's title.","maxLength":300,"type":"string"},"title":{"maxLength":300,"type":"string"}},"type":"object"},"description":"Locale-keyed authored display overrides (for example ja or zh-CN), never translated IDs or control/permission fields. Historical imported prose may exceed the new source short-summary limit; preserve it without truncation. Only reviewed translations are public-eligible; missing or machine text falls back to source outside authenticated Preview.","maxProperties":64,"type":"object"},"usage":{"description":"Original nonnegative template popularity score, not a runs/downloads counter or billing/execution fact.","maximum":9007199254740991,"minimum":0,"type":"number"},"use_cases":{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":100,"type":"array","uniqueItems":true},"visibility":{"enum":["public","staff"],"type":"string"},"visible_from":{"format":"date-time","nullable":true,"type":"string"},"workflow_files":{"items":{"additionalProperties":false,"properties":{"file":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id"],"type":"object"},"name":{"maxLength":200,"minLength":1,"type":"string"}},"required":["name","file"],"type":"object"},"maxItems":100,"type":"array"},"workflow_versions":{"items":{"additionalProperties":false,"properties":{"api":{"additionalProperties":false,"nullable":true,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"download":{"additionalProperties":false,"properties":{"file_version_uid":{"description":"Exact immutable file version: the Media revision_uid returned by the upload. A pin that no longer matches is omitted by the website.","format":"uuid","type":"string"},"id":{"description":"Logical Media UID returned by upload or reference creation.","format":"uuid","type":"string"},"name":{"maxLength":500,"type":"string"},"src":{"description":"Use \"media\". \"r2\" is accepted as a legacy alias; bytes are always resolved from the Media record, never from src.","enum":["r2","media"],"type":"string"}},"required":["src","id","file_version_uid"],"type":"object"},"name":{"maxLength":200,"minLength":1,"type":"string"}},"required":["name","download"],"type":"object"},"maxItems":100,"type":"array"},"works_on_cloud":{"type":"boolean"}},"required":["title","slug","enabled","visibility","available_surfaces"],"type":"object"}}}
