Generate your first scientific figure
You only need an API key and two request fields. Follow these steps to submit a figure, check its progress, and download the result.
Save your API key
Replace fl_live_... with the key from your console. An environment variable keeps it out of your code.
export FIGURELABS_API_KEY="fl_live_..."
Submit a generation request
This minimal request asks FigureLabs to create a new figure from text.
curl -X POST https://api.figurelabs.ai/v1/images/generations \ -H "Authorization: Bearer $FIGURELABS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt":"Create a clean scientific figure of the PI3K-AKT signaling pathway", "mode":"generations" }'
promptrequiredDescribe the figure you want. English prompts usually give the most predictable labels and scientific detail.
modeoptionalUse generations for common image workflows. It is also the default when mode is omitted.
Save the task ID
Generation runs in the background. The first response confirms that your task was accepted; it does not contain the final image yet.
{
"task_id": "tsk_01JZ9F7KQ2",
"status": "processing",
"estimated_price": 80,
"currency": "USD"
}
Check the result
Use the returned task_id. Check every 2–5 seconds until the status reaches a final state.
curl https://api.figurelabs.ai/v1/tasks/tsk_01JZ9F7KQ2 \ -H "Authorization: Bearer $FIGURELABS_API_KEY"
Download the figure
When the task succeeds, save the file from output_url. Signed result URLs remain available for seven days.
"status": "succeeded",
"output_url": "https://files.figurelabs.ai/presigned/...",
"output_type": "image/png",
"actual_price": 80
}
Generation capabilities
All common image generation and editing tasks use POST /v1/images/generations. The generations mode lets FigureLabs infer the user intent from the prompt, source files, palette, and target ratio.
Public mode values
| mode | When to use it | Required input |
|---|---|---|
generations | Text generation, sketch conversion, reference generation, enhancement, recoloring, and aspect-ratio editing. This is the default when mode is omitted. | Prompt and/or source files, depending on the task. |
region_redraw | Force the regional-redraw processing path. | Prompt, original image, and one mask. |
white_background | Force the white-background processing path. | Image or sessionId; prompt is optional. |
Capabilities inferred inside generations
Text to FigurePrompt only; creates a new scientific figure.AUTO-ROUTEDSketch to FigurePrompt plus a rough sketch image.AUTO-ROUTEDReference to FigurePrompt plus a visual or layout reference.AUTO-ROUTEDEnhanceExisting image plus an enhancement instruction.AUTO-ROUTEDRecolorExisting image, recolor instruction, and optional colorPalette.AUTO-ROUTEDAspect RatioExisting image and optional targetRatio. If omitted, FigureLabs selects a suitable ratio for the task.AUTO-ROUTEDExample
{
"mode": "generations",
"prompt": "Recolor this pathway using a restrained blue and green palette",
"files": ["file_image123"],
"colorPalette": "#2563EB,#14B8A6"
}File uploads and storage
Upload a local image or document to receive a file_id, then pass that ID to a generation or flowchart request. Uploaded files are temporary API inputs, not permanent cloud storage.
Self-serve storage tiers
A new self-serve account starts with 0 storage until its first successful wallet top-up. A successful top-up moves the account to the matching storage tier. The achieved quota does not decrease when API usage later reduces the wallet balance. All API keys under the same account share this limit.
| Wallet total after top-up | File storage |
|---|---|
| $0 before first top-up | 0 GB |
| More than $0 and up to $10 | 1 GB |
| More than $10 and up to $50 | 2 GB |
| More than $50 and below $200 | 5 GB |
| $200 or more | 20 GB |
Enterprise accounts
Enterprise storage allowance is defined in the enterprise agreement and is not calculated from wallet balance. If the agreement does not specify a custom allowance, the default is 50 GB. Contact enterprise support to confirm or change the contracted allowance.
File validity and deletion
Uploaded files are valid for 7 days. After 7 days, a file can no longer be used through the external API by file_id and is not counted toward file storage.
- Deleting a file makes its file ID unavailable immediately and removes it from the storage calculation.
- The console shows metadata and a Delete action only. It does not preview, open, or download uploaded file content.
Upload and use a local file
curl -X POST https://api.figurelabs.ai/v1/files \ -H "Authorization: Bearer $FIGURELABS_API_KEY" \ -F "file=@./reference.png" \ -F "purpose=image_generation"
{
"mode": "generations",
"prompt": "Redraw this as a clean publication figure",
"files": ["file_abc123"]
}Models, speed & aspect ratios
Use the optional model field to lock a model. If omitted, FigureLabs selects a recommended model allowed by your API key and compatible with the workflow and ratio.
| Model value | Display name | Approx. time | Supported targetRatio values |
|---|---|---|---|
gemini-3-pro-image-preview | Nano Banana Pro | ~30 sec | 16:9, 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 21:9 |
nano-banana-2 | Nano Banana 2 | ~30 sec | 16:9, 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 21:9 |
gpt-image-2 | GPT Image 2 | ~90 sec | 16:9, 1:1, 2:3, 3:2, 4:5, 5:4, 9:16 |
nano-banana | Nano Banana | ~15 sec | 16:9, 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 21:9 |
gpt-image-1 | GPT Image 1.5 | ~90 sec | 3:2, 1:1, 2:3 |
seedream-5-0-260128 | Seedream 5.0 Lite | ~120 sec | 16:9, 1:1, 2:3, 3:4, 9:16, 3:2, 4:3, 21:9 |
seedream-4-5-251128 | Seedream 4.5 | ~30 sec | 16:9, 1:1, 2:3, 3:4, 9:16, 3:2, 4:3, 21:9 |
flux-kontext-max | Flux.2 Max | ~15 sec | 4:3, 1:1, 16:9, 9:16, 21:9, 2:3, 5:1, 3:2, 3:7, 7:3 |
sora-image | Sora | ~90 sec | 3:2, 1:1, 2:3 |
How ratio selection works
Image generation uses targetRatio; Flowcharts uses ratio. Use colon notation such as 16:9, not pixels or a display label.
- If a model is specified, choose one of its supported ratios.
- If no targetRatio is sent, FigureLabs determines a suitable output ratio from the prompt, source files, and generation task.
- If no model is sent, FigureLabs selects a compatible model using the prompt, input type, requested targetRatio, and available models for the API key.
Control generated output
A basic generation needs a prompt and workflow. Add model, ratio, style, palette, format, or session fields only when you need more control.
promptconditionalMaximum 2,000 characters. Required for generation and edit modes that need instructions.
modeoptionalDefaults to generations. Public values are generations, region_redraw, and white_background.
modeloptionalLock a model. Omit it to use the recommended compatible model.
targetRatioconditionalOptional. Send a supported ratio to force the output shape; omit it to let FigureLabs choose a suitable ratio from the generation task.
styleoptionalFlat, 3D, 2.5D, hand_drawn, or line_art. Default: Flat.
formatoptionalpng by default. vector generates then vectorizes to SVG.
qualityoptionalV1 supports only high. It is the default and does not change price.
sessionIdoptionalContinue an existing conversation. Omit it to create a new session.
colorPaletteoptionalPass 1–8 comma-separated colors in #RRGGBB format. The palette guides the model, especially for recolor, but does not strictly limit every output color. Omit it or pass an empty string to let the model choose.
Example
{
"model": "nano-banana",
"prompt": "Create a publication-ready mitochondrial pathway figure",
"mode": "generations",
"style": "Flat",
"targetRatio": "16:9",
"colorPalette": "#0F172A,#2563EB,#14B8A6",
"format": "png"
}Generate & edit images
Use one endpoint for text generation, sketch and reference workflows, enhancement, regional redraw, recoloring, white background, and aspect-ratio editing.
Request parameters
| Field | Type | Required? | Description |
|---|---|---|---|
model | string | Optional | Model value from Models & ratios. Omit for recommended routing. |
prompt | string | Conditional | Maximum 2,000 characters. Required for generation and instruction-driven edits. |
sessionId | string | Optional | Continue an existing session; a new session is created when omitted. |
mode | string | Optional | Routing mode. Default: generations. Other values: region_redraw and white_background. |
style | string | Optional | Flat, 3D, 2.5D, hand_drawn, or line_art. Default: Flat. |
colorPalette | string | Optional | 1–8 comma-separated #RRGGBB colors used as visual guidance. |
imageUrl | string / object / array | Optional | Legacy-compatible reference input: URL, Data URI, file object, file ID, or array. |
files | string / object / array | Optional | Image or document inputs. Merged with imageUrl. |
mask | string / object | Conditional | One image; required and only valid for region_redraw. |
targetRatio | string | Conditional | Optional ratio such as 16:9. Omit it to let FigureLabs choose a suitable ratio for the generation task. |
format | string | Optional | png (default) or vector. Vector runs generation plus SVG conversion. |
quality | string | Optional | V1 supports only high; default high; no price change. |
quoteMessageId | number | Optional | Message to edit. Requires sessionId; otherwise ignored. |
safetyIdentifier | string | Optional | Your non-sensitive end-user reference for safety auditing. |
Routing modes
| mode | Behavior | Input requirements |
|---|---|---|
generations | Agent automatically identifies text, sketch, reference, enhance, recolor, or aspect-ratio intent. | Prompt and/or source files. Default when omitted. |
region_redraw | Fixed regional-redraw processing. | Prompt, original image, and one mask. |
white_background | Fixed white-background processing. | Image or sessionId; prompt optional. |
Request examples
Text to figure
{
"model": "gpt-image-2",
"prompt": "A publication-ready mitochondrial metabolism pathway",
"mode": "generations",
"style": "Flat",
"colorPalette": "#111111,#2F80ED,#27AE60",
"targetRatio": "16:9",
"format": "png"
}Reference image
{
"model": "nano-banana",
"prompt": "Redraw this as a clean Nature-style schematic",
"mode": "generations",
"imageUrl": "https://example.com/input/figure.png",
"targetRatio": "4:3"
}Regional redraw with mask
{
"prompt": "Redraw the masked area as a microscope panel",
"mode": "region_redraw",
"files": ["file_image123"],
"mask": "file_mask123"
}Creation response
| Field | Type | Meaning |
|---|---|---|
task_id | string | Save this ID and query Tasks. |
session_id | string | Use it to continue the same session. |
status | string | Usually processing. |
estimated_price | number | Estimated hold in USD cents. |
currency | string | USD in V1. |
Upscale an image
Increase one raster image to a 2K, 4K, or 8K target. The successful task output is PNG.
Request parameters
| Field | Type | Required? | Description |
|---|---|---|---|
image_url | string / object / array | Required | URL, Data URI, file object, or file ID. If an array is sent, the first valid image is used. |
target_size | string | Optional | 2k, 4k, 8k, or width x height such as 4096x2048. Default: 2K tier. |
safety_identifier | string | Optional | Your non-sensitive end-user reference. |
Target tiers & pricing
| Value | Target long edge | Standard price |
|---|---|---|
2k or omitted | Approximately 2,048 px | $0.02 |
4k | Approximately 4,096 px | $0.04 |
8k | Approximately 8,192 px | $0.08 |
4096x2048 | Larger dimension selects the tier | $0.04 |
Example
{
"image_url": "https://example.com/input/source.png",
"target_size": "4k",
"safety_identifier": "user_12345"
}Vectorize an image
Convert one raster image to scalable SVG. V1 processes one image per task.
Request parameters
| Field | Type | Required? | Description |
|---|---|---|---|
image_url | string / object | Required | One bitmap URL, Data URI, file object, or file ID. |
safety_identifier | string | Optional | Your non-sensitive end-user reference. |
Example
{
"image_url": "https://example.com/input/chart.png"
}Generate a flowchart
Create an SVG research workflow from a prompt and optional image or document inputs.
Request parameters
| Field | Type | Required? | Description |
|---|---|---|---|
prompt | string | Required | Non-empty flowchart instruction. |
session_id | string | Optional | Continue an existing session; creates a new session when omitted. |
ratio | string | Optional | Output ratio such as 16:9 or 1:1. |
file_url | string / object / array | Optional | Legacy single-file field; also accepts file object, file ID, or array. |
files | string / object / array | Optional | URL, Data URI, file object, or file ID array. Merged with file_url. |
Example
{
"prompt": "Draw a single-cell RNA-seq workflow from tissue dissociation to marker annotation",
"ratio": "16:9"
}With a source file
{
"prompt": "Convert this rough process sketch into a polished SVG flowchart",
"ratio": "4:3",
"files": ["file_sketch123"]
}Files
Upload temporary task inputs and manage uploaded-file metadata from the developer console.
Upload requirements
Uploads must pass authentication, file-type, file-size, and account storage-limit checks. Rejected uploads are not stored or counted toward account usage.
Form fields
| Field | Type | Required? | Description |
|---|---|---|---|
file | file | Required | Image or document. Video and audio are not supported. |
purpose | string | Optional | general, image_generation, flowchart, or mask. Default: general. |
Response fields
| Field | Description |
|---|---|
id | File ID to pass to a task request. |
file_name, mime_type, size | Uploaded-file metadata. |
created_at, expires_at | UTC upload time and the 7-day external expiry time. |
Upload example
curl -X POST https://api.figurelabs.ai/v1/files \ -H "Authorization: Bearer $FIGURELABS_API_KEY" \ -F "file=@./reference.pdf" \ -F "purpose=image_generation"
{
"id": "file_abc123",
"file_name": "reference.pdf",
"mime_type": "application/pdf",
"size": 204800,
"created_at": "2026-08-04T10:22:00Z",
"expires_at": "2026-08-11T10:22:00Z"
}Manage and delete files
Open Developer console → Files to review uploaded-file metadata or delete a file. Deletion requires confirmation.
After deletion, the file_id becomes unavailable immediately and the file no longer counts toward file storage. Already-submitted tasks continue. Data retention follows the FigureLabs privacy policy.
Storage-limit errors
| HTTP | errorCode | Meaning |
|---|---|---|
| 413 | STORAGE_QUOTA_EXCEEDED | The new file would exceed the account's file storage limit. |
Query a task result
Use the shared task endpoint for Generate, Upscale, Vectorize, and Flowchart tasks. A key can query only tasks owned by its account.
Path parameter
| Parameter | Type | Required? | Description |
|---|---|---|---|
task_id | string | Required | ID returned by a task creation endpoint; usually starts with tsk_. |
Response fields
| Field | Type | Description |
|---|---|---|
task_id | string | Task ID. |
session_id | string | Session ID for follow-up generation. |
status | string | pending, processing, succeeded, failed, rejected, or canceled. |
output_url | string / null | Seven-day signed result URL after success. |
output_type | string / null | For example image/png, image/svg+xml, png, or svg. |
error | object / null | Error details for failed or rejected tasks. |
error.code | string | Public task error code. |
error.message | string | Human-readable task error. |
actual_price | number / null | Final charge in USD cents after success. |
estimated_price | number / null | Estimated hold in USD cents. |
currency | string / null | USD in V1. |
created_at | string / null | UTC RFC 3339 time, ending in Z. |
finished_at | string / null | Completion time; null until finished. |
Polling recommendations
- Poll every 2–5 seconds.
- Use a longer interval for slower models such as gpt-image-2 and seedream-5-0-260128.
- Stop when status is succeeded, failed, rejected, or canceled.
- Persist task_id so a network interruption does not lose the result lookup.
Successful result
{
"task_id": "tsk_01JZ9F7KQ2",
"status": "succeeded",
"output_url": "https://files.figurelabs.ai/presigned/...",
"output_type": "image/png",
"error": null,
"actual_price": 80,
"estimated_price": 80,
"currency": "USD",
"created_at": "2026-07-31T10:20:30Z",
"finished_at": "2026-07-31T10:21:02Z"
}Failed or rejected tasks
actual_price is null and the estimated hold is released. Use UPSTREAM_FAILED for processing failure and UPSTREAM_SAFETY_REJECTED for a safety refusal.
Error handling
Handle errors differently depending on whether FigureLabs created a task.
HTTP errorAuthentication, balance, permission, or validation failed before task creation. Read the top-level error response.
Task errorA task exists but finishes as failed or rejected. Query Tasks and read its error object. It is not charged.
HTTP error format
{
"code": 401000,
"errorCode": "INVALID_API_KEY",
"message": "Invalid API key.",
"requestId": "req_abc123"
}Common HTTP errors
| HTTP | errorCode | What it means | Recommended action |
|---|---|---|---|
| 401 | INVALID_API_KEY | Key missing, malformed, or unknown. | Check the Authorization header. |
| 401 | API_KEY_REVOKED | The key was permanently revoked. | Create and use a new key. |
| 403 | API_KEY_DISABLED | The key is disabled. | Enable it or use another key. |
| 403 | CUSTOMER_DISABLED | The customer account cannot make calls. | Contact account support. |
| 403 | MODEL_NOT_ALLOWED | The key cannot use the selected model. | Change model or allowed-model settings. |
| 402 | INSUFFICIENT_BALANCE | The wallet cannot cover the task. | Add funds and submit again. |
| 402 | BILLING_FAILED | The billing hold or charge failed. | Retry later or contact support. |
| 409 | IDEMPOTENCY_KEY_CONFLICT | The same key was reused with a different body. | Use a new Idempotency-Key. |
| 429 | RATE_LIMITED | Request rate exceeded. | Wait and retry with backoff. |
| 429 | CONCURRENT_TASK_LIMIT_EXCEEDED | Too many tasks are running. | Wait for active tasks to finish. |
| 422 | INVALID_PROMPT | Prompt or required field validation failed. | Review required fields and limits. |
| 422 | MODEL_MODE_NOT_SUPPORTED | The model cannot perform this workflow. | Omit model or choose another model. |
| 400 / 422 | 1001011026 | File, target size, or task parameter is invalid. | Review request fields and values. |
| 400 / 422 | 1001011051 | The file ID does not exist. | Upload again or use a valid file ID. |
| 403 | 1001011052 | The file belongs to another account. | Use a file uploaded by this account. |
| 400 / 422 | 1001011053 | Unsupported file type. | Use an accepted image or document. |
| 400 / 422 | 1001011054 | More than five ordinary input files. | Reduce the number of inputs. |
| 400 / 422 | 1001011055 | Decoded file size exceeds the limit. | Compress or resize the file. |
| 500 | 1001011056 | File upload or reading failed. | Retry the upload. |
| 404 | 1001011019 | Task missing or owned by another account. | Check task_id and API key account. |
| 500 | INTERNAL_ERROR | FigureLabs platform error. | Retry with backoff; contact support if persistent. |
Task terminal errors
| Task status | error.code | Meaning | Charged? |
|---|---|---|---|
failed | UPSTREAM_FAILED | Generation or processing failed. | No |
rejected | UPSTREAM_SAFETY_REJECTED | The safety policy refused the request. | No |
Rate-limit response headers
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Current rate limit. |
X-RateLimit-Remaining | Requests remaining in the current window. |
X-RateLimit-Reset | Suggested wait in seconds. |
Retry-After | How long to wait before retrying. |
File storage errors
| HTTP | errorCode | Recommended action |
|---|---|---|
| 413 | STORAGE_QUOTA_EXCEEDED | Delete files from the console, wait for expiry, or increase the account quota. |
Model policies
FigureLabs and the selected model provider apply safety checks to prompts and uploaded content.
If a request is rejected
The task returns status=rejected with a concise reason. Show that reason to your user, let them revise the input, and do not retry the same content automatically.
For applications with end users
Pass a non-sensitive user reference in safetyIdentifier. Do not send names, email addresses, or other personal data.
llms.txt
Give coding agents a concise index of supported endpoints, authentication, task polling, and error handling.
Location
Use it with an agent
Read https://developer.figurelabs.ai/llms.txt and build a server-side integration that generates a scientific figure, polls the task, and handles rejected requests.