> ## Documentation Index
> Fetch the complete documentation index at: https://sudomock.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> The base URL is https://api.sudomock.com.
> Authenticate every request with the x-api-key header. Keys begin with sm_.
> A render returns the finished image at data.print_files[0].export_path. A request sent with is_async true returns a job_id to poll at GET /api/v1/jobs/{job_id}.
> Prefer the official SDKs over hand-written HTTP calls: npm install sudomock for Node, pip install sudomock for Python.

# Start From a Ready-Made Template: No File of Your Own

> Find a ready-made mockup in the free library, turn it into your own, and render your artwork onto it, with what each step costs.

You do not need a Photoshop file or a product photo to get a finished product image out of SudoMock. The library holds 6,800+ ready-made mockups across 104 product types, grouped into 912 templates, one per product scene. Every mockup in it is free to start from.

A mockup is one view of a product scene: front, folded, flat lay, lifestyle, close-up. A template is the set of those views. You pick a mockup, SudoMock turns it into a reusable mockup on your account, and from then on it renders your artwork like any mockup you made yourself.

Three steps, and two of them are free.

## 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.

```js Node.js theme={"theme":{"light":"github-light","dark":"vesper"}}
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 PHP theme={"theme":{"light":"github-light","dark":"vesper"}}
<?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;
```

```python Python theme={"theme":{"light":"github-light","dark":"vesper"}}
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())
```

```ruby Ruby theme={"theme":{"light":"github-light","dark":"vesper"}}
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
```

```go Go theme={"theme":{"light":"github-light","dark":"vesper"}}
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))
}
```

```java Java theme={"theme":{"light":"github-light","dark":"vesper"}}
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());
```

```csharp .NET theme={"theme":{"light":"github-light","dark":"vesper"}}
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());
```

```bash cURL theme={"theme":{"light":"github-light","dark":"vesper"}}
curl -X GET "https://api.sudomock.com/api/v1/library/templates?search=oversized%20t-shirt&limit=2" \
  -H "x-api-key: $SUDOMOCK_API_KEY"
```

```json theme={"theme":{"light":"github-light","dark":"vesper"}}
{
  "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.

```js Node.js theme={"theme":{"light":"github-light","dark":"vesper"}}
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 PHP theme={"theme":{"light":"github-light","dark":"vesper"}}
<?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;
```

```python Python theme={"theme":{"light":"github-light","dark":"vesper"}}
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())
```

```ruby Ruby theme={"theme":{"light":"github-light","dark":"vesper"}}
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
```

```go Go theme={"theme":{"light":"github-light","dark":"vesper"}}
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))
}
```

```java Java theme={"theme":{"light":"github-light","dark":"vesper"}}
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());
```

```csharp .NET theme={"theme":{"light":"github-light","dark":"vesper"}}
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());
```

```bash cURL theme={"theme":{"light":"github-light","dark":"vesper"}}
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"
```

```json theme={"theme":{"light":"github-light","dark":"vesper"}}
{
  "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"
}
```

Each entry of `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's `source_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.

```js Node.js theme={"theme":{"light":"github-light","dark":"vesper"}}
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 PHP theme={"theme":{"light":"github-light","dark":"vesper"}}
<?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;
```

```python Python theme={"theme":{"light":"github-light","dark":"vesper"}}
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())
```

```ruby Ruby theme={"theme":{"light":"github-light","dark":"vesper"}}
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
```

```go Go theme={"theme":{"light":"github-light","dark":"vesper"}}
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))
}
```

```java Java theme={"theme":{"light":"github-light","dark":"vesper"}}
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());
```

```csharp .NET theme={"theme":{"light":"github-light","dark":"vesper"}}
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());
```

```bash cURL theme={"theme":{"light":"github-light","dark":"vesper"}}
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"
  }'
```

That create costs **25 credits**, refunded automatically if the image turns out not to be suitable. The response carries the new mockup's `mockup_id` and its print areas.

```json theme={"theme":{"light":"github-light","dark":"vesper"}}
{
  "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
}
```

The mockup came back `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.

```js Node.js theme={"theme":{"light":"github-light","dark":"vesper"}}
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 PHP theme={"theme":{"light":"github-light","dark":"vesper"}}
<?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;
```

```python Python theme={"theme":{"light":"github-light","dark":"vesper"}}
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())
```

```ruby Ruby theme={"theme":{"light":"github-light","dark":"vesper"}}
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
```

```go Go theme={"theme":{"light":"github-light","dark":"vesper"}}
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))
}
```

```java Java theme={"theme":{"light":"github-light","dark":"vesper"}}
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());
```

```csharp .NET theme={"theme":{"light":"github-light","dark":"vesper"}}
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());
```

```bash cURL theme={"theme":{"light":"github-light","dark":"vesper"}}
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
    }
  }'
```

Send artwork with a transparent background: anything the file carries around the design lands on the product too.

```json theme={"theme":{"light":"github-light","dark":"vesper"}}
{
  "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
}
```

The finished image is at `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 |

A new account starts with 500 one-time credits, which is twenty mockups to start from, or one mockup and ninety-five renders.

## 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.

```ts Node.js theme={"theme":{"light":"github-light","dark":"vesper"}}
// 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)
```

```python Python theme={"theme":{"light":"github-light","dark":"vesper"}}
# 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.
```

See [Connect an agent](https://sudomock.com/docs/connect-an-agent.md) for how to add the server.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.