Документация API

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_here

API 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/v1

Models

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 adds requested_model (the name you sent) and notice.
  • The response carries the headers Deprecation: true and X-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-fine price, 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

ParameterTypeRequiredDescription
promptstringYes*A single text prompt describing the diagram
promptsstring[]Yes*Array of prompts for batch generation (max 4)
modelstringNo"cv-3-fine" (the only model, and the default). Retired names are still accepted; see Models
modestringNoGeneration mode: "standard" (default) or "max"
qualitystringNoImage 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
aspectRatiostringNoAspect 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:

ValueResult
"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.

ParameterTypeRequiredDescription
promptstringYesEdit instructions for the image
imagesstring[]YesInput image URLs or data:image/...;base64,... values (max 4)
modelstringNo"cv-3-fine" (the only model, and the default). Retired names are still accepted; see Models
modestringNoGeneration mode: "standard" (default) or "max"
qualitystringNoImage resolution, lowercase: "2k" or "4k". Same defaults and fallback as /generate
aspectRatiostringNoOutput 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.

ModeQualityCredits per Image
standard (default)2k1
standard4k2
max2k2
max4k4

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

ParameterTypeRequiredDescription
promptsstring[]Yes1 to 20 prompts. Each is generated as its own image, up to about 8,000 characters each
style_reference_imagestringYesThe 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
stylestringNoExtra style direction in your own words (max 1,000 characters), added to the reference style
quality, mode, aspectRatioNoSame values and defaults as /generate. They are set once and apply to every image in the batch
modelstringNo"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_image x number of prompts). If it is not enough, the whole batch is rejected with 402 INSUFFICIENT_CREDITS (the body includes credits_required and credits_remaining) and nothing is charged.
  • If any prompt is blocked by safety checks, the whole batch is rejected with 400 INPUT_MODERATION_BLOCKED and a rejected list 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

ParameterTypeRequiredDescription
task_idstringYesA completed task of your own (from /generate, /edit or a batch item)
image_indexintegerNoWhich image of the task, starting at 0. Default 0
formatstringYes"svg", "pptx", "pdf" or "transparent_png"
max_creditsnumberNoRefuse (409 QUOTE_CHANGED) if the price is above this

Only images produced by your own account can be exported; you never send a URL.

FormatWhat you getPriceRequires
svgAdvanced SVG: the image is traced, so everything becomes paths and text is converted to outlines. Text is not editable2 credits (free while you have included Advanced SVG uses left)A plan with Advanced tools (Standard or higher)
pptxPowerPoint where text and elements are editable4 creditsPro or higher, or Lifetime
pdfThe image placed on one page at 300 DPI (a raster image inside a PDF, not vector, text not editable)FreeAPI access
transparent_pngAdvanced background removal: the image with its background removed, as a transparent PNG1 creditA 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.svg

GET /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
done

Python

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 StatusCodeDescription
400INVALID_BODYRequest body is not valid JSON
400IMAGE_REQUIREDEdit request did not include an input image
400INVALID_IMAGEInput 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
413IMAGE_TOO_LARGEAn input image is larger than 20MB
400PROMPT_TOO_LONGA prompt is longer than about 8,000 characters
400PROMPT_REQUIREDNo prompt or prompts provided
400TOO_MANY_IMAGESMore than 4 images in one edit request
400UNSUPPORTED_MODELModel must be cv-3-fine (retired names are also accepted); mode must be standard or max
400STYLE_REFERENCE_REQUIRED/batch needs a style_reference_image
400INVALID_PROMPT / INVALID_STYLEA batch prompt is empty or not a string, or style is invalid or longer than 1,000 characters
400TOO_MANY_PROMPTSMore than 4 prompts in one /generate request, or more than 20 in one /batch
409IDEMPOTENCY_KEY_REUSEDThe Idempotency-Key was already used with a different request body
502STYLE_ANALYSIS_FAILEDThe style reference image could not be analyzed. Nothing was charged; retry
404BATCH_NOT_FOUNDBatch id not found or doesn't belong to your account
429BATCH_CONCURRENCY_LIMITEDToo many batch images are already pending or running (40 per account)
400UNSUPPORTED_FORMAT / TASK_REQUIREDExport format must be svg, pptx, pdf or transparent_png, and task_id is required
404IMAGE_NOT_FOUND / EXPORT_NOT_FOUNDNo completed image for that task, or the export id is unknown
403PLAN_REQUIREDThe account's plan does not include this export format
409QUOTE_CHANGEDThe export price is above max_credits
429EXPORT_LIMITEDToo many exports in progress or today
401UNAUTHORIZEDMissing or invalid Authorization header
401INVALID_API_KEYAPI key is invalid, disabled or revoked
402INSUFFICIENT_CREDITSNot enough credits for the quoted cost (includes credits_remaining)
403API_ACCESS_REQUIREDThe account does not have API access (requires Max, Yearly or Lifetime, or existing API access)
404TASK_NOT_FOUNDTask ID not found or doesn't belong to your account
429CONCURRENCY_LIMITEDThis key already has 8 tasks in progress. Wait for one to finish, then retry
429RATE_LIMITEDToo 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
429MODERATION_RATE_LIMITEDToo many moderation requests in a short period
400INPUT_MODERATION_BLOCKEDPrompt or input image was blocked by safety checks. No credits are charged
502IMAGE_FETCH_FAILEDThe 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
503MODERATION_UNAVAILABLEThe image check is temporarily unavailable. Not a policy decision; retry after the Retry-After delay
500CREDIT_CONSUMPTION_FAILEDCredits could not be consumed
500IMAGE_UPLOAD_FAILEDAn input image could not be stored. Retry the request
500INTERNAL_ERRORUnexpected server error. Retry; contact support if it persists
500GENERATION_FAILEDImage 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.

LimitValueError
Tasks in progress8 at a time429 CONCURRENCY_LIMITED
Batch images in progress40 at a time per account (separate from the 8 above)429 BATCH_CONCURRENCY_LIMITED
POST /generate, /edit, /batch and /export30 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:

HeaderMeaning
X-RateLimit-LimitRequests allowed in the current window
X-RateLimit-RemainingRequests left in the current window
X-RateLimit-ResetUnix 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 for Retry-After seconds 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 status is completed or failed. Failed tasks are refunded automatically.

Limits

ConstraintValue
Max images per /generate request4
Max images per /batch request20 (1 shared style reference image, up to 10MB)
Batch release rate5 images per minute per batch
Max API keys per account5
Tasks in progress per key8
Generation time30–90 seconds typical
Poll interval3–5 seconds recommended
Available modelcv-3-fine (older names are accepted and served by it)
Available modesstandard (default), max
Export formatssvg, pptx, pdf, transparent_png
Available qualities2k, 4k (unknown values fall back to the default)
Max prompt lengthAbout 8,000 characters
Max input image size20MB each