Developer API
Scientific figures, built for your product.
Generate publication-ready figures from text, sketches, or reference images—all through one API.
create-figure.sh
curl https://api.figurelabs.ai/v1/images/generations \
-H "Authorization: Bearer $FIGURELABS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "generations",
"prompt": "PI3K–AKT signaling pathway"
}'202 Accepted · tsk_01JZ9F7KQ2 · processing
One API. Multiple workflows.

→

POST /v1/images/generations
{
"mode": "generations",
"prompt": "PI3K–AKT signaling pathway"
}202 Accepted
{
"task_id": "tsk_01JZ9F7KQ2",
"status": "processing"
}One endpoint. Automatic routing.View examples
Create, refine, and deliver scientific figures.
Describe your goal and provide any source files. FigureLabs automatically routes each request to the right generation or editing workflow.
Text-to-Figure
Create a figure from a scientific prompt.
Sketch-to-Figure
Turn a rough sketch into a polished visual.
Reference Image-to-Figure
Create from a reference image or visual style.
Enhance
Improve clarity, labels, and composition.
Flowchart
Generate workflows and process diagrams.
Upscale
Export at 2K, 4K, or 8K resolution.
Vectorize
Convert raster figures to editable SVG.
Quickstart
Submit, poll, and retrieve
FigureLabs uses asynchronous tasks so your product stays responsive while complex figures are generated.
- 1Submit a generation request.
- 2Persist the returned task_id.
- 3Poll until the task reaches a final state.
- 4Download the output URL within seven days.
import os, time, requests
headers = {
"Authorization": f"Bearer {os.environ['FIGURELABS_API_KEY']}"
}
task_response = requests.post(
"https://api.figurelabs.ai/v1/images/generations",
headers=headers,
json={"mode":"generations","prompt":"PI3K–AKT pathway"}
)
task_response.raise_for_status()
task = task_response.json()
while True:
result_response = requests.get(
f"https://api.figurelabs.ai/v1/tasks/{task['task_id']}",
headers=headers
)
result_response.raise_for_status()
result = result_response.json()
if result["status"] in {"succeeded", "failed", "rejected", "canceled"}:
break
time.sleep(3)
if result["status"] != "succeeded":
raise RuntimeError(result.get("error") or result["status"])
print(result["output_url"])