Build path: product to print-ready PDF
Create a product, define print sides, save a design and generate a print-ready PDF.
The sequence
POST /account -> JWT
POST /stores -> sid, secret, unauth_token
POST /products -> product
POST /sides -> printable surface (design area, bleed, safe zone)
or POST /products/{id}/sides/import-from-template
POST /images -> upload artwork (or POST /multipart/create for large files)
POST /designs -> saved design (creates a project implicitly)
POST /projects -> order (or reuse the implicit one)
POST /designs/{id}/generate/print-pdf -> print-ready PDF
POST /webhooks -> get notified when things changeEach step is documented with request and response schemas in the API reference. Authentication for each call is covered in Authentication.
Sides carry print-readiness
A product on its own is not printable. The side carries the geometry:
| Response field | Meaning |
|---|---|
design_area | {width, height, top, left}: the printable rectangle |
cut_line_margin | {x, y}: bleed, left and right and top and bottom |
safe_zone_margin | {x, y}: the keep-clear margin inside the trim |
side_image_size | {width, height}: the mockup image size |
scale | pixels per dimension_unit, which turns canvas coordinates into physical size |
Geometry is submitted in the same grouped form, not as flat columns. Units come from the product's dimension_unit, which is inch, cm or px.
GET /products/{product}/production-readiness reports what is still missing before a product can produce output. It is a useful onboarding pre-flight.
Designs
POST /designs takes either multipart/form-data with a design_file, or JSON that references a design_image_id you uploaded earlier. Send exactly one of side_id or product_id, and exactly one of the two file inputs.
layers, the canvas document, is submitted as a JSON-encoded string and returned as JSON. Each design snapshots the side geometry into original_side, so editing the side later does not change how an existing design renders.
Output
| Endpoint | Produces |
|---|---|
POST /designs/{design}/generate/print-pdf | A print-ready CMYK PDF with TrimBox and BleedBox and marks. For a canvas product, the full print sheet with a cut line |
POST /designs/{design}/generate/pdf | A plain RGB page at the design-area size, with no bleed, marks or boxes. Not a press file |
POST /designs/{design}/generate/preview-pdf | A low-resolution proof. Do not send it to press |
POST /designs/{design}/generate/png | A raster image for thumbnails and emails |
The PDF endpoints cache their result: repeat calls return the same file until you pass {"reset": true}. The PNG endpoint takes no body. Rendering is synchronous and can take several seconds.
Projects are orders
When a store is connected to a platform such as WooCommerce, Shopify or Wix, one platform order becomes one project. Commercial fields on a project, such as customer email, totals and currency, are derived from the order data the platform integration wrote.
A project you create directly through the API does not have that order data, so those fields are empty. Keep your own order record as the source of truth for commerce and use the project id as the join key.
GET /projects/{project} returns everything needed to produce an order. It is the only response that embeds project_items, and those items embed their designs.
Related
- Webhooks to react to design and project changes without polling.
- Design Tool SDK to put the customizer on a product page.
- Preparing print-ready files for DPI, bleed, color and fonts.
- Automating POD orders and fulfillment with the Printcart API.