Skip to main content
A photo mockup turns one product photograph into a template you render onto. You prepare it once, then send any artwork at it for as long as you keep it, the same way a PSD template works, without owning a layered file.

The two steps

Creating a mockup and rendering onto it are separate calls. Setup happens once per photograph; rendering happens once per design. Create the mockup
Send exactly one image source: source_url or source_base64. The call is synchronous by default and returns the finished mockup, so there is nothing to poll before you render.
201 Created
Keep three values: data.mockup_id for the render path, and a target id from either data.quads or data.surfaces. The two lists are render targets you choose between: a quad is a bounded zone drawn on the product, a surface is the whole product. A product keeps its surface entry after you draw zones on it, so a chest logo and an all over print are two entries on the same photograph. See Print areas and surfaces. Render onto it
The finished image is at data.print_files[0].export_path.
200 OK
From here, swap artwork_url and send the call again. Every field of the render body is covered in Render artwork.

Run it in the background

Both calls accept is_async: true. You get a job instead of a result, which is what you want when you create or render in batches and do not want to hold connections open.
202 Accepted
Poll status_url until the job reports succeeded, or subscribe to a webhook and skip polling. A finished create job carries the new mockup id in mockup_uuid; a finished render job puts the image in result_url. The full poll contract is in the job status reference.

Which events fire

Asynchronous work reports through five events. Subscribe on Webhooks.
A delivery can arrive more than once. Match on job_id plus the event name so a repeat is a safe no operation.

What a mockup costs you

Creating a mockup is charged once, and each render is charged per image, so the cost of a design set follows the number of designs rather than the number of photographs. A rejected or failed create returns its credits automatically. The current credit weights are on pricing. On a funded account renders come back unwatermarked at the width you asked for. While the account is on trial credits, renders carry a watermark and a reduced output width.

Next

Print areas and surfaces

Where artwork can land, and how to move it.

Render artwork

Placement, adjustments and export options, field by field.

Create endpoint

The create contract with examples in cURL, Python and JavaScript.

Legacy paths

What the older 2D paths map to.