The Prepress API.
REST in, files out. One API key, one credit balance, and a set of endpoints that turn raw customer artwork into press-ready files, previews and mockups for every technique you run. Everything heavy is a job; everything is JSON.
One base URL, nine things it does.
All requests go to https://api.designmint.intuio.io/v1. The API does one job: take an image and hand back something a press, a marketplace or a customer can use. It groups into image services (fix the artwork), validation (check it against a technique), previews (mockups and scenes) and pipelines (the whole chain in one call).
A bearer key, per project.
Every request carries an API key as a bearer token. Keys are issued when you buy a credit block and live in your account; each key is its own project with its own credit balance and rate limit. Keys starting dm_test_ run against the sandbox — same responses, watermarked outputs, no credits charged.
1curl https://api.designmint.intuio.io/v1/account/credits \2 -H "Authorization: Bearer dm_live_9f3a…c21e"Send a file, get a job.
Inputs are either a public or signed source_url in a JSON body, or the file itself as multipart/form-data under file. PNG, JPEG, WebP, SVG, PDF, PSD, AI, EPS and CDR are accepted, up to 50 MB.
Processing endpoints are asynchronous: they answer 202 with a job. Poll GET /jobs/{id} or register a webhook and wait for job.completed. Outputs are signed URLs, valid for 24 hours — copy them into your own storage.
1{2 "job": {3 "id": "job_01J9KQ7M3Z",4 "status": "queued",5 "endpoint": "images.upscale",6 "credits": 5,7 "created_at": "2026-09-02T09:14:07Z"8 }9}One currency, one limit.
Every call is priced in credits — 1 credit = $0.01 — bought in one-time blocks with rollover. Credits are charged when a job completes; failed jobs are not charged. Rate limits are the same on every block: 300 requests a minute per key. Short bursts queue rather than drop; past the limit you get 429 with a Retry-After header, and the client library backs off for you.
/account/creditsThe live balance, the blocks it came from, and the key's limit.
1{2 "balance": 8412,3 "blocks": [4 { "id": "blk_growth_0421", "credits": 10400, "remaining": 8412, "expires_at": "2027-03-01T00:00:00Z" }5 ],6 "rate_limit": { "per_minute": 300, "remaining": 297 }7}Fix the artwork before the press does.
Five single-purpose services. Each takes one image, returns one job, and hands back one output. Chain them yourself, or let a pipeline do it.
/images/upscale5 creditsRaise resolution to a target DPI at a target print size. The model favours edges and lettering over texture, so logos stay crisp.
1curl -X POST https://api.designmint.intuio.io/v1/images/upscale \2 -H "Authorization: Bearer $DM_KEY" \3 -H "Idempotency-Key: order-1042-front" \4 -H "Content-Type: application/json" \5 -d '{6 "source_url": "https://cdn.yourshop.com/uploads/logo-500px.png",7 "target_dpi": 300,8 "print_width_mm": 2809 }'1{2 "output": { "url": "https://files.designmint.intuio.io/…/logo-3307px.png", "format": "png" },3 "width": 3307,4 "height": 1417,5 "dpi": 300,6 "scale": 6.6,7 "warnings": []8}/images/sharpen5 creditsRecovers edge detail on soft or over-compressed artwork. Fields: source_url, optional strength (0–1, default 0.5).
/images/remove-background5 creditsIsolates the subject on transparency. Returns a PNG with alpha and the detected bounding box, so you can place it on a print area straight away.
/images/vectorize8 creditsTraces raster artwork to clean SVG. Best on logos, lettering and flat illustration; photos are rejected with unprocessable and a hint to quantize first.
1{2 "output": { "url": "https://files.designmint.intuio.io/…/logo.svg", "format": "svg" },3 "paths": 14,4 "colors": ["#C2532F", "#0F1620", "#FFFFFF"],5 "viewbox": [0, 0, 1200, 514]6}/images/quantize8 creditsReduces the artwork to N spot colours and returns the palette — the step before screen separations or embroidery thread mapping.
Know before the press knows.
/images/validate8 creditsChecks an image against a technique and a print area and returns every issue with a concrete fix. This is the one synchronous endpoint — it answers 200 directly, so it can sit inside a checkout.
1{2 "ok": false,3 "dpi_at_size": 96,4 "issues": [5 { "code": "low_dpi", "severity": "error", "detail": "96 dpi at 280 mm; dtg needs 300",6 "fixes": [ { "action": "upscale", "endpoint": "/images/upscale" },7 { "action": "reduce_size", "max_width_mm": 90 } ] },8 { "code": "outside_bleed", "severity": "warning", "detail": "artwork within 1.2 mm of the edge",9 "fixes": [ { "action": "nudge", "dx_mm": 0, "dy_mm": 2 } ] }10 ]11}Show it on the product.
/mockups8 creditsPlaces artwork on a product photo at a placement, with the garment's shading and fabric texture applied. Product slugs come from your catalog or ours.
1{2 "outputs": [3 { "view": "front", "url": "https://files.designmint.intuio.io/…/front.png", "width": 2000, "height": 2000 }4 ],5 "product": "gildan-5000", "color": "black", "placement": "front"6}/scenes12 creditsDrops a mockup into a lifestyle scene — a person, a shelf, a desk — for listings and social. Takes a mockup_url (or the same fields as /mockups) plus a scene preset or a short prompt.
The whole chain, one call.
A pipeline runs prep, validation and output for a technique in one job: clean the artwork, check it, then produce exactly the files that technique's press expects. It is what the DesignMint studio calls on every order.
/pipelines/{technique}25 creditstechnique is one of dtg, dtf, screen, embroidery, sublimation, uv, htv, laser.
1curl -X POST https://api.designmint.intuio.io/v1/pipelines/dtf \2 -H "Authorization: Bearer $DM_KEY" \3 -H "Content-Type: application/json" \4 -d '{5 "source_url": "https://cdn.yourshop.com/uploads/logo-500px.png",6 "print_area": { "width_mm": 280, "height_mm": 350 },7 "product": "gildan-5000",8 "on_fail": "best-effort"9 }'1{2 "technique": "dtf",3 "steps": ["upscale", "remove-background", "validate"],4 "validation": { "ok": true, "dpi_at_size": 300, "issues": [] },5 "outputs": [6 { "role": "print", "url": "…/front-dtf.png", "format": "png", "dpi": 300, "mirrored": true, "white_underbase": true },7 { "role": "preview", "url": "…/front-preview.png", "format": "png" },8 { "role": "mockup", "url": "…/front-mockup.png", "format": "png" }9 ]10}Poll it, or be told.
/jobs/{id}Status and, once complete, the result. Jobs are kept for 7 days.
1{2 "id": "job_01J9KQ7M3Z",3 "status": "completed", // queued · processing · completed · failed4 "endpoint": "images.upscale",5 "credits": 5,6 "created_at": "2026-09-02T09:14:07Z",7 "completed_at": "2026-09-02T09:14:19Z",8 "result": { "…": "…" }9}/jobsList jobs, newest first. Filter with status, endpoint and since; page with cursor.
We call you when it's done.
/webhooksRegister an HTTPS endpoint for job.completed and job.failed. Deliveries retry with backoff for 24 hours until you answer 2xx.
1POST https://yourshop.com/hooks/designmint2DesignMint-Signature: t=1756804459,v1=8f2c…e1a034{5 "event": "job.completed",6 "job": { "id": "job_01J9KQ7M3Z", "endpoint": "pipelines.dtf", "credits": 25 },7 "result": { "…": "…" }8}{t}.{raw body} with your secret must equal v1. Reject anything older than five minutes./webhooksList registered webhooks.
/webhooks/{id}Remove one.
Plain codes, plain messages.
1{2 "error": {3 "code": "insufficient_credits",4 "message": "This call needs 25 credits; balance is 12.",5 "doc": "https://designmint.intuio.io/docs/prepress#errors"6 }7}Or skip the curl.
A small TypeScript client wraps the endpoints, waits on jobs for you, and backs off on 429. It lives in the same private @intuio scope as the SDKs.
1npm i @intuio/designmint-prepress1import { Prepress } from "@intuio/designmint-prepress"23const prepress = new Prepress({ apiKey: process.env.DM_KEY! })45// one call, wait for the result6const job = await prepress.pipelines.run("dtf", {7 sourceUrl: upload.url,8 printArea: { widthMm: 280, heightMm: 350 },9 product: "gildan-5000",10 onFail: "best-effort",11})1213const result = await job.wait() // polls until completed / failed14const printFile = result.outputs.find((o) => o.role === "print")1516// or: validate synchronously inside checkout17const check = await prepress.images.validate({18 sourceUrl: upload.url,19 technique: "dtg",20 printArea: { widthMm: 280, heightMm: 350 },21})22if (!check.ok) showFixes(check.issues)Questions about the contract, or need an endpoint that isn't here yet? Write to designmint@intuio.io.