Print Ready API

Process DTF Artwork Programmatically

Scan, fix, vectorize, and mock up DTF artwork straight from your own app, store, or fulfilment pipeline. Same processing engine as the DTFWiz web tools, over a plain REST API. Available on the Business plan.

Authentication

All API requests require an API key passed in the x-api-key header. Keys are tied to your DTFWiz account, require an active Business plan, and count toward your daily limit. Treat a key like a password: it carries your billing, so keep it server-side and never ship it in browser or app code.

// Pass your key as a request header x-api-key: dtf_your_key_here // Or as a Bearer token Authorization: Bearer dtf_your_key_here

Base URL: https://dtfwiz.com/api/v1 · All endpoints accept multipart/form-data

Plan Requirement & Rate Limits

Free · Starter

No API access

Keys cannot be created

Pro

No API access

Use the web tools instead

Business

999,999 requests / day

Per key, and adjustable per account on request. Background removal and upscale carry their own lower daily caps.

The API is Business-only. Entitlement is checked live on every request, not just when the key is created. If the Business plan lapses or the account is suspended, existing keys stop working immediately and return a 402. Reactivating the plan brings the same keys back with no need to reissue them.

Fair use on the AI endpoints

Most endpoints run on our own servers, so the per-key ceiling above is the only limit that applies. Two of them call out to paid AI services on every request, and those carry a smaller daily cap per account:

POST /api/v1/remove-bgBackground removal. Each call consumes one image from our monthly provider allowance.
POST /api/v1/upscaleAI upscale. Each call consumes GPU time against a monthly budget.

These caps count per account over a rolling 24 hours, across every key the account holds, so adding keys does not raise them. They are also set per account, so if your volume needs a different allowance than the default, tell us and we will raise yours specifically. Going over returns 429 with code: "fair_use_exceeded" plus limit, used and retry_after_seconds, and a standard Retry-After header. Read your live upscale position any time from GET /api/v1/upscale (fairUsePerDay, fairUseUsed, fairUseRemaining), which is itself unmetered. Running a high-volume pipeline? Talk to us and we will size a limit to it.

API limits and in-app limits are separate. The Business plan's unlimited AI tools refer to the DTFWiz web tools, which have no daily cap on that plan. API keys are metered on their own counters, described here. Work you do in the editor never consumes your API allowance, and vice versa.

All daily limits reset on a rolling 24-hour window, not at midnight.

Error Responses

401Missing, invalid, or revoked API key
402Business plan no longer active, so the key is inactive. Body carries code: "plan_inactive".
403Account suspended
429Per-key daily limit reached; an AI endpoint's fair-use cap reached (code: "fair_use_exceeded", with limit, used and retry_after_seconds); or the vectorize queue is full (code: "queue_full")
400Bad request: missing required fields or invalid values
413Image too large, see per-endpoint size limits
500Server error, retry or contact support
// Error response shape { "error": "Invalid API key." } // Some errors carry a machine-readable code { "error": "API access requires an active Business plan…", "code": "plan_inactive", "plan": "free" }

Endpoints

POST

Scan Artwork

/api/v1/scan

Analyze a DTF artwork file and get a detailed JSON quality report. Detects DPI, background type, alpha fringe, speck noise, edge quality, and more.

Parameters

imageFilerequiredPNG, JPEG, or WebP file
print_width_inchesnumberoptionalTarget print width in inches (default: 12)
Returns:JSON — { dpi, background, alpha, transparency_fix, ink_coverage_percent, speck_count, is_jpeg, edge_quality, issues[], suggestions[] }. transparency_fix.recommended tells you whether soft pixels should be removed (fix_alpha_threshold) or halftoned (fix_halftone): "remove" | "halftone" | "either" | "none", with a plain-English reason. alpha.soft_rim_px is the average width in pixels of the semi-transparent band around the artwork — normal anti-aliasing is about 1px wide, while haze, glows and blown-out AI edges run far wider. Judge soft pixels on that rather than alpha.semi_transparent_percent: intricate artwork carries more anti-aliased edge simply because it has more edge, so the percentage reads high on files that are perfectly clean. alpha.has_fringe and transparency_fix already account for this.

Example

curl -X POST https://dtfwiz.com/api/v1/scan \
  -H "x-api-key: dtf_your_key_here" \
  -F "image=@artwork.png" \
  -F "print_width_inches=12"
POST

Fix Artwork

/api/v1/fix

Apply one or more fixes to a DTF artwork file. Remove edge fringe, trim transparent borders, remove noise specks, and resize — all in one call. Returns a clean PNG.

Parameters

imageFilerequiredPNG, JPEG, or WebP file
fix_alpha_thresholdbooleanoptional"true" to cut semi-transparent edge fringe
alpha_thresholdnumberoptionalAlpha cutoff 0–255 (default: 144). Lower = more aggressive.
fix_halftonebooleanoptional"true" to convert soft fades and glows into fully-opaque halftone dots instead of removing them. The opposite remedy to fix_alpha_threshold; use the scan's transparency_fix.recommended to pick. If both are sent, halftone wins and the alpha threshold is skipped. Dots are created after any resize, at final output resolution.
halftone_lpinumberoptionalHalftone dot frequency in lines per inch, 15–65 (default: 35). Lower = bigger dots.
print_width_inchesnumberoptionalTarget print width; sizes the halftone dots for the physical print (default assumes 300 DPI artwork)
fix_trimbooleanoptional"true" to trim transparent border pixels
fix_despecklebooleanoptional"true" to remove isolated noise pixels
resize_width_pxnumberoptionalResize output to this pixel width (maintains aspect ratio)
resize_height_pxnumberoptionalResize output to this pixel height (use both for exact dimensions)
Returns:Binary PNG image (Content-Type: image/png)

Example

curl -X POST https://dtfwiz.com/api/v1/fix \
  -H "x-api-key: dtf_your_key_here" \
  -F "image=@artwork.png" \
  -F "fix_alpha_threshold=true" \
  -F "fix_trim=true" \
  -F "fix_despeckle=true" \
  -o fixed.png
POST

Remove Background

/api/v1/remove-bg

AI-powered background removal using PhotoRoom. Returns a clean PNG with transparent background. Works on complex artwork, logos, and photos. Typical response: 3–5 seconds. Subject to a daily fair-use cap — see Plan Requirement & Rate Limits.

Parameters

imageFilerequiredPNG or JPEG file (max 25MP)
Returns:Binary PNG image with transparent background (Content-Type: image/png)

Example

curl -X POST https://dtfwiz.com/api/v1/remove-bg \
  -H "x-api-key: dtf_your_key_here" \
  -F "image=@photo.jpg" \
  -o transparent.png
GET

Background Removal Limits

/api/v1/remove-bg

Read the input cap and your live fair-use position before sending work. This endpoint carries the tightest daily cap on the API, because every request consumes an image from a fixed monthly provider allowance, so it is the one worth pacing against. Unmetered, and it does not count against the cap it reports.

Parameters

Returns:JSON — { maxPixels, fairUsePerDay, fairUseUsed, fairUseRemaining }. The three fairUse fields are null when the endpoint is uncapped for your account, so treat null as "no limit to pace against" rather than zero.

Example

curl https://dtfwiz.com/api/v1/remove-bg \
  -H "x-api-key: dtf_your_key_here"
POST

AI Upscale

/api/v1/upscale

Upscale low-resolution artwork by 2× or 4× using Real-ESRGAN. Recovers fine detail lost in compression or small source files. Returns a URL to the upscaled image, hosted by us so you can store it. Subject to a daily fair-use cap — see Plan Requirement & Rate Limits.

Parameters

imageFilerequiredPNG or JPEG file. Inputs over the GPU budget are shrunk to it automatically (up to 4× the budget in pixels, 2× linear); larger files get a 413 { code: "image_too_large", maxPixels, pixels }
scalenumberoptional2 or 4 (default: 4)
Returns:JSON — { output_url: string, scale: number, preShrunk: boolean, from?: {width,height}, to?: {width,height}, output_hosted_by: "dtfwiz" | "provider", output_url_expires: boolean }. output_url normally points at DTFWiz storage and stays valid, so it is safe to keep on an order record. If a storage write fails we still return the finished image, but as the GPU provider's own link: output_hosted_by is then "provider" and output_url_expires is true, meaning the URL is short-lived and you should download the bytes immediately. Check that flag rather than assuming either case.

Example

curl -X POST https://dtfwiz.com/api/v1/upscale \
  -H "x-api-key: dtf_your_key_here" \
  -F "image=@low_res.png" \
  -F "scale=4"
GET

Upscale Limits

/api/v1/upscale

Read the effective input caps and your live fair-use position before uploading. maxPixels / maxPixels4x are the largest inputs accepted per scale including the auto-shrink allowance; budget / budget4x are the sizes the AI actually runs at (anything above is shrunk to it first). Admin-tunable, so read at runtime rather than hardcoding. autoShrink: true means your app no longer needs to pre-shrink. Unmetered, and it does not count against the fair-use cap it reports.

Parameters

Returns:JSON — { maxPixels, maxPixels4x, budget, budget4x, autoShrink: true, shrinkAllowance: 4, scales: [2, 4], fairUsePerDay, fairUseUsed, fairUseRemaining }. The three fairUse fields are null when the endpoint is uncapped for your account (including admin accounts), so treat null as "no limit to pace against" rather than zero.

Example

curl https://dtfwiz.com/api/v1/upscale \
  -H "x-api-key: dtf_your_key_here"
GET

Vectorize Queue Status

/api/v1/vectorize

Conversions run one at a time on the server. Check the live queue before converting so your app can show a loader for a short wait or its own message for a long one.

Parameters

Returns:JSON — { queue: { converting: boolean, waiting: number, max_waiting: number } }

Example

curl https://dtfwiz.com/api/v1/vectorize \
  -H "x-api-key: dtf_your_key_here"
POST

Convert to Vector (SVG)

/api/v1/vectorize

Traces artwork into a clean, infinitely scalable SVG tuned for DTF: exact color palettes, smooth edges, no speck noise. Auto color mode picks the right number of colors for the art. Typical response: 3–15 seconds plus any queue wait.

Parameters

imageFilerequiredPNG, JPEG, or WebP file (max 25MB)
colorsstringoptional"auto" (default — server picks 4–20), a number 1–20 (1 = single-color silhouette), or "unlimited"
detailstringoptional"smoother", "balanced" (default), or "precise" (best for sharp text)
shape_stylestringoptional"stacked" (default, overlapping layers — easy to edit) or "cutout" (flat pieces)
speck_sizenumberoptionalRemove blobs under this many px across, 0–16 (default: 4)
smooth_bandsbooleanoptional"false" to skip color-band smoothing (default: true). Only affects colors="unlimited"; other modes always smooth.
edge_cleanupbooleanoptional"false" to keep semi-transparent edge pixels (default: true)
gradientsbooleanoptional"true" lets shaded or painted art use smooth gradient fills. Default false: every shape has one solid color.
print_width_inchesnumberoptionalWrites the SVG at a physical size so RIP software imports it print-ready
Returns:SVG document (Content-Type: image/svg+xml). X-Paths, X-Colors-Used, X-Trace-Ms, X-Queue-Ms headers carry the stats. If the queue is full: 429 JSON with code "queue_full" and the live queue snapshot — map it to your own messaging.

Example

curl -X POST https://dtfwiz.com/api/v1/vectorize \
  -H "x-api-key: dtf_your_key_here" \
  -F "image=@artwork.png" \
  -F "colors=auto" \
  -o artwork.svg
GET

List Mockup Garments

/api/v1/mockup/templates

Lists the available garment photos and their named placements (Center, Left Chest, Full Front, ...). Use the ids or names in POST /v1/mockup.

Parameters

Returns:JSON — { templates: [{ id, name, category, preview_url, width_px, height_px, placements: [{ id, name }] }] }

Example

curl https://dtfwiz.com/api/v1/mockup/templates \
  -H "x-api-key: dtf_your_key_here"
GET

Search Blank Garments

/api/v1/garments

Searches every connected blank supplier (S&S Activewear, SanMar) plus DTFWiz blanks. With no q, returns the featured blanks. Use the returned key in GET /v1/garments/style and POST /v1/mockup.

Parameters

qstringoptionalBrand, style number or type, e.g. "gildan 5000", "hoodie", "PC54"
supplierstringoptionalComma list to filter: ss, sanmar, house
Returns:JSON — { styles: [{ key, supplier, brand, style_number, title, category, thumb, color_count }], suppliers }

Example

curl "https://dtfwiz.com/api/v1/garments?q=gildan%205000" \
  -H "x-api-key: dtf_your_key_here"
GET

Garment Colors, Sizes and Placements

/api/v1/garments/style

One style in full: every color with its hex and front/back product photo, sizes with SKU and in-stock flags, chest width per size (when the supplier publishes specs), and the print placements valid for the garment type. Wholesale prices are never returned.

Parameters

keystringrequiredStyle key from GET /v1/garments, e.g. "ss:39"
Returns:JSON — { key, brand, style_number, title, category, sizes, chest_by_size_in, colors: [{ id, name, hex, images: { front, back }, sizes: [{ size, sku, in_stock }] }], placements: [{ id, name, view, default_width_in, max_width_in, default_top_in }] }

Example

curl "https://dtfwiz.com/api/v1/garments/style?key=ss:39" \
  -H "x-api-key: dtf_your_key_here"
POST

Generate Mockup

/api/v1/mockup

Renders your design onto a real garment photo. Pass style to use any catalog blank in any color, placed TRUE TO SIZE: print_width_in is real inches on the shirt and top_in is measured from the collar, the same way a press operator specs a job. The ink follows the fabric folds. Returns the PNG, or JSON with the print spec and printer warnings for order records. The older template_id / garment / scale fields still work unchanged.

Parameters

imageFilerequiredThe design. Transparent PNG recommended.
stylestringoptionalCatalog style key from GET /v1/garments, e.g. "ss:39". Turns on true-to-size mode.
colorstringoptionalColor id or name, e.g. "Black" (default: black, else the first color)
placementstringoptionalleft-chest, center-chest, full-front, oversized, right-chest, back-neck, upper-back or full-back (see the style listing)
viewstringoptional"front" or "back". Defaults to the placement's side.
print_width_innumberoptionalReal print width in inches (default: the placement's standard, e.g. 11 for full front)
top_innumberoptionalTop of the design below the collar, inches (default 3)
offset_x_innumberoptionalSideways offset from the center line, inches. Positive = toward the right of the photo (wearer's left on the front, wearer's right on the back).
sizestringoptionalGarment size to show at true scale, e.g. "2XL" (uses the supplier's chest spec)
fabricnumberoptionalFabric realism 0 to 1 (default 0.8), or "false" for a flat paste
output_sizenumberoptionalLong side in pixels, 400 to 4000 (default 2000)
framestringoptional"native" (photo shape, default) or "square"
formatstringoptional"png" (default) or "jpeg"
responsestringoptional"image" (default) or "json": base64 image plus the print spec, effective DPI and warnings
template_id / garment / placement_id / scalelegacyoptionalOlder box-placement mode for DTFWiz blanks (see GET /v1/mockup/templates). Used when style is omitted.
Returns:Image (Content-Type image/png or image/jpeg) with X-Garment, X-Placement, X-Print-Width-In, X-Print-Height-In, X-Effective-DPI and X-Warnings headers. With response=json: { garment, view, placement, print: { width_in, height_in, top_in, offset_x_in, description, artwork_px, effective_dpi }, warnings, image: { content_type, width, height, base64 } }.

Example

curl -X POST https://dtfwiz.com/api/v1/mockup \
  -H "x-api-key: dtf_your_key_here" \
  -F "image=@design.png" \
  -F "style=ss:39" \
  -F "color=Black" \
  -F "placement=full-front" \
  -F "print_width_in=11" \
  -o mockup.png

Ready to integrate?

API keys come with the Business plan. Create one from your account and start scanning, fixing, and vectorizing DTF artwork from your own app.

Get your API key