The Prepress API.
JSON in, files out. One API key, one credit balance, and seven tools that turn raw customer artwork into clean vectors, print-resolution PNGs, cut-outs and AI product photos. Every result comes back in the response itself.
One base URL, seven tools.
All requests go to https://api.designmint.intuio.io — no version prefix. Send a JSON body with a public image URL; the answer is the finished result, in the same response: a PNG or JPEG, an SVG inside JSON, or a streamed layout. There is nothing to poll.
A bearer key, on your server.
Every route except GET /health needs an API key as a bearer token: Authorization: Bearer dm_live_…. Create keys in the console. A key is dm_live_ and 32 hex characters, and it is shown once — when you create it or roll it — so store it straight away. A key can carry an expiry date and an IP allowlist of addresses or CIDR ranges.
A missing, wrong, revoked or expired key gets a 401; a key used from an address its allowlist doesn't allow gets a 403. The console's playground calls these same routes as you, signed in, from the same balance.
1curl https://api.designmint.intuio.io/remove-bg \2 -H "Authorization: Bearer $DM_KEY" \3 -H "Content-Type: application/json" \4 -d '{"imageUrl":"https://example.com/logo.png"}' \5 -o logo-cutout.pngSend a URL, get the file back.
Every call but the two reads is a POST with a JSON body (Content-Type: application/json, up to 1 MB). Images go in by URL: imageUrl must be a public http(s) address. Private and internal addresses are refused, and so is any redirect to one. An image can be up to 30 MB and 8192 px on a side (8K). The image tools work on it at full size; the AI routes (and ai: true) give it to the model at most 2048 px on a side.
The result is the response body: the picture's bytes for the image and AI routes, JSON for vectorize and the reads, a stream for templates. An AI call takes up to 100 s; an image tool can take minutes when the engine is busy (up to 15). Give your HTTP client a generous timeout: Node's built-in fetch gives up after 5 minutes without an answer (pass an undici Agent({ headersTimeout: 0, bodyTimeout: 0 }) as dispatcher for big jobs).
/healthAnswers { "ok": true } while the service is up. No key needed, so it suits an uptime check.
One balance, one limit.
Every call is priced in credits — 1 credit = $0.01. The price is taken up front and refunded if the call fails or you disconnect before it finishes: failed calls are never charged. A balance that can't cover a call gets a 402 — Not enough credits: this call costs 5 and the balance is 4 — and nothing is taken.
Credits come in one-time packs that roll over, and calls spend from the pack that expires first.
Your account may make 60 calls a minute, shared by all its keys; a busy account can have that raised — contact us. Past the limit you get a 429 with Retry-After, and the call isn't charged. When the service itself is busy it answers 503 with Retry-After: 30.
/creditsfreeYour balance and the blocks it is made of, in the order they will be spent. Free, but it counts toward the rate limit. kind is welcome, starter, growth, scale or grant; expiresAt is a Unix time in milliseconds.
1{2 "balance": 8412,3 "blocks": [4 { "id": "blk_3f9a1c2e", "kind": "welcome", "remaining": 312, "expiresAt": 1793404800000 },5 { "id": "blk_8d04b7a1", "kind": "growth", "remaining": 8100, "expiresAt": 1806537600000 }6 ]7}Fix the artwork before the press does.
Three single-purpose tools. Each takes one imageUrl and answers with the result.
/vectorize8 credits · 18 with aiTraces an image to SVG with one path per colour, so it is easy to recolour and edit. Uploads under 2000 px are upscaled to 2000 px before the trace.
1curl https://api.designmint.intuio.io/vectorize \2 -H "Authorization: Bearer $DM_KEY" \3 -H "Content-Type: application/json" \4 -d '{"imageUrl":"https://example.com/logo.png","colors":6}' \5 | jq -r .svgString > logo.svg1{ "svgString": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 2000 857\">…</svg>" }/upscale5 credits · 15 with aiEnlarges an image and answers with a PNG — alpha and colour profile kept — its size in X-Width and X-Height. The input can be at most 4.2 MP (2048 × 2048 px, in any shape) and the result at most 8192 px on a side; past either you get a 413.
/remove-bg5 creditsCuts the subject out and answers with a PNG on a transparent background, at least 2000 px on its longest side (smaller uploads are upscaled first), colour profile kept.
1curl https://api.designmint.intuio.io/remove-bg \2 -H "Authorization: Bearer $DM_KEY" \3 -H "Content-Type: application/json" \4 -d '{"imageUrl":"https://example.com/logo.png"}' \5 -o logo-cutout.pngDescribe it, get the picture.
Four routes on Gemini. Each answers with the finished picture; a template streams its layout. When the AI sends no picture back (it declined the prompt or the image) you get a 422; when Google rejects the request, or a template gets no text, a 502; when it is busy, a 503 with Retry-After: 30; past 100 s, a 504. None is charged.
/ai/image8 edit · 10 artworkA picture and a prompt in, a PNG out. edit answers with the picture edited, at 1K. artwork makes standalone artwork the picture only inspires, at 2K, its plain border trimmed.
/ai/scene12 creditsPuts the product photo in the setting you describe and answers with a 2K JPEG, in the shape nearest the photo's. The product is left blank — no print, logo or text — ready for a design to go on.
/ai/lifestyle12 creditsThe product photo worn or used by a person in a simple, real scene, as a 1K PNG.
/ai/template3 creditsA theme in, a layout out: one JSON array of Fabric.js objects sized to your canvas, streamed as application/x-ndjson while the AI writes it. Collect the text and parse the array when the stream ends. An error before the first text is an ordinary status with { "detail" }; after it, the stream ends with a last line {"error":"…"} — the status is already 200, but the call is refunded all the same.
1[2{"type":"rect","left":0,"top":0,"width":720,"height":1080,"fill":"#0f1620"},3{"type":"textbox","text":"Summer Market","fontFamily":"Raleway","fontWeight":"700","fontSize":64,"fill":"#f4f1ec","left":60,"top":120,"width":600}4]Plain codes, plain messages.
Every error is JSON with one field, detail: a sentence you can log or show. A 422 for a bad body names the field, as field: message. No failed call is charged: X-Credits-Charged is 0, or absent when the call was refused before any credit was taken.
1{ "detail": "Not enough credits: this call costs 5 and the balance is 4" }Or skip the curl.
No client library needed: fetch in Node 18 and later does it. Read the bytes for a picture, res.json() for vectorize and the reads.
1import { writeFile } from "node:fs/promises"23const res = await fetch("https://api.designmint.intuio.io/remove-bg", {4 method: "POST",5 headers: {6 Authorization: `Bearer ${process.env.DM_KEY}`,7 "Content-Type": "application/json",8 },9 body: JSON.stringify({ imageUrl: "https://example.com/logo.png" }),10})1112if (!res.ok) {13 const { detail } = await res.json()14 throw new Error(`${res.status}: ${detail}`)15}1617await writeFile("logo-cutout.png", Buffer.from(await res.arrayBuffer()))1819console.log(res.headers.get("X-Width"), "x", res.headers.get("X-Height"))20console.log("charged", res.headers.get("X-Credits-Charged"), "left", res.headers.get("X-Credits-Remaining"))Questions about the API, or need a tool that isn't here yet? Write to designmint@intuio.io.