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

# Put a Design on a Product Photo: One Photo, Every Design, by API

> Turn one product photo into a reusable mockup, then render any design on it with one request, with a working example and the plans in plain text.

Yes, a design can sit on a product photo with the folds and shadows of that photo. Turn the photo into a mockup once, then send one request for each design. The mockup comes back with its print areas ready, and your exact design lands in the same place on every render.

SudoMock is a mockup generator and rendering API with a free library of 6,800+ ready-made mockups across 104 product types. It renders a ready-made mockup, your own PSD template, or your own product photo with your artwork and returns the finished image. No PSD is required.

Create the mockup once:

```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://example.com/shirt.jpg",
    "name": "White tee, front"
  }),
});

const data = await response.json();
console.log(data);
```

```php PHP theme={"theme":{"light":"github-light","dark":"vesper"}}
<?php

$payload = <<<'JSON'
{
  "source_url": "https://example.com/shirt.jpg",
  "name": "White tee, front"
}
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://example.com/shirt.jpg',
 'name': 'White tee, front'}

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://example.com/shirt.jpg",
    "name": "White tee, front"
  }
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://example.com/shirt.jpg",
  "name": "White tee, front"
}`)

	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://example.com/shirt.jpg",
  "name": "White tee, front"
}
""";

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://example.com/shirt.jpg",
  "name": "White tee, front"
}
""";

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://example.com/shirt.jpg",
    "name": "White tee, front"
  }'
```

Keep `data.mockup_id` and one print area id from `data.quads`. Then send one request per design:

```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": "PRINT_AREA_ID",
        "artwork_url": "https://example.com/design-001.png"
      }
    ]
  }),
});

const data = await response.json();
console.log(data);
```

```php PHP theme={"theme":{"light":"github-light","dark":"vesper"}}
<?php

$payload = <<<'JSON'
{
  "print_areas": [
    {
      "uuid": "PRINT_AREA_ID",
      "artwork_url": "https://example.com/design-001.png"
    }
  ]
}
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': 'PRINT_AREA_ID',
                  'artwork_url': 'https://example.com/design-001.png'}]}

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": "PRINT_AREA_ID",
        "artwork_url": "https://example.com/design-001.png"
      }
    ]
  }
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": "PRINT_AREA_ID",
      "artwork_url": "https://example.com/design-001.png"
    }
  ]
}`)

	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": "PRINT_AREA_ID",
      "artwork_url": "https://example.com/design-001.png"
    }
  ]
}
""";

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": "PRINT_AREA_ID",
      "artwork_url": "https://example.com/design-001.png"
    }
  ]
}
""";

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": "PRINT_AREA_ID",
        "artwork_url": "https://example.com/design-001.png"
      }
    ]
  }'
```

The finished image is at `data.print_files[0].export_path`.

## A photo you set up once, a catalog you keep rendering

Setup happens once per photograph and rendering happens once per design, so the cost of a catalog follows the number of designs rather than the number of photos. A catalog of 500 designs is 500 requests against one mockup. The average SudoMock render finishes in under a second; we measure render time in milliseconds.

A photo mockup keeps working after that first batch: the same mockup takes a new design on every new listing, order or seasonal drop, from your own code or as one step in n8n or Make.

## What it costs

Plans start at $25/month. Subscriptions from $0.002 per render. Signup includes 500 credits, no credit card required.

## Next steps

* What a photo mockup is: [Photo mockups](https://sudomock.com/docs/photo-mockups/overview.md)
* Placement, size and tiling on a print area: [Render artwork onto a photo mockup](https://sudomock.com/docs/photo-mockups/render-artwork.md)
* You have a layered PSD instead of a photo: [Quickstart](https://sudomock.com/docs/quickstart.md)


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