Diagram Generation API Reference
Generate and edit diagrams from your own app with the ConceptViz REST API. Covers authentication, models, credit costs, rate limits and error codes.
Authentication
All API requests require an API key passed via the Authorization header.
Authorization: Bearer cvk_your_api_key_hereAPI access is included with the Max, Yearly and Lifetime plans, and with existing API customer accounts. Create and manage API keys in the API Keys tab of Account Center: open the avatar menu, choose Settings, then API Keys (or go straight to Settings → API Keys). Free, Standard and Pro plans do not include API access. The account is checked on every API call; if it no longer qualifies, requests return 403 API_ACCESS_REQUIRED and only any remaining legacy API credits can be spent.
Your API key grants full access to your account credits. Keep it secret and never expose it in client-side code.
Base URL
https://conceptviz.app/api/v1Models
cv-3-fine is the only model. It is the default, so you can leave model out.
The older names cv-1, cv-2 and cv-3-fast are retired but never rejected: a request that names one is served by cv-3-fine, so existing integrations keep working. When that happens:
- The response body reports
"model": "cv-3-fine"and addsrequested_model(the name you sent) andnotice. - The response carries the headers
Deprecation: trueandX-ConceptViz-Model-Notice: <old name> is retired; requests now use cv-3-fine. - You are charged the lower of what the old model would have cost for the same request and the
cv-3-fineprice, so the switch never costs you more than before.
{
"taskId": "vaW29_MJ1wbnyFU4bl_pd",
"status": "pending",
"model": "cv-3-fine",
"requested_model": "cv-2",
"notice": "cv-2 is retired; requests now use cv-3-fine",
"credits_used": 1
}Retired names no longer have their own behavior. For example, cv-1 has no mode (it is treated as standard), and 1:1 images are generated at 2K. Please update your integration to send cv-3-fine or no model at all.
Generate Diagrams
Generation is asynchronous. You submit a request, receive a task ID, then poll for results.
Step 1: Submit Generation Request
POST /api/v1/generate
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes* | A single text prompt describing the diagram |
prompts | string[] | Yes* | Array of prompts for batch generation (max 4) |
model | string | No | "cv-3-fine" (the only model, and the default). Retired names are still accepted; see Models |
mode | string | No | Generation mode: "standard" (default) or "max" |
quality | string | No | Image resolution, lowercase: "2k" or "4k". Default is "2k"; max mode defaults to "4k". Images at 1:1 are always generated at 2k. Any other value is ignored and the default is used |
aspectRatio | string | No | Aspect ratio. See Aspect ratios. Default "16:9". Unknown values fall back to 16:9 |
Each prompt can be up to about 8,000 characters. Longer prompts are rejected with 400 PROMPT_TOO_LONG.
Aspect ratios
aspectRatio accepts:
| Value | Result |
|---|---|
"16:9" (default), "4:3", "1:1", "9:16", "a4-portrait", "a4-landscape" | Used as given |
"auto", "landscape" | 16:9 |
"portrait" | 9:16 |
"square" | 1:1 |
"WxH", "W:H" or "W/H" (for example "1600x900") | Mapped to the nearest supported ratio above |
An unknown aspectRatio or quality value does not return an error. The request is accepted and generated, and billed, with the fallback (16:9 and the default quality), so check the aspect_ratio and credits_used fields in the response.
Provide either prompt (single) or prompts (batch) — not both. If both are provided, prompts takes priority.
Response
{
"taskId": "vaW29_MJ1wbnyFU4bl_pd",
"status": "pending",
"model": "cv-3-fine",
"mode": "standard",
"quality": "2k",
"aspect_ratio": "16:9",
"credits_used": 1,
"credits_remaining": 80,
"poll_url": "/api/v1/task/vaW29_MJ1wbnyFU4bl_pd"
}The /generate response may also include a generation_strength field ("standard" or "max", and "preview" for lower-power preview runs). It describes how the task was run and can be ignored.
Step 2: Poll for Results
GET /api/v1/task/{taskId}
Poll this endpoint every 3–5 seconds until status is completed or failed. Typical generation takes 30–90 seconds. See Rate Limits for polling limits.
Response (completed)
{
"status": "completed",
"images": [
{
"url": "https://conceptviz.app/images/abc123.png",
"prompt": "water cycle diagram"
}
],
"generation_strength": "standard"
}Response (failed)
{
"status": "failed",
"error": "Image generation failed. Please try again later.",
"code": "GENERATION_FAILED",
"credits_refunded": true
}Response (pending/processing)
{
"status": "processing"
}Edit Images
Image editing is also asynchronous. Submit one or more input images with an edit prompt, then poll the same task endpoint for the edited result.
POST /api/v1/edit
JSON Request Body
Use this format when your input image is already hosted at a public URL or provided as a data URL.
| Parameter | Type | Required | Description |
|---|---|---|---|
prompt | string | Yes | Edit instructions for the image |
images | string[] | Yes | Input image URLs or data:image/...;base64,... values (max 4) |
model | string | No | "cv-3-fine" (the only model, and the default). Retired names are still accepted; see Models |
mode | string | No | Generation mode: "standard" (default) or "max" |
quality | string | No | Image resolution, lowercase: "2k" or "4k". Same defaults and fallback as /generate |
aspectRatio | string | No | Output aspect ratio. Same values and fallback as /generate; see Aspect ratios |
Image inputs are moderated before processing. Images can be up to 20MB each (a larger image returns 413 IMAGE_TOO_LARGE), with a maximum of 4 images per edit request. Base64 data URLs count by their decoded size. Supported formats are PNG, JPEG and WebP.
curl -X POST https://conceptviz.app/api/v1/edit \
-H "Authorization: Bearer cvk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Replace the annotations with a clean professional architecture diagram",
"images": ["https://example.com/marked-up-diagram.png"],
"model": "cv-3-fine",
"mode": "standard"
}'Multipart Upload
Use this format to upload local image files directly.
curl -X POST https://conceptviz.app/api/v1/edit \
-H "Authorization: Bearer cvk_your_api_key_here" \
-F "prompt=Convert this sketch into a polished system diagram" \
-F "image=@./sketch.png" \
-F "model=cv-3-fine"To provide multiple input images, repeat the image form field.
curl -X POST https://conceptviz.app/api/v1/edit \
-H "Authorization: Bearer cvk_your_api_key_here" \
-F "prompt=Combine these references into one clean diagram" \
-F "image=@./reference-1.png" \
-F "image=@./reference-2.png"Response
{
"taskId": "vaW29_MJ1wbnyFU4bl_pd",
"status": "pending",
"model": "cv-3-fine",
"mode": "standard",
"quality": "2k",
"aspect_ratio": "16:9",
"credits_used": 1,
"credits_remaining": 80,
"poll_url": "/api/v1/task/vaW29_MJ1wbnyFU4bl_pd"
}Credit Cost
API usage is billed in the same unified image credits as Studio and Agent. There are no API-only credit packs. Billing is per output image: a generate request is charged per image requested (up to 4), and an edit request returns one image, so it is charged for one image.
Using the API requires a Max, Yearly or Lifetime plan; Standard and Pro plans do not include API access. Credits are deducted in this order: any legacy API credits you already hold (they never expire) first, then your image credits, following the same order as the web app. The credits_used value in the response matches the quoted cost exactly.
| Mode | Quality | Credits per Image |
|---|---|---|
standard (default) | 2k | 1 |
standard | 4k | 2 |
max | 2k | 2 |
max | 4k | 4 |
Images with a 1:1 aspect ratio are always generated at 2K, and are billed at the 2K price. A 4k request at 1:1 is not an error: it is generated and billed at 2K, and the response says so. quality is the size actually used, requested_quality is what you asked for ("4k"), and notice explains why. /generate, /edit and /batch all do this.
Credits are charged when the task is submitted. If generation fails, credits are automatically refunded. Usage by key and by day (requests, tasks, images, credits charged and refunded) is shown in Settings → API Keys.
Batch Generation (shared style)
Generate up to 20 independent images that all share one visual style, taken from a reference image you provide. Each prompt becomes its own image.
POST /api/v1/batch
The name follows the Studio feature "Bulk generate", which does the same thing. This is separate from prompts on /generate, which is limited to 4 prompts and has no shared style.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
prompts | string[] | Yes | 1 to 20 prompts. Each is generated as its own image, up to about 8,000 characters each |
style_reference_image | string | Yes | The image whose style every result should follow: a base64 data:image/...;base64,... value (max 10MB decoded), or the URL of an image hosted by ConceptViz, such as an image URL returned by this API. Other hosts are rejected with 400 INVALID_IMAGE; send a data URL instead |
style | string | No | Extra style direction in your own words (max 1,000 characters), added to the reference style |
quality, mode, aspectRatio | No | Same values and defaults as /generate. They are set once and apply to every image in the batch | |
model | string | No | "cv-3-fine", the default. See Models |
Send an optional Idempotency-Key header (1 to 255 printable characters) to make retries safe: the same key with the same body returns the original batch with Idempotent-Replayed: true and charges nothing again; the same key with a different body returns 409 IDEMPOTENCY_KEY_REUSED.
How the style stays consistent. ConceptViz reads the reference image once and writes a short description of its style: palette, rendering, lines, labels, typography and layout. Exactly the same description (plus your style text, if any) is added to every prompt in the batch, and every image uses the same model, mode, quality and aspect ratio. The reference image itself is used only for that analysis and is not copied into the results. This keeps the set coherent, but it is a written style, not pixel-level matching.
curl -X POST https://conceptviz.app/api/v1/batch \
-H "Authorization: Bearer cvk_your_api_key_here" \
-H "Idempotency-Key: lesson-42-v1" \
-H "Content-Type: application/json" \
-d '{
"prompts": [
"Water cycle for grade 5",
"Photosynthesis inside a leaf",
"Food chain in a pond"
],
"style_reference_image": "https://conceptviz.app/images/abc123.png",
"style": "Keep labels short and use a white background",
"quality": "2k"
}'Response
{
"batch_id": "bat_k3Jv9...",
"status": "pending",
"model": "cv-3-fine",
"mode": "standard",
"quality": "2k",
"aspect_ratio": "16:9",
"total": 3,
"credits_per_image": 1,
"credits_used": 3,
"credits_remaining": 77,
"items": [
{ "index": 0, "task_id": "vaW29_MJ1wbnyFU4bl_pd" },
{ "index": 1, "task_id": "Qm3x..." },
{ "index": 2, "task_id": "p0Zc..." }
],
"poll_url": "/api/v1/batch/bat_k3Jv9..."
}Billing
- Before anything is accepted, your balance is checked once against all images (
credits_per_imagex number of prompts). If it is not enough, the whole batch is rejected with402 INSUFFICIENT_CREDITS(the body includescredits_requiredandcredits_remaining) and nothing is charged. - If any prompt is blocked by safety checks, the whole batch is rejected with
400 INPUT_MODERATION_BLOCKEDand arejectedlist of prompt indexes. Nothing is charged. - Otherwise each image is charged separately at submission, at the same per-image price as
/generate(see Credit Cost). An image that fails is refunded on its own; the others are not affected.
Concurrency
Images start in groups of 5, one group per minute, so a batch of 20 is released over about 3 minutes. Batch images do not count toward the 8 tasks in progress that /generate and /edit share, but an account can have at most 40 batch images pending or running at once (429 BATCH_CONCURRENCY_LIMITED; wait and retry).
Check a batch
GET /api/v1/batch/{batch_id}
Poll every 5 to 10 seconds. A batch belongs to your account; any other batch id returns 404 BATCH_NOT_FOUND. Each item uses the same status values and fields as GET /api/v1/task/{taskId}, and you can also poll an item's task_id there.
{
"batch_id": "bat_k3Jv9...",
"status": "partial",
"model": "cv-3-fine",
"total": 3,
"counts": { "pending": 0, "processing": 0, "completed": 2, "failed": 1 },
"credits_used": 3,
"credits_refunded": 1,
"items": [
{
"index": 0,
"task_id": "vaW29_MJ1wbnyFU4bl_pd",
"status": "completed",
"prompt": "Water cycle for grade 5",
"images": [{ "url": "https://conceptviz.app/images/def456.png", "prompt": "Water cycle for grade 5" }]
},
{
"index": 2,
"task_id": "p0Zc...",
"status": "failed",
"prompt": "Food chain in a pond",
"error": "Image generation failed. Please try again later.",
"code": "GENERATION_FAILED",
"credits_refunded": true
}
]
}status is pending, processing, completed (all images done), partial (some failed) or failed (all failed).
Export a Finished Image
Convert an image you generated into another format, or remove its background. Exports are asynchronous (PowerPoint can take a couple of minutes), so you start one and poll it.
POST /api/v1/export
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | string | Yes | A completed task of your own (from /generate, /edit or a batch item) |
image_index | integer | No | Which image of the task, starting at 0. Default 0 |
format | string | Yes | "svg", "pptx", "pdf" or "transparent_png" |
max_credits | number | No | Refuse (409 QUOTE_CHANGED) if the price is above this |
Only images produced by your own account can be exported; you never send a URL.
| Format | What you get | Price | Requires |
|---|---|---|---|
svg | Advanced SVG: the image is traced, so everything becomes paths and text is converted to outlines. Text is not editable | 2 credits (free while you have included Advanced SVG uses left) | A plan with Advanced tools (Standard or higher) |
pptx | PowerPoint where text and elements are editable | 4 credits | Pro or higher, or Lifetime |
pdf | The image placed on one page at 300 DPI (a raster image inside a PDF, not vector, text not editable) | Free | API access |
transparent_png | Advanced background removal: the image with its background removed, as a transparent PNG | 1 credit | A plan with Advanced tools (Standard or higher) |
Prices match the same tools in Studio. They are paid in the same order as image generation (any legacy API credits first, then your image credits) and charged only when the converted file is ready: a failed export costs nothing, and you can submit it again. Images that already have a transparent background cannot be exported to PowerPoint or have their background removed (status: "unsupported", no charge). Submitting the same image and format again returns the existing export instead of charging twice. Each account can have 2 exports running and 30 per day.
# Start an Advanced SVG export, then poll until it is ready
EXPORT_ID=$(curl -s -X POST https://conceptviz.app/api/v1/export \
-H "Authorization: Bearer cvk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "task_id": "vaW29_MJ1wbnyFU4bl_pd", "format": "svg" }' | jq -r '.export_id')
while true; do
RESULT=$(curl -s https://conceptviz.app/api/v1/export/$EXPORT_ID \
-H "Authorization: Bearer cvk_your_api_key_here")
STATUS=$(echo $RESULT | jq -r '.status')
[ "$STATUS" != "processing" ] && break
sleep 10
done
curl -s https://conceptviz.app/api/v1/export/$EXPORT_ID/download \
-H "Authorization: Bearer cvk_your_api_key_here" -o image.svgGET /api/v1/export/{export_id} returns export_id, format, status (processing, completed, failed, unsupported, payment_required or result_unknown), credits, download_url once completed, and can_retry. payment_required means your credits ran out before the file could be charged; add credits and submit the export again. result_unknown means the converter could not confirm the result: nothing was charged, and can_check says whether polling again can re-check it. Do not poll it forever; if it stays unconfirmed after a few tries, contact support with the export_id. GET /api/v1/export/{export_id}/download returns the file and needs the same API key.
Examples
cURL
This example uses jq to read the JSON responses. Install it first (for example brew install jq or apt install jq).
# Step 1: Submit
RESPONSE=$(curl -s -X POST https://conceptviz.app/api/v1/generate \
-H "Authorization: Bearer cvk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "water cycle diagram showing evaporation, condensation, and precipitation",
"model": "cv-3-fine",
"mode": "standard",
"quality": "2k"
}')
TASK_ID=$(echo $RESPONSE | jq -r '.taskId')
echo "Task ID: $TASK_ID"
# Step 2: Poll until complete
while true; do
RESULT=$(curl -s https://conceptviz.app/api/v1/task/$TASK_ID \
-H "Authorization: Bearer cvk_your_api_key_here")
STATUS=$(echo $RESULT | jq -r '.status')
echo "Status: $STATUS"
if [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ]; then
echo $RESULT | jq .
break
fi
sleep 5
donePython
import requests
import time
API_KEY = "cvk_your_api_key_here"
BASE_URL = "https://conceptviz.app/api/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
# Step 1: Submit
response = requests.post(
f"{BASE_URL}/generate",
headers=HEADERS,
json={
"prompt": "photosynthesis process diagram",
"model": "cv-3-fine",
"mode": "standard",
"quality": "2k",
},
)
data = response.json()
task_id = data["taskId"]
print(f"Task submitted: {task_id}")
print(f"Credits used: {data['credits_used']}, remaining: {data['credits_remaining']}")
# Step 2: Poll for result
while True:
result = requests.get(f"{BASE_URL}/task/{task_id}", headers=HEADERS).json()
print(f"Status: {result['status']}")
if result["status"] == "completed":
for image in result["images"]:
print(f"Image URL: {image['url']}")
break
elif result["status"] == "failed":
print(f"Error: {result['error']}")
print(f"Credits refunded: {result.get('credits_refunded', False)}")
break
time.sleep(5)JavaScript / TypeScript
const API_KEY = "cvk_your_api_key_here";
const BASE_URL = "https://conceptviz.app/api/v1";
// Step 1: Submit
const submitResponse = await fetch(`${BASE_URL}/generate`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
prompts: [
"cell division mitosis diagram",
"DNA double helix structure",
],
model: "cv-3-fine",
mode: "standard",
quality: "2k",
}),
});
const { taskId, credits_used, credits_remaining } = await submitResponse.json();
console.log(`Task: ${taskId}, credits used: ${credits_used}`);
// Step 2: Poll for result
while (true) {
const pollResponse = await fetch(`${BASE_URL}/task/${taskId}`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
const result = await pollResponse.json();
console.log(`Status: ${result.status}`);
if (result.status === "completed") {
console.log("Images:", result.images);
break;
} else if (result.status === "failed") {
console.error("Failed:", result.error);
break;
}
await new Promise((r) => setTimeout(r, 5000));
}Error Handling
The API returns standard HTTP status codes with JSON error bodies:
{
"error": "Human-readable error message",
"code": "ERROR_CODE"
}Error Codes
| HTTP Status | Code | Description |
|---|---|---|
400 | INVALID_BODY | Request body is not valid JSON |
400 | IMAGE_REQUIRED | Edit request did not include an input image |
400 | INVALID_IMAGE | Input image data, URL, or file type is invalid, or the image URL's host is not allowed (send a data URL or upload the file instead). Checked before safety checks run, so it never means a policy violation |
413 | IMAGE_TOO_LARGE | An input image is larger than 20MB |
400 | PROMPT_TOO_LONG | A prompt is longer than about 8,000 characters |
400 | PROMPT_REQUIRED | No prompt or prompts provided |
400 | TOO_MANY_IMAGES | More than 4 images in one edit request |
400 | UNSUPPORTED_MODEL | Model must be cv-3-fine (retired names are also accepted); mode must be standard or max |
400 | STYLE_REFERENCE_REQUIRED | /batch needs a style_reference_image |
400 | INVALID_PROMPT / INVALID_STYLE | A batch prompt is empty or not a string, or style is invalid or longer than 1,000 characters |
400 | TOO_MANY_PROMPTS | More than 4 prompts in one /generate request, or more than 20 in one /batch |
409 | IDEMPOTENCY_KEY_REUSED | The Idempotency-Key was already used with a different request body |
502 | STYLE_ANALYSIS_FAILED | The style reference image could not be analyzed. Nothing was charged; retry |
404 | BATCH_NOT_FOUND | Batch id not found or doesn't belong to your account |
429 | BATCH_CONCURRENCY_LIMITED | Too many batch images are already pending or running (40 per account) |
400 | UNSUPPORTED_FORMAT / TASK_REQUIRED | Export format must be svg, pptx, pdf or transparent_png, and task_id is required |
404 | IMAGE_NOT_FOUND / EXPORT_NOT_FOUND | No completed image for that task, or the export id is unknown |
403 | PLAN_REQUIRED | The account's plan does not include this export format |
409 | QUOTE_CHANGED | The export price is above max_credits |
429 | EXPORT_LIMITED | Too many exports in progress or today |
401 | UNAUTHORIZED | Missing or invalid Authorization header |
401 | INVALID_API_KEY | API key is invalid, disabled or revoked |
402 | INSUFFICIENT_CREDITS | Not enough credits for the quoted cost (includes credits_remaining) |
403 | API_ACCESS_REQUIRED | The account does not have API access (requires Max, Yearly or Lifetime, or existing API access) |
404 | TASK_NOT_FOUND | Task ID not found or doesn't belong to your account |
429 | CONCURRENCY_LIMITED | This key already has 8 tasks in progress. Wait for one to finish, then retry |
429 | RATE_LIMITED | Too many requests for this key in the current minute. The message says which limit was hit: submissions (/generate, /edit, /batch and /export, 30 per minute) or status polls (/task, /batch/{id} and /export/{id}, 300 per minute). See Retry-After |
429 | MODERATION_RATE_LIMITED | Too many moderation requests in a short period |
400 | INPUT_MODERATION_BLOCKED | Prompt or input image was blocked by safety checks. No credits are charged |
502 | IMAGE_FETCH_FAILED | The input image URL could not be fetched for checking. Make sure it is publicly reachable, or send a data URL or upload the file. Safe to retry |
503 | MODERATION_UNAVAILABLE | The image check is temporarily unavailable. Not a policy decision; retry after the Retry-After delay |
500 | CREDIT_CONSUMPTION_FAILED | Credits could not be consumed |
500 | IMAGE_UPLOAD_FAILED | An input image could not be stored. Retry the request |
500 | INTERNAL_ERROR | Unexpected server error. Retry; contact support if it persists |
500 | GENERATION_FAILED | Image generation failed (credits auto-refunded) |
Example: Handling Errors
response = requests.post(f"{BASE_URL}/generate", headers=headers, json=payload)
if response.status_code == 402:
data = response.json()
print(f"Not enough credits. Remaining: {data.get('credits_remaining', 0)}")
elif response.status_code == 429:
wait = int(response.headers.get("Retry-After", "5"))
print(f"{response.json()['code']}: retrying in {wait}s")
time.sleep(wait)
elif response.status_code != 200:
print(f"Error: {response.json()['error']}")
else:
data = response.json()
task_id = data["taskId"]
# Start polling...Rate Limits
Limits apply per API key.
| Limit | Value | Error |
|---|---|---|
| Tasks in progress | 8 at a time | 429 CONCURRENCY_LIMITED |
| Batch images in progress | 40 at a time per account (separate from the 8 above) | 429 BATCH_CONCURRENCY_LIMITED |
POST /generate, /edit, /batch and /export | 30 requests per minute (shared) | 429 RATE_LIMITED |
GET /task/{taskId}, /batch/{id} and /export/{id} | 300 requests per minute (counted separately) | 429 RATE_LIMITED |
Limits use fixed one-minute windows that start at the top of each clock minute, not a sliding window. Rejected requests count toward the window, and a burst can straddle a minute boundary (up to about twice the limit across two adjacent windows). X-RateLimit-Reset tells you when the current window ends.
Every 429 response includes a Retry-After header (seconds to wait). Responses from /generate, /edit, /batch, /export and /task also carry these headers:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests allowed in the current window |
X-RateLimit-Remaining | Requests left in the current window |
X-RateLimit-Reset | Unix timestamp (seconds) when the current one-minute window resets |
Polling Recommendations
- Poll every 3–5 seconds. A typical task takes 30–90 seconds, so 300 polls per minute per key covers 8 tasks polled in parallel.
- When you receive
429, wait forRetry-Afterseconds before sending the next request. Do not retry in a tight loop. - To run more work in parallel, keep at most 8 tasks in progress per key and submit a new task as each one completes.
- Stop polling when
statusiscompletedorfailed. Failed tasks are refunded automatically.
Limits
| Constraint | Value |
|---|---|
Max images per /generate request | 4 |
Max images per /batch request | 20 (1 shared style reference image, up to 10MB) |
| Batch release rate | 5 images per minute per batch |
| Max API keys per account | 5 |
| Tasks in progress per key | 8 |
| Generation time | 30–90 seconds typical |
| Poll interval | 3–5 seconds recommended |
| Available model | cv-3-fine (older names are accepted and served by it) |
| Available modes | standard (default), max |
| Export formats | svg, pptx, pdf, transparent_png |
| Available qualities | 2k, 4k (unknown values fall back to the default) |
| Max prompt length | About 8,000 characters |
| Max input image size | 20MB each |