Professional next-generation AI-first vector graphics tool
"Illustmaker"

One line of code, vector designs come alive.
A simple HTTP JSON API (102 methods total) you can call from AI agents, server-side code, or cron — anywhere.
Realize whatever you envision.

EndpointPOST https://asi.co.jp/illustmaker/api/mcp.php
Content-Typeapplication/json
Format{ "method": "...", "params": {...}, "session": "..." }
Response{ "ok": true, ... } or { "ok": false, "error": "..." }
Version1.0.0
llms.txt/illustmaker/llms.txt

Quick Start

1. Create a session

curl -X POST https://asi.co.jp/illustmaker/api/mcp.php \
  -H 'Content-Type: application/json' \
  -d '{"method":"illust.create_session","params":{"width":800,"height":600,"bg":"#ffffff"}}'
{
  "ok": true,
  "session": "abc123def456",
  "state": {"docW":800,"docH":600,"docBg":"#ffffff","objects":[]},
  "open_url": "https://asi.co.jp/illustmaker/?s=abc123def456"
}

2. Add an object

curl -X POST https://asi.co.jp/illustmaker/api/mcp.php \
  -H 'Content-Type: application/json' \
  -d '{
    "method": "illust.add_object",
    "session": "abc123def456",
    "params": {"type":"ellipse","x":200,"y":150,"w":400,"h":300,"fill":"#4a9eff"}
  }'

3. Export SVG

curl -X POST https://asi.co.jp/illustmaker/api/mcp.php \
  -H 'Content-Type: application/json' \
  -d '{"method":"illust.export_svg","session":"abc123def456"}'

4. Open in the browser (let the user edit)

Open open_url in a browser and the user can continue editing by hand.

Authentication / API key

The API can be used anonymously, but the rate limit is strict (30 req/min). For continued use we recommend issuing an API key.

Issuing an API key

curl -X POST https://asi.co.jp/illustmaker/api/keys.php \
  -H 'Content-Type: application/json' \
  -d '{"action":"issue","email":"you@example.com","purpose":"my_project"}'
{
  "ok": true,
  "api_key": "im_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "tier": "free",
  "rate_limit_per_min": 100
}

The issued API key is shown only once. Store it somewhere safe.

Usage

curl -X POST https://asi.co.jp/illustmaker/api/mcp.php \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: im_xxxxxxxxxx' \
  -d '{"method":"illust.health"}'

Rate limit tiers

tierLimitHow to obtain
anon30 req/minNo API key required
free100 req/minThe issue endpoint above
pro600 req/minContact us

Status check & revocation

# info
curl -X POST https://asi.co.jp/illustmaker/api/keys.php -H 'Content-Type: application/json' \
  -d '{"action":"info","key":"im_xxx"}'
# revoke
curl -X POST https://asi.co.jp/illustmaker/api/keys.php -H 'Content-Type: application/json' \
  -d '{"action":"revoke","key":"im_xxx"}'

Limits

Request bodyMax 1MB
Objects per sessionMax 5,000
Session file sizeMax 5MB
batch_render rowsMax 1,000
Rate limitanon 30 / free 100 / pro 600 req/min
Session retention7 days from last update (auto-deleted via cron)
import_from_urlPublic IPs and ports 80/443 only. No redirect following. 5MB max

Use cases

Mass-produce 100 food labels

One template + CSV/JSON generates labels for 100 products in 2 seconds. Variable Data Printing for food factories, restaurants, and craft breweries.

  1. Create template: create_session → border/logo/color bar via add_object
  2. Add variable text: {{name}}{{net}}{{expiry}}
  3. Extract array from product DB/CSV
  4. batch_render with output:"pdf-imposition" to generate an A4 imposed PDF in one shot
  5. Submit directly to a print shop

Bulk export price POPs as PDF

Supermarket sale POPs, restaurant price tags, retail show cards. Generate 30 PDFs at once from a CSV of prices and product names.

  1. Create a POP template (red "Sale" ribbon + product image + price)
  2. Build an array of product name, regular price, and sale price from POS or CSV data
  3. batch_render takes you all the way to a print-ready PDF

Generate per-article OGP images

Generate SNS thumbnails for 100 blog posts at once with consistent design. Just swap title and author name.

  1. Create a 1200x630 template (background + brand logo + variable title)
  2. Extract a {title, author} array from your blog DB
  3. batch_render with output:"png-zip" to get PNGs in bulk
  4. Auto-place on each article page

Generate 10 logo variants for A/B testing

Generate 10 variants with different palettes/fonts for the same company name → compare side by side → pick the best one and refine.

  1. Create a template (company name + logo mark)
  2. Combine suggest_palette 12 themes x suggest_font 8 purposes
  3. batch_render bulk-generates 10 color variants
  4. Compare side by side in client / Slack / Notion

Data → auto-diagrammed graph SVG

Hand a sales CSV/JSON to the AI and it draws bar/pie/line charts directly as SVG. Embed straight into presentation slides.

  1. Pass the data array to the AI and prompt "turn this into a bar chart SVG"
  2. The AI computes properties → places chart elements via add_object (rect) and add_text
  3. export_pdf for a presentation-ready PDF

Mass-produce numbered business cards & tickets

Mass production of event tickets, reception slips with QR codes, business cards — anything with sequential numbers and individualized info.

  1. Create a template (QR position + serial number field + personal info fields)
  2. Add variable text {{name}}{{qr_url}}{{seat_no}}
  3. Extract array from attendee DB
  4. batch_render with imposition places 10 tickets per A4 sheet → print

Product catalog printing

Auto-typeset EC / wholesale product catalogs from your product DB. All four elements — image + SKU + price + features — for every product.

  1. Create a template for one catalog page
  2. Use illust.import_from_url to fetch product images by URL
  3. Loop the whole product DB → batch_render
  4. Lay out 2x4=8 products per A4 portrait and print

Method reference

Linked to the side-nav categories. The full method list is also available in llms.txt.

illust.health no-session

Server reachability check.

{"method": "illust.health"}
{"ok": true, "version": "1.0.0", "methods": 10}

illust.create_session no-session

Creates a new session. Returns share_id and a URL for opening it.

params

widthnumber16-16384, default 800
heightnumber16-16384, default 600
bgstringBackground color (HEX/none), default "#ffffff"
{
  "method": "illust.create_session",
  "params": {"width": 1200, "height": 630, "bg": "#000"}
}
{"ok":true, "session":"...", "state":{...}, "open_url":"..."}

illust.set_document

Change document size and background.

{"method":"illust.set_document","session":"...","params":{"width":1080,"height":1080}}

illust.add_object

Add an object. type is one of rect/ellipse/text/path/line/poly/star/image/raw.

Common params

typestringRequired
x, y, w, hnumberPosition and size
fillstringColor value (HEX/rgb/named/none)
strokestringStroke color
strokeWidthnumberStroke width
rotationnumberDegrees
namestringLayer name

Per-type additional properties

texttext, fontSize, fontFamily, fontWeight, letterSpacing, lineHeight
path/poly/starnodes: [{x,y,hIn,hOut}], closed: bool
linex1, y1, x2, y2
imagehref: "data:image/png;base64,..." or URL
rawrawSvg: "<path d=\"...\"/>" (sanitized)

illust.add_svg

Parses an SVG string into objects and inserts them.

{"method":"illust.add_svg","session":"...","params":{"svg":"<svg><circle cx='50' cy='50' r='30' fill='red'/></svg>"}}

illust.list_objects

List current objects (id/type/position/size/color).

illust.update_object

Partially update properties of a specific object.

{"method":"illust.update_object","session":"...","params":{"id":"o1","patch":{"fill":"#ef4444","rotation":15}}}

illust.delete_objects

Delete objects by ID.

{"method":"illust.delete_objects","session":"...","params":{"ids":["o1","o3"]}}

illust.export_svg

Generates the SVG string server-side and returns it.

{"ok":true, "svg":"<svg xmlns=...>...</svg>"}

illust.batch_render 5 batch modes

Embed {{var_name}} variables in your template and expand them with a data array. Generate SVG / PNG / PDF imposition in a single command. For mass-producing food labels, price POPs, product tags, and OGP images.

output modes

svgdefaultReturns an array of SVG strings (no filename, for compatibility)
svg-zipZIPBundles all SVGs into a single ZIP, returned base64-encoded
pngPNG arrayRasterized via ImageMagick, each PNG returned base64 in an array. dpi can be set 72-600
png-zipZIPAll PNGs bundled into a single ZIP
pdf-impositionPDFPrint-ready PDF imposed cols x rows onto A4 etc. True vector embedding (TCPDF)

Parameters

dataarrayRequired. Each element is a variable object, e.g. {"name":"Dark soy sauce","net":"500ml"}
outputstringOne of the 5 modes above. Default "svg"
filename_templatestringFilename template inside the ZIP, e.g. "{{name}}"Dark soy sauce.svg. {{i}} is a serial number
dpinumberFor png/png-zip. 72 (web) - 600 (print), default 96
impositionobjectFor pdf-imposition. {paper:"A4"|"A3"|"letter", cols:N, rows:M, margin_mm:5, gap_mm:3}

Setup (common)

// 1. Create template — include {{var}} in your text
{"method":"illust.add_object","session":"...","params":{
  "type":"text","text":"Product: {{name}}","x":50,"y":80,"fontSize":36
}}

Usage examples

A) SVG-ZIP — get individual SVGs bundled in a ZIP

{"method":"illust.batch_render","session":"...","params":{
  "output": "svg-zip",
  "filename_template": "{{name}}",
  "data":[
    {"name":"Dark soy sauce","net":"500ml"},
    {"name":"Light soy sauce","net":"500ml"}
  ]
}}
{"ok":true, "count":2, "output":"svg-zip",
 "filename":"illustmaker-batch-20260525-115500.zip",
 "zip_base64":"UEsDBBQAAAA...", "size":1352}

B) PNG (high-DPI for print)

{"method":"illust.batch_render","session":"...","params":{
  "output":"png-zip", "dpi":300,
  "filename_template":"label-{{i}}",
  "data":[{"name":"Product A"}, {"name":"Product B"}, ...]
}}

C) A4 imposed PDF — submit directly to a print shop

{"method":"illust.batch_render","session":"...","params":{
  "output": "pdf-imposition",
  "imposition": {
    "paper": "A4",
    "cols": 2,
    "rows": 4,
    "margin_mm": 10,
    "gap_mm": 5
  },
  "data": [/* 100 rows */]
}}
{"ok":true, "count":100, "output":"pdf-imposition",
 "paper":"A4", "cols":2, "rows":4, "pages":13,
 "filename":"illustmaker-imposed-20260525-115500.pdf",
 "pdf_base64":"JVBERi0xLjcK...", "size":54320}

Client side (browser)

Helpers IM.batchRender() + IM.batchSave() trigger an automatic ZIP/PDF download:

IM.batchRender("session-id",
  [{name:"Dark soy sauce"}, {name:"Light soy sauce"}, ...],
  {output:"pdf-imposition", imposition:{cols:2, rows:4}}
).then(IM.batchSave);
// → browser download fires automatically

Additional methods (v2.0+)

v2.0 onward expanded the API from 10 to 64 methods. Covers session management, alignment, mass production, palette suggestions, external fetch, gallery integration, masks / symbols / blends / pathfinder, print-ready PDFs (trim marks, bleed), parts/template library, and BYOK image generation / AI Vision critique.

Session management

illust.list_sessionsList all sessions (max 100, newest first) → {count, sessions:[{session, docW, docH, objectCount, updated_at, size}]}
illust.session_infoSession metadata (size, updated_at, object count)
illust.clone_sessionClone a session (template reuse). Object IDs are reassigned
illust.delete_sessionDelete a session
illust.copy_to_session{target, ids} Copy objects to another session

Object operations

illust.get_object{id} → full data for a single object
illust.clear_objectsDelete all objects
illust.add_image{url} server-side fetch → embed as data URI / {href} direct
illust.duplicate_objects{ids, dx, dy} Duplicate with offset
illust.group_objects{ids, name?} Group into a folder
illust.align_objects{ids, kind} Align. kind: left/right/center-h/top/bottom/center-v/dist-h/dist-v
illust.set_layer_order{ids, action} Z-order. action: front/back/forward/backward

Save & load

illust.save_projectSerializes the whole state to JSON → {project_base64, filename}. Can be saved as .json
illust.load_project{project_base64 | project_json} Replace state entirely

Single export (for one-offs, not batch_render)

illust.export_png{dpi?} 72-600 → PNG base64
illust.export_jpeg{dpi?, quality?} 50-100 → JPEG base64
illust.export_pdfTrue vector PDF (SVG embedded via TCPDF)
illust.export_optimized_svgSVGO-equivalent minification. Also returns {original_size, optimized_size, reduction_pct}

Text

illust.measure_text{text, fontSize, fontFamily?, letterSpacing?}{width, height, baseline} (approximate, with full-width/half-width detection)
illust.replace_text{find, replace} Bulk replace across all text
illust.set_text_style{ids?, style:{fontSize, fontFamily, fill, ...}} Bulk style change
illust.text_to_pathFreeze text as raw SVG (true outlining requires client-side getBBox / opentype.js)
illust.list_fontsList of system fonts + popular Google Fonts
illust.set_font{name} Register a Google Font to the session (actual load happens client-side)

Palette & font suggestions

illust.extract_paletteExtract colors from existing objects → {palette:[{color, count}], unique_count}
illust.suggest_palette{theme} → 5-color palette. themes: warm/cool/pastel/mono/vivid/japanese/summer/autumn/winter/spring/natural/tech
illust.suggest_font{purpose} → 5 recommended fonts. purposes: logo/heading/body/japanese-logo/japanese-body/casual/serious/tech

External resources

illust.import_from_url{url, x?, y?, w?, h?} Fetch SVG/image from an HTTP(S) URL and place it (5MB max)

After finishing a session, submit, browse, remix, and comment on the public gallery directly from AI.

gallery.submit{session, title, description?, category?, tags?, author_name?, parent_id?} Publish the session. SVG/PNG/projectJSON are generated server-side.
{id, slug, url, png_url}
gallery.list{sort?, category?, tag?, q?, limit?} List public works. sort:"new"|"popular", category:"icon|logo|illustration|character|ui|pattern|other"
gallery.get{slug} Work details (title/author/tags/PNG/SVG/projectURL etc.)
gallery.remix{slug} Create a new session loaded with the parent work → {session, open_url, parent_id, object_count}. Modify with illust.update_object etc.
gallery.list_comments{slug} List comments (single-level threading via parent_id)
gallery.comment{slug, body, author_name?, parent_id?} Post a comment. Replies via parent_id

Masks (clip & opacity)

Any rect/ellipse/path shape can be used as a mask (rect/ellipse support added in v3.0).

illust.clip_mask{session, mask_id, content_ids} Clip content to the shape of the topmost object. The mask source is removed
illust.release_clip{session, ids} Release clip
illust.opacity_mask{session, mask_id, content_ids} Opacity mask (white=opaque, black=transparent, gradients OK)
illust.release_opacity_mask{session, ids} Release opacity mask

Text on path

illust.text_on_path{session, text_id, path_id, offset?} Place text along a path curve. startOffset accepted ("50%" or px)
illust.release_text_on_path{session, text_id} Return to normal text

Symbols (master & instances)

illust.save_symbol{session, ids, name} Save selected objects as a symbol
illust.list_symbols{session} List symbols
illust.create_symbol_instance{session, symbol_id, x, y} Place an instance at coordinates

Pathfinder & blend

illust.pathfinder{session, ids[2+], op: union|intersect|subtract|exclude} Boolean operations. High-precision server-side processing via marching squares
illust.blend{session, id_a, id_b, steps} Generate N intermediate objects between two objects. Interpolates shape and color

Print submission (pro)

Output PDFs you can submit directly to a print shop. Supports trim marks, bleed, and registration marks.

illust.export_print_pdf{session, bleed_mm?, trim_marks?, registration_marks?, color_space?} Print-ready PDF output.
- bleed_mm: bleed (default 3mm)
- trim_marks: auto-add trim marks
- registration_marks: 4-color registration marks
illust.preflight_check{session, bleed_mm?} Preflight diagnostic → {score: 0-10, issues, warnings, recommended_actions}. Detects missing bleed, un-outlined text, RGB→CMYK warnings

Live trace (image → vector)

illust.live_trace{session, image_id, threshold?, turd_size?, opt_tolerance?, fill?, replace_image?} Vectorize raster image objects via potrace. For turning hand-drawn sketches into logos, etc.

Parts & template library

Server-hosted high-quality parts (icons, frames, decorations) and templates (business cards, flyers, logos, etc.). Searchable and usable from AI.

illust.library_search{q?, category?, limit?} Search parts. category: icon|frame|decoration
illust.library_use{session, slug, x, y, w?, h?} Place a selected part into the session
illust.template_list{category?, limit?} List templates. category: business-card|flyer|logo|banner|card|coupon
illust.template_render{slug, vars} Generate a new session from a template. Variables like {{name}} {{title}} are auto-substituted

BYOK image generation & AI Vision critique

Run image generation and AI critique using your own API keys. ASI servers never store your keys (transparent proxy).

illust.generate_image{session, prompt, api_key, provider: openai|recraft, model?, size?, x, y, w, h} Insert an image from an image-generation AI
illust.critique{session, api_key, provider: anthropic|openai, model?, criteria?} Rasterize the current session to PNG → critique via Vision LLM → {score, summary, issues, strengths}

Gradient mesh (v4.0)

Smooth 2D color gradients via bilinear interpolation. Specify 4 corner colors or every color in an N x M grid.

illust.add_mesh_gradient{session, x, y, w, h, cols?, rows?, detail?, corners?, colors?} Smooth 2D color gradient. detail (8-60) adjusts smoothness. Rendered with 576-3600 polygons

Brand kit storage (v4.0)

Save palette, fonts, and asset URLs together as brand assets. Anonymous owner_fp (ip+ua hash) based.

illust.brand_save{name, palette[], fonts[], assets[], kit_id?} Save a brand kit. Specify kit_id to overwrite
illust.brand_listList your brand kits
illust.brand_delete{kit_id} Delete a brand kit

Live share (v4.0)

Share a session you're editing via URL. Viewers see it at /illustmaker/live/{token} with 3-second polling. Valid for 30 days. Issue with mode='comment' and viewers can post coordinate-anchored comments.

illust.share_create{session, mode: view|comment, label?} Issue a share link. Returns {token, url}
illust.share_listList share links you've issued
illust.share_delete{token} Invalidate a share link
illust.share_view{token} Public endpoint (no auth). Returns current SVG from token

Live share comments (v4.1)

Issue a share link with mode='comment' and viewers can post coordinate-anchored comments on the live viewer. For internal reviews, client feedback, and Q&A boards in education.

illust.share_comment_post{token, body, author_name?, x?, y?} Viewer-side comment posting (public endpoint, no auth). Max 2000 chars. Omitting x/y means "comment on the whole work." Rate limit: 20/hour per viewer
illust.share_comment_list{token, include_resolved?} List comments (public endpoint)
illust.share_comment_resolve{comment_id, resolved} Owner of the share link only. Toggle resolved status
illust.share_comment_delete{comment_id} Owner of the share link only. Soft delete

Real-time collaborative editing (v5.0)

Issue a share link with mode='edit' and multiple people can simultaneously draw, move, and delete shapes from /illustmaker/live/{token} in a full collaborative editing mode. HTTP long-polling + LWW (Last-Write-Wins) conflict resolution. Displays participant cursors, selections, and edit locks.

illust.collab_join{token, actor_name?, actor_color?, actor_id?} Join collaborative editing. Returns issued actor_id + initial state + last_seq
illust.collab_leave{token, actor_id} Leave
illust.collab_op_submit{token, actor_id, op_type, payload} Submit an operation. op_type = add_object / update_object / delete_objects / set_document / reorder_objects / cursor / selection / lock_object / unlock_object
illust.collab_poll{token, actor_id, since} Long-poll (up to 25 seconds). Returns ops after since, participants, and lock list
illust.collab_status{token} Lightweight status (participant count, op count, last seq)

AI tool integration

Claude Desktop / Cursor / Cline (npm version)

Published: @illustmaker/mcp

{
  "mcpServers": {
    "illustmaker": {
      "command": "npx",
      "args": ["-y", "@illustmaker/mcp"]
    }
  }
}

If you get `failed to connect` on macOS / Homebrew: Claude Code and similar tools launch subprocesses with a minimal PATH, so npx may not be found. Specify the absolute path as shown below (check with which npx).

{
  "mcpServers": {
    "illustmaker": {
      "command": "/usr/local/bin/npx",
      "args": ["-y", "@illustmaker/mcp"]
    }
  }
}

You can also call the HTTP API directly.

From the browser console (window.IM)

With the editor open, access all features from the browser DevTools console via window.IllustMaker (shorthand: IM).

IM.api()                          // list all methods
IM.newDocument({width:800,height:600})
IM.addRect({x:100,y:100,w:200,h:120,fill:"#4a9eff"})
IM.addText("Hello",{x:160,y:300,fontSize:48})
IM.exportSVG()                    // → string
IM.downloadSVG("logo.svg")

Schema

Object type

{
  "id": "o1",                    // required, alphanumeric
  "type": "rect"|"ellipse"|"text"|"path"|"line"|"poly"|"star"|"image"|"raw",
  "name": "label",               // display name
  "x": 0, "y": 0, "w": 100, "h": 100,
  "rotation": 0,                 // degrees
  "fill": "#000",                // color or {"stops":[...]}
  "stroke": "none",
  "strokeWidth": 0,
  "visible": true,
  "locked": false,
  // per-type:
  // text: text, fontSize, fontFamily, fontWeight, letterSpacing, lineHeight
  // path/poly/star: nodes:[{x,y,hIn,hOut}], closed
  // line: x1, y1, x2, y2
  // image: href
  // raw: rawSvg (sanitized)
}

Accepted color formats

  • HEX: #000, #ffffff, #00000080 (8 digits = alpha)
  • RGB/RGBA: rgba(255, 0, 0, 0.5)
  • HSL: hsl(120, 50%, 50%)
  • Named: red, blue, currentColor
  • Special: none, transparent
  • Gradient: {"stops":[{"offset":0,"color":"#f00"},{"offset":1,"color":"#00f"}], "angle":0}