Rendering
Learn how to create product mockup renders using scenes, perspectives, and compositions.
Overview
Rendering generates realistic product mockups by placing your design on a product in a 3D scene, viewed from a specific camera angle. The full flow looks like this:
Browse catalog Discover scenes
GET /products GET /scenes
│ │
▼ ▼
Product_xxx Scene_xxx
│ │
└─────────┬───────────┘
│
▼
List perspectives
GET /perspectives
│
▼
Perspective_xxx
│
▼
Look up composition
GET /lookup-composition
│
▼
Composition_xxx + Image_xxx
POST /renders
│
▼
Render_xxx
│
▼
Poll status
GET /renders/xxx
│
▼
completed
│
┌─────────┴─────────┐
▼ ▼
Download media Download thumbnail
GET /renders/xxx/ GET /renders/xxx/
media thumbnail
Concepts
Rendering has four building blocks:
- Scene — A 3D environment (studio backdrop, desk setup, flat lay) in which products are placed. Each scene supports specific productgroups.
- Perspective — A camera angle with output settings (resolution, format). Scene perspectives can be used for all products in a scene. Product perspectives are tied to specific products, these usually highlight product features such as the camera island or charging port.
- Composition — A valid combination of a scene, a product, and a perspective. Not all combinations exist. Use the lookup endpoint to check.
- Render — The final output: your design placed on the product in the scene, from the chosen camera angle.
Step 1: Discover Scenes and Perspectives
List available scenes with GET /scenes. Use the optional productgroupReference filter to find scenes that support a specific productgroup.
curl "https://api.printeers.com/v2/scenes?productgroupReference=Productgroup_7yrcm5hd2w8pz4x6k3qf9b1tnv" \
-H "X-Printeers-Secret-Key: $KEY"
{
"scenes": [
{
"reference": "Scene_8hm3pz5wkr1yv7xn4btq9cdfsj",
"name": "Studio White Backdrop"
}
]
}
Use GET /scenes/{sceneReference} to see the scene's compatible productgroups and perspectives:
{
"scene": {
"reference": "Scene_8hm3pz5wkr1yv7xn4btq9cdfsj",
"name": "Studio White Backdrop",
"description": "A simple photo studio with white backdrop",
"private": false,
"allowsProductPerspectives": false,
"compatibleProductgroups": [
{ "reference": "Productgroup_7yrcm5hd2w8pz4x6k3qf9b1tnv" }
],
"perspectives": [
{ "reference": "Perspective_6rv2mc8yqw3nt5xk9hpz1bdfgs" },
{ "reference": "Perspective_3qn8yw1kfh6mp5xr7vzb9ctdsj" }
]
}
}
When allowsProductPerspectives is true, product-specific perspectives can also be used with this scene in addition to the scene's own perspectives. Not all scenes are suitable for rendering the product highlight perspectives.
List perspectives with GET /perspectives, optionally filtered by sceneReference and/or productReference. Use GET /perspectives/{perspectiveReference} to see output details:
{
"perspective": {
"reference": "Perspective_6rv2mc8yqw3nt5xk9hpz1bdfgs",
"name": "Upper Right",
"output": {
"widthPx": 2560,
"heightPx": 2560,
"format": "png"
},
"scenes": [
{ "reference": "Scene_8hm3pz5wkr1yv7xn4btq9cdfsj" }
],
"products": null
}
}
For scene perspectives, scenes lists the linked scenes and products is null. For product perspectives, products lists the linked products and scenes is null.
Step 2: Look Up a Composition
Use GET /lookup-composition to check whether a scene + product + perspective combination is available:
curl "https://api.printeers.com/v2/lookup-composition?sceneReference=Scene_8hm3pz5wkr1yv7xn4btq9cdfsj&productReference=Product_4j8k2m5n7p9q1r3s6t8v0w2x4y&perspectiveReference=Perspective_6rv2mc8yqw3nt5xk9hpz1bdfgs" \
-H "X-Printeers-Secret-Key: $KEY"
When the combination is available, the endpoint returns 200 OK:
{
"composition": {
"reference": "Composition_8hm3pz5wkr1yv7xn4btq9cdfsj"
}
}
When the combination does not exist, the endpoint returns 404 Not Found. When the combination exists but is no longer available, it returns 410 Gone.
Note: It may make sense to store or even hard-code references to the scenes, perspectives and/or compositions you require for your use-case. Just be aware that references are different between our test and prod environment and that referenced objects may be deprecated and become unavailable.
Step 3: Upload an Image
Upload the design you want rendered on the product. This is the same image upload used for creating orders — see the Creating Orders guide for full details.
curl -X POST https://api.printeers.com/v2/images \
-H "X-Printeers-Secret-Key: $KEY" \
-H "Content-Type: application/octet-stream" \
--data-binary @design.png
{
"image": {
"reference": "Image_pdcptbw3k48sv03wy338bb8jzm"
}
}
Accepted formats are JPEG and PNG. Images larger than 7000x7000 pixels are automatically downsized. Uploading the same image twice returns the same reference.
Step 4: Create a Render
Create a render by providing a composition reference and an image reference:
curl -X POST https://api.printeers.com/v2/renders \
-H "X-Printeers-Secret-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{
"render": {
"compositionReference": "Composition_8hm3pz5wkr1yv7xn4btq9cdfsj",
"imageReference": "Image_pdcptbw3k48sv03wy338bb8jzm"
}
}'
{
"render": {
"reference": "Render_8eksvwek9pc58r1qmqqf3492mg"
}
}
Creating a render with the same composition and image returns the existing render reference.
Step 5: Poll for Completion
Renders are processed asynchronously. Poll GET /renders/{renderReference} to check the status. Use a 60-second polling interval.
curl "https://api.printeers.com/v2/renders/Render_8eksvwek9pc58r1qmqqf3492mg" \
-H "X-Printeers-Secret-Key: $KEY"
{
"render": {
"reference": "Render_8eksvwek9pc58r1qmqqf3492mg",
"compositionReference": "Composition_8hm3pz5wkr1yv7xn4btq9cdfsj",
"imageReference": "Image_pdcptbw3k48sv03wy338bb8jzm",
"status": "completed",
"thumbhash": "1QcSHQRnh493V4dIh4eXh4aTh0eHJ4dnhw==",
"media": {
"mimeType": "image/png",
"extension": "png",
"size": 524288
},
"thumbnail": {
"mimeType": "image/png",
"extension": "png",
"size": 32768
},
"created": "2026-02-24T12:34:56Z",
"completed": "2026-02-24T12:35:10Z"
}
}
| Status | Meaning |
|---|---|
pending |
Render is queued or being processed. |
completed |
Render is ready for download. |
failed |
Render failed during processing. |
The thumbhash field contains a base64-encoded thumbhash for generating a placeholder preview while the full image loads. It is only available when status is completed.
Step 6: Download the Result
Download the full render or its thumbnail:
# Full render
curl "https://api.printeers.com/v2/renders/Render_8eksvwek9pc58r1qmqqf3492mg/media" \
-H "X-Printeers-Secret-Key: $KEY" \
--output render.png
# Thumbnail
curl "https://api.printeers.com/v2/renders/Render_8eksvwek9pc58r1qmqqf3492mg/thumbnail" \
-H "X-Printeers-Secret-Key: $KEY" \
--output thumbnail.png
When the render is complete, these endpoints return 200 OK with the binary file. When the render is not yet complete, they return 202 Accepted with a Retry-After header indicating how many seconds to wait before retrying.
Typical Integration
A typical rendering integration follows these steps:
- Browse the catalog — call
GET /productsto find products and their productgroup references. See the Products guide. - Discover scenes — call
GET /scenesfiltered by productgroup to find available scenes. - Pick a perspective — use
GET /scenes/{sceneReference}to see the scene's perspectives, orGET /perspectivesto browse all perspectives. - Look up the composition — call
GET /lookup-compositionwith the scene, product, and perspective. Returns 404 if the combination doesn't exist, or 410 if it's no longer available. - Upload an image — send the design to
POST /images. - Create the render — call
POST /renderswith the composition and image references. - Wait for completion — poll
GET /renders/{renderReference}every 60 seconds untilstatusiscompleted. - Download the result — fetch the full render from
/mediaand optionally the thumbnail from/thumbnail.
Next Steps
- API Reference — full endpoint documentation for all rendering endpoints.
- Products — learn how products and productgroups are organized.
- Creating Orders — place orders with your product images.
