Skip to main content
If you already own the PSD templates, you do not need Photoshop in the loop to produce images from them. Upload a template once and every later image is an HTTP request: no Photoshop licence, no Actions or scripts, no machine to keep running.
This page is the whole job end to end. The Quickstart is the shorter version if you only want the two calls.

What stays in Photoshop and what leaves it

Photoshop keeps the work it is good at: building the template, placing the smart objects, and setting the transforms and effects. That happens once per product, and Preparing a PSD is where that work gets done. Everything that repeats leaves. Filling a slot with a design, swapping a headline, changing a colour, exporting at print resolution: each of those is a field on a render request rather than a session in front of the file. What you authored still renders as authored: smart object transforms, warps, perspective, layer masks, clipping masks, blend modes, opacity, and Drop Shadow, Stroke and Blend If. PSD compatibility is the row-by-row list, including what to send instead where a feature is not rendered today.

The job end to end

1

Get an API key.

Authentication covers where the key lives and how to send it.
2

Upload the template once.

Create a mockup from a PSD takes a file URL and a name, and one response carries every identifier a render needs.
3

Store the template id and its slot ids.

Keep data.uuid as the template and each data.smart_objects[].uuid as a slot, next to your product record. Nothing in your render loop touches the upload endpoint again. Upload a PSD reads that response field by field, and Smart objects matches slots by name rather than by order.
4

Send one render request per design.

Render a PSD mockup takes the template id, the slots you are filling and the export options. The finished image is at data.print_files[0].export_path.
5

Walk your design list.

A design list plus one template is a catalogue of images, and this is the shape most integrations settle on: the request stays the same and only the artwork URL changes. Python and the SDKs carry that request in the language you are writing in.
6

Let a long run finish in the background.

Requests run in parallel up to your plan’s concurrency, and one past that ceiling comes back as a 429 with a Retry-After you can wait out. Usage limits holds both ceilings and the headers that report what you have left.
Send is_async: true and collect the result from a webhook rather than holding a connection open per image. A queued render holds no concurrency slot while it waits, and Retrieve a single job is there when you would rather ask.

Change more than the artwork

The same template also carries text and colour, so one file covers variants that would otherwise be separate PSDs. Each one is another field on the render request you are already sending. Send image_size: "original" to render at the PSD’s own size and resolution, ready for print. The file comes out at the template’s own width, the height follows its proportions, and the file carries the resolution the PSD was saved with. A dpi in the same request still sets the resolution instead. If a template answers REUPLOAD_REQUIRED for "original", it was uploaded before this option existed: upload its PSD again, which makes a new template with its own UUIDs. To print at another size, set the pixels yourself. dpi stamps a print resolution tag into the file metadata; it does not change the pixels. Size them with image_size = print_inches x dpi, so a 12 inch print at 300 DPI is image_size: 3600. Choose png or jpg for the widest print-tool support.

Learn more

Upload a PSD

Register a template and read back every slot.

PSD compatibility

Check which Photoshop features render as authored.

Next steps

Preparing a PSD

Build the template so every slot is addressable.

Text layers

Personalise wording on the same template.