1. Find a template
Search the library by free text, or filter it by category, subcategory, product type or tag. Every template comes back with the mockups it holds, so this one call already carries what you send next.const response = await fetch("https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2", {
method: "GET",
headers: { "x-api-key": "$SUDOMOCK_API_KEY" },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init("https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-api-key: $SUDOMOCK_API_KEY",
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests
response = requests.get(
"https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2",
headers={"x-api-key": "$SUDOMOCK_API_KEY"},
)
response.raise_for_status()
print(response.json())
require "net/http"
require "uri"
uri = URI("https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2")
request = Net::HTTP::Get.new(uri)
request["x-api-key"] = "$SUDOMOCK_API_KEY"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.body
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2", nil)
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", "$SUDOMOCK_API_KEY")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2"))
.header("x-api-key", "$SUDOMOCK_API_KEY")
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http;
using System.Text;
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2");
request.Headers.Add("x-api-key", "$SUDOMOCK_API_KEY");
var client = new HttpClient();
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
curl -X GET "https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2" \
-H "x-api-key: $SUDOMOCK_API_KEY"
{
"templates": [
{
"slug": "american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f",
"title": "American Apparel 102 Women's Fine Jersey Boxy Tee Mockup",
"description": "Oversized t-shirt mockup for the American Apparel 102 Women's Fine Jersey Boxy Tee, a 4.5 oz ring-spun cotton tee with a boxy, mid-length cut, in 9 views. Every angle opens as a ready photo mockup: place your artwork in the editor or through the API.",
"category": "apparel",
"subcategory": "t-shirts",
"product_type": "oversized",
"tags": [
"american-apparel-mockup",
"oversized-t-shirt-mockup",
"front-and-back-mockup",
"on-model-mockup"
],
"is_featured": false,
"mockup_count": 9,
"mockups": [
{
"name": "Lifestyle Scene",
"view": "lifestyle-scene",
"source_url": "https://assets.sudomock.com/workspace/adaecdfaf474/workspace-start/catalogue-bulk/069f1bf7-9125-58ef-a190-36d2b0dc9b64-adaecdfaf474887f26e7d0d9e6a10c60cef4b39ff0a314b25562811aaea0d729.png"
},
{
"name": "Flat Lay",
"view": "flat-lay-overhead",
"source_url": "https://assets.sudomock.com/library/269cd7439bd517b0248648038f22b31cf03df84af8bce76c385e48bf55b75645.png"
},
"... 7 more"
]
},
{
"slug": "as-colour-4030-womens-box-tee-mockup-4a9c",
"title": "AS Colour 4030 Women's Box Tee Mockup",
"description": "Oversized t-shirt mockup set for the AS Colour 4030 Women's Box Tee: 9 views of a relaxed women's box tee, with Worn Front, Worn Back and Worn Three-Quarter on a model. Every angle opens as a ready photo mockup: place your artwork in the editor or through the API.",
"category": "apparel",
"subcategory": "t-shirts",
"product_type": "oversized",
"tags": [
"as-colour-mockup",
"oversized-t-shirt-mockup",
"front-and-back-mockup",
"on-model-mockup"
],
"is_featured": false,
"mockup_count": 9,
"mockups": [
{
"name": "Lifestyle Scene",
"view": "lifestyle-scene",
"source_url": "https://assets.sudomock.com/workspace/272d4d25b6e7/workspace-start/catalogue-bulk/4a9c5c71-f983-5504-a4fb-0af23b16659a-272d4d25b6e71e534901ba6137557d13f8973fedd9de2077dea0696c6223c8a5.png"
},
{
"name": "Flat Lay",
"view": "flat-lay-overhead",
"source_url": "https://assets.sudomock.com/library/a4fef805f60edbd7dee4f4d3624c9dc29024c490b29a424a8c7d5ae6a71fdf3e.png"
},
"... 7 more"
]
}
],
"total_templates": 20,
"total_mockups": 161,
"page": 1,
"limit": 2,
"pages": 10
}
total_templates counts the templates that match, total_mockups counts the mockups inside them, and both describe the whole search rather than this page. Reading costs nothing.
2. Read one template, if you want its long-form copy
The search answer already carries every mockup and its address, so this step is optional. It adds the scene described at length, what it offers, and the facets it is listed under.const response = await fetch("https://api.sudomock.com/api/v1/library/templates/american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f", {
method: "GET",
headers: { "x-api-key": "$SUDOMOCK_API_KEY" },
});
const data = await response.json();
console.log(data);
<?php
$ch = curl_init("https://api.sudomock.com/api/v1/library/templates/american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-api-key: $SUDOMOCK_API_KEY",
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests
response = requests.get(
"https://api.sudomock.com/api/v1/library/templates/american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f",
headers={"x-api-key": "$SUDOMOCK_API_KEY"},
)
response.raise_for_status()
print(response.json())
require "net/http"
require "uri"
uri = URI("https://api.sudomock.com/api/v1/library/templates/american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f")
request = Net::HTTP::Get.new(uri)
request["x-api-key"] = "$SUDOMOCK_API_KEY"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.body
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.sudomock.com/api/v1/library/templates/american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f", nil)
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", "$SUDOMOCK_API_KEY")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sudomock.com/api/v1/library/templates/american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f"))
.header("x-api-key", "$SUDOMOCK_API_KEY")
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http;
using System.Text;
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.sudomock.com/api/v1/library/templates/american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f");
request.Headers.Add("x-api-key", "$SUDOMOCK_API_KEY");
var client = new HttpClient();
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
curl -X GET "https://api.sudomock.com/api/v1/library/templates/american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f" \
-H "x-api-key: $SUDOMOCK_API_KEY"
{
"slug": "american-apparel-102-womens-fine-jersey-boxy-tee-mockup-069f",
"title": "American Apparel 102 Women's Fine Jersey Boxy Tee Mockup",
"description": "Oversized t-shirt mockup for the American Apparel 102 Women's Fine Jersey Boxy Tee, a 4.5 oz ring-spun cotton tee with a boxy, mid-length cut, in 9 views. Every angle opens as a ready photo mockup: place your artwork in the editor or through the API.",
"category": "apparel",
"subcategory": "t-shirts",
"product_type": "oversized",
"tags": [
"american-apparel-mockup",
"oversized-t-shirt-mockup",
"front-and-back-mockup",
"on-model-mockup"
],
"is_featured": false,
"mockup_count": 9,
"mockups": [
{
"name": "Lifestyle Scene",
"view": "lifestyle-scene",
"source_url": "https://assets.sudomock.com/workspace/adaecdfaf474/workspace-start/catalogue-bulk/069f1bf7-9125-58ef-a190-36d2b0dc9b64-adaecdfaf474887f26e7d0d9e6a10c60cef4b39ff0a314b25562811aaea0d729.png"
},
{
"name": "Flat Lay",
"view": "flat-lay-overhead",
"source_url": "https://assets.sudomock.com/library/269cd7439bd517b0248648038f22b31cf03df84af8bce76c385e48bf55b75645.png"
},
"... 7 more"
],
"long_description": "Oversized t-shirt mockup for the American Apparel 102 Women's Fine Jersey Boxy Tee, a 4.5 oz ring-spun cotton tee with a boxy, mid-length cut, in 9 views. Every ...",
"features": [
"Front, back and three-quarter views on a model",
"Ring-spun cotton fine jersey, 4.5 oz",
"..."
],
"visual_style": [
"lifestyle",
"studio",
"on-model",
"flat-lay",
"macro-detail"
],
"target_audience": [],
"compatible_platforms": [
"etsy",
"shopify",
"woocommerce",
"zapier",
"make",
"n8n",
"airtable",
"google-sheets",
"adalo"
],
"industries": [],
"use_cases": [],
"seasons": [],
"published_at": "2026-10-31T13:09:06.177196Z"
}
mockups carries name (what the view is called), view (the kind of view) and source_url (the address to start from).
3. Turn a mockup into your own, then render it
Send a mockup’ssource_url as source_url to the photo mockup create endpoint. SudoMock finds the printable surfaces on it and gives you back a reusable mockup on your account.
const response = await fetch("https://api.sudomock.com/api/v1/photo-mockups", {
method: "POST",
headers: {
"x-api-key": "$SUDOMOCK_API_KEY",
"content-type": "application/json",
},
body: JSON.stringify({
"source_url": "https://assets.sudomock.com/library/<the source_url you picked>",
"name": "Oversize tee, flat lay"
}),
});
const data = await response.json();
console.log(data);
<?php
$payload = <<<'JSON'
{
"source_url": "https://assets.sudomock.com/library/<the source_url you picked>",
"name": "Oversize tee, flat lay"
}
JSON;
$ch = curl_init("https://api.sudomock.com/api/v1/photo-mockups");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-api-key: $SUDOMOCK_API_KEY",
"content-type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests
payload = {'source_url': 'https://assets.sudomock.com/library/<the '
'source_url you picked>',
'name': 'Oversize tee, flat lay'}
response = requests.post(
"https://api.sudomock.com/api/v1/photo-mockups",
headers={"x-api-key": "$SUDOMOCK_API_KEY"},
json=payload,
)
response.raise_for_status()
print(response.json())
require "net/http"
require "uri"
uri = URI("https://api.sudomock.com/api/v1/photo-mockups")
request = Net::HTTP::Post.new(uri)
request["x-api-key"] = "$SUDOMOCK_API_KEY"
request["content-type"] = "application/json"
request.body = <<~JSON
{
"source_url": "https://assets.sudomock.com/library/<the source_url you picked>",
"name": "Oversize tee, flat lay"
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.body
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{
"source_url": "https://assets.sudomock.com/library/<the source_url you picked>",
"name": "Oversize tee, flat lay"
}`)
req, err := http.NewRequest("POST", "https://api.sudomock.com/api/v1/photo-mockups", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", "$SUDOMOCK_API_KEY")
req.Header.Set("content-type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String payload = """
{
"source_url": "https://assets.sudomock.com/library/<the source_url you picked>",
"name": "Oversize tee, flat lay"
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sudomock.com/api/v1/photo-mockups"))
.header("x-api-key", "$SUDOMOCK_API_KEY")
.header("content-type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http;
using System.Text;
var payload = """
{
"source_url": "https://assets.sudomock.com/library/<the source_url you picked>",
"name": "Oversize tee, flat lay"
}
""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.sudomock.com/api/v1/photo-mockups");
request.Headers.Add("x-api-key", "$SUDOMOCK_API_KEY");
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
var client = new HttpClient();
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
curl -X POST "https://api.sudomock.com/api/v1/photo-mockups" \
-H "x-api-key: $SUDOMOCK_API_KEY" \
-H "content-type: application/json" \
-d '{
"source_url": "https://assets.sudomock.com/library/<the source_url you picked>",
"name": "Oversize tee, flat lay"
}'
mockup_id and its print areas.
{
"data": {
"mockup_id": "607a7356-0a0b-4f3f-a498-080adcb317fc",
"name": "Oversized tee, flat lay",
"status": "ready",
"customizable": true,
"thumbnail_url": null,
"source_width": 1600,
"source_height": 2000,
"quads": [
{
"print_area_id": "fe09f1a9-0fee-407f-9d98-b148ffeec4d0",
"points": [
[
364,
643
],
[
1232,
643
],
[
1232,
1166
],
[
364,
1166
]
],
"name": null,
"sort_order": 0
}
],
"surfaces": [
{
"surface_uuid": "ee403978-f184-4ef7-904c-0f452d72b180",
"label": "grey t-shirt",
"points": [
[
25.0,
431.0
],
[
1567.0,
431.0
],
[
1567.0,
1577.0
],
[
25.0,
1577.0
]
],
"bbox": {
"x": 25.0,
"y": 431.0,
"width": 1542.0,
"height": 1146.0
}
}
],
"version": 1,
"created_at": "2026-11-12T16:03:56.8311+00:00",
"updated_at": "2026-11-12T16:04:13.318206+00:00"
},
"success": true
}
ready from the one call. Each entry of quads is a print area you can render onto, addressed by print_area_id; surfaces names the product surfaces found on the image.
From there it is an ordinary photo mockup: render your artwork onto it as many times as you like.
const response = await fetch("https://api.sudomock.com/api/v1/photo-mockups/$MOCKUP_ID/render", {
method: "POST",
headers: {
"x-api-key": "$SUDOMOCK_API_KEY",
"content-type": "application/json",
},
body: JSON.stringify({
"print_areas": [
{
"uuid": "fe09f1a9-0fee-407f-9d98-b148ffeec4d0",
"artwork_url": "https://example.com/artwork.png"
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1600
}
}),
});
const data = await response.json();
console.log(data);
<?php
$payload = <<<'JSON'
{
"print_areas": [
{
"uuid": "fe09f1a9-0fee-407f-9d98-b148ffeec4d0",
"artwork_url": "https://example.com/artwork.png"
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1600
}
}
JSON;
$ch = curl_init("https://api.sudomock.com/api/v1/photo-mockups/$MOCKUP_ID/render");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"x-api-key: $SUDOMOCK_API_KEY",
"content-type: application/json",
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import requests
payload = {'print_areas': [{'uuid': 'fe09f1a9-0fee-407f-9d98-b148ffeec4d0',
'artwork_url': 'https://example.com/artwork.png'}],
'export_options': {'image_format': 'jpg',
'image_size': 1600}}
response = requests.post(
"https://api.sudomock.com/api/v1/photo-mockups/$MOCKUP_ID/render",
headers={"x-api-key": "$SUDOMOCK_API_KEY"},
json=payload,
)
response.raise_for_status()
print(response.json())
require "net/http"
require "uri"
uri = URI("https://api.sudomock.com/api/v1/photo-mockups/$MOCKUP_ID/render")
request = Net::HTTP::Post.new(uri)
request["x-api-key"] = "$SUDOMOCK_API_KEY"
request["content-type"] = "application/json"
request.body = <<~JSON
{
"print_areas": [
{
"uuid": "fe09f1a9-0fee-407f-9d98-b148ffeec4d0",
"artwork_url": "https://example.com/artwork.png"
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1600
}
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.request(request)
end
puts response.body
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
payload := []byte(`{
"print_areas": [
{
"uuid": "fe09f1a9-0fee-407f-9d98-b148ffeec4d0",
"artwork_url": "https://example.com/artwork.png"
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1600
}
}`)
req, err := http.NewRequest("POST", "https://api.sudomock.com/api/v1/photo-mockups/$MOCKUP_ID/render", bytes.NewBuffer(payload))
if err != nil {
panic(err)
}
req.Header.Set("x-api-key", "$SUDOMOCK_API_KEY")
req.Header.Set("content-type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String payload = """
{
"print_areas": [
{
"uuid": "fe09f1a9-0fee-407f-9d98-b148ffeec4d0",
"artwork_url": "https://example.com/artwork.png"
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1600
}
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sudomock.com/api/v1/photo-mockups/$MOCKUP_ID/render"))
.header("x-api-key", "$SUDOMOCK_API_KEY")
.header("content-type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
using System.Net.Http;
using System.Text;
var payload = """
{
"print_areas": [
{
"uuid": "fe09f1a9-0fee-407f-9d98-b148ffeec4d0",
"artwork_url": "https://example.com/artwork.png"
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1600
}
}
""";
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.sudomock.com/api/v1/photo-mockups/$MOCKUP_ID/render");
request.Headers.Add("x-api-key", "$SUDOMOCK_API_KEY");
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
var client = new HttpClient();
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
curl -X POST "https://api.sudomock.com/api/v1/photo-mockups/$MOCKUP_ID/render" \
-H "x-api-key: $SUDOMOCK_API_KEY" \
-H "content-type: application/json" \
-d '{
"print_areas": [
{
"uuid": "fe09f1a9-0fee-407f-9d98-b148ffeec4d0",
"artwork_url": "https://example.com/artwork.png"
}
],
"export_options": {
"image_format": "jpg",
"image_size": 1600
}
}'
{
"data": {
"print_files": [
{
"export_path": "https://cdn.sudomock.com/mockup-assets/renders/2d/607a7356-0a0b-4f3f-a498-080adcb317fc/4b7f5c6a-5aaa-4c5c-aa41-406e81301fa5.jpg",
"export_format": "jpg"
}
],
"render_uuid": "4b7f5c6a-5aaa-4c5c-aa41-406e81301fa5"
},
"success": true,
"warnings": null
}
data.print_files[0].export_path. Each render costs 5 credits.
What it costs, in one place
| Step | Credits |
|---|---|
| Search the library | 0 |
| Read one template | 0 |
| Turn a mockup into your own | 25, refunded if the image is not suitable |
| Render that mockup, each time | 5 |
From the SDKs
The Node and Python clients read the same library, so the three steps above are four calls in your own language. The first two cost nothing and the last two are the credits in the table above.// 1. Search the catalogue.
const { templates, totalMockups } = await client.readyMadeMockups.search({
search: 'coffee mug',
category: 'drinkware',
limit: 5,
})
// 2. Read one template for its long-form copy and every facet.
const template = await client.readyMadeMockups.getTemplate(templates[0]!.slug)
// 3. Hand the view you picked to photo mockup creation.
const view = template.mockups![0]!
const mockup = await client.photoMockups.create({ sourceUrl: view.sourceUrl })
// 4. Render your own artwork onto it.
const surface = mockup.surfaces[0]
if (!surface) throw new Error('No surface available')
const result = await client.photoMockups.render({
mockupId: mockup.mockupId,
printAreas: [{
surfaceUuid: surface.surfaceUuid,
artworkUrl: 'https://example.com/artwork.png',
placement: { coverage: 60 },
}],
})
console.log(result.url)
# 1. Search the catalogue.
page = client.ready_made_mockups.search(search="coffee mug", category="drinkware", limit=5)
print(page.total_templates, "templates,", page.total_mockups, "views")
# 2. Read one template for its long-form copy and every facet.
template = client.ready_made_mockups.get_template(page.templates[0].slug)
# 3. Hand the view you picked to photo mockup creation.
view = template.mockups[0]
mockup = client.photo_mockups.create(source_url=view.source_url)
# 4. Render your own artwork onto it.
render = client.photo_mockups.render(
mockup_uuid=mockup.mockup_id,
print_areas=[
{
"surface_uuid": mockup.surfaces[0].surface_uuid,
"artwork_url": "https://example.com/artwork.png",
"placement": {"coverage": 60},
}
],
)
print(render.url)
readyMadeMockups arrived in sudomock 2.18.0 and ready_made_mockups in the
Python sudomock 0.21.0. The filters, paging and sorting are the ones the search
call above takes, and both clients answer with typed objects. AsyncSudoMock
carries the same two methods.
From an AI assistant
The hosted MCP server carries the same library in one read tool,search_ready_made_mockups. It searches the library and reads one template, and it spends nothing. The step that spends credits is create_photo_mockup, which takes a mockup’s source_url and says its own price.
Find me a ready-made oversized tee mockup, use the flat lay view, and put this
design on it.