---
title: "Use Krea 3 with Comfy Router"
description: "Call krea/krea-3 through Comfy Router: endpoint, request shape and the response Router returns."
sidebarTitle: "Krea 3"
---
{/* GENERATED FILE. Generated from router-schemas/krea/krea-3.json by `pnpm code-pages:gen`. */}
import RouterCodeFooter from "/snippets/comfy-router/model-code-footer.mdx";
API Reference for `krea/krea-3`, served by Comfy Router from Krea.
**Input:** Text, Image ยท **Output:** Image
## Quick start
Create a key in [your Comfy workspace](https://platform.comfy.org/profile/api-keys?onboarding=router) and export it as `COMFY_API_KEY`. The Python and TypeScript snippets use the Comfy SDKs (`pip install comfy-sdk` and `npm install @comfyorg/sdk`); the cURL snippet is the same call over raw HTTP.
**Model ID:** `krea/krea-3`
**Endpoint:** `POST https://api.comfy.org/v2/models/krea/krea-3`
```python Python
from comfy_sdk import Comfy
# Reads COMFY_API_KEY from the environment.
# The SDK automatically creates an idempotency key and reuses it for automatic retries.
with Comfy() as client:
result = client.models.run(
"krea/krea-3",
{
"prompt": "A ceramic coffee mug on a clean studio background",
"resolution": "1k",
},
)
print(result)
```
```typescript TypeScript
import { comfy } from "@comfyorg/sdk";
// Reads COMFY_API_KEY from the environment.
// The SDK automatically creates an idempotency key and reuses it for automatic retries.
const { data } = await comfy.models.run("krea/krea-3", {
prompt: "A ceramic coffee mug on a clean studio background",
resolution: "1k",
});
console.log(data);
```
```bash cURL
curl https://api.comfy.org/v2/models/krea/krea-3 \
-H "X-API-Key: $COMFY_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d "{\"prompt\": \"A ceramic coffee mug on a clean studio background\", \"resolution\": \"1k\"}"
```
The same body, sent to `POST https://api.comfy.org/v2/models/krea/krea-3/requests`. Router answers `201` with a `request_id` as soon as the run is admitted, and the result is collected once it is ready, from this process or another one. [Queued delivery](/development/comfy-router/queue) walks through status, cancellation and collection.
```python Python
import asyncio
from comfy_sdk import AsyncComfy
# Reads COMFY_API_KEY from the environment.
# Each submit() call mints its own Idempotency-Key and reuses it for automatic retries.
async def main():
async with AsyncComfy() as client:
handle = await client.models.submit(
"krea/krea-3",
{
"prompt": "A ceramic coffee mug on a clean studio background",
"resolution": "1k",
},
)
print("request_id:", handle.request_id) # with the model ID, all another process needs
# Poll until the request completes, waiting the Retry-After the server names.
async for update in handle.iter_events():
print(update.status, update.queue_position)
# The provider's own payload, the same value models.run() returns.
# A request that failed or was cancelled raises the typed Router error here.
result = await handle.get()
print(result)
asyncio.run(main())
```
```typescript TypeScript
import { comfy } from "@comfyorg/sdk";
// Reads COMFY_API_KEY from the environment.
// Each submit() call mints its own Idempotency-Key and reuses it for automatic retries.
const handle = await comfy.models.submit("krea/krea-3", {
prompt: "A ceramic coffee mug on a clean studio background",
resolution: "1k",
});
console.log("requestId:", handle.requestId); // with the model ID, all another process needs
// Poll until the request completes, waiting the Retry-After the server names.
for await (const update of handle.events()) {
console.log(update.status, update.queuePosition);
}
// The same result models.run() returns. A request that failed or was cancelled rejects here.
const result = await handle.get();
console.log(result.data);
```
```bash cURL
# 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url.
curl https://api.comfy.org/v2/models/krea/krea-3/requests \
-H "X-API-Key: $COMFY_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d "{\"prompt\": \"A ceramic coffee mug on a clean studio background\", \"resolution\": \"1k\"}"
# 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names.
REQUEST_ID=""
curl -i https://api.comfy.org/v2/models/krea/krea-3/requests/$REQUEST_ID/status \
-H "X-API-Key: $COMFY_API_KEY"
# 3. Collect. 200 with the model's native output, 202 with the status body while it is still running.
curl https://api.comfy.org/v2/models/krea/krea-3/requests/$REQUEST_ID \
-H "X-API-Key: $COMFY_API_KEY"
```
## Schema
### Input
1:1, 4:5, 3:4, 2:3, 9:16, 5:4, 4:3, 3:2, 16:9 or 21:9. Use with resolution; omit for automatic framing.
Input image URLs, up to 8. The image_url returned by uploading the image to POST /proxy/krea/assets (multipart form field `file`) is always accepted. Whether other public https URLs are accepted depends on the environment: where they are not, any link that is not an https URL on the host app-uploads.krea.ai is rejected with 400; where they are, any public https image URL is accepted, and a URL that is malformed or not https is rejected with 400. For a well-formed https URL in that case, a reference the caller can fix is rejected with 400 naming its host: its host does not resolve or is not publicly reachable when checked before the fetch, it redirects more than the allowed number of times, to a URL that is not https, or to a host that is not publicly reachable, it returns a 4xx other than 408 or 429, it is not an image, it is an image in a format that cannot be read, its image size header is not within the first 2 MiB, or a response with no declared length or chunked encoding ends before its image size header. Any other failure fetching it fails with a 502 error on POST /proxy/krea (Comfy Router answers it with 500 internal_error): a transient DNS, TLS or connection failure, a timeout, an origin 408, 429, 5xx or other non-200 status, or a host that passed that check but does not resolve or is not publicly reachable when the fetch connects. Where other URLs are not accepted, an app-uploads.krea.ai link that is not a live upload fails with a 5xx error; where they are, it is rejected with 400 like any other unreachable reference. While a server has not yet learned which applies, any https URL with a host that is not an app-uploads.krea.ai link, public or not, fails with a 503 error that is safe to retry. Omit for text-to-image.
berry (default, quality) or jam (speed).
What to generate. With image_urls, the editing instruction; describe what should change and what should stay the same.
Set true for a local edit that keeps the rest of the image. Needs model berry and at least one image in image_urls.
1k or 2k.
fast (default), high or ultra. High and ultra plan complex edits in more detail and take longer. Ultra needs resolution 2k.
Generated from the schema Router serves at `GET /v2/models/krea/krea-3/openapi.json`, the same document it validates a call against before the request reaches the provider.
### Output
Format: `date-time`
Format: `date-time`
Format: `uuid`
The finished generation. Not nullable here, unlike on `KreaJob`: a terminal job whose `result` carries no `urls` is answered as a Comfy Router error, so a `200` always carries it.
Set by loraTraining jobs rather than by a generation; a `200` for these models carries `urls`.
The generated images, as downloadable links. At least one, because a `completed` job with an empty `urls` is `success_without_output` and never reaches this document.
Always `completed` on this document: it is the only status Router reports as a success, and Krea's vocabulary is matched without a case fold.
Possible values: `completed`
## Examples
### Input
```json
{
"prompt": "A ceramic coffee mug on a clean studio background",
"resolution": "1k"
}
```
### Output
```json
{
"completed_at": "2027-01-01T00:00:37Z",
"created_at": "2027-01-01T00:00:00Z",
"job_id": "7f1c2e84-5b90-4a37-8d61-2c0f9ab4e153",
"result": {
"urls": [
"https://example.invalid/krea/krea-2/generated.png"
]
},
"status": "completed"
}
```