Print an approved design
const url = 'https://api.pixonaut.app/v1/prints';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"designId":"6f1c8a2b-3d4e-4f5a-8b6c-7d8e9f0a1b2c"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.pixonaut.app/v1/prints \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "designId": "6f1c8a2b-3d4e-4f5a-8b6c-7d8e9f0a1b2c" }'Operation ID: prints.create
Makes the print files for an approved design. Answers 202 with the print as soon as it is reserved, and renders it after the answer: read it at Location until it is completed or failed, or wait for print.completed or print.failed. With Prefer: wait it answers once the print has rendered, 201 with its job ticket, or render_failed. A studio member or a connected store’s integration key needs prints:create.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Header Parameters
Section titled “Header Parameters”Your own key for this request. A repeat with the same key and body within 24 hours is answered with what the first one made, marked Idempotent-Replayed: true, and makes nothing; the same key with another body is refused idempotency_key_reused, and a repeat while the first is still being answered idempotency_key_in_use. A request that is refused makes nothing, so its key may be sent again.
Your own key for this request. A repeat with the same key and body within 24 hours is answered with what the first one made, marked Idempotent-Replayed: true, and makes nothing; the same key with another body is refused idempotency_key_reused, and a repeat while the first is still being answered idempotency_key_in_use. A request that is refused makes nothing, so its key may be sent again.
wait answers once the print has rendered: 201 with its job ticket, or render_failed. Without it the print is answered 202 as soon as it is reserved, and renders after the answer.
wait answers once the print has rendered: 201 with its job ticket, or render_failed. Without it the print is answered 202 as soon as it is reserved, and renders after the answer.
Request Bodyrequired
Section titled “Request Bodyrequired”object
The design’s hasPrint as the caller read it. false refuses already_printed when the design’s current text has been printed since, so it is not printed twice by someone who did not know.
No longer accepted: the consumer’s reference is the order’s. Send it to POST /v1/prints/{id}/orders.
No longer accepted: the quantity is the order’s. Send it to POST /v1/prints/{id}/orders.
Examples
Design to order: 3. Print the approved design
{ "designId": "6f1c8a2b-3d4e-4f5a-8b6c-7d8e9f0a1b2c"}Example
{ "designId": "6f1c8a2b-3d4e-4f5a-8b6c-7d8e9f0a1b2c", "expectedHasPrint": false}Responses
Section titled “Responses”With Prefer: wait: the print, rendered, and its job ticket
object
object
object
object
object
object
object
object
object
How the print aligns to the reference: top-left, top-center, top-right, center-left, center, center-right, bottom-left, bottom-center or bottom-right. Anything else is read as center.
How far the print is moved from the reference, in millimetres. y grows downward.
object
Horizontal offset in millimetres; positive moves right.
Vertical offset in millimetres; positive moves down.
The physical reference the print is positioned against on the product.
object
The linked group the design is one placement of: one design drives every placement it names. Absent for a design on one placement alone.
object
Whether this placement’s print is mirrored left to right.
The group’s placements, by id.
The width of the group’s widest print area, in mm: what a repeat across the group is sized against, so it prints at one physical scale on every placement.
The repeat the print was drawn as: the design’s mode, size and seed, and the printed size of the tile laid across the print. Absent for a print that does not repeat.
object
How the tiles are laid: grid lines them up, brick moves every other row along by half a tile, halfDrop moves every other column down by half a tile, and scatter strews them at random places, turns and sizes, arranged by seed.
Which arrangement a scatter draws: another seed is another arrangement of the same tile. Read by scatter only.
The tile’s width in percent of the print area’s width, above 0 and at most 100; the tile keeps the template’s shape. A tile that would print under 10 mm on a side is drawn at 10 mm.
The tile’s printed height in millimetres.
The tile’s printed width in millimetres.
object
True when the print shop cuts the product to this shape: the outline and the cut-outs go into the print file as its cut line. Omitted, the product already has the shape.
The shape as SVG path data in fractions of the print area, 0 to 1 across and down (curves, no arcs): its first subpath the outline, every further one a cut-out, filled even-odd, each subpath closed.
object
Examples
Design to order: 3. Print the approved design
{ "jobTicket": { "artifact": { "colorSpace": "DeviceCMYK", "effectiveDpi": 300, "file": "PR-2026-000123_6f1c8a2b.pdf", "format": "pdf", "iccProfile": "ISOcoated_v2_eci.icc", "includesBleed": true, "spotColors": [], "spotOutput": "process", "trimMarks": false }, "artwork": { "name": "Front", "templateId": "tshirt-basic@2" }, "manifest": { "docHash": "9f2c4e1a", "fontSetHash": "a1b2c3d4", "iccProfile": "ISOcoated_v2_eci.icc", "renderedAt": "2026-09-21T14:01:40.000Z", "rendererVersion": "0.1.0", "templateVersion": "tshirt-basic@2" }, "printArea": { "bleedMm": 3, "cutShape": { "d": "M 0 0 L 90 0 L 90 50 L 0 50 Z", "type": "path" }, "heightMm": 50, "widthMm": 90 }, "product": { "sku": "6f1c8a2b-3d4e-4f5a-8b6c-7d8e9f0a1b2c", "tenantId": "acme" } }, "printId": "c4d5e6f7-a8b9-4c0d-9e1f-2a3b4c5d6e7f"}Example
{ "jobTicket": { "artifact": { "colorSpace": "DeviceCMYK", "effectiveDpi": 300, "file": "PR-2026-481920_c4d5e6f7.pdf", "format": "pdf", "iccProfile": "ISOcoated_v2_eci.icc", "includesBleed": true, "spotColors": [], "spotOutput": "process", "trimMarks": false }, "artwork": { "name": "Class of 2026", "templateId": "tshirt-basic@2" }, "fulfilmentPayload": { "variantSku": "TEE-BLACK-M" }, "manifest": { "docHash": "sha256:9f2c4e7a1b8d3f6052c7e9a4b1d8f3066a5e2c9b7d4f1830e6a2b5c8d9f10a37", "fontSetHash": "sha256:3c8e1a5f7b2d9046e1f8a3c6b9d25704a8e3f1c6b0d97245e8a1c3f6b9d2e508", "iccProfile": "ISOcoated_v2_eci.icc", "renderedAt": "2026-10-13T10:14:05Z", "rendererVersion": "0.14.2", "templateVersion": "tshirt-basic@2" }, "printArea": { "bleedMm": 3, "cutShape": { "d": "M0 0 H250 V300 H0 Z", "type": "path" }, "heightMm": 300, "printMethod": "dtg", "widthMm": 250 }, "product": { "sku": "6f1c8a2b-3d4e-4f5a-8b6c-7d8e9f0a1b2c", "tenantId": "acme" } }, "printId": "c4d5e6f7-a8b9-4c0d-9e1f-2a3b4c5d6e7f"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
The print, reserved and rendering
object
The print is rendering. Read it at Location until it is completed or failed, or wait for print.completed or print.failed.
Examples
Design to order: 3. Print the approved design
{ "printId": "c4d5e6f7-a8b9-4c0d-9e1f-2a3b4c5d6e7f", "status": "created"}Example
{ "printId": "c4d5e6f7-a8b9-4c0d-9e1f-2a3b4c5d6e7f", "status": "created"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
The print, at GET /v1/prints/{id}.
The print, at GET /v1/prints/{id}.
Refused: bad_request, quantity_moved_to_order, external_ref_moved_to_order
object
Examples
bad_request
{ "error": "bad_request"}external_ref_moved_to_order
{ "error": "external_ref_moved_to_order"}quantity_moved_to_order
{ "error": "quantity_moved_to_order"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
Refused: unauthorized
object
Examples
unauthorized
{ "error": "unauthorized"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
Refused: plan_limit_reached, origin_forbidden, forbidden, feature_disabled, workspace_suspended
object
The feature the tenant does not have. Always sent with feature_disabled.
The limit the tenant is at: templates, connectedStores, apiKeys, shareLinks, customDomains, printsMadePerMonth (prints made without an order this month), members, orders (this month’s orders, which getting a print’s files without an order counts as), or a sandbox’s own caps: sandboxPrintsPerDay, sandboxPrintsPerMonth, sandboxOrdersPerMonth. A sandbox shares every other limit with its live workspace. Always sent with plan_limit_reached.
How many the plan allows. Always sent with plan_limit_reached.
The plan whose limit it is. Always sent with plan_limit_reached.
Examples
feature_disabled
{ "error": "feature_disabled", "feature": "api"}forbidden
{ "error": "forbidden"}origin_forbidden
{ "error": "origin_forbidden"}plan_limit_reached
{ "error": "plan_limit_reached", "limit": "templates", "max": 0, "plan": "free"}workspace_suspended
{ "error": "workspace_suspended"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
Refused: design_not_found, not_found
object
Examples
design_not_found
{ "error": "design_not_found"}not_found
{ "error": "not_found"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
Refused: design_erased, design_not_approved, already_printed, idempotency_key_in_use
object
Examples
already_printed
{ "error": "already_printed"}design_erased
{ "error": "design_erased"}design_not_approved
{ "error": "design_not_approved"}Errors
{ "error": "design_not_approved"}idempotency_key_in_use
{ "error": "idempotency_key_in_use"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
Refused: idempotency_key_reused, invalid_idempotency_key, payload_too_large
object
Sent with payload_too_large.
Always sent with payload_too_large.
Examples
idempotency_key_reused
{ "error": "idempotency_key_reused"}invalid_idempotency_key
{ "error": "invalid_idempotency_key"}payload_too_large
{ "error": "payload_too_large", "maxBytes": 0}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
Refused: render_failed, db_error. A request that failed unexpectedly answers as text instead.
object
Always sent with render_failed.
The print the render left failed. Always sent with render_failed.
Examples
db_error
{ "error": "db_error"}render_failed
{ "detail": "string", "error": "render_failed", "printId": "string"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
Refused: lock_timeout
object
Examples
lock_timeout
{ "error": "lock_timeout"}Headers
Section titled “Headers”Every response names the request it answers in X-Request-Id: the id the request was sent with in that header, when it is well formed, else one the API gave it. Quote it when reporting a refusal or a failure: the API’s log lines for that request carry it.
Questions? Write to [email protected].