Comfy Router’s model catalog - one page of the canonical model IDs that POST /v2/models/{provider}/{model} accepts. An SDK calls this on cold start to discover what is runnable, and the model_not_found suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry’s provider and model are the two path segments of the invocation route and reference the same schema components that route’s path parameters do, and id is those two segments joined by /.
Bearer token authentication. Normally a Firebase or Cloud JWT. A 'comfyui-' prefixed API key is also accepted in this header: the prefix classifies the value as an API key and it is validated exactly as if it had been sent in X-API-Key.
The ETag a caller holds from an earlier 200. When it matches the current page (RFC 9110 weak comparison; * matches any current page) the answer is a bodyless 304 carrying the same ETag, otherwise the full page.
Opaque pagination cursor. Pass a previous page's next_cursor to fetch the next page; omit it for the first page. See RouterPageCursor for why the value is opaque and why this route paginates by cursor rather than by offset.
An opaque cursor into a Router list. It is produced by the server and only ever round-tripped: it is not an offset, not a model ID, not ordered, and not stable across catalog rebuilds, so parsing one, incrementing one, or persisting one beyond the walk it came from are all outside the contract. Cursor rather than offset because the catalog is a moving list - an offset walk silently skips or repeats entries when entries are added or removed mid-walk, and a caller cannot tell that it happened.
Number of models to return in one page. Values above the declared maximum are outside the contract, but this route does not reject them: it serves the maximum instead, and the page size actually served is echoed back as limit on the response, so a clamp is always detectable by the caller. Treat the maximum as the real page stride - a client that asks for more and assumes it received more will miss rows. 0 and negative values are also accepted and select the default, which is why no minimum is declared: sub-1 is meaningful here, not invalid.
The page size actually served. A requested limit above the maximum is clamped down to the maximum rather than rejected, so this can be smaller than the value asked for - paginate with this number, not with the one you sent, or you will assume rows you never received.
An opaque cursor into a Router list. It is produced by the server and only ever round-tripped: it is not an offset, not a model ID, not ordered, and not stable across catalog rebuilds, so parsing one, incrementing one, or persisting one beyond the walk it came from are all outside the contract. Cursor rather than offset because the catalog is a moving list - an offset walk silently skips or repeats entries when entries are added or removed mid-walk, and a caller cannot tell that it happened.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"ComfyUI","colors":{"primary":"#49378B","light":"#F2FF59","dark":"#F2FF59"},"logo":{"light":"https://mintcdn.com/dripart/WCFdTagRdhtvk9-o/logo/light.svg?fit=max\u0026auto=format\u0026n=WCFdTagRdhtvk9-o\u0026q=85\u0026s=ec112de87239058f5a931a7e4b594965","dark":"https://mintcdn.com/dripart/QzWbjSCBG7w61rR3/logo/dark.svg?fit=max\u0026auto=format\u0026n=QzWbjSCBG7w61rR3\u0026q=85\u0026s=62b4d879fb3aadbd7a468d1539032d6f","href":"/"},"favicon":"https://mintcdn.com/dripart/maKDA164-rrTfyxY/favicon.ico?fit=max\u0026auto=format\u0026n=maKDA164-rrTfyxY\u0026q=85\u0026s=94f3a697cf4c9a1ee3961b69219d0942","appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://blog.comfy.org/?utm_source=docs","label":"Blog"},{"href":"/tutorials/partner-nodes/pricing","label":"Pricing"},{"href":"https://platform.comfy.org/?utm_source=docs","label":"Platform"},{"href":"https://comfy.org/download?utm_source=docs","label":"Download"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"Resources","items":[{"label":"installation","href":"/installation/system_requirements"},{"label":"Tutorials","href":"/tutorials/basic/text-to-image"},{"label":"Development","href":"/development/overview"}]},{"header":"Products","items":[{"label":"Features","href":"https://www.comfy.org/?utm_source=docs"},{"label":"Gallery","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"Download","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"Company","items":[{"label":"About","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"Careers","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"Terms of Service","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"Privacy Policy","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"search":{"prompt":"Search Comfy documentation..."},"seo":{"metatags":{"googlebot":"max-video-preview:0"}},"icons":{"library":"fontawesome"},"integrations":{"ga4":{"measurementId":"G-MXC01ZDDHQ"},"posthog":{"apiKey":"phc_iKfK86id4xVYws9LybMje0h44eGtfwFgRPIBehmy8rO"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":""},{"language":"zh","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"资源","items":[{"label":"安装","href":"/zh/installation/system_requirements"},{"label":"教程","href":"/zh/tutorials/basic/text-to-image"},{"label":"开发","href":"/zh/development/overview"}]},{"header":"产品","items":[{"label":"功能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"画廊","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"下载","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"公司","items":[{"label":"关于","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"招聘","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"服务条款","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"隐私政策","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"href":"zh"},{"language":"ja","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"リソース","items":[{"label":"インストール","href":"/ja/installation/system_requirements"},{"label":"チュートリアル","href":"/ja/tutorials/basic/text-to-image"},{"label":"開発","href":"/ja/development/overview"}]},{"header":"プロダクト","items":[{"label":"機能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"ギャラリー","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"ダウンロード","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"会社情報","items":[{"label":"概要","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"採用情報","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"利用規約","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"プライバシーポリシー","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ja/tutorials/partner-nodes/pricing","label":"料金"},{"href":"https://comfy.org/download?utm_source=docs","label":"ダウンロード"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"href":"ja"},{"language":"ko","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"리소스","items":[{"label":"설치","href":"/ko/installation/system_requirements"},{"label":"튜토리얼","href":"/ko/tutorials/basic/text-to-image"},{"label":"개발","href":"/ko/development/overview"}]},{"header":"제품","items":[{"label":"기능","href":"https://www.comfy.org/?utm_source=docs"},{"label":"갤러리","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"다운로드","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"회사 정보","items":[{"label":"소개","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"채용","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"이용약관","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"개인정보 처리방침","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ko/tutorials/partner-nodes/pricing","label":"가격 정책"},{"href":"https://comfy.org/download?utm_source=docs","label":"다운로드"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"href":"ko"},{"language":"es","href":"es"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"dripart","hasAudioNarration":false,"actualSubdomain":"dripart","customDomains":["docs.comfy.org"],"gitSource":{"type":"github","owner":"comfy-org","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae0139d83efab76e3e30628","collectionId":"fd71a9fe-d7b3-4ca6-9226-736e0a51de4f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae0139d83efab76e3e30628"},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"DISABLED"}},"buildId":"6ae026dcfa64afb3742fc11a","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"en","tag":"Built-in Nodes","count":1133},{"language":"ja","tag":"組み込みノード","count":1133},{"language":"zh","tag":"内置节点","count":1133},{"language":"en","tag":"Nodes","count":1132},{"language":"ja","tag":"ノード","count":1132},{"language":"zh","tag":"节点","count":1132},{"language":"ko","tag":"내장 노드 (Built-in Nodes)","count":1091},{"language":"ko","tag":"노드","count":1090},{"language":"es","tag":"Nodos integrados","count":1025},{"language":"es","tag":"Nodos","count":1024},{"language":"en","tag":"Tutorials","count":403},{"language":"es","tag":"Tutoriales","count":398},{"language":"en","tag":"Model","count":377},{"language":"es","tag":"Modelo","count":377},{"language":"ja","tag":"Model","count":377},{"language":"ko","tag":"Model","count":377},{"language":"zh","tag":"Model","count":377},{"language":"en","tag":"Image","count":347},{"language":"en","tag":"Partner","count":322},{"language":"ja","tag":"Partner","count":322},{"language":"ko","tag":"Partner","count":322},{"language":"zh","tag":"Partner","count":322},{"language":"es","tag":"Partner","count":320},{"language":"es","tag":"Imagen","count":314},{"language":"ja","tag":"はじめに","count":299},{"language":"ko","tag":"시작하기","count":299},{"language":"zh","tag":"开始使用","count":299},{"language":"ja","tag":"API 開発","count":294},{"language":"ko","tag":"API 개발","count":294},{"language":"zh","tag":"API 开发","count":294},{"language":"en","tag":"Video","count":269},{"language":"es","tag":"Comfy Router","count":267},{"language":"ja","tag":"Comfy Router","count":257},{"language":"ko","tag":"Comfy Router","count":257},{"language":"zh","tag":"Comfy Router","count":257},{"language":"en","tag":"Comfy Router","count":253},{"language":"es","tag":"Video","count":244},{"language":"es","tag":"Models","count":230},{"language":"ja","tag":"Models","count":229},{"language":"ko","tag":"Models","count":229},{"language":"zh","tag":"Models","count":229},{"language":"es","tag":"All Models","count":227},{"language":"en","tag":"Models","count":225},{"language":"en","tag":"All Models","count":222},{"language":"ja","tag":"画像","count":202},{"language":"ko","tag":"이미지","count":202},{"language":"zh","tag":"图像","count":202},{"language":"ja","tag":"Video","count":177},{"language":"zh","tag":"Video","count":177},{"language":"ko","tag":"Video","count":160}],"searchSettings":{"maxResults":10}},"assistantConfig":{"enableStarterQuestions":false},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"custom.css","content":":root{--ink-900:#151417;--hub-shell-light:#f7f6f9;--accent-purple:#49378b;--accent-yellow:#f2ff59;--primary:73 55 139!important;--primary-light:242 255 89!important;--primary-dark:242 255 89!important}html.dark{--primary:242 255 89!important;--background-dark:14 14 13!important}html.dark body{background-color:#0e0e0d!important}html.dark #navbar,html.dark #navbar-transition{background-color:var(--ink-900)!important}html.dark #sidebar,html.dark #sidebar-content{background-color:rgb(var(--background-dark))!important}html.dark #navbar,html.dark #navbar-transition{box-shadow:none!important;filter:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important}html.dark #navbar-transition{border-bottom:1px solid rgba(255,255,255,.08)!important;opacity:1!important}html.dark img.nav-logo{filter:none}html.dark #sidebar-content a:not([aria-current=page]){color:rgba(255,255,255,.72)!important}html.dark #sidebar-content a:not([aria-current=page]) *{color:inherit!important}html.dark #sidebar-content a[aria-current=page]{color:var(--accent-yellow)!important;background-color:rgba(242,255,89,.1)!important}html.dark #sidebar-content a[aria-current=page] *{color:inherit!important}html.dark .nav-tabs-item[data-active],html.dark mobile-nav-tabs-item[data-active]{color:var(--accent-yellow)!important}html.dark #navbar a[href*=\"comfy.org/cloud\"] span.absolute{background-color:var(--accent-yellow)!important}html.dark #navbar a[href*=\"comfy.org/cloud\"] span.text-white{color:#151417!important}html:not(.dark) #background-color,html:not(.dark) #navbar,html:not(.dark) #navbar-transition,html:not(.dark) #sidebar,html:not(.dark) #sidebar-content{background-color:var(--hub-shell-light)!important}html:not(.dark) .nav-tabs-item[data-active],html:not(.dark) mobile-nav-tabs-item[data-active],html:not(.dark) nav-dropdown-item[data-active]{background-color:transparent!important;box-shadow:none!important;color:var(--accent-purple)!important;font-weight:600!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"] *,html:not(.dark) #sidebar-content a[aria-current=page] *,html:not(.dark) .nav-tabs-item[data-active] *,html:not(.dark) mobile-nav-tabs-item[data-active] *,html:not(.dark) nav-dropdown-item[data-active] *{color:inherit!important}html:not(.dark) #sidebar-content li:has(>a[aria-current=page]){background-color:transparent!important;box-shadow:none!important}html:not(.dark) #sidebar-content a[aria-current=page]{color:var(--accent-purple)!important;background-color:rgba(73,55,139,.1)!important;font-weight:600!important}html:not(.dark) toc-item[data-active-deepest],html:not(.dark) toc-item[data-active-deepest] a,html:not(.dark) toc-item[data-active],html:not(.dark) toc-item[data-active] a{background-color:transparent!important;color:var(--accent-purple)!important;font-weight:600!important}html:not(.dark) #content-area :where(h1, h2, h3, h4, h5, h6),html:not(.dark) #header :where(h1, h2, h3, h4, h5, h6){color:#151417!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"]{background-color:transparent!important;color:var(--accent-purple)!important;border-radius:.75rem;box-shadow:inset 0 0 0 1px var(--accent-purple)!important}html:not(.dark) #navbar a[href*=\"comfy.org/cloud\"] span.absolute{background-color:transparent!important}#sidebar .sticky.top-0.pointer-events-none.bg-linear-to-b{background-image:none!important}@media (min-width:1024px){#navbar.is-not-custom.is-not-center+div:has(>#sidebar),.max-w-8xl.mx-auto,.max-w-8xl.mx-auto.relative{max-width:none!important;width:100%!important;margin-left:0!important;margin-right:0!important;padding-left:0!important;padding-right:0!important}#navbar [class*=mx-4],#navbar [class*=px-12]{padding-left:0!important;padding-right:1.5rem!important;margin-left:0!important;margin-right:0!important}#navbar .nav-logo,#navbar a.select-none{margin-left:1rem!important}#navbar .nav-tabs{padding-left:2rem!important}#sidebar{left:0!important;margin-left:0!important;box-shadow:none!important}#sidebar-content{margin-left:0!important;padding-left:1rem!important;box-sizing:border-box!important}#navbar,#navbar-transition{left:0!important;right:0!important;width:100%!important;max-width:none!important}#content-area{margin-left:0!important;padding-left:18rem!important}#sidebar.sticky~#content-container #content-area{padding-left:2rem!important;padding-right:2rem!important}#body-content,#content-area,#content-container{max-width:none!important;width:100%!important}:root{--content-width:100%;--sidebar-width:18rem}#sidebar[style],nav#sidebar{left:0!important;right:auto!important;margin-left:0!important;transform:none!important}#navbar li.navbar-link:has(a[href*=\"comfy.org/download\"]){margin-right:0!important}#navbar a[href*=\"comfy.org/download\"]{box-sizing:border-box;border:1px solid rgb(255 255 255/.22);border-radius:.75rem;padding:7px .875rem!important;color:#fff!important;font-size:.875rem;line-height:1.25rem}html:not(.dark) #navbar a[href*=\"comfy.org/download\"]{border-color:rgb(0 0 0/.16);color:#151417!important}#navbar a[href*=\"comfy.org/download\"]:hover{background:rgb(255 255 255/.06)}html:not(.dark) #navbar a[href*=\"comfy.org/download\"]:hover{background:rgb(0 0 0/.04)}#navbar .flex.space-x-6>.whitespace-nowrap.hidden,#navbar li.navbar-link:has(a[href*=\"comfy.org/download\"])+.whitespace-nowrap{margin-left:.5rem!important}}body:has(.router-api-reference-marker) #content,body:has(.router-api-reference-marker) #header{max-width:48rem}body:has(.router-api-reference-marker) #content-area table,body:has(.router-provider-coverage-marker) #content-area table{width:100%;table-layout:auto}body:has(.router-api-reference-marker) #content-area td,body:has(.router-api-reference-marker) #content-area th{min-width:4rem!important;overflow-wrap:anywhere}body:has(.router-api-reference-marker) #content-area table:has(th:nth-child(6)) td:nth-child(3),body:has(.router-api-reference-marker) #content-area table:has(th:nth-child(6)) th:nth-child(3){min-width:5rem!important}@media (max-width:1535px){body:has(.router-api-reference-marker) #content-side-layout{display:none!important}}body:has(.router-provider-coverage-marker) #content,body:has(.router-provider-coverage-marker) #header{max-width:64rem}body:has(.router-provider-coverage-marker) #content-area td,body:has(.router-provider-coverage-marker) #content-area th{min-width:5rem!important;overflow-wrap:anywhere}body:has(.router-provider-coverage-marker) #content-area td:first-child,body:has(.router-provider-coverage-marker) #content-area th:first-child{min-width:12rem!important}body:has(.router-quickstart-marker) [data-component-part=card-content] [data-component-part=code-block-root][style*=\"height: 190px\"],body:has(.router-quickstart-marker) [data-component-part=card-content] [data-component-part=code-block-root][style*=\"height:190px\"]{height:86px!important}"},{"filePath":"samples-cards.css","content":".sample-card-grid{display:grid;gap:20px;grid-template-columns:repeat(2,minmax(0,1fr));margin-top:28px}.sample-card{min-width:0;perspective:1200px}.sample-card-inner{height:565px;position:relative;transform-style:preserve-3d;transition:transform 560ms cubic-bezier(.2,.75,.3,1)}.sample-card[data-flipped=true] .sample-card-inner{transform:rotateY(180deg)}.sample-card-face{backface-visibility:hidden;background:#fff;border:1px solid #e5e1eb;border-radius:12px;box-sizing:border-box;height:100%;inset:0;overflow:hidden;position:absolute;width:100%}.sample-card-front{display:flex;flex-direction:column}.sample-card-back{opacity:0;pointer-events:none;transform:rotateY(180deg);visibility:hidden}.sample-card[data-flipped=true] .sample-card-front{pointer-events:none;transition:visibility 0s linear 280ms;visibility:hidden}.sample-card[data-flipped=true][data-active-path=api] .sample-card-back[data-sample-path=api],.sample-card[data-flipped=true][data-active-path=endpoint] .sample-card-back[data-sample-path=endpoint]{opacity:1;pointer-events:auto;visibility:visible}.sample-card-preview{border-bottom:1px solid #e5e1eb;cursor:pointer;display:block;width:100%}.sample-card-body{display:flex;flex:1;flex-direction:column;padding:20px}.sample-card-body h2,.sample-path-body h2{color:#49378b;font-size:18px;font-weight:700;letter-spacing:-.02em;margin:0 0 8px}.sample-path-body h2{text-align:center}.sample-card-body>p{color:#5f5966;font-size:14px;line-height:1.55;margin:0;min-height:66px}.sample-card-actions,.sample-card-links{display:flex;gap:8px;margin-top:20px}.sample-card-actions button{background:#fff;border:1px solid #cfc8de;border-radius:6px;color:#49378b;cursor:pointer;flex:1;font-size:13px;font-weight:700;padding:10px 12px}.sample-card-links{border-top:1px solid #eeeaf1;margin-top:16px;padding-top:12px}.sample-card-links a{color:#625b6c;font-size:12px;font-weight:650;text-decoration:none}.sample-card-links span{color:#b3adba}.sample-path-body{padding:20px}.sample-path-body>button{background:0 0;border:0;color:#625b6c;cursor:pointer;font-size:12px;font-weight:700;padding:0}.sample-path-eyebrow{color:#857a9e;font-size:10px;font-weight:700;letter-spacing:.08em;margin:19px 0 5px;text-align:center;text-transform:uppercase}.sample-path-body>p:not(.sample-path-eyebrow){color:#5f5966;font-size:12px;line-height:1.5;margin:0 0 15px}.sample-path-steps{display:grid;gap:8px}.sample-path-step{align-items:center;background:#faf9fc;border:1px solid #e5e1ea;border-radius:8px;display:flex;gap:10px;padding:10px 11px}.sample-path-number{align-items:center;background:#49378b;border-radius:999px;color:#fff;display:inline-flex;flex:0 0 21px;font-size:11px;font-weight:700;height:21px;justify-content:center}.sample-path-copy{flex:1;min-width:0}.sample-path-copy strong{color:#312c36;display:block;font-size:12px}.sample-path-copy span{color:#706a75;display:block;font-size:11px;line-height:1.35;margin-top:2px}.sample-path-step a{color:#49378b;flex:0 0 auto;font-size:11px;font-weight:700;text-decoration:none}@media (max-width:768px){.sample-card-grid{grid-template-columns:1fr}.sample-card-inner{height:clamp(620px,180vw,760px)}}"}],"page":{"pagePath":"api-reference/router/comfy-router/list-the-models-comfy-router-can-run","slug":"/api-reference/router/comfy-router/list-the-models-comfy-router-can-run","pageMetadata":{"title":"List the models Comfy Router can run.","description":"Comfy Router's model catalog - one page of the canonical model IDs that `POST /v2/models/{provider}/{model}` accepts. An SDK calls this on cold start to discover what is runnable, and the `model_not_found` suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry's `provider` and `model` are the two path segments of the invocation route and reference the same schema components that route's path parameters do, and `id` is those two segments joined by `/`.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models","href":"/api-reference/router/comfy-router/list-the-models-comfy-router-can-run","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Comfy Router’s model catalog - one page of the canonical model IDs that \", _jsx(_components.code, {\n children: \"POST /v2/models/{provider}/{model}\"\n }), \" accepts. An SDK calls this on cold start to discover what is runnable, and the \", _jsx(_components.code, {\n children: \"model_not_found\"\n }), \" suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry’s \", _jsx(_components.code, {\n children: \"provider\"\n }), \" and \", _jsx(_components.code, {\n children: \"model\"\n }), \" are the two path segments of the invocation route and reference the same schema components that route’s path parameters do, and \", _jsx(_components.code, {\n children: \"id\"\n }), \" is those two segments joined by \", _jsx(_components.code, {\n children: \"/\"\n }), \".\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"List the models Comfy Router can run.","description":"Comfy Router's model catalog - one page of the canonical model IDs that `POST /v2/models/{provider}/{model}` accepts. An SDK calls this on cold start to discover what is runnable, and the `model_not_found` suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry's `provider` and `model` are the two path segments of the invocation route and reference the same schema components that route's path parameters do, and `id` is those two segments joined by `/`.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models","href":"/api-reference/router/comfy-router/list-the-models-comfy-router-can-run","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/dripart/9d6bf2b2531e904c/giscus-comments.js","/_mintlify/custom/dripart/bd0341946f3c75a6/syft.js","/_mintlify/custom/dripart/042392a43b5e681e/samples-cards.js"],"openApiReferenceData":{"operation":{"summary":"List the models Comfy Router can run.","description":"Comfy Router's model catalog - one page of the canonical model IDs that `POST /v2/models/{provider}/{model}` accepts. An SDK calls this on cold start to discover what is runnable, and the `model_not_found` suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry's `provider` and `model` are the two path segments of the invocation route and reference the same schema components that route's path parameters do, and `id` is those two segments joined by `/`.","operationId":"listRouterModels","tags":["Comfy Router"],"security":["f6dcf0c9-eef8-42af-936d-dbcbe3524235","5224f9e0-18d8-4926-914a-6ae92b8d810c"],"parameters":["5468d6df-2ce8-4ad8-a876-ae177357e9a0","ffef7cb4-b06a-4740-8eb8-5c32d98ba0e0","ac921786-bd04-43ec-90c2-03af000ded2f"],"responses":{"200":"210ea31a-23b2-452c-8c49-0ebe33181457","304":"c8ff74cf-a123-447c-a4ce-6ae5df514b7f","400":"f33cee3c-5068-4775-a817-02d53b5cbc12","401":"a7073b9d-0d18-4e56-b430-f53c099fdfb4","403":"26b4d055-dc34-4db4-a363-ee1d64547200","503":"495a7d24-5324-45ec-a374-09bd4b375737"},"method":"get","type":"path","servers":["f24065f5-ecd5-447b-a593-a7927e1a743a"],"path":"/v2/models","baseUrlOptions":["https://api.comfy.org"],"title":"List the models Comfy Router can run.","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"5468d6df-2ce8-4ad8-a876-ae177357e9a0":{"name":"cursor","in":"query","required":false,"description":"Opaque pagination cursor. Pass a previous page's `next_cursor` to fetch the next page; omit it for the first page. See `RouterPageCursor` for why the value is opaque and why this route paginates by cursor rather than by offset.","schema":{"type":"string","description":"Opaque pagination cursor. Pass a previous page's `next_cursor` to fetch the next page; omit it for the first page. See `RouterPageCursor` for why the value is opaque and why this route paginates by cursor rather than by offset.\nAn opaque cursor into a Router list. It is produced by the server and only ever round-tripped: it is not an offset, not a model ID, not ordered, and not stable across catalog rebuilds, so parsing one, incrementing one, or persisting one beyond the walk it came from are all outside the contract. Cursor rather than offset because the catalog is a moving list - an offset walk silently skips or repeats entries when entries are added or removed mid-walk, and a caller cannot tell that it happened.","pattern":"^[A-Za-z0-9._~+/=-]+$","minLength":1,"maxLength":512,"example":"q7Fm2xTn9pLd4RsV","isRequired":false,"uniqueKey":"","typeLabel":"string"}},"ffef7cb4-b06a-4740-8eb8-5c32d98ba0e0":{"name":"limit","in":"query","required":false,"description":"Number of models to return in one page. Values above the declared maximum are outside the contract, but this route does not reject them: it serves the maximum instead, and the page size actually served is echoed back as `limit` on the response, so a clamp is always detectable by the caller. Treat the maximum as the real page stride - a client that asks for more and assumes it received more will miss rows. 0 and negative values are also accepted and select the default, which is why no `minimum` is declared: sub-1 is meaningful here, not invalid.","schema":{"type":"integer","maximum":100,"default":20,"isRequired":false,"description":"Number of models to return in one page. Values above the declared maximum are outside the contract, but this route does not reject them: it serves the maximum instead, and the page size actually served is echoed back as `limit` on the response, so a clamp is always detectable by the caller. Treat the maximum as the real page stride - a client that asks for more and assumes it received more will miss rows. 0 and negative values are also accepted and select the default, which is why no `minimum` is declared: sub-1 is meaningful here, not invalid.","uniqueKey":"","typeLabel":"integer"}},"ac921786-bd04-43ec-90c2-03af000ded2f":{"in":"header","name":"If-None-Match","required":false,"description":"The `ETag` a caller holds from an earlier `200`. When it matches the current page (RFC 9110 weak comparison; `*` matches any current page) the answer is a bodyless `304` carrying the same `ETag`, otherwise the full page.","schema":{"type":"string","isRequired":false,"description":"The `ETag` a caller holds from an earlier `200`. When it matches the current page (RFC 9110 weak comparison; `*` matches any current page) the answer is a bodyless `304` carrying the same `ETag`, otherwise the full page.","uniqueKey":"","typeLabel":"string"}}},"responses":{"210ea31a-23b2-452c-8c49-0ebe33181457":{"description":"OK - one page of the model catalog.","headers":{"X-Comfy-Request-Id":{"description":"Server-generated identifier for this call, present on every Router response - success, 4xx and 5xx alike, because an error response is exactly when a user needs an id to quote in a support request. The same value is written into the call's usage/audit event, which is what lets a complaint about a charge be joined to the charge itself instead of searched for by timestamp.","required":true,"schema":{"type":"string","format":"uuid","example":"6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21"}},"ETag":{"description":"Strong entity tag over the served body's bytes, for `GET /v2/models` and `GET /v2/models/{provider}/{model}`. A caller that re-reads the catalog should store this value and send it back as `If-None-Match` to get a `304` instead of the body.","required":true,"schema":{"type":"string","example":"\"6b8c1f2e0a9d4c3b5e7f8a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f\""}},"Cache-Control":{"description":"Freshness directives for a catalog page or entry. `private` because the answer is decided per credential (the response also carries `Vary: Authorization, X-API-Key`), so a shared cache must not hold it, and `must-revalidate` so a stale copy is revalidated against the `ETag` rather than served on. Error responses on these routes are `private, no-store` instead.","required":false,"schema":{"type":"string","example":"private, max-age=300, must-revalidate"}}},"content":{"application/json":{"schema":{"type":"object","description":"One page of the Router model catalog.","properties":{"data":{"type":"array","description":"The models on this page, at most `limit` of them.","items":{"type":"object","description":"One entry in the Router model catalog: the identity of a runnable model, and nothing else. The per-model detail route composes this same entry rather than restating it, which is why the name is `...ListEntry` and not `...Summary` - there must be exactly one definition of what a catalog entry is. Per-model detail and the per-model input/output schemas are their own routes, so this shape stays the minimum a caller needs in order to invoke the model - deliberately, because this is the payload an SDK fetches on cold start. `id` is `provider` and `model` joined by `/`; the two fields are carried separately as well so a caller composes the invocation path without splitting a string.","properties":{"id":{"type":"string","description":"A canonical Comfy Router model ID, `{provider}/{model}` - exactly the value that addresses the model on `POST /v2/models/{provider}/{model}`, so a caller can interpolate it into that path without re-deriving it from anything. Its `pattern` is `RouterProviderSegment` and `RouterModelSegment` joined by a single `/`, and `maxLength` is their sum plus that separator.","pattern":"^[a-z0-9]+([._-][a-z0-9]+)*/[a-z0-9]+([._-][a-z0-9]+)*$","maxLength":193,"example":"bfl/flux-2-pro","isRequired":true,"uniqueKey":"data.items.[INDEX].id","typeLabel":"string"},"provider":{"type":"string","description":"Lowercase `provider` segment of the canonical `{provider}/{model}` model ID - the partner whose model is being addressed. The invocation route's `provider` path parameter and a catalog entry's `provider` field both reference this one schema, which is what keeps the listed IDs and the accepted IDs from drifting apart.","pattern":"^[a-z0-9]+([._-][a-z0-9]+)*$","maxLength":64,"example":"bfl","isRequired":true,"uniqueKey":"data.items.[INDEX].provider","typeLabel":"string"},"model":{"type":"string","description":"Lowercase `model` segment of the canonical `{provider}/{model}` model ID - the model to run within that provider. Shared by the invocation route's `model` path parameter and a catalog entry's `model` field, for the same no-drift reason as `RouterProviderSegment`.","pattern":"^[a-z0-9]+([._-][a-z0-9]+)*$","maxLength":128,"example":"flux-2-pro","isRequired":true,"uniqueKey":"data.items.[INDEX].model","typeLabel":"string"},"billing":{"type":"object","description":"Per-model billing facts a caller needs before invoking - not prices. Usage and cost figures never appear here.","properties":{"charges_on_policy_rejection":{"type":"string","description":"Whether a call this model refuses on content-policy grounds is nevertheless charged to the caller. Providers differ, the difference is invisible at call time, and a user who sees an error and a charge for the same call has no way to have known - so it is stated per model, before the call, rather than left to per-provider folklore.","example":"unknown","isRequired":true,"uniqueKey":"data.items.[INDEX].billing.charges_on_policy_rejection","typeLabel":"string"}},"required":["charges_on_policy_rejection"],"isRequired":true,"uniqueKey":"data.items.[INDEX].billing","typeLabel":"object"},"schema_etag":{"type":"string","description":"The current strong `ETag` of this model's `GET /v2/models/{provider}/{model}/openapi.json` document. Send it as `If-None-Match` on that read to get a `304` while the schema is unchanged, or compare it with the value seen last time to learn which models' schemas changed without fetching every document. Absent whenever that read would not answer `200` for this caller at this moment: the schema service is not available, the model's document cannot be rendered, or the model stopped being available to this caller while the response was being built. An absent tag is not a schema change; re-read the model's document to learn its current tag.","example":"\"9f2c1e0b7a4d3c6e8f5a2b1d0c9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e\"","uniqueKey":"data.items.[INDEX].schema_etag","typeLabel":"string"}},"required":["id","provider","model","billing"],"uniqueKey":"data.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"data","typeLabel":"object[]"},"has_more":{"type":"boolean","description":"Whether another page exists beyond this one. Keep walking while this is true; do not infer the end of the catalog from a short or empty `data`.","isRequired":true,"uniqueKey":"has_more","typeLabel":"boolean"},"limit":{"type":"integer","description":"The page size actually served. A requested `limit` above the maximum is clamped down to the maximum rather than rejected, so this can be smaller than the value asked for - paginate with this number, not with the one you sent, or you will assume rows you never received.","minimum":1,"maximum":100,"example":20,"isRequired":true,"uniqueKey":"limit","typeLabel":"integer"},"next_cursor":{"type":"string","description":"An opaque cursor into a Router list. It is produced by the server and only ever round-tripped: it is not an offset, not a model ID, not ordered, and not stable across catalog rebuilds, so parsing one, incrementing one, or persisting one beyond the walk it came from are all outside the contract. Cursor rather than offset because the catalog is a moving list - an offset walk silently skips or repeats entries when entries are added or removed mid-walk, and a caller cannot tell that it happened.","pattern":"^[A-Za-z0-9._~+/=-]+$","minLength":1,"maxLength":512,"example":"q7Fm2xTn9pLd4RsV","uniqueKey":"next_cursor","typeLabel":"string"}},"required":["data","has_more","limit"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":[{"id":"bfl/flux-2-pro","provider":"bfl","model":"flux-2-pro","billing":{"charges_on_policy_rejection":"unknown"},"schema_etag":"\"9f2c1e0b7a4d3c6e8f5a2b1d0c9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e\""}],"has_more":true,"limit":20,"next_cursor":"q7Fm2xTn9pLd4RsV"}}},"exampleType":"generated"}},"exampleType":"generated"},"c8ff74cf-a123-447c-a4ce-6ae5df514b7f":{"description":"Not Modified - the page is unchanged since the `ETag` the caller sent in `If-None-Match`. No body is returned.","headers":{"X-Comfy-Request-Id":{"description":"Server-generated identifier for this call, present on every Router response - success, 4xx and 5xx alike, because an error response is exactly when a user needs an id to quote in a support request. The same value is written into the call's usage/audit event, which is what lets a complaint about a charge be joined to the charge itself instead of searched for by timestamp.","required":true,"schema":{"type":"string","format":"uuid","example":"6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21"}},"ETag":{"description":"Strong entity tag over the served body's bytes, for `GET /v2/models` and `GET /v2/models/{provider}/{model}`. A caller that re-reads the catalog should store this value and send it back as `If-None-Match` to get a `304` instead of the body.","required":true,"schema":{"type":"string","example":"\"6b8c1f2e0a9d4c3b5e7f8a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f\""}},"Cache-Control":{"description":"Freshness directives for a catalog page or entry. `private` because the answer is decided per credential (the response also carries `Vary: Authorization, X-API-Key`), so a shared cache must not hold it, and `must-revalidate` so a stale copy is revalidated against the `ETag` rather than served on. Error responses on these routes are `private, no-store` instead.","required":false,"schema":{"type":"string","example":"private, max-age=300, must-revalidate"}}},"content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"f33cee3c-5068-4775-a817-02d53b5cbc12":{"description":"A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. The body is `RouterErrorResponse` and the bucket is repeated on `X-Comfy-Error-Type`.","headers":{"X-Comfy-Error-Type":{"description":"Coarse, machine-readable bucket for the failure, set by Router on every error response. It carries the same value as `RouterErrorResponse.error_type`, and on the `422` it is the only machine-readable bucket, because that body is the FastAPI `detail[]` shape and has no `error_type` field of its own. A client can therefore branch on this header alone, before deciding which of the two Router error bodies it received.","required":true,"schema":{"type":"string","description":"Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at nineteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable`, `rate_limited`, `cancelled`, `queue_timeout`, `request_not_found` and `queue_backlog_full`. Closed describes the set as documented today, not a bound that holds forever: the set is expected to grow, which is why this is deliberately a plain string and not an `enum`, so a client must treat an unrecognised value as `internal_error` rather than switch exhaustively over the list above and break on the next addition.","example":"invalid_input","x-comfy-error-types":[{"value":"invalid_input","tier":"request","meaning":"The request was rejected before it reached the model - a malformed body, a malformed or expired pagination cursor, an input the model's own schema does not accept, or an `Idempotency-Key` that cannot serve this request (already used for a different request - the method, the path and query, or the body differ - or already consumed by a call whose response cannot be replayed). Sent with `409` in the key cases and with `400`/`422` in the others; the status says which, and the key cases are the ones answered by using a new key rather than by editing the request."},{"value":"content_policy_violation","tier":"request","meaning":"The provider refused the request on content-policy grounds. The refusal is deterministic: re-sending the same input will be refused again."},{"value":"provider_error","tier":"request","meaning":"The partner provider reported a failure of its own, or returned a response Router could not interpret as a result."},{"value":"provider_timeout","tier":"request","meaning":"The partner provider did not answer within its deadline. This bucket is the provider timing out and never Router's own server deadline, which is reported as `deadline_exceeded` - the two share `504` and are separated because they name different causes: this one says the partner failed, that one says Comfy stopped holding the connection."},{"value":"insufficient_credits","tier":"request","meaning":"The calling workspace does not have enough credits to run the model."},{"value":"model_not_found","tier":"request","meaning":"The `{provider}/{model}` ID names no model Router can run: an unknown provider, an unenrolled id, one the catalog has retired past its sunset date, or a catalogued ID the provider does not currently serve for Comfy. A retired id's `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and not withheld, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of a suggestion list; the successor named for a retired id is always a live catalog ID you can re-point the call at, and a successor is dropped from `detail` either because the table records none, or because the recorded one is currently withheld behind an embargo the caller cannot see. A model whose sunset is still in the future is not withdrawn: it stays listed by `GET /v2/models` and stays runnable until the date, so a listing taken today remains the answer to what runs today. Otherwise `detail` carries up to three suggestions drawn from the models the caller is entitled to see, except for a catalogued ID the provider does not currently serve for Comfy, whose response carries no suggestions."},{"value":"unauthorized","tier":"transport","meaning":"The request carried no usable credential."},{"value":"forbidden","tier":"transport","meaning":"The credential is valid but is not entitled to this model or this operation."},{"value":"concurrency_limit_exceeded","tier":"transport","meaning":"The workspace already has as many calls in flight as it is allowed; retry once one of them finishes. It carries one further condition on the run route, on a `409` rather than the `429` above: another call is already in flight for the `Idempotency-Key` this request presented. Re-send the same key after `Retry-After` seconds to collect that call's result."},{"value":"client_disconnected","tier":"transport","meaning":"The caller closed the connection before Router could return a result. It is logged rather than delivered - there is no socket left to write it to - and it is an attribution, not a billing outcome: a provider generation that completed is billed regardless of whether the caller received the response."},{"value":"internal_error","tier":"transport","meaning":"Router itself failed. It is also the value a client should treat any unrecognized bucket as, so a later addition to the set does not break a client generated before it."},{"value":"deadline_exceeded","tier":"transport","meaning":"Comfy stopped holding the connection at its own configured bound before an answer arrived. It shares `504` with `provider_timeout` and the pair says which side ran out of time; this one is Comfy's own bound, so nothing about the request was rejected and the same request may be retried. It says nothing about the charge: a provider generation that completed is billed regardless of whether the caller received the response. Retry it with the same `Idempotency-Key`: when the provider had already accepted the generation, the retry collects that generation rather than dispatching another, and a `Retry-After` on the `504` says when to ask."},{"value":"not_enabled","tier":"transport","meaning":"Comfy Router is not switched on for this caller yet. Nothing about the request is wrong and the model exists, which is why this is not `model_not_found`; it shares `403` with `forbidden` and is not the same thing, because `forbidden` is an entitlement decision about the caller while this is a state of the rollout. It is terminal: do not retry, and do not treat it as an outage. The one exception to \"about the caller\" is the queued submit, which also answers `not_enabled` for a model whose partner answers a generation directly as bytes: that model cannot yet be queued, so it is the model and not the caller that is refused, nothing is queued or charged, and the synchronous route `POST /v2/models/{provider}/{model}` runs it instead."},{"value":"service_unavailable","tier":"transport","meaning":"A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. Retry it with backoff: it is the one bucket here whose condition clears on its own, without the caller changing the request and without a concurrency slot freeing, which is what distinguishes it from the other retryable answers (`concurrency_limit_exceeded`, `deadline_exceeded`). It is separate from `internal_error` - which is a `500` and means Router itself failed - so a client can tell \"come back shortly\" from \"this call is not going to work\"."},{"value":"rate_limited","tier":"transport","meaning":"The caller has spent an allowance measured over a window and must wait for that window to roll. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one clears the moment one of the caller's own in-flight calls finishes, so retrying in seconds is right, whereas nothing the caller does drains this one early. `detail` names the window."},{"value":"cancelled","tier":"transport","meaning":"A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. Cancelling stops Comfy waiting and it does not always stop the partner working, so a request cancelled while it was still `IN_QUEUE` was never dispatched and cannot be charged, whereas one cancelled after it was admitted may still be charged — a partner generation that completes is charged whether or not anyone collected it, which is why the cancel route calls the ask a request rather than a guarantee. It is not `client_disconnected`: that one says nobody is listening any more while a generation may still be running and billable, whereas this says the request itself was withdrawn. A caller polling the status read sees `200` with this in the body, because the request ended and so the read succeeded. Collecting the result of such a request answers `409` in Router's error envelope: that read also worked, and what it found is a request whose terminal state - the caller's own decision - leaves nothing to return. It is deliberately not `410`, which on that route means the result aged out of its retention window, and not a `5xx`, which would report the caller's own cancellation as a Router fault and read to a polling client as worth retrying."},{"value":"queue_timeout","tier":"transport","meaning":"A queued request waited past its queue timeout without ever being admitted. Terminal, unbilled, and it never took a concurrency slot — the job never reached a provider. Deliberately not `deadline_exceeded`, which is the synchronous route's connection bound: a `deadline_exceeded` generation may be running and billable, whereas this one provably never started. It is returned under `504`, which it shares with `provider_timeout` and `deadline_exceeded` because a status can only say that a clock ran out; which clock - the partner's, Comfy's connection bound, or the queue's admission bound - is what `error_type` carries. The request itself is terminal, so submit a new one rather than re-reading this one."},{"value":"request_not_found","tier":"transport","meaning":"The `request_id` names no request of the caller's under this model. It is the second of the two conditions the queued reads' `404` covers; the first is the `{provider}/{model}` ID resolving to no partner model, which is `model_not_found` and carries fuzzy model suggestions. It also covers the right-id / wrong-model URL the path shape refuses, and it is deliberately indistinguishable from a request in another workspace, so a probe with a guessed id learns nothing. A request that has merely aged out of its retention window is `410`, not this."},{"value":"queue_backlog_full","tier":"transport","meaning":"The caller already has too many queued requests waiting to run, so this submit was refused. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one is the synchronous route's answer for too many calls in flight at once, whereas the queue accepts a submit at that limit and parks it, and this bucket is the separate bound on how many a caller may leave waiting so that parking cannot mean enqueuing without end. It clears as the caller's own queued requests finish, so retry once some of them complete."}]}},"X-Comfy-Request-Id":{"description":"Server-generated identifier for this call, present on every Router response - success, 4xx and 5xx alike, because an error response is exactly when a user needs an id to quote in a support request. The same value is written into the call's usage/audit event, which is what lets a complaint about a charge be joined to the charge itself instead of searched for by timestamp.","required":true,"schema":{"type":"string","format":"uuid","example":"6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21"}}},"content":{"application/json":{"schema":{"type":"object","description":"Router's request-level error body: what is returned when the request never reached the model, or failed for a reason the model itself did not report - auth, quota, an unknown model ID, or provider transport. A model-level validation failure has its own shape, `RouterValidationErrorResponse`, because flattening a FastAPI `detail[]` array into this `detail` string would destroy the per-field granularity an SDK branches on.","properties":{"detail":{"type":"string","description":"Human-readable description of the failure, safe to surface to an end user. Not machine-parsed - branch on `error_type` instead. For `model_not_found` on a retired model, `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and visible to the caller, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of the usual suggestion list. A successor named here is always a live catalog ID the call can be re-pointed at. A model whose sunset date is still in the future is not retired: it stays listed by `GET /v2/models` and stays runnable until that date. Like the rest of `detail`, this retirement wording is for display and carries no compatibility guarantee.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_type":{"type":"string","description":"Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at nineteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable`, `rate_limited`, `cancelled`, `queue_timeout`, `request_not_found` and `queue_backlog_full`. Closed describes the set as documented today, not a bound that holds forever: the set is expected to grow, which is why this is deliberately a plain string and not an `enum`, so a client must treat an unrecognised value as `internal_error` rather than switch exhaustively over the list above and break on the next addition.","example":"invalid_input","x-comfy-error-types":[{"value":"invalid_input","tier":"request","meaning":"The request was rejected before it reached the model - a malformed body, a malformed or expired pagination cursor, an input the model's own schema does not accept, or an `Idempotency-Key` that cannot serve this request (already used for a different request - the method, the path and query, or the body differ - or already consumed by a call whose response cannot be replayed). Sent with `409` in the key cases and with `400`/`422` in the others; the status says which, and the key cases are the ones answered by using a new key rather than by editing the request."},{"value":"content_policy_violation","tier":"request","meaning":"The provider refused the request on content-policy grounds. The refusal is deterministic: re-sending the same input will be refused again."},{"value":"provider_error","tier":"request","meaning":"The partner provider reported a failure of its own, or returned a response Router could not interpret as a result."},{"value":"provider_timeout","tier":"request","meaning":"The partner provider did not answer within its deadline. This bucket is the provider timing out and never Router's own server deadline, which is reported as `deadline_exceeded` - the two share `504` and are separated because they name different causes: this one says the partner failed, that one says Comfy stopped holding the connection."},{"value":"insufficient_credits","tier":"request","meaning":"The calling workspace does not have enough credits to run the model."},{"value":"model_not_found","tier":"request","meaning":"The `{provider}/{model}` ID names no model Router can run: an unknown provider, an unenrolled id, one the catalog has retired past its sunset date, or a catalogued ID the provider does not currently serve for Comfy. A retired id's `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and not withheld, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of a suggestion list; the successor named for a retired id is always a live catalog ID you can re-point the call at, and a successor is dropped from `detail` either because the table records none, or because the recorded one is currently withheld behind an embargo the caller cannot see. A model whose sunset is still in the future is not withdrawn: it stays listed by `GET /v2/models` and stays runnable until the date, so a listing taken today remains the answer to what runs today. Otherwise `detail` carries up to three suggestions drawn from the models the caller is entitled to see, except for a catalogued ID the provider does not currently serve for Comfy, whose response carries no suggestions."},{"value":"unauthorized","tier":"transport","meaning":"The request carried no usable credential."},{"value":"forbidden","tier":"transport","meaning":"The credential is valid but is not entitled to this model or this operation."},{"value":"concurrency_limit_exceeded","tier":"transport","meaning":"The workspace already has as many calls in flight as it is allowed; retry once one of them finishes. It carries one further condition on the run route, on a `409` rather than the `429` above: another call is already in flight for the `Idempotency-Key` this request presented. Re-send the same key after `Retry-After` seconds to collect that call's result."},{"value":"client_disconnected","tier":"transport","meaning":"The caller closed the connection before Router could return a result. It is logged rather than delivered - there is no socket left to write it to - and it is an attribution, not a billing outcome: a provider generation that completed is billed regardless of whether the caller received the response."},{"value":"internal_error","tier":"transport","meaning":"Router itself failed. It is also the value a client should treat any unrecognized bucket as, so a later addition to the set does not break a client generated before it."},{"value":"deadline_exceeded","tier":"transport","meaning":"Comfy stopped holding the connection at its own configured bound before an answer arrived. It shares `504` with `provider_timeout` and the pair says which side ran out of time; this one is Comfy's own bound, so nothing about the request was rejected and the same request may be retried. It says nothing about the charge: a provider generation that completed is billed regardless of whether the caller received the response. Retry it with the same `Idempotency-Key`: when the provider had already accepted the generation, the retry collects that generation rather than dispatching another, and a `Retry-After` on the `504` says when to ask."},{"value":"not_enabled","tier":"transport","meaning":"Comfy Router is not switched on for this caller yet. Nothing about the request is wrong and the model exists, which is why this is not `model_not_found`; it shares `403` with `forbidden` and is not the same thing, because `forbidden` is an entitlement decision about the caller while this is a state of the rollout. It is terminal: do not retry, and do not treat it as an outage. The one exception to \"about the caller\" is the queued submit, which also answers `not_enabled` for a model whose partner answers a generation directly as bytes: that model cannot yet be queued, so it is the model and not the caller that is refused, nothing is queued or charged, and the synchronous route `POST /v2/models/{provider}/{model}` runs it instead."},{"value":"service_unavailable","tier":"transport","meaning":"A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. Retry it with backoff: it is the one bucket here whose condition clears on its own, without the caller changing the request and without a concurrency slot freeing, which is what distinguishes it from the other retryable answers (`concurrency_limit_exceeded`, `deadline_exceeded`). It is separate from `internal_error` - which is a `500` and means Router itself failed - so a client can tell \"come back shortly\" from \"this call is not going to work\"."},{"value":"rate_limited","tier":"transport","meaning":"The caller has spent an allowance measured over a window and must wait for that window to roll. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one clears the moment one of the caller's own in-flight calls finishes, so retrying in seconds is right, whereas nothing the caller does drains this one early. `detail` names the window."},{"value":"cancelled","tier":"transport","meaning":"A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. Cancelling stops Comfy waiting and it does not always stop the partner working, so a request cancelled while it was still `IN_QUEUE` was never dispatched and cannot be charged, whereas one cancelled after it was admitted may still be charged — a partner generation that completes is charged whether or not anyone collected it, which is why the cancel route calls the ask a request rather than a guarantee. It is not `client_disconnected`: that one says nobody is listening any more while a generation may still be running and billable, whereas this says the request itself was withdrawn. A caller polling the status read sees `200` with this in the body, because the request ended and so the read succeeded. Collecting the result of such a request answers `409` in Router's error envelope: that read also worked, and what it found is a request whose terminal state - the caller's own decision - leaves nothing to return. It is deliberately not `410`, which on that route means the result aged out of its retention window, and not a `5xx`, which would report the caller's own cancellation as a Router fault and read to a polling client as worth retrying."},{"value":"queue_timeout","tier":"transport","meaning":"A queued request waited past its queue timeout without ever being admitted. Terminal, unbilled, and it never took a concurrency slot — the job never reached a provider. Deliberately not `deadline_exceeded`, which is the synchronous route's connection bound: a `deadline_exceeded` generation may be running and billable, whereas this one provably never started. It is returned under `504`, which it shares with `provider_timeout` and `deadline_exceeded` because a status can only say that a clock ran out; which clock - the partner's, Comfy's connection bound, or the queue's admission bound - is what `error_type` carries. The request itself is terminal, so submit a new one rather than re-reading this one."},{"value":"request_not_found","tier":"transport","meaning":"The `request_id` names no request of the caller's under this model. It is the second of the two conditions the queued reads' `404` covers; the first is the `{provider}/{model}` ID resolving to no partner model, which is `model_not_found` and carries fuzzy model suggestions. It also covers the right-id / wrong-model URL the path shape refuses, and it is deliberately indistinguishable from a request in another workspace, so a probe with a guessed id learns nothing. A request that has merely aged out of its retention window is `410`, not this."},{"value":"queue_backlog_full","tier":"transport","meaning":"The caller already has too many queued requests waiting to run, so this submit was refused. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one is the synchronous route's answer for too many calls in flight at once, whereas the queue accepts a submit at that limit and parks it, and this bucket is the separate bound on how many a caller may leave waiting so that parking cannot mean enqueuing without end. It clears as the caller's own queued requests finish, so retry once some of them complete."}],"isRequired":true,"uniqueKey":"error_type","typeLabel":"string"},"upstream_detail":{"type":"string","description":"A bounded, sanitized reason the model provider gave for rejecting the request, present only when `error_type` is `invalid_input` and `X-Comfy-Upstream-Status` is a provider `4xx` or `2xx` - i.e. the provider refused the request as malformed and said why. Usually that status is a `4xx`; it is a `2xx` for a provider that reports a rejected generation inside a success envelope (a BytePlus failed-task poll is HTTP `200` with the reason in its body). Absent on every other failure, including provider `5xx`, transport failures, content-policy refusals and any refusal Router raised about itself. It mirrors the `X-Comfy-Upstream-Detail` header.","uniqueKey":"upstream_detail","typeLabel":"string"},"refusal_subject":{"type":"string","description":"Which input or output a content-policy refusal was about, as a Router-level closed vocabulary: `input`, `output`, `input_text`, `input_image`, `input_video`, `input_audio`, `output_text`, `output_image`, `output_video`, `output_audio`. The bare `input` / `output` values name the side when the provider did not name a modality. Present only when `error_type` is `content_policy_violation` and the provider named the refused subject with a machine-readable code; absent otherwise. Never provider text. Named today for BytePlus, Runway, BFL, Gemini, Veo, Vertex, xAI and Wan refusals, and for the MiniMax Router's Nano Banana legs' Gemini refusals; a provider whose refusal does not say which side it was about leaves it absent. It mirrors the `X-Comfy-Refusal-Subject` header.","uniqueKey":"refusal_subject","typeLabel":"string"}},"required":["detail","error_type"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":"\u003cstring>","error_type":"invalid_input","upstream_detail":"\u003cstring>","refusal_subject":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"a7073b9d-0d18-4e56-b430-f53c099fdfb4":{"description":"A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. The body is `RouterErrorResponse` and the bucket is repeated on `X-Comfy-Error-Type`.","headers":{"X-Comfy-Error-Type":{"description":"Coarse, machine-readable bucket for the failure, set by Router on every error response. It carries the same value as `RouterErrorResponse.error_type`, and on the `422` it is the only machine-readable bucket, because that body is the FastAPI `detail[]` shape and has no `error_type` field of its own. A client can therefore branch on this header alone, before deciding which of the two Router error bodies it received.","required":true,"schema":{"type":"string","description":"Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at nineteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable`, `rate_limited`, `cancelled`, `queue_timeout`, `request_not_found` and `queue_backlog_full`. Closed describes the set as documented today, not a bound that holds forever: the set is expected to grow, which is why this is deliberately a plain string and not an `enum`, so a client must treat an unrecognised value as `internal_error` rather than switch exhaustively over the list above and break on the next addition.","example":"invalid_input","x-comfy-error-types":[{"value":"invalid_input","tier":"request","meaning":"The request was rejected before it reached the model - a malformed body, a malformed or expired pagination cursor, an input the model's own schema does not accept, or an `Idempotency-Key` that cannot serve this request (already used for a different request - the method, the path and query, or the body differ - or already consumed by a call whose response cannot be replayed). Sent with `409` in the key cases and with `400`/`422` in the others; the status says which, and the key cases are the ones answered by using a new key rather than by editing the request."},{"value":"content_policy_violation","tier":"request","meaning":"The provider refused the request on content-policy grounds. The refusal is deterministic: re-sending the same input will be refused again."},{"value":"provider_error","tier":"request","meaning":"The partner provider reported a failure of its own, or returned a response Router could not interpret as a result."},{"value":"provider_timeout","tier":"request","meaning":"The partner provider did not answer within its deadline. This bucket is the provider timing out and never Router's own server deadline, which is reported as `deadline_exceeded` - the two share `504` and are separated because they name different causes: this one says the partner failed, that one says Comfy stopped holding the connection."},{"value":"insufficient_credits","tier":"request","meaning":"The calling workspace does not have enough credits to run the model."},{"value":"model_not_found","tier":"request","meaning":"The `{provider}/{model}` ID names no model Router can run: an unknown provider, an unenrolled id, one the catalog has retired past its sunset date, or a catalogued ID the provider does not currently serve for Comfy. A retired id's `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and not withheld, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of a suggestion list; the successor named for a retired id is always a live catalog ID you can re-point the call at, and a successor is dropped from `detail` either because the table records none, or because the recorded one is currently withheld behind an embargo the caller cannot see. A model whose sunset is still in the future is not withdrawn: it stays listed by `GET /v2/models` and stays runnable until the date, so a listing taken today remains the answer to what runs today. Otherwise `detail` carries up to three suggestions drawn from the models the caller is entitled to see, except for a catalogued ID the provider does not currently serve for Comfy, whose response carries no suggestions."},{"value":"unauthorized","tier":"transport","meaning":"The request carried no usable credential."},{"value":"forbidden","tier":"transport","meaning":"The credential is valid but is not entitled to this model or this operation."},{"value":"concurrency_limit_exceeded","tier":"transport","meaning":"The workspace already has as many calls in flight as it is allowed; retry once one of them finishes. It carries one further condition on the run route, on a `409` rather than the `429` above: another call is already in flight for the `Idempotency-Key` this request presented. Re-send the same key after `Retry-After` seconds to collect that call's result."},{"value":"client_disconnected","tier":"transport","meaning":"The caller closed the connection before Router could return a result. It is logged rather than delivered - there is no socket left to write it to - and it is an attribution, not a billing outcome: a provider generation that completed is billed regardless of whether the caller received the response."},{"value":"internal_error","tier":"transport","meaning":"Router itself failed. It is also the value a client should treat any unrecognized bucket as, so a later addition to the set does not break a client generated before it."},{"value":"deadline_exceeded","tier":"transport","meaning":"Comfy stopped holding the connection at its own configured bound before an answer arrived. It shares `504` with `provider_timeout` and the pair says which side ran out of time; this one is Comfy's own bound, so nothing about the request was rejected and the same request may be retried. It says nothing about the charge: a provider generation that completed is billed regardless of whether the caller received the response. Retry it with the same `Idempotency-Key`: when the provider had already accepted the generation, the retry collects that generation rather than dispatching another, and a `Retry-After` on the `504` says when to ask."},{"value":"not_enabled","tier":"transport","meaning":"Comfy Router is not switched on for this caller yet. Nothing about the request is wrong and the model exists, which is why this is not `model_not_found`; it shares `403` with `forbidden` and is not the same thing, because `forbidden` is an entitlement decision about the caller while this is a state of the rollout. It is terminal: do not retry, and do not treat it as an outage. The one exception to \"about the caller\" is the queued submit, which also answers `not_enabled` for a model whose partner answers a generation directly as bytes: that model cannot yet be queued, so it is the model and not the caller that is refused, nothing is queued or charged, and the synchronous route `POST /v2/models/{provider}/{model}` runs it instead."},{"value":"service_unavailable","tier":"transport","meaning":"A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. Retry it with backoff: it is the one bucket here whose condition clears on its own, without the caller changing the request and without a concurrency slot freeing, which is what distinguishes it from the other retryable answers (`concurrency_limit_exceeded`, `deadline_exceeded`). It is separate from `internal_error` - which is a `500` and means Router itself failed - so a client can tell \"come back shortly\" from \"this call is not going to work\"."},{"value":"rate_limited","tier":"transport","meaning":"The caller has spent an allowance measured over a window and must wait for that window to roll. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one clears the moment one of the caller's own in-flight calls finishes, so retrying in seconds is right, whereas nothing the caller does drains this one early. `detail` names the window."},{"value":"cancelled","tier":"transport","meaning":"A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. Cancelling stops Comfy waiting and it does not always stop the partner working, so a request cancelled while it was still `IN_QUEUE` was never dispatched and cannot be charged, whereas one cancelled after it was admitted may still be charged — a partner generation that completes is charged whether or not anyone collected it, which is why the cancel route calls the ask a request rather than a guarantee. It is not `client_disconnected`: that one says nobody is listening any more while a generation may still be running and billable, whereas this says the request itself was withdrawn. A caller polling the status read sees `200` with this in the body, because the request ended and so the read succeeded. Collecting the result of such a request answers `409` in Router's error envelope: that read also worked, and what it found is a request whose terminal state - the caller's own decision - leaves nothing to return. It is deliberately not `410`, which on that route means the result aged out of its retention window, and not a `5xx`, which would report the caller's own cancellation as a Router fault and read to a polling client as worth retrying."},{"value":"queue_timeout","tier":"transport","meaning":"A queued request waited past its queue timeout without ever being admitted. Terminal, unbilled, and it never took a concurrency slot — the job never reached a provider. Deliberately not `deadline_exceeded`, which is the synchronous route's connection bound: a `deadline_exceeded` generation may be running and billable, whereas this one provably never started. It is returned under `504`, which it shares with `provider_timeout` and `deadline_exceeded` because a status can only say that a clock ran out; which clock - the partner's, Comfy's connection bound, or the queue's admission bound - is what `error_type` carries. The request itself is terminal, so submit a new one rather than re-reading this one."},{"value":"request_not_found","tier":"transport","meaning":"The `request_id` names no request of the caller's under this model. It is the second of the two conditions the queued reads' `404` covers; the first is the `{provider}/{model}` ID resolving to no partner model, which is `model_not_found` and carries fuzzy model suggestions. It also covers the right-id / wrong-model URL the path shape refuses, and it is deliberately indistinguishable from a request in another workspace, so a probe with a guessed id learns nothing. A request that has merely aged out of its retention window is `410`, not this."},{"value":"queue_backlog_full","tier":"transport","meaning":"The caller already has too many queued requests waiting to run, so this submit was refused. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one is the synchronous route's answer for too many calls in flight at once, whereas the queue accepts a submit at that limit and parks it, and this bucket is the separate bound on how many a caller may leave waiting so that parking cannot mean enqueuing without end. It clears as the caller's own queued requests finish, so retry once some of them complete."}]}},"X-Comfy-Request-Id":{"description":"Server-generated identifier for this call, present on every Router response - success, 4xx and 5xx alike, because an error response is exactly when a user needs an id to quote in a support request. The same value is written into the call's usage/audit event, which is what lets a complaint about a charge be joined to the charge itself instead of searched for by timestamp.","required":true,"schema":{"type":"string","format":"uuid","example":"6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21"}}},"content":{"application/json":{"schema":{"type":"object","description":"Router's request-level error body: what is returned when the request never reached the model, or failed for a reason the model itself did not report - auth, quota, an unknown model ID, or provider transport. A model-level validation failure has its own shape, `RouterValidationErrorResponse`, because flattening a FastAPI `detail[]` array into this `detail` string would destroy the per-field granularity an SDK branches on.","properties":{"detail":{"type":"string","description":"Human-readable description of the failure, safe to surface to an end user. Not machine-parsed - branch on `error_type` instead. For `model_not_found` on a retired model, `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and visible to the caller, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of the usual suggestion list. A successor named here is always a live catalog ID the call can be re-pointed at. A model whose sunset date is still in the future is not retired: it stays listed by `GET /v2/models` and stays runnable until that date. Like the rest of `detail`, this retirement wording is for display and carries no compatibility guarantee.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_type":{"type":"string","description":"Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at nineteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable`, `rate_limited`, `cancelled`, `queue_timeout`, `request_not_found` and `queue_backlog_full`. Closed describes the set as documented today, not a bound that holds forever: the set is expected to grow, which is why this is deliberately a plain string and not an `enum`, so a client must treat an unrecognised value as `internal_error` rather than switch exhaustively over the list above and break on the next addition.","example":"invalid_input","x-comfy-error-types":[{"value":"invalid_input","tier":"request","meaning":"The request was rejected before it reached the model - a malformed body, a malformed or expired pagination cursor, an input the model's own schema does not accept, or an `Idempotency-Key` that cannot serve this request (already used for a different request - the method, the path and query, or the body differ - or already consumed by a call whose response cannot be replayed). Sent with `409` in the key cases and with `400`/`422` in the others; the status says which, and the key cases are the ones answered by using a new key rather than by editing the request."},{"value":"content_policy_violation","tier":"request","meaning":"The provider refused the request on content-policy grounds. The refusal is deterministic: re-sending the same input will be refused again."},{"value":"provider_error","tier":"request","meaning":"The partner provider reported a failure of its own, or returned a response Router could not interpret as a result."},{"value":"provider_timeout","tier":"request","meaning":"The partner provider did not answer within its deadline. This bucket is the provider timing out and never Router's own server deadline, which is reported as `deadline_exceeded` - the two share `504` and are separated because they name different causes: this one says the partner failed, that one says Comfy stopped holding the connection."},{"value":"insufficient_credits","tier":"request","meaning":"The calling workspace does not have enough credits to run the model."},{"value":"model_not_found","tier":"request","meaning":"The `{provider}/{model}` ID names no model Router can run: an unknown provider, an unenrolled id, one the catalog has retired past its sunset date, or a catalogued ID the provider does not currently serve for Comfy. A retired id's `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and not withheld, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of a suggestion list; the successor named for a retired id is always a live catalog ID you can re-point the call at, and a successor is dropped from `detail` either because the table records none, or because the recorded one is currently withheld behind an embargo the caller cannot see. A model whose sunset is still in the future is not withdrawn: it stays listed by `GET /v2/models` and stays runnable until the date, so a listing taken today remains the answer to what runs today. Otherwise `detail` carries up to three suggestions drawn from the models the caller is entitled to see, except for a catalogued ID the provider does not currently serve for Comfy, whose response carries no suggestions."},{"value":"unauthorized","tier":"transport","meaning":"The request carried no usable credential."},{"value":"forbidden","tier":"transport","meaning":"The credential is valid but is not entitled to this model or this operation."},{"value":"concurrency_limit_exceeded","tier":"transport","meaning":"The workspace already has as many calls in flight as it is allowed; retry once one of them finishes. It carries one further condition on the run route, on a `409` rather than the `429` above: another call is already in flight for the `Idempotency-Key` this request presented. Re-send the same key after `Retry-After` seconds to collect that call's result."},{"value":"client_disconnected","tier":"transport","meaning":"The caller closed the connection before Router could return a result. It is logged rather than delivered - there is no socket left to write it to - and it is an attribution, not a billing outcome: a provider generation that completed is billed regardless of whether the caller received the response."},{"value":"internal_error","tier":"transport","meaning":"Router itself failed. It is also the value a client should treat any unrecognized bucket as, so a later addition to the set does not break a client generated before it."},{"value":"deadline_exceeded","tier":"transport","meaning":"Comfy stopped holding the connection at its own configured bound before an answer arrived. It shares `504` with `provider_timeout` and the pair says which side ran out of time; this one is Comfy's own bound, so nothing about the request was rejected and the same request may be retried. It says nothing about the charge: a provider generation that completed is billed regardless of whether the caller received the response. Retry it with the same `Idempotency-Key`: when the provider had already accepted the generation, the retry collects that generation rather than dispatching another, and a `Retry-After` on the `504` says when to ask."},{"value":"not_enabled","tier":"transport","meaning":"Comfy Router is not switched on for this caller yet. Nothing about the request is wrong and the model exists, which is why this is not `model_not_found`; it shares `403` with `forbidden` and is not the same thing, because `forbidden` is an entitlement decision about the caller while this is a state of the rollout. It is terminal: do not retry, and do not treat it as an outage. The one exception to \"about the caller\" is the queued submit, which also answers `not_enabled` for a model whose partner answers a generation directly as bytes: that model cannot yet be queued, so it is the model and not the caller that is refused, nothing is queued or charged, and the synchronous route `POST /v2/models/{provider}/{model}` runs it instead."},{"value":"service_unavailable","tier":"transport","meaning":"A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. Retry it with backoff: it is the one bucket here whose condition clears on its own, without the caller changing the request and without a concurrency slot freeing, which is what distinguishes it from the other retryable answers (`concurrency_limit_exceeded`, `deadline_exceeded`). It is separate from `internal_error` - which is a `500` and means Router itself failed - so a client can tell \"come back shortly\" from \"this call is not going to work\"."},{"value":"rate_limited","tier":"transport","meaning":"The caller has spent an allowance measured over a window and must wait for that window to roll. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one clears the moment one of the caller's own in-flight calls finishes, so retrying in seconds is right, whereas nothing the caller does drains this one early. `detail` names the window."},{"value":"cancelled","tier":"transport","meaning":"A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. Cancelling stops Comfy waiting and it does not always stop the partner working, so a request cancelled while it was still `IN_QUEUE` was never dispatched and cannot be charged, whereas one cancelled after it was admitted may still be charged — a partner generation that completes is charged whether or not anyone collected it, which is why the cancel route calls the ask a request rather than a guarantee. It is not `client_disconnected`: that one says nobody is listening any more while a generation may still be running and billable, whereas this says the request itself was withdrawn. A caller polling the status read sees `200` with this in the body, because the request ended and so the read succeeded. Collecting the result of such a request answers `409` in Router's error envelope: that read also worked, and what it found is a request whose terminal state - the caller's own decision - leaves nothing to return. It is deliberately not `410`, which on that route means the result aged out of its retention window, and not a `5xx`, which would report the caller's own cancellation as a Router fault and read to a polling client as worth retrying."},{"value":"queue_timeout","tier":"transport","meaning":"A queued request waited past its queue timeout without ever being admitted. Terminal, unbilled, and it never took a concurrency slot — the job never reached a provider. Deliberately not `deadline_exceeded`, which is the synchronous route's connection bound: a `deadline_exceeded` generation may be running and billable, whereas this one provably never started. It is returned under `504`, which it shares with `provider_timeout` and `deadline_exceeded` because a status can only say that a clock ran out; which clock - the partner's, Comfy's connection bound, or the queue's admission bound - is what `error_type` carries. The request itself is terminal, so submit a new one rather than re-reading this one."},{"value":"request_not_found","tier":"transport","meaning":"The `request_id` names no request of the caller's under this model. It is the second of the two conditions the queued reads' `404` covers; the first is the `{provider}/{model}` ID resolving to no partner model, which is `model_not_found` and carries fuzzy model suggestions. It also covers the right-id / wrong-model URL the path shape refuses, and it is deliberately indistinguishable from a request in another workspace, so a probe with a guessed id learns nothing. A request that has merely aged out of its retention window is `410`, not this."},{"value":"queue_backlog_full","tier":"transport","meaning":"The caller already has too many queued requests waiting to run, so this submit was refused. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one is the synchronous route's answer for too many calls in flight at once, whereas the queue accepts a submit at that limit and parks it, and this bucket is the separate bound on how many a caller may leave waiting so that parking cannot mean enqueuing without end. It clears as the caller's own queued requests finish, so retry once some of them complete."}],"isRequired":true,"uniqueKey":"error_type","typeLabel":"string"},"upstream_detail":{"type":"string","description":"A bounded, sanitized reason the model provider gave for rejecting the request, present only when `error_type` is `invalid_input` and `X-Comfy-Upstream-Status` is a provider `4xx` or `2xx` - i.e. the provider refused the request as malformed and said why. Usually that status is a `4xx`; it is a `2xx` for a provider that reports a rejected generation inside a success envelope (a BytePlus failed-task poll is HTTP `200` with the reason in its body). Absent on every other failure, including provider `5xx`, transport failures, content-policy refusals and any refusal Router raised about itself. It mirrors the `X-Comfy-Upstream-Detail` header.","uniqueKey":"upstream_detail","typeLabel":"string"},"refusal_subject":{"type":"string","description":"Which input or output a content-policy refusal was about, as a Router-level closed vocabulary: `input`, `output`, `input_text`, `input_image`, `input_video`, `input_audio`, `output_text`, `output_image`, `output_video`, `output_audio`. The bare `input` / `output` values name the side when the provider did not name a modality. Present only when `error_type` is `content_policy_violation` and the provider named the refused subject with a machine-readable code; absent otherwise. Never provider text. Named today for BytePlus, Runway, BFL, Gemini, Veo, Vertex, xAI and Wan refusals, and for the MiniMax Router's Nano Banana legs' Gemini refusals; a provider whose refusal does not say which side it was about leaves it absent. It mirrors the `X-Comfy-Refusal-Subject` header.","uniqueKey":"refusal_subject","typeLabel":"string"}},"required":["detail","error_type"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":"\u003cstring>","error_type":"invalid_input","upstream_detail":"\u003cstring>","refusal_subject":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"26b4d055-dc34-4db4-a363-ee1d64547200":{"description":"A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. The body is `RouterErrorResponse` and the bucket is repeated on `X-Comfy-Error-Type`.","headers":{"X-Comfy-Error-Type":{"description":"Coarse, machine-readable bucket for the failure, set by Router on every error response. It carries the same value as `RouterErrorResponse.error_type`, and on the `422` it is the only machine-readable bucket, because that body is the FastAPI `detail[]` shape and has no `error_type` field of its own. A client can therefore branch on this header alone, before deciding which of the two Router error bodies it received.","required":true,"schema":{"type":"string","description":"Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at nineteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable`, `rate_limited`, `cancelled`, `queue_timeout`, `request_not_found` and `queue_backlog_full`. Closed describes the set as documented today, not a bound that holds forever: the set is expected to grow, which is why this is deliberately a plain string and not an `enum`, so a client must treat an unrecognised value as `internal_error` rather than switch exhaustively over the list above and break on the next addition.","example":"invalid_input","x-comfy-error-types":[{"value":"invalid_input","tier":"request","meaning":"The request was rejected before it reached the model - a malformed body, a malformed or expired pagination cursor, an input the model's own schema does not accept, or an `Idempotency-Key` that cannot serve this request (already used for a different request - the method, the path and query, or the body differ - or already consumed by a call whose response cannot be replayed). Sent with `409` in the key cases and with `400`/`422` in the others; the status says which, and the key cases are the ones answered by using a new key rather than by editing the request."},{"value":"content_policy_violation","tier":"request","meaning":"The provider refused the request on content-policy grounds. The refusal is deterministic: re-sending the same input will be refused again."},{"value":"provider_error","tier":"request","meaning":"The partner provider reported a failure of its own, or returned a response Router could not interpret as a result."},{"value":"provider_timeout","tier":"request","meaning":"The partner provider did not answer within its deadline. This bucket is the provider timing out and never Router's own server deadline, which is reported as `deadline_exceeded` - the two share `504` and are separated because they name different causes: this one says the partner failed, that one says Comfy stopped holding the connection."},{"value":"insufficient_credits","tier":"request","meaning":"The calling workspace does not have enough credits to run the model."},{"value":"model_not_found","tier":"request","meaning":"The `{provider}/{model}` ID names no model Router can run: an unknown provider, an unenrolled id, one the catalog has retired past its sunset date, or a catalogued ID the provider does not currently serve for Comfy. A retired id's `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and not withheld, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of a suggestion list; the successor named for a retired id is always a live catalog ID you can re-point the call at, and a successor is dropped from `detail` either because the table records none, or because the recorded one is currently withheld behind an embargo the caller cannot see. A model whose sunset is still in the future is not withdrawn: it stays listed by `GET /v2/models` and stays runnable until the date, so a listing taken today remains the answer to what runs today. Otherwise `detail` carries up to three suggestions drawn from the models the caller is entitled to see, except for a catalogued ID the provider does not currently serve for Comfy, whose response carries no suggestions."},{"value":"unauthorized","tier":"transport","meaning":"The request carried no usable credential."},{"value":"forbidden","tier":"transport","meaning":"The credential is valid but is not entitled to this model or this operation."},{"value":"concurrency_limit_exceeded","tier":"transport","meaning":"The workspace already has as many calls in flight as it is allowed; retry once one of them finishes. It carries one further condition on the run route, on a `409` rather than the `429` above: another call is already in flight for the `Idempotency-Key` this request presented. Re-send the same key after `Retry-After` seconds to collect that call's result."},{"value":"client_disconnected","tier":"transport","meaning":"The caller closed the connection before Router could return a result. It is logged rather than delivered - there is no socket left to write it to - and it is an attribution, not a billing outcome: a provider generation that completed is billed regardless of whether the caller received the response."},{"value":"internal_error","tier":"transport","meaning":"Router itself failed. It is also the value a client should treat any unrecognized bucket as, so a later addition to the set does not break a client generated before it."},{"value":"deadline_exceeded","tier":"transport","meaning":"Comfy stopped holding the connection at its own configured bound before an answer arrived. It shares `504` with `provider_timeout` and the pair says which side ran out of time; this one is Comfy's own bound, so nothing about the request was rejected and the same request may be retried. It says nothing about the charge: a provider generation that completed is billed regardless of whether the caller received the response. Retry it with the same `Idempotency-Key`: when the provider had already accepted the generation, the retry collects that generation rather than dispatching another, and a `Retry-After` on the `504` says when to ask."},{"value":"not_enabled","tier":"transport","meaning":"Comfy Router is not switched on for this caller yet. Nothing about the request is wrong and the model exists, which is why this is not `model_not_found`; it shares `403` with `forbidden` and is not the same thing, because `forbidden` is an entitlement decision about the caller while this is a state of the rollout. It is terminal: do not retry, and do not treat it as an outage. The one exception to \"about the caller\" is the queued submit, which also answers `not_enabled` for a model whose partner answers a generation directly as bytes: that model cannot yet be queued, so it is the model and not the caller that is refused, nothing is queued or charged, and the synchronous route `POST /v2/models/{provider}/{model}` runs it instead."},{"value":"service_unavailable","tier":"transport","meaning":"A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. Retry it with backoff: it is the one bucket here whose condition clears on its own, without the caller changing the request and without a concurrency slot freeing, which is what distinguishes it from the other retryable answers (`concurrency_limit_exceeded`, `deadline_exceeded`). It is separate from `internal_error` - which is a `500` and means Router itself failed - so a client can tell \"come back shortly\" from \"this call is not going to work\"."},{"value":"rate_limited","tier":"transport","meaning":"The caller has spent an allowance measured over a window and must wait for that window to roll. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one clears the moment one of the caller's own in-flight calls finishes, so retrying in seconds is right, whereas nothing the caller does drains this one early. `detail` names the window."},{"value":"cancelled","tier":"transport","meaning":"A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. Cancelling stops Comfy waiting and it does not always stop the partner working, so a request cancelled while it was still `IN_QUEUE` was never dispatched and cannot be charged, whereas one cancelled after it was admitted may still be charged — a partner generation that completes is charged whether or not anyone collected it, which is why the cancel route calls the ask a request rather than a guarantee. It is not `client_disconnected`: that one says nobody is listening any more while a generation may still be running and billable, whereas this says the request itself was withdrawn. A caller polling the status read sees `200` with this in the body, because the request ended and so the read succeeded. Collecting the result of such a request answers `409` in Router's error envelope: that read also worked, and what it found is a request whose terminal state - the caller's own decision - leaves nothing to return. It is deliberately not `410`, which on that route means the result aged out of its retention window, and not a `5xx`, which would report the caller's own cancellation as a Router fault and read to a polling client as worth retrying."},{"value":"queue_timeout","tier":"transport","meaning":"A queued request waited past its queue timeout without ever being admitted. Terminal, unbilled, and it never took a concurrency slot — the job never reached a provider. Deliberately not `deadline_exceeded`, which is the synchronous route's connection bound: a `deadline_exceeded` generation may be running and billable, whereas this one provably never started. It is returned under `504`, which it shares with `provider_timeout` and `deadline_exceeded` because a status can only say that a clock ran out; which clock - the partner's, Comfy's connection bound, or the queue's admission bound - is what `error_type` carries. The request itself is terminal, so submit a new one rather than re-reading this one."},{"value":"request_not_found","tier":"transport","meaning":"The `request_id` names no request of the caller's under this model. It is the second of the two conditions the queued reads' `404` covers; the first is the `{provider}/{model}` ID resolving to no partner model, which is `model_not_found` and carries fuzzy model suggestions. It also covers the right-id / wrong-model URL the path shape refuses, and it is deliberately indistinguishable from a request in another workspace, so a probe with a guessed id learns nothing. A request that has merely aged out of its retention window is `410`, not this."},{"value":"queue_backlog_full","tier":"transport","meaning":"The caller already has too many queued requests waiting to run, so this submit was refused. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one is the synchronous route's answer for too many calls in flight at once, whereas the queue accepts a submit at that limit and parks it, and this bucket is the separate bound on how many a caller may leave waiting so that parking cannot mean enqueuing without end. It clears as the caller's own queued requests finish, so retry once some of them complete."}]}},"X-Comfy-Request-Id":{"description":"Server-generated identifier for this call, present on every Router response - success, 4xx and 5xx alike, because an error response is exactly when a user needs an id to quote in a support request. The same value is written into the call's usage/audit event, which is what lets a complaint about a charge be joined to the charge itself instead of searched for by timestamp.","required":true,"schema":{"type":"string","format":"uuid","example":"6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21"}}},"content":{"application/json":{"schema":{"type":"object","description":"Router's request-level error body: what is returned when the request never reached the model, or failed for a reason the model itself did not report - auth, quota, an unknown model ID, or provider transport. A model-level validation failure has its own shape, `RouterValidationErrorResponse`, because flattening a FastAPI `detail[]` array into this `detail` string would destroy the per-field granularity an SDK branches on.","properties":{"detail":{"type":"string","description":"Human-readable description of the failure, safe to surface to an end user. Not machine-parsed - branch on `error_type` instead. For `model_not_found` on a retired model, `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and visible to the caller, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of the usual suggestion list. A successor named here is always a live catalog ID the call can be re-pointed at. A model whose sunset date is still in the future is not retired: it stays listed by `GET /v2/models` and stays runnable until that date. Like the rest of `detail`, this retirement wording is for display and carries no compatibility guarantee.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_type":{"type":"string","description":"Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at nineteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable`, `rate_limited`, `cancelled`, `queue_timeout`, `request_not_found` and `queue_backlog_full`. Closed describes the set as documented today, not a bound that holds forever: the set is expected to grow, which is why this is deliberately a plain string and not an `enum`, so a client must treat an unrecognised value as `internal_error` rather than switch exhaustively over the list above and break on the next addition.","example":"invalid_input","x-comfy-error-types":[{"value":"invalid_input","tier":"request","meaning":"The request was rejected before it reached the model - a malformed body, a malformed or expired pagination cursor, an input the model's own schema does not accept, or an `Idempotency-Key` that cannot serve this request (already used for a different request - the method, the path and query, or the body differ - or already consumed by a call whose response cannot be replayed). Sent with `409` in the key cases and with `400`/`422` in the others; the status says which, and the key cases are the ones answered by using a new key rather than by editing the request."},{"value":"content_policy_violation","tier":"request","meaning":"The provider refused the request on content-policy grounds. The refusal is deterministic: re-sending the same input will be refused again."},{"value":"provider_error","tier":"request","meaning":"The partner provider reported a failure of its own, or returned a response Router could not interpret as a result."},{"value":"provider_timeout","tier":"request","meaning":"The partner provider did not answer within its deadline. This bucket is the provider timing out and never Router's own server deadline, which is reported as `deadline_exceeded` - the two share `504` and are separated because they name different causes: this one says the partner failed, that one says Comfy stopped holding the connection."},{"value":"insufficient_credits","tier":"request","meaning":"The calling workspace does not have enough credits to run the model."},{"value":"model_not_found","tier":"request","meaning":"The `{provider}/{model}` ID names no model Router can run: an unknown provider, an unenrolled id, one the catalog has retired past its sunset date, or a catalogued ID the provider does not currently serve for Comfy. A retired id's `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and not withheld, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of a suggestion list; the successor named for a retired id is always a live catalog ID you can re-point the call at, and a successor is dropped from `detail` either because the table records none, or because the recorded one is currently withheld behind an embargo the caller cannot see. A model whose sunset is still in the future is not withdrawn: it stays listed by `GET /v2/models` and stays runnable until the date, so a listing taken today remains the answer to what runs today. Otherwise `detail` carries up to three suggestions drawn from the models the caller is entitled to see, except for a catalogued ID the provider does not currently serve for Comfy, whose response carries no suggestions."},{"value":"unauthorized","tier":"transport","meaning":"The request carried no usable credential."},{"value":"forbidden","tier":"transport","meaning":"The credential is valid but is not entitled to this model or this operation."},{"value":"concurrency_limit_exceeded","tier":"transport","meaning":"The workspace already has as many calls in flight as it is allowed; retry once one of them finishes. It carries one further condition on the run route, on a `409` rather than the `429` above: another call is already in flight for the `Idempotency-Key` this request presented. Re-send the same key after `Retry-After` seconds to collect that call's result."},{"value":"client_disconnected","tier":"transport","meaning":"The caller closed the connection before Router could return a result. It is logged rather than delivered - there is no socket left to write it to - and it is an attribution, not a billing outcome: a provider generation that completed is billed regardless of whether the caller received the response."},{"value":"internal_error","tier":"transport","meaning":"Router itself failed. It is also the value a client should treat any unrecognized bucket as, so a later addition to the set does not break a client generated before it."},{"value":"deadline_exceeded","tier":"transport","meaning":"Comfy stopped holding the connection at its own configured bound before an answer arrived. It shares `504` with `provider_timeout` and the pair says which side ran out of time; this one is Comfy's own bound, so nothing about the request was rejected and the same request may be retried. It says nothing about the charge: a provider generation that completed is billed regardless of whether the caller received the response. Retry it with the same `Idempotency-Key`: when the provider had already accepted the generation, the retry collects that generation rather than dispatching another, and a `Retry-After` on the `504` says when to ask."},{"value":"not_enabled","tier":"transport","meaning":"Comfy Router is not switched on for this caller yet. Nothing about the request is wrong and the model exists, which is why this is not `model_not_found`; it shares `403` with `forbidden` and is not the same thing, because `forbidden` is an entitlement decision about the caller while this is a state of the rollout. It is terminal: do not retry, and do not treat it as an outage. The one exception to \"about the caller\" is the queued submit, which also answers `not_enabled` for a model whose partner answers a generation directly as bytes: that model cannot yet be queued, so it is the model and not the caller that is refused, nothing is queued or charged, and the synchronous route `POST /v2/models/{provider}/{model}` runs it instead."},{"value":"service_unavailable","tier":"transport","meaning":"A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. Retry it with backoff: it is the one bucket here whose condition clears on its own, without the caller changing the request and without a concurrency slot freeing, which is what distinguishes it from the other retryable answers (`concurrency_limit_exceeded`, `deadline_exceeded`). It is separate from `internal_error` - which is a `500` and means Router itself failed - so a client can tell \"come back shortly\" from \"this call is not going to work\"."},{"value":"rate_limited","tier":"transport","meaning":"The caller has spent an allowance measured over a window and must wait for that window to roll. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one clears the moment one of the caller's own in-flight calls finishes, so retrying in seconds is right, whereas nothing the caller does drains this one early. `detail` names the window."},{"value":"cancelled","tier":"transport","meaning":"A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. Cancelling stops Comfy waiting and it does not always stop the partner working, so a request cancelled while it was still `IN_QUEUE` was never dispatched and cannot be charged, whereas one cancelled after it was admitted may still be charged — a partner generation that completes is charged whether or not anyone collected it, which is why the cancel route calls the ask a request rather than a guarantee. It is not `client_disconnected`: that one says nobody is listening any more while a generation may still be running and billable, whereas this says the request itself was withdrawn. A caller polling the status read sees `200` with this in the body, because the request ended and so the read succeeded. Collecting the result of such a request answers `409` in Router's error envelope: that read also worked, and what it found is a request whose terminal state - the caller's own decision - leaves nothing to return. It is deliberately not `410`, which on that route means the result aged out of its retention window, and not a `5xx`, which would report the caller's own cancellation as a Router fault and read to a polling client as worth retrying."},{"value":"queue_timeout","tier":"transport","meaning":"A queued request waited past its queue timeout without ever being admitted. Terminal, unbilled, and it never took a concurrency slot — the job never reached a provider. Deliberately not `deadline_exceeded`, which is the synchronous route's connection bound: a `deadline_exceeded` generation may be running and billable, whereas this one provably never started. It is returned under `504`, which it shares with `provider_timeout` and `deadline_exceeded` because a status can only say that a clock ran out; which clock - the partner's, Comfy's connection bound, or the queue's admission bound - is what `error_type` carries. The request itself is terminal, so submit a new one rather than re-reading this one."},{"value":"request_not_found","tier":"transport","meaning":"The `request_id` names no request of the caller's under this model. It is the second of the two conditions the queued reads' `404` covers; the first is the `{provider}/{model}` ID resolving to no partner model, which is `model_not_found` and carries fuzzy model suggestions. It also covers the right-id / wrong-model URL the path shape refuses, and it is deliberately indistinguishable from a request in another workspace, so a probe with a guessed id learns nothing. A request that has merely aged out of its retention window is `410`, not this."},{"value":"queue_backlog_full","tier":"transport","meaning":"The caller already has too many queued requests waiting to run, so this submit was refused. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one is the synchronous route's answer for too many calls in flight at once, whereas the queue accepts a submit at that limit and parks it, and this bucket is the separate bound on how many a caller may leave waiting so that parking cannot mean enqueuing without end. It clears as the caller's own queued requests finish, so retry once some of them complete."}],"isRequired":true,"uniqueKey":"error_type","typeLabel":"string"},"upstream_detail":{"type":"string","description":"A bounded, sanitized reason the model provider gave for rejecting the request, present only when `error_type` is `invalid_input` and `X-Comfy-Upstream-Status` is a provider `4xx` or `2xx` - i.e. the provider refused the request as malformed and said why. Usually that status is a `4xx`; it is a `2xx` for a provider that reports a rejected generation inside a success envelope (a BytePlus failed-task poll is HTTP `200` with the reason in its body). Absent on every other failure, including provider `5xx`, transport failures, content-policy refusals and any refusal Router raised about itself. It mirrors the `X-Comfy-Upstream-Detail` header.","uniqueKey":"upstream_detail","typeLabel":"string"},"refusal_subject":{"type":"string","description":"Which input or output a content-policy refusal was about, as a Router-level closed vocabulary: `input`, `output`, `input_text`, `input_image`, `input_video`, `input_audio`, `output_text`, `output_image`, `output_video`, `output_audio`. The bare `input` / `output` values name the side when the provider did not name a modality. Present only when `error_type` is `content_policy_violation` and the provider named the refused subject with a machine-readable code; absent otherwise. Never provider text. Named today for BytePlus, Runway, BFL, Gemini, Veo, Vertex, xAI and Wan refusals, and for the MiniMax Router's Nano Banana legs' Gemini refusals; a provider whose refusal does not say which side it was about leaves it absent. It mirrors the `X-Comfy-Refusal-Subject` header.","uniqueKey":"refusal_subject","typeLabel":"string"}},"required":["detail","error_type"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":"\u003cstring>","error_type":"invalid_input","upstream_detail":"\u003cstring>","refusal_subject":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"495a7d24-5324-45ec-a374-09bd4b375737":{"description":"A Router request-level failure - the request never reached the model, or failed for a reason the model itself did not report. The body is `RouterErrorResponse` and the bucket is repeated on `X-Comfy-Error-Type`.","headers":{"X-Comfy-Error-Type":{"description":"Coarse, machine-readable bucket for the failure, set by Router on every error response. It carries the same value as `RouterErrorResponse.error_type`, and on the `422` it is the only machine-readable bucket, because that body is the FastAPI `detail[]` shape and has no `error_type` field of its own. A client can therefore branch on this header alone, before deciding which of the two Router error bodies it received.","required":true,"schema":{"type":"string","description":"Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at nineteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable`, `rate_limited`, `cancelled`, `queue_timeout`, `request_not_found` and `queue_backlog_full`. Closed describes the set as documented today, not a bound that holds forever: the set is expected to grow, which is why this is deliberately a plain string and not an `enum`, so a client must treat an unrecognised value as `internal_error` rather than switch exhaustively over the list above and break on the next addition.","example":"invalid_input","x-comfy-error-types":[{"value":"invalid_input","tier":"request","meaning":"The request was rejected before it reached the model - a malformed body, a malformed or expired pagination cursor, an input the model's own schema does not accept, or an `Idempotency-Key` that cannot serve this request (already used for a different request - the method, the path and query, or the body differ - or already consumed by a call whose response cannot be replayed). Sent with `409` in the key cases and with `400`/`422` in the others; the status says which, and the key cases are the ones answered by using a new key rather than by editing the request."},{"value":"content_policy_violation","tier":"request","meaning":"The provider refused the request on content-policy grounds. The refusal is deterministic: re-sending the same input will be refused again."},{"value":"provider_error","tier":"request","meaning":"The partner provider reported a failure of its own, or returned a response Router could not interpret as a result."},{"value":"provider_timeout","tier":"request","meaning":"The partner provider did not answer within its deadline. This bucket is the provider timing out and never Router's own server deadline, which is reported as `deadline_exceeded` - the two share `504` and are separated because they name different causes: this one says the partner failed, that one says Comfy stopped holding the connection."},{"value":"insufficient_credits","tier":"request","meaning":"The calling workspace does not have enough credits to run the model."},{"value":"model_not_found","tier":"request","meaning":"The `{provider}/{model}` ID names no model Router can run: an unknown provider, an unenrolled id, one the catalog has retired past its sunset date, or a catalogued ID the provider does not currently serve for Comfy. A retired id's `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and not withheld, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of a suggestion list; the successor named for a retired id is always a live catalog ID you can re-point the call at, and a successor is dropped from `detail` either because the table records none, or because the recorded one is currently withheld behind an embargo the caller cannot see. A model whose sunset is still in the future is not withdrawn: it stays listed by `GET /v2/models` and stays runnable until the date, so a listing taken today remains the answer to what runs today. Otherwise `detail` carries up to three suggestions drawn from the models the caller is entitled to see, except for a catalogued ID the provider does not currently serve for Comfy, whose response carries no suggestions."},{"value":"unauthorized","tier":"transport","meaning":"The request carried no usable credential."},{"value":"forbidden","tier":"transport","meaning":"The credential is valid but is not entitled to this model or this operation."},{"value":"concurrency_limit_exceeded","tier":"transport","meaning":"The workspace already has as many calls in flight as it is allowed; retry once one of them finishes. It carries one further condition on the run route, on a `409` rather than the `429` above: another call is already in flight for the `Idempotency-Key` this request presented. Re-send the same key after `Retry-After` seconds to collect that call's result."},{"value":"client_disconnected","tier":"transport","meaning":"The caller closed the connection before Router could return a result. It is logged rather than delivered - there is no socket left to write it to - and it is an attribution, not a billing outcome: a provider generation that completed is billed regardless of whether the caller received the response."},{"value":"internal_error","tier":"transport","meaning":"Router itself failed. It is also the value a client should treat any unrecognized bucket as, so a later addition to the set does not break a client generated before it."},{"value":"deadline_exceeded","tier":"transport","meaning":"Comfy stopped holding the connection at its own configured bound before an answer arrived. It shares `504` with `provider_timeout` and the pair says which side ran out of time; this one is Comfy's own bound, so nothing about the request was rejected and the same request may be retried. It says nothing about the charge: a provider generation that completed is billed regardless of whether the caller received the response. Retry it with the same `Idempotency-Key`: when the provider had already accepted the generation, the retry collects that generation rather than dispatching another, and a `Retry-After` on the `504` says when to ask."},{"value":"not_enabled","tier":"transport","meaning":"Comfy Router is not switched on for this caller yet. Nothing about the request is wrong and the model exists, which is why this is not `model_not_found`; it shares `403` with `forbidden` and is not the same thing, because `forbidden` is an entitlement decision about the caller while this is a state of the rollout. It is terminal: do not retry, and do not treat it as an outage. The one exception to \"about the caller\" is the queued submit, which also answers `not_enabled` for a model whose partner answers a generation directly as bytes: that model cannot yet be queued, so it is the model and not the caller that is refused, nothing is queued or charged, and the synchronous route `POST /v2/models/{provider}/{model}` runs it instead."},{"value":"service_unavailable","tier":"transport","meaning":"A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. Retry it with backoff: it is the one bucket here whose condition clears on its own, without the caller changing the request and without a concurrency slot freeing, which is what distinguishes it from the other retryable answers (`concurrency_limit_exceeded`, `deadline_exceeded`). It is separate from `internal_error` - which is a `500` and means Router itself failed - so a client can tell \"come back shortly\" from \"this call is not going to work\"."},{"value":"rate_limited","tier":"transport","meaning":"The caller has spent an allowance measured over a window and must wait for that window to roll. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one clears the moment one of the caller's own in-flight calls finishes, so retrying in seconds is right, whereas nothing the caller does drains this one early. `detail` names the window."},{"value":"cancelled","tier":"transport","meaning":"A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. Cancelling stops Comfy waiting and it does not always stop the partner working, so a request cancelled while it was still `IN_QUEUE` was never dispatched and cannot be charged, whereas one cancelled after it was admitted may still be charged — a partner generation that completes is charged whether or not anyone collected it, which is why the cancel route calls the ask a request rather than a guarantee. It is not `client_disconnected`: that one says nobody is listening any more while a generation may still be running and billable, whereas this says the request itself was withdrawn. A caller polling the status read sees `200` with this in the body, because the request ended and so the read succeeded. Collecting the result of such a request answers `409` in Router's error envelope: that read also worked, and what it found is a request whose terminal state - the caller's own decision - leaves nothing to return. It is deliberately not `410`, which on that route means the result aged out of its retention window, and not a `5xx`, which would report the caller's own cancellation as a Router fault and read to a polling client as worth retrying."},{"value":"queue_timeout","tier":"transport","meaning":"A queued request waited past its queue timeout without ever being admitted. Terminal, unbilled, and it never took a concurrency slot — the job never reached a provider. Deliberately not `deadline_exceeded`, which is the synchronous route's connection bound: a `deadline_exceeded` generation may be running and billable, whereas this one provably never started. It is returned under `504`, which it shares with `provider_timeout` and `deadline_exceeded` because a status can only say that a clock ran out; which clock - the partner's, Comfy's connection bound, or the queue's admission bound - is what `error_type` carries. The request itself is terminal, so submit a new one rather than re-reading this one."},{"value":"request_not_found","tier":"transport","meaning":"The `request_id` names no request of the caller's under this model. It is the second of the two conditions the queued reads' `404` covers; the first is the `{provider}/{model}` ID resolving to no partner model, which is `model_not_found` and carries fuzzy model suggestions. It also covers the right-id / wrong-model URL the path shape refuses, and it is deliberately indistinguishable from a request in another workspace, so a probe with a guessed id learns nothing. A request that has merely aged out of its retention window is `410`, not this."},{"value":"queue_backlog_full","tier":"transport","meaning":"The caller already has too many queued requests waiting to run, so this submit was refused. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one is the synchronous route's answer for too many calls in flight at once, whereas the queue accepts a submit at that limit and parks it, and this bucket is the separate bound on how many a caller may leave waiting so that parking cannot mean enqueuing without end. It clears as the caller's own queued requests finish, so retry once some of them complete."}]}},"X-Comfy-Request-Id":{"description":"Server-generated identifier for this call, present on every Router response - success, 4xx and 5xx alike, because an error response is exactly when a user needs an id to quote in a support request. The same value is written into the call's usage/audit event, which is what lets a complaint about a charge be joined to the charge itself instead of searched for by timestamp.","required":true,"schema":{"type":"string","format":"uuid","example":"6f1a1a6e-6a53-4a5f-9d3a-2b3b0a1f9c21"}}},"content":{"application/json":{"schema":{"type":"object","description":"Router's request-level error body: what is returned when the request never reached the model, or failed for a reason the model itself did not report - auth, quota, an unknown model ID, or provider transport. A model-level validation failure has its own shape, `RouterValidationErrorResponse`, because flattening a FastAPI `detail[]` array into this `detail` string would destroy the per-field granularity an SDK branches on.","properties":{"detail":{"type":"string","description":"Human-readable description of the failure, safe to surface to an end user. Not machine-parsed - branch on `error_type` instead. For `model_not_found` on a retired model, `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and visible to the caller, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of the usual suggestion list. A successor named here is always a live catalog ID the call can be re-pointed at. A model whose sunset date is still in the future is not retired: it stays listed by `GET /v2/models` and stays runnable until that date. Like the rest of `detail`, this retirement wording is for display and carries no compatibility guarantee.","isRequired":true,"uniqueKey":"detail","typeLabel":"string"},"error_type":{"type":"string","description":"Coarse, machine-readable bucket for a Router failure, mirrored on the `X-Comfy-Error-Type` response header so a caller can branch without parsing the body. The set is closed at nineteen values: the six request-level buckets `invalid_input`, `content_policy_violation`, `provider_error`, `provider_timeout`, `insufficient_credits` and `model_not_found`, plus the transport-level `unauthorized`, `forbidden`, `concurrency_limit_exceeded`, `client_disconnected`, `internal_error`, `deadline_exceeded`, `not_enabled`, `service_unavailable`, `rate_limited`, `cancelled`, `queue_timeout`, `request_not_found` and `queue_backlog_full`. Closed describes the set as documented today, not a bound that holds forever: the set is expected to grow, which is why this is deliberately a plain string and not an `enum`, so a client must treat an unrecognised value as `internal_error` rather than switch exhaustively over the list above and break on the next addition.","example":"invalid_input","x-comfy-error-types":[{"value":"invalid_input","tier":"request","meaning":"The request was rejected before it reached the model - a malformed body, a malformed or expired pagination cursor, an input the model's own schema does not accept, or an `Idempotency-Key` that cannot serve this request (already used for a different request - the method, the path and query, or the body differ - or already consumed by a call whose response cannot be replayed). Sent with `409` in the key cases and with `400`/`422` in the others; the status says which, and the key cases are the ones answered by using a new key rather than by editing the request."},{"value":"content_policy_violation","tier":"request","meaning":"The provider refused the request on content-policy grounds. The refusal is deterministic: re-sending the same input will be refused again."},{"value":"provider_error","tier":"request","meaning":"The partner provider reported a failure of its own, or returned a response Router could not interpret as a result."},{"value":"provider_timeout","tier":"request","meaning":"The partner provider did not answer within its deadline. This bucket is the provider timing out and never Router's own server deadline, which is reported as `deadline_exceeded` - the two share `504` and are separated because they name different causes: this one says the partner failed, that one says Comfy stopped holding the connection."},{"value":"insufficient_credits","tier":"request","meaning":"The calling workspace does not have enough credits to run the model."},{"value":"model_not_found","tier":"request","meaning":"The `{provider}/{model}` ID names no model Router can run: an unknown provider, an unenrolled id, one the catalog has retired past its sunset date, or a catalogued ID the provider does not currently serve for Comfy. A retired id's `detail` reads `\u003cid> was retired on \u003cYYYY-MM-DD>; use \u003csuccessor>` when a successor is recorded and not withheld, or just `\u003cid> was retired on \u003cYYYY-MM-DD>` when it is not, instead of a suggestion list; the successor named for a retired id is always a live catalog ID you can re-point the call at, and a successor is dropped from `detail` either because the table records none, or because the recorded one is currently withheld behind an embargo the caller cannot see. A model whose sunset is still in the future is not withdrawn: it stays listed by `GET /v2/models` and stays runnable until the date, so a listing taken today remains the answer to what runs today. Otherwise `detail` carries up to three suggestions drawn from the models the caller is entitled to see, except for a catalogued ID the provider does not currently serve for Comfy, whose response carries no suggestions."},{"value":"unauthorized","tier":"transport","meaning":"The request carried no usable credential."},{"value":"forbidden","tier":"transport","meaning":"The credential is valid but is not entitled to this model or this operation."},{"value":"concurrency_limit_exceeded","tier":"transport","meaning":"The workspace already has as many calls in flight as it is allowed; retry once one of them finishes. It carries one further condition on the run route, on a `409` rather than the `429` above: another call is already in flight for the `Idempotency-Key` this request presented. Re-send the same key after `Retry-After` seconds to collect that call's result."},{"value":"client_disconnected","tier":"transport","meaning":"The caller closed the connection before Router could return a result. It is logged rather than delivered - there is no socket left to write it to - and it is an attribution, not a billing outcome: a provider generation that completed is billed regardless of whether the caller received the response."},{"value":"internal_error","tier":"transport","meaning":"Router itself failed. It is also the value a client should treat any unrecognized bucket as, so a later addition to the set does not break a client generated before it."},{"value":"deadline_exceeded","tier":"transport","meaning":"Comfy stopped holding the connection at its own configured bound before an answer arrived. It shares `504` with `provider_timeout` and the pair says which side ran out of time; this one is Comfy's own bound, so nothing about the request was rejected and the same request may be retried. It says nothing about the charge: a provider generation that completed is billed regardless of whether the caller received the response. Retry it with the same `Idempotency-Key`: when the provider had already accepted the generation, the retry collects that generation rather than dispatching another, and a `Retry-After` on the `504` says when to ask."},{"value":"not_enabled","tier":"transport","meaning":"Comfy Router is not switched on for this caller yet. Nothing about the request is wrong and the model exists, which is why this is not `model_not_found`; it shares `403` with `forbidden` and is not the same thing, because `forbidden` is an entitlement decision about the caller while this is a state of the rollout. It is terminal: do not retry, and do not treat it as an outage. The one exception to \"about the caller\" is the queued submit, which also answers `not_enabled` for a model whose partner answers a generation directly as bytes: that model cannot yet be queued, so it is the model and not the caller that is refused, nothing is queued or charged, and the synchronous route `POST /v2/models/{provider}/{model}` runs it instead."},{"value":"service_unavailable","tier":"transport","meaning":"A service Comfy Router depends on is temporarily unavailable and the caller did nothing wrong. Retry it with backoff: it is the one bucket here whose condition clears on its own, without the caller changing the request and without a concurrency slot freeing, which is what distinguishes it from the other retryable answers (`concurrency_limit_exceeded`, `deadline_exceeded`). It is separate from `internal_error` - which is a `500` and means Router itself failed - so a client can tell \"come back shortly\" from \"this call is not going to work\"."},{"value":"rate_limited","tier":"transport","meaning":"The caller has spent an allowance measured over a window and must wait for that window to roll. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one clears the moment one of the caller's own in-flight calls finishes, so retrying in seconds is right, whereas nothing the caller does drains this one early. `detail` names the window."},{"value":"cancelled","tier":"transport","meaning":"A queued request was withdrawn — through the cancel route, or by an operator — before it produced a result; it is terminal, and it is not by itself a statement about the charge. Cancelling stops Comfy waiting and it does not always stop the partner working, so a request cancelled while it was still `IN_QUEUE` was never dispatched and cannot be charged, whereas one cancelled after it was admitted may still be charged — a partner generation that completes is charged whether or not anyone collected it, which is why the cancel route calls the ask a request rather than a guarantee. It is not `client_disconnected`: that one says nobody is listening any more while a generation may still be running and billable, whereas this says the request itself was withdrawn. A caller polling the status read sees `200` with this in the body, because the request ended and so the read succeeded. Collecting the result of such a request answers `409` in Router's error envelope: that read also worked, and what it found is a request whose terminal state - the caller's own decision - leaves nothing to return. It is deliberately not `410`, which on that route means the result aged out of its retention window, and not a `5xx`, which would report the caller's own cancellation as a Router fault and read to a polling client as worth retrying."},{"value":"queue_timeout","tier":"transport","meaning":"A queued request waited past its queue timeout without ever being admitted. Terminal, unbilled, and it never took a concurrency slot — the job never reached a provider. Deliberately not `deadline_exceeded`, which is the synchronous route's connection bound: a `deadline_exceeded` generation may be running and billable, whereas this one provably never started. It is returned under `504`, which it shares with `provider_timeout` and `deadline_exceeded` because a status can only say that a clock ran out; which clock - the partner's, Comfy's connection bound, or the queue's admission bound - is what `error_type` carries. The request itself is terminal, so submit a new one rather than re-reading this one."},{"value":"request_not_found","tier":"transport","meaning":"The `request_id` names no request of the caller's under this model. It is the second of the two conditions the queued reads' `404` covers; the first is the `{provider}/{model}` ID resolving to no partner model, which is `model_not_found` and carries fuzzy model suggestions. It also covers the right-id / wrong-model URL the path shape refuses, and it is deliberately indistinguishable from a request in another workspace, so a probe with a guessed id learns nothing. A request that has merely aged out of its retention window is `410`, not this."},{"value":"queue_backlog_full","tier":"transport","meaning":"The caller already has too many queued requests waiting to run, so this submit was refused. It shares `429` with `concurrency_limit_exceeded` and is not the same thing: that one is the synchronous route's answer for too many calls in flight at once, whereas the queue accepts a submit at that limit and parks it, and this bucket is the separate bound on how many a caller may leave waiting so that parking cannot mean enqueuing without end. It clears as the caller's own queued requests finish, so retry once some of them complete."}],"isRequired":true,"uniqueKey":"error_type","typeLabel":"string"},"upstream_detail":{"type":"string","description":"A bounded, sanitized reason the model provider gave for rejecting the request, present only when `error_type` is `invalid_input` and `X-Comfy-Upstream-Status` is a provider `4xx` or `2xx` - i.e. the provider refused the request as malformed and said why. Usually that status is a `4xx`; it is a `2xx` for a provider that reports a rejected generation inside a success envelope (a BytePlus failed-task poll is HTTP `200` with the reason in its body). Absent on every other failure, including provider `5xx`, transport failures, content-policy refusals and any refusal Router raised about itself. It mirrors the `X-Comfy-Upstream-Detail` header.","uniqueKey":"upstream_detail","typeLabel":"string"},"refusal_subject":{"type":"string","description":"Which input or output a content-policy refusal was about, as a Router-level closed vocabulary: `input`, `output`, `input_text`, `input_image`, `input_video`, `input_audio`, `output_text`, `output_image`, `output_video`, `output_audio`. The bare `input` / `output` values name the side when the provider did not name a modality. Present only when `error_type` is `content_policy_violation` and the provider named the refused subject with a machine-readable code; absent otherwise. Never provider text. Named today for BytePlus, Runway, BFL, Gemini, Veo, Vertex, xAI and Wan refusals, and for the MiniMax Router's Nano Banana legs' Gemini refusals; a provider whose refusal does not say which side it was about leaves it absent. It mirrors the `X-Comfy-Refusal-Subject` header.","uniqueKey":"refusal_subject","typeLabel":"string"}},"required":["detail","error_type"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"detail":"\u003cstring>","error_type":"invalid_input","upstream_detail":"\u003cstring>","refusal_subject":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"f6dcf0c9-eef8-42af-936d-dbcbe3524235":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Bearer token authentication. Normally a Firebase or Cloud JWT. A 'comfyui-' prefixed API key is also accepted in this header: the prefix classifies the value as an API key and it is validated exactly as if it had been sent in X-API-Key.","scopes":[],"schemeName":"BearerAuth"}},"5224f9e0-18d8-4926-914a-6ae92b8d810c":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key authentication. Send the key in the X-API-Key header; keys are prefixed with 'comfyui-' and are generated from user account settings. The same 'comfyui-' key is also accepted in Authorization: Bearer (see BearerAuth), and when both headers carry a key, X-API-Key wins.","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"f24065f5-ecd5-447b-a593-a7927e1a743a":{"url":"https://api.comfy.org"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Bearer token authentication. Normally a Firebase or Cloud JWT. A 'comfyui-' prefixed API key is also accepted in this header: the prefix classifies the value as an API key and it is validated exactly as if it had been sent in X-API-Key.","scopes":[],"schemeName":"BearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Bearer token authentication. Normally a Firebase or Cloud JWT. A 'comfyui-' prefixed API key is also accepted in this header: the prefix classifies the value as an API key and it is validated exactly as if it had been sent in X-API-Key.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"BearerAuth","name":"Authorization"}],"title":"BearerAuth"},{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API key authentication. Send the key in the X-API-Key header; keys are prefixed with 'comfyui-' and are generated from user account settings. The same 'comfyui-' key is also accepted in Authorization: Bearer (see BearerAuth), and when both headers carry a key, X-API-Key wins.","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"X-API-Key","type":"string","description":"API key authentication. Send the key in the X-API-Key header; keys are prefixed with 'comfyui-' and are generated from user account settings. The same 'comfyui-' key is also accepted in Authorization: Bearer (see BearerAuth), and when both headers carry a key, X-API-Key wins.","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"X-API-Key"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"router-openapi.yaml"},"subdomain":"dripart","siteName":"ComfyUI","title":"List the models Comfy Router can run. - ComfyUI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/api-reference/router/comfy-router/list-the-models-comfy-router-can-run","matchLevel":0},"zh":{"href":"/zh/api-reference/router/comfy-router/list-the-models-comfy-router-can-run","matchLevel":1},"ja":{"href":"/ja/api-reference/router/comfy-router/list-the-models-comfy-router-can-run","matchLevel":1},"ko":{"href":"/ko/api-reference/router/comfy-router/list-the-models-comfy-router-can-run","matchLevel":1},"es":{"href":"/es/api-reference/router/comfy-router/list-the-models-comfy-router-can-run","matchLevel":1}}},"lastModified":"2026-10-26T22:14:27.704Z","originalFileLocation":"api-reference/router/comfy-router/list-the-models-comfy-router-can-run.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Comfy Router\u0026#x27;s model catalog - one page of the canonical model IDs that POST /v2/models/{provider}/{model} accepts. An SDK calls this on cold start to discover what is runnable, and the model_not_found suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry\u0026#x27;s provider and model are the two path segments of the invocation route and reference the same schema components that route\u0026#x27;s path parameters do, and id is those two segments joined by /.\">\u003cmeta data-mint-head name=\"application-name\" content=\"ComfyUI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"List the models Comfy Router can run. - ComfyUI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Comfy Router\u0026#x27;s model catalog - one page of the canonical model IDs that POST /v2/models/{provider}/{model} accepts. An SDK calls this on cold start to discover what is runnable, and the model_not_found suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry\u0026#x27;s provider and model are the two path segments of the invocation route and reference the same schema components that route\u0026#x27;s path parameters do, and id is those two segments joined by /.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"ComfyUI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://dripart.mintlify.app/_mintlify/api/og/v2?division=Comfy+Router\u0026amp;title=List+the+models+Comfy+Router+can+run.\u0026amp;description=Comfy+Router%27s+model+catalog+-+one+page+of+the+canonical+model+IDs+that+%60POST+%2Fv2%2Fmodels%2F%7Bprovider%7D%2F%7Bmodel%7D%60+accepts.+An+SDK+calls+this+on+cold+start+to+discove\u0026amp;theme=a03fed56f9a178c9b893031e\u0026amp;signature=56c3af3f158963b4d1f578dcc2dc4a69d6b5cd7c2fdb36f0bee955229a9c1373\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"List the models Comfy Router can run. - ComfyUI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Comfy Router\u0026#x27;s model catalog - one page of the canonical model IDs that POST /v2/models/{provider}/{model} accepts. An SDK calls this on cold start to discover what is runnable, and the model_not_found suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry\u0026#x27;s provider and model are the two path segments of the invocation route and reference the same schema components that route\u0026#x27;s path parameters do, and id is those two segments joined by /.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://dripart.mintlify.app/_mintlify/api/og/v2?division=Comfy+Router\u0026amp;title=List+the+models+Comfy+Router+can+run.\u0026amp;description=Comfy+Router%27s+model+catalog+-+one+page+of+the+canonical+model+IDs+that+%60POST+%2Fv2%2Fmodels%2F%7Bprovider%7D%2F%7Bmodel%7D%60+accepts.+An+SDK+calls+this+on+cold+start+to+discove\u0026amp;theme=a03fed56f9a178c9b893031e\u0026amp;signature=56c3af3f158963b4d1f578dcc2dc4a69d6b5cd7c2fdb36f0bee955229a9c1373\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/dripart/lS3H5I41bE6LSXEf/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"ComfyUI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#49378B\">\u003cmeta data-mint-head name=\"googlebot\" content=\"max-video-preview:0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/router/comfy-router/list-the-models-comfy-router-can-run.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://docs.comfy.org/zh/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.comfy.org/ja/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://docs.comfy.org/ko/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"es\" href=\"https://docs.comfy.org/es/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.comfy.org/#organization\",\"name\":\"ComfyUI\",\"url\":\"https://docs.comfy.org\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/dripart/WCFdTagRdhtvk9-o/logo/light.svg?fit=max\u0026auto=format\u0026n=WCFdTagRdhtvk9-o\u0026q=85\u0026s=ec112de87239058f5a931a7e4b594965\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.comfy.org#website\",\"name\":\"ComfyUI\",\"url\":\"https://docs.comfy.org\",\"publisher\":{\"@id\":\"https://docs.comfy.org/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run#webpage\",\"url\":\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\",\"name\":\"List the models Comfy Router can run.\",\"description\":\"Comfy Router's model catalog - one page of the canonical model IDs that POST /v2/models/{provider}/{model} accepts. An SDK calls this on cold start to discover what is runnable, and the model_not_found suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry's provider and model are the two path segments of the invocation route and reference the same schema components that route's path parameters do, and id is those two segments joined by /.\",\"dateModified\":\"2026-10-26T22:14:27.704Z\",\"isPartOf\":{\"@id\":\"https://docs.comfy.org#website\"},\"breadcrumb\":{\"@id\":\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Reference\",\"item\":\"https://docs.comfy.org/development/comfy-router/reference\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"List the models Comfy Router can run.\",\"item\":\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run#apireference\",\"headline\":\"List the models Comfy Router can run.\",\"name\":\"List the models Comfy Router can run.\",\"description\":\"Comfy Router's model catalog - one page of the canonical model IDs that POST /v2/models/{provider}/{model} accepts. An SDK calls this on cold start to discover what is runnable, and the model_not_found suggestions come from the same catalog, so an ID listed here that then 404s on invocation would be worse than either failure alone. That agreement is structural rather than a promise: an entry's provider and model are the two path segments of the invocation route and reference the same schema components that route's path parameters do, and id is those two segments joined by /.\",\"url\":\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run\",\"mainEntityOfPage\":{\"@id\":\"https://docs.comfy.org/api-reference/router/comfy-router/list-the-models-comfy-router-can-run#webpage\"},\"dateModified\":\"2026-10-26T22:14:27.704Z\",\"publisher\":{\"@id\":\"https://docs.comfy.org/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.comfy.org#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"ComfyUI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"ComfyUI","nav":{"global":null,"languages":[{"language":"en","tabs":[{"tab":"Getting started","pages":[{"title":"Getting started","href":""}]},{"tab":"Tutorials","pages":[{"title":"Tutorials","href":"/basic-concepts/workflow"}]},{"tab":"Comfy Router","pages":[{"title":"Comfy Router quickstart","sidebarTitle":"Quickstart","href":"/development/comfy-router/quickstart"},{"group":"Router API","pages":[{"title":"Comfy Router API overview","sidebarTitle":"Overview","href":"/development/comfy-router/api"},{"title":"Discover Comfy Router models","sidebarTitle":"Discover models","href":"/development/comfy-router/discover-models"},{"title":"Comfy Router model schemas and results","sidebarTitle":"Schemas and results","href":"/development/comfy-router/schemas"},{"title":"Queue Comfy Router requests","sidebarTitle":"Queued requests","href":"/development/comfy-router/queue"},{"title":"Comfy Router errors and retries","sidebarTitle":"Errors and retries","href":"/development/comfy-router/errors"},{"title":"Comfy Router billing","sidebarTitle":"Billing","href":"/development/comfy-router/billing"}]},{"group":"Reference","pages":[{"title":"Comfy Router API reference","sidebarTitle":"API Reference","href":"/development/comfy-router/reference"},{"title":"Comfy Router headers","sidebarTitle":"Headers","href":"/development/comfy-router/headers"},{"title":"Comfy Router capabilities and limits","sidebarTitle":"Capabilities and limits","description":"Choose Router or a partner proxy, plan for long-running calls, and understand recovery, rate limits, and asset storage.","href":"/development/comfy-router/limitations"},{"group":"API Reference","pages":[{"group":"Comfy Router","pages":[{"title":"List the models Comfy Router can run.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models","href":"/api-reference/router/comfy-router/list-the-models-comfy-router-can-run"},{"title":"Read one partner model's catalog entry by canonical model ID.","description":"Per-model detail for a single Comfy Router model, so a caller can check one model without walking the whole paginated catalog. The SDKs use it to look a model up immediately before invoking it.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models/{provider}/{model}","href":"/api-reference/router/comfy-router/read-one-partner-models-catalog-entry-by-canonical-model-id"},{"title":"Run a partner model synchronously by canonical model ID.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml post /v2/models/{provider}/{model}","href":"/api-reference/router/comfy-router/run-a-partner-model-synchronously-by-canonical-model-id"},{"title":"Price a model call before running it, without running it.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml post /v2/models/{provider}/{model}/estimate","href":"/api-reference/router/comfy-router/price-a-model-call-before-running-it-without-running-it"},{"title":"Read one partner model's input and output schemas as an OpenAPI document.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models/{provider}/{model}/openapi.json","href":"/api-reference/router/comfy-router/read-one-partner-models-input-and-output-schemas-as-an-openapi-document"},{"title":"Submit a partner model run to the queue and return immediately.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml post /v2/models/{provider}/{model}/requests","href":"/api-reference/router/comfy-router/submit-a-partner-model-run-to-the-queue-and-return-immediately"},{"title":"Collect the result of one submitted request.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models/{provider}/{model}/requests/{request_id}","href":"/api-reference/router/comfy-router/collect-the-result-of-one-submitted-request"},{"title":"Ask for one submitted request to be cancelled.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml put /v2/models/{provider}/{model}/requests/{request_id}/cancel","href":"/api-reference/router/comfy-router/ask-for-one-submitted-request-to-be-cancelled"},{"title":"Read the queue state of one submitted request.","deprecated":null,"version":null,"openapi":"/router-openapi.yaml get /v2/models/{provider}/{model}/requests/{request_id}/status","href":"/api-reference/router/comfy-router/read-the-queue-state-of-one-submitted-request"}]}]}]},{"group":"Models","pages":[{"title":"Comfy Router models","sidebarTitle":"All models","href":"/development/comfy-router/models"},{"title":"Comfy Router pricing","sidebarTitle":"Pricing","mode":"wide","href":"/development/comfy-router/pricing"},{"title":"Comfy Router serving providers","sidebarTitle":"Serving providers","href":"/development/comfy-router/providers"},{"group":"All Models","pages":[{"group":"Anthropic","pages":[{"title":"Use Claude Fable 5.1 with Comfy Router","sidebarTitle":"Claude Fable 5.1","href":"/development/comfy-router/models/anthropic/claude-fable-5-1/code"},{"title":"Use Claude Fable 5 with Comfy Router","sidebarTitle":"Claude Fable 5","href":"/development/comfy-router/models/anthropic/claude-fable-5/code"},{"title":"Use Claude Haiku 4.5 20251001 with Comfy Router","sidebarTitle":"Claude Haiku 4.5 20251001","href":"/development/comfy-router/models/anthropic/claude-haiku-4-5-20251001/code"},{"title":"Use Claude Opus 4.6 with Comfy Router","sidebarTitle":"Claude Opus 4.6","href":"/development/comfy-router/models/anthropic/claude-opus-4-6/code"},{"title":"Use Claude Opus 4.7 with Comfy Router","sidebarTitle":"Claude Opus 4.7","href":"/development/comfy-router/models/anthropic/claude-opus-4-7/code"},{"title":"Use Claude Opus 4.8 with Comfy Router","sidebarTitle":"Claude Opus 4.8","href":"/development/comfy-router/models/anthropic/claude-opus-4-8/code"},{"title":"Use Claude Opus 5.5 with Comfy Router","sidebarTitle":"Claude Opus 5.5","href":"/development/comfy-router/models/anthropic/claude-opus-5-5/code"},{"title":"Use Claude Opus 5 with Comfy Router","sidebarTitle":"Claude Opus 5","href":"/development/comfy-router/models/anthropic/claude-opus-5/code"},{"title":"Use Claude Sonnet 4.5 20250929 with Comfy Router","sidebarTitle":"Claude Sonnet 4.5 20250929","href":"/development/comfy-router/models/anthropic/claude-sonnet-4-5-20250929/code"},{"title":"Use Claude Sonnet 4.6 with Comfy Router","sidebarTitle":"Claude Sonnet 4.6","href":"/development/comfy-router/models/anthropic/claude-sonnet-4-6/code"},{"title":"Use Claude Sonnet 5.5 with Comfy Router","sidebarTitle":"Claude Sonnet 5.5","href":"/development/comfy-router/models/anthropic/claude-sonnet-5-5/code"},{"title":"Use Claude Sonnet 5 with Comfy Router","sidebarTitle":"Claude Sonnet 5","href":"/development/comfy-router/models/anthropic/claude-sonnet-5/code"}]},{"group":"Beeble","pages":[{"title":"Use SwitchX with Comfy Router","sidebarTitle":"SwitchX","href":"/development/comfy-router/models/beeble/switchx/code"}]},{"group":"Black Forest Labs","pages":[{"title":"Use Erase V1 with Comfy Router","sidebarTitle":"Erase V1","href":"/development/comfy-router/models/black-forest-labs/erase-v1/code"},{"title":"Use Flux 1.1 Pro Ultra Image with Comfy Router","sidebarTitle":"Flux 1.1 Pro Ultra Image","href":"/development/comfy-router/models/black-forest-labs/flux-1-1-pro-ultra-image/code"},{"title":"Use FLUX.1 Kontext with Comfy Router","sidebarTitle":"FLUX.1 Kontext","href":"/development/comfy-router/models/black-forest-labs/flux-1-kontext/code"},{"title":"Use FLUX 2 Max with Comfy Router","sidebarTitle":"FLUX 2 Max","href":"/development/comfy-router/models/black-forest-labs/flux-2-max/code"},{"title":"Use FLUX 2 Pro with Comfy Router","sidebarTitle":"FLUX 2 Pro","href":"/development/comfy-router/models/black-forest-labs/flux-2-pro/code"},{"title":"Use FLUX 3 Image with Comfy Router","sidebarTitle":"FLUX 3 Image","href":"/development/comfy-router/models/black-forest-labs/flux-3-image/code"},{"title":"Use FLUX 3 Video with Comfy Router","sidebarTitle":"FLUX 3 Video","href":"/development/comfy-router/models/black-forest-labs/flux-3-video/code"},{"title":"Use FLUX Pro 1.0 Expand with Comfy Router","sidebarTitle":"FLUX Pro 1.0 Expand","href":"/development/comfy-router/models/black-forest-labs/flux-pro-1-0-expand/code"},{"title":"Use FLUX Pro 1.0 Fill with Comfy Router","sidebarTitle":"FLUX Pro 1.0 Fill","href":"/development/comfy-router/models/black-forest-labs/flux-pro-1-0-fill/code"},{"title":"Use FLUX Video Upscale with Comfy Router","sidebarTitle":"FLUX Video Upscale","href":"/development/comfy-router/models/black-forest-labs/flux-video-upscale/code"},{"title":"Use Video Edit V1 with Comfy Router","sidebarTitle":"Video Edit V1","href":"/development/comfy-router/models/black-forest-labs/video-edit-v1/code"},{"title":"Use VTO V1 with Comfy Router","sidebarTitle":"VTO V1","href":"/development/comfy-router/models/black-forest-labs/vto-v1/code"}]},{"group":"Bria","pages":[{"title":"Use Fibo with Comfy Router","sidebarTitle":"Fibo","href":"/development/comfy-router/models/bria/fibo/code"},{"title":"Use Image Edit Add Object By Text with Comfy Router","sidebarTitle":"Image Edit Add Object By Text","href":"/development/comfy-router/models/bria/image-edit-add-object-by-text/code"},{"title":"Use Image Edit Erase By Text with Comfy Router","sidebarTitle":"Image Edit Erase By Text","href":"/development/comfy-router/models/bria/image-edit-erase-by-text/code"},{"title":"Use Image Edit Erase Foreground with Comfy Router","sidebarTitle":"Image Edit Erase Foreground","href":"/development/comfy-router/models/bria/image-edit-erase-foreground/code"},{"title":"Use Image Edit Erase with Comfy Router","sidebarTitle":"Image Edit Erase","href":"/development/comfy-router/models/bria/image-edit-erase/code"},{"title":"Use Image Edit Expand with Comfy Router","sidebarTitle":"Image Edit Expand","href":"/development/comfy-router/models/bria/image-edit-expand/code"},{"title":"Use Image Edit Gen Fill with Comfy Router","sidebarTitle":"Image Edit Gen Fill","href":"/development/comfy-router/models/bria/image-edit-gen-fill/code"},{"title":"Use Image Edit Increase Resolution with Comfy Router","sidebarTitle":"Image Edit Increase Resolution","href":"/development/comfy-router/models/bria/image-edit-increase-resolution/code"},{"title":"Use Image Edit Product Holding with Comfy Router","sidebarTitle":"Image Edit Product Holding","href":"/development/comfy-router/models/bria/image-edit-product-holding/code"},{"title":"Use Image Edit Product Virtual Tryon with Comfy Router","sidebarTitle":"Image Edit Product Virtual Tryon","href":"/development/comfy-router/models/bria/image-edit-product-virtual-tryon/code"},{"title":"Use Image Edit Relight with Comfy Router","sidebarTitle":"Image Edit Relight","href":"/development/comfy-router/models/bria/image-edit-relight/code"},{"title":"Use Image Edit Remove Background Guided with Comfy Router","sidebarTitle":"Image Edit Remove Background Guided","href":"/development/comfy-router/models/bria/image-edit-remove-background-guided/code"},{"title":"Use Image Edit Remove Background with Comfy Router","sidebarTitle":"Image Edit Remove Background","href":"/development/comfy-router/models/bria/image-edit-remove-background/code"},{"title":"Use Image Edit Replace Background with Comfy Router","sidebarTitle":"Image Edit Replace Background","href":"/development/comfy-router/models/bria/image-edit-replace-background/code"},{"title":"Use Image Edit Replace Object By Text with Comfy Router","sidebarTitle":"Image Edit Replace Object By Text","href":"/development/comfy-router/models/bria/image-edit-replace-object-by-text/code"},{"title":"Use Image Edit Reseason with Comfy Router","sidebarTitle":"Image Edit Reseason","href":"/development/comfy-router/models/bria/image-edit-reseason/code"},{"title":"Use Image Edit Restore with Comfy Router","sidebarTitle":"Image Edit Restore","href":"/development/comfy-router/models/bria/image-edit-restore/code"},{"title":"Use Image with Comfy Router","sidebarTitle":"Image","href":"/development/comfy-router/models/bria/image/code"},{"title":"Use Video Edit Erase with Comfy Router","sidebarTitle":"Video Edit Erase","href":"/development/comfy-router/models/bria/video-edit-erase/code"},{"title":"Use Video Edit Green Screen with Comfy Router","sidebarTitle":"Video Edit Green Screen","href":"/development/comfy-router/models/bria/video-edit-green-screen/code"},{"title":"Use Video Edit Remove Background with Comfy Router","sidebarTitle":"Video Edit Remove Background","href":"/development/comfy-router/models/bria/video-edit-remove-background/code"},{"title":"Use Video Edit Replace Background with Comfy Router","sidebarTitle":"Video Edit Replace Background","href":"/development/comfy-router/models/bria/video-edit-replace-background/code"}]},{"group":"BytePlus","pages":[{"title":"Use Dreamina Seedance 2.0 260128 with Comfy Router","sidebarTitle":"Dreamina Seedance 2.0 260128","href":"/development/comfy-router/models/byteplus/dreamina-seedance-2-0-260128/code"},{"title":"Use Dreamina Seedance 2.0 Fast 260128 with Comfy Router","sidebarTitle":"Dreamina Seedance 2.0 Fast 260128","href":"/development/comfy-router/models/byteplus/dreamina-seedance-2-0-fast-260128/code"},{"title":"Use Dreamina Seedance 2.0 Mini with Comfy Router","sidebarTitle":"Dreamina Seedance 2.0 Mini","href":"/development/comfy-router/models/byteplus/dreamina-seedance-2-0-mini/code"},{"title":"Use Dreamina Seedance 2.5 260628 with Comfy Router","sidebarTitle":"Dreamina Seedance 2.5 260628","href":"/development/comfy-router/models/byteplus/dreamina-seedance-2-5-260628/code"},{"title":"Use Seed 2.0 Lite 260228 with Comfy Router","sidebarTitle":"Seed 2.0 Lite 260228","href":"/development/comfy-router/models/byteplus/seed-2-0-lite-260228/code"},{"title":"Use Seed 2.0 Mini 260215 with Comfy Router","sidebarTitle":"Seed 2.0 Mini 260215","href":"/development/comfy-router/models/byteplus/seed-2-0-mini-260215/code"},{"title":"Use Seed 2.0 Pro 260328 with Comfy Router","sidebarTitle":"Seed 2.0 Pro 260328","href":"/development/comfy-router/models/byteplus/seed-2-0-pro-260328/code"},{"title":"Use Seed Audio 1.0 Multilingual with Comfy Router","sidebarTitle":"Seed Audio 1.0 Multilingual","href":"/development/comfy-router/models/byteplus/seed-audio-1-0-multilingual/code"},{"title":"Use Seed Audio 1.0 with Comfy Router","sidebarTitle":"Seed Audio 1.0","href":"/development/comfy-router/models/byteplus/seed-audio-1-0/code"},{"title":"Use Seedance 1.0 Pro 250528 with Comfy Router","sidebarTitle":"Seedance 1.0 Pro 250528","href":"/development/comfy-router/models/byteplus/seedance-1-0-pro-250528/code"},{"title":"Use Seedance 1.0 Pro Fast 251015 with Comfy Router","sidebarTitle":"Seedance 1.0 Pro Fast 251015","href":"/development/comfy-router/models/byteplus/seedance-1-0-pro-fast-251015/code"},{"title":"Use Seedance 1.5 Pro 251215 with Comfy Router","sidebarTitle":"Seedance 1.5 Pro 251215","href":"/development/comfy-router/models/byteplus/seedance-1-5-pro-251215/code"},{"title":"Use Seedream 4.0 250828 with Comfy Router","sidebarTitle":"Seedream 4.0 250828","href":"/development/comfy-router/models/byteplus/seedream-4-0-250828/code"},{"title":"Use Seedream 4.5 251128 with Comfy Router","sidebarTitle":"Seedream 4.5 251128","href":"/development/comfy-router/models/byteplus/seedream-4-5-251128/code"},{"title":"Use Seedream 5.0 260128 with Comfy Router","sidebarTitle":"Seedream 5.0 260128","href":"/development/comfy-router/models/byteplus/seedream-5-0-260128/code"},{"title":"Use Seedream 5.0 Flash 260915 with Comfy Router","sidebarTitle":"Seedream 5.0 Flash 260915","href":"/development/comfy-router/models/byteplus/seedream-5-0-flash-260915/code"},{"title":"Use Seedream 5.0 Pro 260628 with Comfy Router","sidebarTitle":"Seedream 5.0 Pro 260628","href":"/development/comfy-router/models/byteplus/seedream-5-0-pro-260628/code"}]},{"group":"Elevenlabs","pages":[{"title":"Use Eleven Multilingual V2 with Comfy Router","sidebarTitle":"Eleven Multilingual V2","href":"/development/comfy-router/models/elevenlabs/eleven-multilingual-v2/code"},{"title":"Use Eleven Sfx V2 with Comfy Router","sidebarTitle":"Eleven Sfx V2","href":"/development/comfy-router/models/elevenlabs/eleven-sfx-v2/code"},{"title":"Use Eleven V3 with Comfy Router","sidebarTitle":"Eleven V3","href":"/development/comfy-router/models/elevenlabs/eleven-v3/code"},{"title":"Use Eleven V4 Turbo with Comfy Router","sidebarTitle":"Eleven V4 Turbo","href":"/development/comfy-router/models/elevenlabs/eleven-v4-turbo/code"},{"title":"Use Eleven V4 with Comfy Router","sidebarTitle":"Eleven V4","href":"/development/comfy-router/models/elevenlabs/eleven-v4/code"}]},{"group":"fal","pages":[{"title":"Use Crystal Upscaler with Comfy Router","sidebarTitle":"Crystal Upscaler","href":"/development/comfy-router/models/fal/crystal-upscaler/code"},{"title":"Use Crystal Video Upscaler with Comfy Router","sidebarTitle":"Crystal Video Upscaler","href":"/development/comfy-router/models/fal/crystal-video-upscaler/code"},{"title":"Use FLUX 3 Max with Comfy Router","sidebarTitle":"FLUX 3 Max","href":"/development/comfy-router/models/fal/flux-3-max/code"},{"title":"Use H3 Max Turbo with Comfy Router","sidebarTitle":"H3 Max Turbo","href":"/development/comfy-router/models/fal/h3-max-turbo/code"},{"title":"Use H3 Max with Comfy Router","sidebarTitle":"H3 Max","href":"/development/comfy-router/models/fal/h3-max/code"},{"title":"Use Patina with Comfy Router","sidebarTitle":"Patina","href":"/development/comfy-router/models/fal/patina/code"}]},{"group":"Freepik","pages":[{"title":"Use AI Image Upscaler Precision V2 with Comfy Router","sidebarTitle":"AI Image Upscaler Precision V2","href":"/development/comfy-router/models/freepik/ai-image-upscaler-precision-v2/code"},{"title":"Use AI Skin Enhancer Creative with Comfy Router","sidebarTitle":"AI Skin Enhancer Creative","href":"/development/comfy-router/models/freepik/ai-skin-enhancer-creative/code"},{"title":"Use AI Skin Enhancer Faithful with Comfy Router","sidebarTitle":"AI Skin Enhancer Faithful","href":"/development/comfy-router/models/freepik/ai-skin-enhancer-faithful/code"},{"title":"Use AI Skin Enhancer Flexible with Comfy Router","sidebarTitle":"AI Skin Enhancer Flexible","href":"/development/comfy-router/models/freepik/ai-skin-enhancer-flexible/code"}]},{"group":"Gemini Interactions","pages":[{"title":"Use Gemini Omni 1.1 Flash with Comfy Router","sidebarTitle":"Gemini Omni 1.1 Flash","href":"/development/comfy-router/models/gemini-interactions/gemini-omni-1-1-flash/code"},{"title":"Use Gemini Omni Flash Preview with Comfy Router","sidebarTitle":"Gemini Omni Flash Preview","href":"/development/comfy-router/models/gemini-interactions/gemini-omni-flash-preview/code"}]},{"group":"Google","pages":[{"title":"Use Gemini 2.5 Flash Image with Comfy Router","sidebarTitle":"Gemini 2.5 Flash Image","href":"/development/comfy-router/models/google/gemini-2-5-flash-image/code"},{"title":"Use Gemini 3.1 Flash Lite with Comfy Router","sidebarTitle":"Gemini 3.1 Flash Lite","href":"/development/comfy-router/models/google/gemini-3-1-flash-lite/code"},{"title":"Use Gemini 3.7 Flash with Comfy Router","sidebarTitle":"Gemini 3.7 Flash","href":"/development/comfy-router/models/google/gemini-3-7-flash/code"},{"title":"Use Gemini 3.8 Flash with Comfy Router","sidebarTitle":"Gemini 3.8 Flash","href":"/development/comfy-router/models/google/gemini-3-8-flash/code"},{"title":"Use Gemini Nano Banana 2.1 with Comfy Router","sidebarTitle":"Gemini Nano Banana 2.1","href":"/development/comfy-router/models/google/gemini-nano-banana-2-1/code"},{"title":"Use Google Gemini with Comfy Router","sidebarTitle":"Google Gemini","href":"/development/comfy-router/models/google/gemini/code"},{"title":"Use Nano Banana 2 Lite with Comfy Router","sidebarTitle":"Nano Banana 2 Lite","href":"/development/comfy-router/models/google/nano-banana-2-lite/code"},{"title":"Use Nano Banana 2 with Comfy Router","sidebarTitle":"Nano Banana 2","href":"/development/comfy-router/models/google/nano-banana-2/code"},{"title":"Use Nano Banana Pro with Comfy Router","sidebarTitle":"Nano Banana Pro","href":"/development/comfy-router/models/google/nano-banana-pro/code"}]},{"group":"HeyGen","pages":[{"title":"Use Starfish with Comfy Router","sidebarTitle":"Starfish","href":"/development/comfy-router/models/heygen/starfish/code"}]},{"group":"Higgsfield","pages":[{"title":"Use Higgsfield Genjutsu Motion Transfer V1.0 with Comfy Router","sidebarTitle":"Higgsfield Genjutsu Motion Transfer V1.0","href":"/development/comfy-router/models/higgsfield/higgsfield-genjutsu-motion-transfer-v1-0/code"},{"title":"Use Higgsfield Kling 3.4k with Comfy Router","sidebarTitle":"Higgsfield Kling 3.4k","href":"/development/comfy-router/models/higgsfield/higgsfield-kling-3-4k/code"},{"title":"Use Higgsfield Kling 3 Pro with Comfy Router","sidebarTitle":"Higgsfield Kling 3 Pro","href":"/development/comfy-router/models/higgsfield/higgsfield-kling-3-pro/code"}]},{"group":"Ideogram","pages":[{"title":"Use Ideogram 4.5 with Comfy Router","sidebarTitle":"Ideogram 4.5","href":"/development/comfy-router/models/ideogram/ideogram-4-5/code"},{"title":"Use Ideogram V3 with Comfy Router","sidebarTitle":"Ideogram V3","href":"/development/comfy-router/models/ideogram/ideogram-v3/code"},{"title":"Use Ideogram 4.0 with Comfy Router","sidebarTitle":"Ideogram 4.0","href":"/development/comfy-router/models/ideogram/ideogram-v4/code"},{"title":"Use P Image Ideogram with Comfy Router","sidebarTitle":"P Image Ideogram","href":"/development/comfy-router/models/ideogram/p-image-ideogram/code"}]},{"group":"Kling","pages":[{"title":"Use Kling 3.0 Turbo with Comfy Router","sidebarTitle":"Kling 3.0 Turbo","href":"/development/comfy-router/models/kling/kling-3-0-turbo/code"},{"title":"Use Kling Image O1 with Comfy Router","sidebarTitle":"Kling Image O1","href":"/development/comfy-router/models/kling/kling-image-o1/code"},{"title":"Use Kling V2.5 Turbo with Comfy Router","sidebarTitle":"Kling V2.5 Turbo","href":"/development/comfy-router/models/kling/kling-v2-5-turbo/code"},{"title":"Use Kling V2.6 with Comfy Router","sidebarTitle":"Kling V2.6","href":"/development/comfy-router/models/kling/kling-v2-6/code"},{"title":"Use Kling V3 Omni with Comfy Router","sidebarTitle":"Kling V3 Omni","href":"/development/comfy-router/models/kling/kling-v3-omni/code"},{"title":"Use Kling V3 with Comfy Router","sidebarTitle":"Kling V3","href":"/development/comfy-router/models/kling/kling-v3/code"},{"title":"Use Kling Video O1 with Comfy Router","sidebarTitle":"Kling Video O1","href":"/development/comfy-router/models/kling/kling-video-o1/code"},{"title":"Use Videos Avatar Image 2video with Comfy Router","sidebarTitle":"Videos Avatar Image 2video","href":"/development/comfy-router/models/kling/videos-avatar-image2video/code"},{"title":"Use Videos Lip Sync with Comfy Router","sidebarTitle":"Videos Lip Sync","href":"/development/comfy-router/models/kling/videos-lip-sync/code"},{"title":"Use Videos Video Extend with Comfy Router","sidebarTitle":"Videos Video Extend","href":"/development/comfy-router/models/kling/videos-video-extend/code"}]},{"group":"Krea","pages":[{"title":"Use Krea 2 Large with Comfy Router","sidebarTitle":"Krea 2 Large","href":"/development/comfy-router/models/krea/krea-2-large/code"},{"title":"Use Krea 2 Medium Turbo with Comfy Router","sidebarTitle":"Krea 2 Medium Turbo","href":"/development/comfy-router/models/krea/krea-2-medium-turbo/code"},{"title":"Use Krea 2 Medium with Comfy Router","sidebarTitle":"Krea 2 Medium","href":"/development/comfy-router/models/krea/krea-2-medium/code"},{"title":"Use Krea 2 with Comfy Router","sidebarTitle":"Krea 2","href":"/development/comfy-router/models/krea/krea-2/code"},{"title":"Use Krea 3 with Comfy Router","sidebarTitle":"Krea 3","href":"/development/comfy-router/models/krea/krea-3/code"}]},{"group":"LTX","pages":[{"title":"Use LTX 2.5 Fast with Comfy Router","sidebarTitle":"LTX 2.5 Fast","href":"/development/comfy-router/models/ltx/ltx-2-5-fast/code"},{"title":"Use LTX 2.5 Pro with Comfy Router","sidebarTitle":"LTX 2.5 Pro","href":"/development/comfy-router/models/ltx/ltx-2-5-pro/code"}]},{"group":"Luma","pages":[{"title":"Use Photon 1 with Comfy Router","sidebarTitle":"Photon 1","href":"/development/comfy-router/models/luma/photon-1/code"},{"title":"Use Photon Flash 1 with Comfy Router","sidebarTitle":"Photon Flash 1","href":"/development/comfy-router/models/luma/photon-flash-1/code"},{"title":"Use Ray 2 with Comfy Router","sidebarTitle":"Ray 2","href":"/development/comfy-router/models/luma/ray-2/code"},{"title":"Use Ray Flash 2 with Comfy Router","sidebarTitle":"Ray Flash 2","href":"/development/comfy-router/models/luma/ray-flash-2/code"}]},{"group":"Luma 2","pages":[{"title":"Use Ray 3.2 with Comfy Router","sidebarTitle":"Ray 3.2","href":"/development/comfy-router/models/luma_2/ray-3-2/code"},{"title":"Use Uni 1 Max with Comfy Router","sidebarTitle":"Uni 1 Max","href":"/development/comfy-router/models/luma_2/uni-1-max/code"},{"title":"Use Uni 1 with Comfy Router","sidebarTitle":"Uni 1","href":"/development/comfy-router/models/luma_2/uni-1/code"}]},{"group":"Meshy","pages":[{"title":"Use Animations with Comfy Router","sidebarTitle":"Animations","href":"/development/comfy-router/models/meshy/animations/code"},{"title":"Use Meshy 6 with Comfy Router","sidebarTitle":"Meshy 6","href":"/development/comfy-router/models/meshy/meshy-6/code"},{"title":"Use Meshy 7.1 with Comfy Router","sidebarTitle":"Meshy 7.1","href":"/development/comfy-router/models/meshy/meshy-7-1/code"},{"title":"Use Meshy 7 with Comfy Router","sidebarTitle":"Meshy 7","href":"/development/comfy-router/models/meshy/meshy-7/code"},{"title":"Use Remesh with Comfy Router","sidebarTitle":"Remesh","href":"/development/comfy-router/models/meshy/remesh/code"},{"title":"Use Rigging with Comfy Router","sidebarTitle":"Rigging","href":"/development/comfy-router/models/meshy/rigging/code"}]},{"group":"MiniMax","pages":[{"title":"Use MiniMax H3 with Comfy Router","sidebarTitle":"MiniMax H3","href":"/development/comfy-router/models/minimax/minimax-h3/code"}]},{"group":"Moonvalley","pages":[{"title":"Use Image To Video with Comfy Router","sidebarTitle":"Image To Video","href":"/development/comfy-router/models/moonvalley/image-to-video/code"},{"title":"Use Text To Video with Comfy Router","sidebarTitle":"Text To Video","href":"/development/comfy-router/models/moonvalley/text-to-video/code"},{"title":"Use Video To Video with Comfy Router","sidebarTitle":"Video To Video","href":"/development/comfy-router/models/moonvalley/video-to-video/code"}]},{"group":"OpenAI","pages":[{"title":"Use GPT 4.1 Mini with Comfy Router","sidebarTitle":"GPT 4.1 Mini","href":"/development/comfy-router/models/openai/gpt-4-1-mini/code"},{"title":"Use GPT 4.1 with Comfy Router","sidebarTitle":"GPT 4.1","href":"/development/comfy-router/models/openai/gpt-4-1/code"},{"title":"Use GPT 4o with Comfy Router","sidebarTitle":"GPT 4o","href":"/development/comfy-router/models/openai/gpt-4o/code"},{"title":"Use GPT 5.5 Pro with Comfy Router","sidebarTitle":"GPT 5.5 Pro","href":"/development/comfy-router/models/openai/gpt-5-5-pro/code"},{"title":"Use GPT 5.5 with Comfy Router","sidebarTitle":"GPT 5.5","href":"/development/comfy-router/models/openai/gpt-5-5/code"},{"title":"Use GPT 5.6 Luna with Comfy Router","sidebarTitle":"GPT 5.6 Luna","href":"/development/comfy-router/models/openai/gpt-5-6-luna/code"},{"title":"Use GPT 5.6 Sol with Comfy Router","sidebarTitle":"GPT 5.6 Sol","href":"/development/comfy-router/models/openai/gpt-5-6-sol/code"},{"title":"Use GPT 5.6 Terra with Comfy Router","sidebarTitle":"GPT 5.6 Terra","href":"/development/comfy-router/models/openai/gpt-5-6-terra/code"},{"title":"Use GPT 5 Mini with Comfy Router","sidebarTitle":"GPT 5 Mini","href":"/development/comfy-router/models/openai/gpt-5-mini/code"},{"title":"Use GPT 5 Nano with Comfy Router","sidebarTitle":"GPT 5 Nano","href":"/development/comfy-router/models/openai/gpt-5-nano/code"},{"title":"Use GPT 5 with Comfy Router","sidebarTitle":"GPT 5","href":"/development/comfy-router/models/openai/gpt-5/code"},{"title":"Use GPT 6 Astra with Comfy Router","sidebarTitle":"GPT 6 Astra","href":"/development/comfy-router/models/openai/gpt-6-astra/code"},{"title":"Use GPT 6 Luna with Comfy Router","sidebarTitle":"GPT 6 Luna","href":"/development/comfy-router/models/openai/gpt-6-luna/code"},{"title":"Use GPT 6 Sol with Comfy Router","sidebarTitle":"GPT 6 Sol","href":"/development/comfy-router/models/openai/gpt-6-sol/code"},{"title":"Use GPT Image 1.5 with Comfy Router","sidebarTitle":"GPT Image 1.5","href":"/development/comfy-router/models/openai/gpt-image-1-5/code"},{"title":"Use GPT Image 2.5 Flare with Comfy Router","sidebarTitle":"GPT Image 2.5 Flare","href":"/development/comfy-router/models/openai/gpt-image-2-5-flare/code"},{"title":"Use GPT Image 2.5 Sunburst with Comfy Router","sidebarTitle":"GPT Image 2.5 Sunburst","href":"/development/comfy-router/models/openai/gpt-image-2-5-sunburst/code"},{"title":"Use GPT Image 2 with Comfy Router","sidebarTitle":"GPT Image 2","href":"/development/comfy-router/models/openai/gpt-image-2/code"},{"title":"Use o3 with Comfy Router","sidebarTitle":"o3","href":"/development/comfy-router/models/openai/o3/code"}]},{"group":"Openrouter","pages":[{"title":"Use Chat Completions with Comfy Router","sidebarTitle":"Chat Completions","href":"/development/comfy-router/models/openrouter/chat-completions/code"}]},{"group":"Pika","pages":[{"title":"Use Pika 2.5 Image To Video with Comfy Router","sidebarTitle":"Pika 2.5 Image To Video","href":"/development/comfy-router/models/pika/pika-2-5-image-to-video/code"},{"title":"Use Pika 2.5 Text To Video with Comfy Router","sidebarTitle":"Pika 2.5 Text To Video","href":"/development/comfy-router/models/pika/pika-2-5-text-to-video/code"}]},{"group":"Pruna","pages":[{"title":"Use P Video 2 with Comfy Router","sidebarTitle":"P Video 2","href":"/development/comfy-router/models/pruna/p-video-2/code"}]},{"group":"Qwen","pages":[{"title":"Use Qwen Image 3.0 Pro with Comfy Router","sidebarTitle":"Qwen Image 3.0 Pro","href":"/development/comfy-router/models/qwen/qwen-image-3-0-pro/code"},{"title":"Use Qwen Image 3.0 with Comfy Router","sidebarTitle":"Qwen Image 3.0","href":"/development/comfy-router/models/qwen/qwen-image-3-0/code"}]},{"group":"Recraft","pages":[{"title":"Use Recraft V2 with Comfy Router","sidebarTitle":"Recraft V2","href":"/development/comfy-router/models/recraft/recraftv2/code"},{"title":"Use Recraft V3 with Comfy Router","sidebarTitle":"Recraft V3","href":"/development/comfy-router/models/recraft/recraftv3/code"},{"title":"Use Recraft V4.1 Pro Vector with Comfy Router","sidebarTitle":"Recraft V4.1 Pro Vector","href":"/development/comfy-router/models/recraft/recraftv4-1-pro-vector/code"},{"title":"Use Recraft V4.1 Pro with Comfy Router","sidebarTitle":"Recraft V4.1 Pro","href":"/development/comfy-router/models/recraft/recraftv4-1-pro/code"},{"title":"Use Recraft V4.1 Utility Pro Vector with Comfy Router","sidebarTitle":"Recraft V4.1 Utility Pro Vector","href":"/development/comfy-router/models/recraft/recraftv4-1-utility-pro-vector/code"},{"title":"Use Recraft V4.1 Utility Pro with Comfy Router","sidebarTitle":"Recraft V4.1 Utility Pro","href":"/development/comfy-router/models/recraft/recraftv4-1-utility-pro/code"},{"title":"Use Recraft V4.1 Utility Vector with Comfy Router","sidebarTitle":"Recraft V4.1 Utility Vector","href":"/development/comfy-router/models/recraft/recraftv4-1-utility-vector/code"},{"title":"Use Recraft V4.1 Utility with Comfy Router","sidebarTitle":"Recraft V4.1 Utility","href":"/development/comfy-router/models/recraft/recraftv4-1-utility/code"},{"title":"Use Recraft V4.1 Vector with Comfy Router","sidebarTitle":"Recraft V4.1 Vector","href":"/development/comfy-router/models/recraft/recraftv4-1-vector/code"},{"title":"Use Recraft V4.1 with Comfy Router","sidebarTitle":"Recraft V4.1","href":"/development/comfy-router/models/recraft/recraftv4-1/code"},{"title":"Use Recraft V4 Pro with Comfy Router","sidebarTitle":"Recraft V4 Pro","href":"/development/comfy-router/models/recraft/recraftv4-pro/code"},{"title":"Use Recraft V4 Styles Pro Vector with Comfy Router","sidebarTitle":"Recraft V4 Styles Pro Vector","href":"/development/comfy-router/models/recraft/recraftv4-styles-pro-vector/code"},{"title":"Use Recraft V4 Styles Pro with Comfy Router","sidebarTitle":"Recraft V4 Styles Pro","href":"/development/comfy-router/models/recraft/recraftv4-styles-pro/code"},{"title":"Use Recraft V4 Styles Vector with Comfy Router","sidebarTitle":"Recraft V4 Styles Vector","href":"/development/comfy-router/models/recraft/recraftv4-styles-vector/code"},{"title":"Use Recraft V4 Styles with Comfy Router","sidebarTitle":"Recraft V4 Styles","href":"/development/comfy-router/models/recraft/recraftv4-styles/code"},{"title":"Use Recraft V4 with Comfy Router","sidebarTitle":"Recraft V4","href":"/development/comfy-router/models/recraft/recraftv4/code"}]},{"group":"Runway","pages":[{"title":"Use Aleph 2 with Comfy Router","sidebarTitle":"Aleph 2","href":"/development/comfy-router/models/runway/aleph2/code"},{"title":"Use Gen 4 Image with Comfy Router","sidebarTitle":"Gen 4 Image","href":"/development/comfy-router/models/runway/gen4-image/code"},{"title":"Use Gen 4 Turbo with Comfy Router","sidebarTitle":"Gen 4 Turbo","href":"/development/comfy-router/models/runway/gen4-turbo/code"}]},{"group":"Synclabs","pages":[{"title":"Use Sync 3 with Comfy Router","sidebarTitle":"Sync 3","href":"/development/comfy-router/models/synclabs/sync-3/code"}]},{"group":"Tencent","pages":[{"title":"Use Hunyuan 3D Part with Comfy Router","sidebarTitle":"Hunyuan 3D Part","href":"/development/comfy-router/models/tencent/hunyuan-3d-part/code"},{"title":"Use Hunyuan 3D Smart Topology with Comfy Router","sidebarTitle":"Hunyuan 3D Smart Topology","href":"/development/comfy-router/models/tencent/hunyuan-3d-smart-topology/code"},{"title":"Use Hunyuan 3D Texture Edit with Comfy Router","sidebarTitle":"Hunyuan 3D Texture Edit","href":"/development/comfy-router/models/tencent/hunyuan-3d-texture-edit/code"},{"title":"Use Hunyuan 3D Uv with Comfy Router","sidebarTitle":"Hunyuan 3D Uv","href":"/development/comfy-router/models/tencent/hunyuan-3d-uv/code"}]},{"group":"Veed","pages":[{"title":"Use Clean Audio Video with Comfy Router","sidebarTitle":"Clean Audio Video","href":"/development/comfy-router/models/veed/clean-audio-video/code"},{"title":"Use Clean Audio with Comfy Router","sidebarTitle":"Clean Audio","href":"/development/comfy-router/models/veed/clean-audio/code"},{"title":"Use Fabric 1.0 with Comfy Router","sidebarTitle":"Fabric 1.0","href":"/development/comfy-router/models/veed/fabric-1-0/code"},{"title":"Use Lipsync 2.0 with Comfy Router","sidebarTitle":"Lipsync 2.0","href":"/development/comfy-router/models/veed/lipsync-2-0/code"},{"title":"Use Video Background Removal Fast with Comfy Router","sidebarTitle":"Video Background Removal Fast","href":"/development/comfy-router/models/veed/video-background-removal-fast/code"},{"title":"Use Video Background Removal Green Screen with Comfy Router","sidebarTitle":"Video Background Removal Green Screen","href":"/development/comfy-router/models/veed/video-background-removal-green-screen/code"},{"title":"Use Video Background Removal with Comfy Router","sidebarTitle":"Video Background Removal","href":"/development/comfy-router/models/veed/video-background-removal/code"}]},{"group":"Veo","pages":[{"title":"Use Veo 3.1 Fast Generate 001 with Comfy Router","sidebarTitle":"Veo 3.1 Fast Generate 001","href":"/development/comfy-router/models/veo/veo-3-1-fast-generate-001/code"},{"title":"Use Veo 3.1 Generate 001 with Comfy Router","sidebarTitle":"Veo 3.1 Generate 001","href":"/development/comfy-router/models/veo/veo-3-1-generate-001/code"},{"title":"Use Veo 3.1 Lite Generate 001 with Comfy Router","sidebarTitle":"Veo 3.1 Lite Generate 001","href":"/development/comfy-router/models/veo/veo-3-1-lite-generate-001/code"}]},{"group":"Wan","pages":[{"title":"Use HappyHorse 1.0 I2V with Comfy Router","sidebarTitle":"HappyHorse 1.0 I2V","href":"/development/comfy-router/models/wan/happyhorse-1-0-i2v/code"},{"title":"Use HappyHorse 1.0 R2V with Comfy Router","sidebarTitle":"HappyHorse 1.0 R2V","href":"/development/comfy-router/models/wan/happyhorse-1-0-r2v/code"},{"title":"Use HappyHorse 1.0 T2V with Comfy Router","sidebarTitle":"HappyHorse 1.0 T2V","href":"/development/comfy-router/models/wan/happyhorse-1-0-t2v/code"},{"title":"Use HappyHorse 1.0 Video Edit with Comfy Router","sidebarTitle":"HappyHorse 1.0 Video Edit","href":"/development/comfy-router/models/wan/happyhorse-1-0-video-edit/code"},{"title":"Use HappyHorse 1.1 I2V with Comfy Router","sidebarTitle":"HappyHorse 1.1 I2V","href":"/development/comfy-router/models/wan/happyhorse-1-1-i2v/code"},{"title":"Use HappyHorse 1.1 R2V with Comfy Router","sidebarTitle":"HappyHorse 1.1 R2V","href":"/development/comfy-router/models/wan/happyhorse-1-1-r2v/code"},{"title":"Use HappyHorse 1.1 T2V with Comfy Router","sidebarTitle":"HappyHorse 1.1 T2V","href":"/development/comfy-router/models/wan/happyhorse-1-1-t2v/code"},{"title":"Use Wan 2.5 I2I Preview with Comfy Router","sidebarTitle":"Wan 2.5 I2I Preview","href":"/development/comfy-router/models/wan/wan2-5-i2i-preview/code"},{"title":"Use Wan 2.5 I2V Preview with Comfy Router","sidebarTitle":"Wan 2.5 I2V Preview","href":"/development/comfy-router/models/wan/wan2-5-i2v-preview/code"},{"title":"Use Wan 2.5 T2I Preview with Comfy Router","sidebarTitle":"Wan 2.5 T2I Preview","href":"/development/comfy-router/models/wan/wan2-5-t2i-preview/code"},{"title":"Use Wan 2.5 T2V Preview with Comfy Router","sidebarTitle":"Wan 2.5 T2V Preview","href":"/development/comfy-router/models/wan/wan2-5-t2v-preview/code"},{"title":"Use Wan 2.6 I2V with Comfy Router","sidebarTitle":"Wan 2.6 I2V","href":"/development/comfy-router/models/wan/wan2-6-i2v/code"},{"title":"Use Wan 2.6 R2V with Comfy Router","sidebarTitle":"Wan 2.6 R2V","href":"/development/comfy-router/models/wan/wan2-6-r2v/code"},{"title":"Use Wan 2.6 T2V with Comfy Router","sidebarTitle":"Wan 2.6 T2V","href":"/development/comfy-router/models/wan/wan2-6-t2v/code"},{"title":"Use Wan 2.7 I2V with Comfy Router","sidebarTitle":"Wan 2.7 I2V","href":"/development/comfy-router/models/wan/wan2-7-i2v/code"},{"title":"Use Wan 2.7 R2V with Comfy Router","sidebarTitle":"Wan 2.7 R2V","href":"/development/comfy-router/models/wan/wan2-7-r2v/code"},{"title":"Use Wan 2.7 T2V with Comfy Router","sidebarTitle":"Wan 2.7 T2V","href":"/development/comfy-router/models/wan/wan2-7-t2v/code"},{"title":"Use Wan 2.7 Video Edit with Comfy Router","sidebarTitle":"Wan 2.7 Video Edit","href":"/development/comfy-router/models/wan/wan2-7-videoedit/code"},{"title":"Use Wan 3.0 Video Prime with Comfy Router","sidebarTitle":"Wan 3.0 Video Prime","href":"/development/comfy-router/models/wan/wan3-0-video-prime/code"},{"title":"Use Wan 3.0 Video with Comfy Router","sidebarTitle":"Wan 3.0 Video","href":"/development/comfy-router/models/wan/wan3-0-video/code"}]},{"group":"WaveSpeed","pages":[{"title":"Use Flashvsr with Comfy Router","sidebarTitle":"Flashvsr","href":"/development/comfy-router/models/wavespeed/flashvsr/code"},{"title":"Use Seedvr 2 with Comfy Router","sidebarTitle":"Seedvr 2","href":"/development/comfy-router/models/wavespeed/seedvr2/code"},{"title":"Use Ultimate Image Upscaler with Comfy Router","sidebarTitle":"Ultimate Image Upscaler","href":"/development/comfy-router/models/wavespeed/ultimate-image-upscaler/code"}]},{"group":"xAI","pages":[{"title":"Use Grok Imagine Image 2.0 with Comfy Router","sidebarTitle":"Grok Imagine Image 2.0","href":"/development/comfy-router/models/xai/grok-imagine-image-2-0/code"},{"title":"Use Grok Imagine Image Pro with Comfy Router","sidebarTitle":"Grok Imagine Image Pro","href":"/development/comfy-router/models/xai/grok-imagine-image-pro/code"},{"title":"Use Grok Imagine Image Quality with Comfy Router","sidebarTitle":"Grok Imagine Image Quality","href":"/development/comfy-router/models/xai/grok-imagine-image-quality/code"},{"title":"Use Grok Imagine Image with Comfy Router","sidebarTitle":"Grok Imagine Image","href":"/development/comfy-router/models/xai/grok-imagine-image/code"},{"title":"Use Grok Imagine Video 1.5 Lite with Comfy Router","sidebarTitle":"Grok Imagine Video 1.5 Lite","href":"/development/comfy-router/models/xai/grok-imagine-video-1-5-lite/code"},{"title":"Use Grok Imagine Video 1.5 Preview with Comfy Router","sidebarTitle":"Grok Imagine Video 1.5 Preview","href":"/development/comfy-router/models/xai/grok-imagine-video-1-5-preview/code"},{"title":"Use Grok Imagine Video 1.5 with Comfy Router","sidebarTitle":"Grok Imagine Video 1.5","href":"/development/comfy-router/models/xai/grok-imagine-video-1-5/code"},{"title":"Use Grok Imagine Video with Comfy Router","sidebarTitle":"Grok Imagine Video","href":"/development/comfy-router/models/xai/grok-imagine-video/code"}]}]}]}]},{"tab":"Agent tools","pages":[{"title":"Agent tools","href":"/agent-tools"}]},{"tab":"Built-in Nodes","pages":[{"title":"Built-in Nodes","href":"/built-in-nodes/overview"}]},{"tab":"Developer","pages":[{"title":"Developer","href":"/development/overview"}]},{"tab":"Support","pages":[{"title":"Support","href":"/support/contact-support"}]}]},{"language":"zh","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"资源","items":[{"label":"安装","href":"/zh/installation/system_requirements"},{"label":"教程","href":"/zh/tutorials/basic/text-to-image"},{"label":"开发","href":"/zh/development/overview"}]},{"header":"产品","items":[{"label":"功能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"画廊","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"下载","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"公司","items":[{"label":"关于","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"招聘","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"服务条款","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"隐私政策","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"pages":[{"title":"zh","href":"/zh/api-reference/router/comfy-router/list-the-models-comfy-router-can-run"}]},{"language":"ja","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"リソース","items":[{"label":"インストール","href":"/ja/installation/system_requirements"},{"label":"チュートリアル","href":"/ja/tutorials/basic/text-to-image"},{"label":"開発","href":"/ja/development/overview"}]},{"header":"プロダクト","items":[{"label":"機能","href":"https://www.comfy.org/?utm_source=docs"},{"label":"ギャラリー","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"ダウンロード","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"会社情報","items":[{"label":"概要","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"採用情報","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"利用規約","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"プライバシーポリシー","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ja/tutorials/partner-nodes/pricing","label":"料金"},{"href":"https://comfy.org/download?utm_source=docs","label":"ダウンロード"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"pages":[{"title":"ja","href":"/ja/api-reference/router/comfy-router/list-the-models-comfy-router-can-run"}]},{"language":"ko","footer":{"socials":{"github":"https://github.com/Comfy-Org/ComfyUI","x":"https://x.com/ComfyUI","discord":"https://discord.com/invite/comfyorg","youtube":"https://www.youtube.com/@comfyorg"},"links":[{"header":"리소스","items":[{"label":"설치","href":"/ko/installation/system_requirements"},{"label":"튜토리얼","href":"/ko/tutorials/basic/text-to-image"},{"label":"개발","href":"/ko/development/overview"}]},{"header":"제품","items":[{"label":"기능","href":"https://www.comfy.org/?utm_source=docs"},{"label":"갤러리","href":"https://www.comfy.org/gallery?utm_source=docs"},{"label":"다운로드","href":"https://www.comfy.org/download?utm_source=docs"}]},{"header":"회사 정보","items":[{"label":"소개","href":"https://www.comfy.org/about?utm_source=docs"},{"label":"채용","href":"https://www.comfy.org/careers?utm_source=docs"},{"label":"이용약관","href":"https://www.comfy.org/terms-of-service?utm_source=docs"},{"label":"개인정보 처리방침","href":"https://www.comfy.org/privacy-policy?utm_source=docs"}]}]},"navbar":{"links":[{"href":"/ko/tutorials/partner-nodes/pricing","label":"가격 정책"},{"href":"https://comfy.org/download?utm_source=docs","label":"다운로드"}],"primary":{"type":"button","label":"Comfy Cloud","href":"https://comfy.org/cloud?utm_source=docs"}},"pages":[{"title":"ko","href":"/ko/api-reference/router/comfy-router/list-the-models-comfy-router-can-run"}]},{"language":"es","pages":[{"title":"es","href":"/es/api-reference/router/comfy-router/list-the-models-comfy-router-can-run"}]}]},"title":"List the models Comfy Router can run. - ComfyUI","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-rfhihCWU.js","utils-BmH1XFxk.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-BcNsxPKB.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-BAES3tkd.js","snippetPresets-DCMQBKLP.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-D6l_bzE9.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BOktbnNh.js","shallow-BCs8SgM7.js","getApiPlaygroundDisplay-DEmW5bJB.js","CodeSnippet-CpZOpB9C.js","CodeSnippets-BOBDqibl.js","Page-D5fEM6aW.js","getPastedJson-DH2JBvmr.js","icon-BBJH-kKh.js","MethodPill-D2Sd5NLC.js","DuplicateIcon-CGgfL2qN.js","createIcon-BKudBBzi.js","DynamicMarkdown-85clUA0i.js","SectionHeading-D0JiMgDx.js","axios-vUo_bRtp.js","Markdown-Cfiy0xZO.js","clsx-rL8ZCCw4.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-aeztFa9U.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-BywkCr5C.js"]}