# Get your first render in 1 minute

Thanks to our already prepared sandbox request, you can see a render in a minute!

## Try it out in the API Playground

&#x20;Visit our [API Playground link](https://playground.dynamicmockups.com/use-cases/lookbook-generator/) to see the results in just a few clicks.

{% embed url="<https://playground.dynamicmockups.com/use-cases/lookbook-generator/>" %}

## Or run this request in Postman&#x20;

We did everything for you. Just copy everything below.

This request is using **API KEY** and **Mockup** from our **sandbox account**.

<mark style="color:green;">POST</mark> <https://app.dynamicmockups.com/api/v1/renders>

In **Authorization**, add the following:

* **Type**: API Key
* **Key**: x-api-key
* **Value**: bdf8301a-ef40-457d-8f2e-0d91e18726a0:d1c144ad6cbe665f680584d9a917a2a56c2ae07bd9ddc102cdd881604a159691

In the **raw JSON body**, add the following:

```json
{
  "mockup_uuid": "9ffb48c2-264f-42b9-ab86-858c410422cc",
  "smart_objects": [
            {
                "uuid": "cc864498-b8d1-495a-9968-45937edf42b3",
                "asset": {
                    "url": "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png"
                    //or add your design asset URL from the link
                }
            }
    ]
}
```

## Run this request from one of these

Not using Postman? No worries, get rendered image by running from one of these:

{% tabs %}
{% tab title="Curl" %}

```sh
curl -X POST https://app.dynamicmockups.com/api/v1/renders \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "x-api-key: bdf8301a-ef40-457d-8f2e-0d91e18726a0:d1c144ad6cbe665f680584d9a917a2a56c2ae07bd9ddc102cdd881604a159691" \
-d '{
  "mockup_uuid": "9ffb48c2-264f-42b9-ab86-858c410422cc",
  "smart_objects": [
    {
      "uuid": "cc864498-b8d1-495a-9968-45937edf42b3",
      "asset": {
        "url": "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png"
      }
    }
  ]
}'
```

{% endtab %}

{% tab title="Node" %}

```javascript
const axios = require('axios');

const url = 'https://app.dynamicmockups.com/api/v1/renders';
const apiKey = 'bdf8301a-ef40-457d-8f2e-0d91e18726a0:d1c144ad6cbe665f680584d9a917a2a56c2ae07bd9ddc102cdd881604a159691';

const data = {
  mockup_uuid: '9ffb48c2-264f-42b9-ab86-858c410422cc',
  smart_objects: [
    {
      uuid: 'cc864498-b8d1-495a-9968-45937edf42b3',
      asset: {
        url: 'https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png'
      }
    }
  ]
};

axios.post(url, data, {
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'x-api-key': apiKey
  }
})
.then(response => {
  console.log('Response:', response.data);
})
.catch(error => {
  console.error('Error:', error.response ? error.response.data : error.message);
});
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = 'https://app.dynamicmockups.com/api/v1/renders'
api_key = 'bdf8301a-ef40-457d-8f2e-0d91e18726a0:d1c144ad6cbe665f680584d9a917a2a56c2ae07bd9ddc102cdd881604a159691'

data = {
    "mockup_uuid": "9ffb48c2-264f-42b9-ab86-858c410422cc",
    "smart_objects": [
        {
            "uuid": "cc864498-b8d1-495a-9968-45937edf42b3",
            "asset": {
                "url": "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png"
            }
        }
    ]
}

headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'x-api-key': api_key
}

response = requests.post(url, json=data, headers=headers)

if response.status_code == 200:
    print('Response:', response.json())
else:
    print('Error:', response.status_code, response.text)

```

{% endtab %}

{% tab title="JS" %}

```javascript
const url = 'https://app.dynamicmockups.com/api/v1/renders';
const apiKey = 'bdf8301a-ef40-457d-8f2e-0d91e18726a0:d1c144ad6cbe665f680584d9a917a2a56c2ae07bd9ddc102cdd881604a159691';

const data = {
  mockup_uuid: '9ffb48c2-264f-42b9-ab86-858c410422cc',
  smart_objects: [
    {
      uuid: 'cc864498-b8d1-495a-9968-45937edf42b3',
      asset: {
        url: 'https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png'
      }
    }
  ]
};

fetch(url, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'x-api-key': apiKey
  },
  body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => {
  console.log('Response:', data);
})
.catch(error => {
  console.error('Error:', error);
});

```

{% endtab %}

{% tab title="PHP" %}

```php
<?php

$url = 'https://app.dynamicmockups.com/api/v1/renders';
$apiKey = 'bdf8301a-ef40-457d-8f2e-0d91e18726a0:d1c144ad6cbe665f680584d9a917a2a56c2ae07bd9ddc102cdd881604a159691';

$data = [
    "mockup_uuid" => "9ffb48c2-264f-42b9-ab86-858c410422cc",
    "smart_objects" => [
        [
            "uuid" => "cc864498-b8d1-495a-9968-45937edf42b3",
            "asset" => [
                "url" => "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png"
            ]
        ]
    ]
];

$headers = [
    'Content-Type: application/json',
    'Accept: application/json',
    'x-api-key: ' . $apiKey
];

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
} else {
    echo 'Response: ' . $response;
}

curl_close($ch);

```

{% endtab %}
{% endtabs %}

## What to do now?

We used **mockup\_uuid** and **smart\_objects** from our already prepared sandbox account. Now you can create yours.

STEP 1: You can create your **account** and **API KEY** for **FREE.** [**Sign up here**](https://app.dynamicmockups.com/register)**.**

STEP 2: Choose one of 1000s of other **Mockups** in our [Mockup Library](https://app.dynamicmockups.com/create).

STEP 3: Copy **Mockup UUID** and **Smart Object UUID** from the URL and place them instead of the ones we prepared for you and that's it!

<figure><img src="/files/WPi0RBEejLbZc61X7iaF" alt=""><figcaption></figcaption></figure>

## Congratulations! Use full potential now from our Render API!

Our Render API can do much more! Go to [Render API](/api-reference/render-api) and use the full potential!


# Getting Started

{% content-ref url="/pages/sIfF9qJheZJwm0SPeAI4" %}
[How does the API work?](/getting-started/how-does-the-api-work)
{% endcontent-ref %}

{% content-ref url="/pages/yVMD5veVkq1LVKIAZVfm" %}
[How can I get my API key?](/getting-started/how-can-i-get-my-api-key)
{% endcontent-ref %}

{% content-ref url="/pages/dTmnqDiLWAx8CZs4F7Zy" %}
[How are API calls billed?](/getting-started/how-are-api-calls-billed)
{% endcontent-ref %}

{% content-ref url="/pages/2z3k7tkSQQKiwzuRZM8x" %}
[How can I get support?](/getting-started/how-can-i-get-support)
{% endcontent-ref %}

{% content-ref url="/pages/Y7ufMfEKy4nKU7yhci4f" %}
[Frequently Asked Questions](/getting-started/frequently-asked-questions)
{% endcontent-ref %}

{% content-ref url="/pages/w2CI4RMgqBzmA08kebIq" %}
[Troubleshooting](/getting-started/troubleshooting)
{% endcontent-ref %}


# How does the API work?

The Dynamic Mockups API enables you to create high-quality images based on the selected mockup and provided design asset.

Everything is based on Mockup UUID and Smart Object UUID.

**Smart Objects** are layers(objects) inside the Mockup where you can provide the image URL to be rendered, color, and more advanced options you can explore in [Render API](/api-reference/render-api).

To render your design asset, you should choose the smart object you want to put your design asset on.

**For example**: on a T-shirt smart object.

<figure><img src="/files/U84ebFXlXJ8hkaAZIxRA" alt=""><figcaption><p>Your design on a T-shirt smart object</p></figcaption></figure>

You can choose one from 1000s of free mockups from our [Public Library](https://app.dynamicmockups.com/mockup-library) or even upload your [PSD file](https://app.dynamicmockups.com/custom-mockups).

To explore more and get the most from of our API, explore more [Getting Started](/getting-started) pages and visit our [Render API](/api-reference/render-api).


# How can I get my API key?

To use the Dynamic Mockups API, you'll first need to create the **API Key** on your account and obtain your unique API key. Use that API Key as the **x-api-key** header in each API call.

Here's how to do it:

1. **Sign Up** or **Login** by visiting [app.dynamicmockups.com](https://app.dynamicmockups.com/)
2. Go to the [API Dashboard](https://app.dynamicmockups.com/dashboard-api) on your account.
3. Create the API key by clicking on the **Create new API key** button.
4. **Copy** the API Key once created.
5. Use it as the **x-api-key** header in each API call.

{% hint style="danger" %}
Keep in mind that your API key is tied to your account and should be kept secret. It should not be shared publicly or with others.

If you believe your API key has been compromised, you should [contact our support ](/getting-started/how-can-i-get-support)for assistance​.
{% endhint %}


# How are API calls billed?

API usage is billed by the amount of images **rendered** using [Render API](/api-reference/render-api).

`1 rendered image = 1 credit`

Credits are bought through a **monthly** or a **yearly** subscription. Subscriptions also remove watermarks that show on a FREE plan.

Check pricing options by visiting [this link](https://dynamicmockups.com/pricing/).

{% hint style="info" %}
API calls that result in an error will **not** consume a credit.
{% endhint %}

You can track the remaining credits in your [Subscription](https://app.dynamicmockups.com/subscription) page or the sidebar.

<figure><img src="/files/BNft51ccmDijaFhrX9Ge" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
You get 50 credits for FREE when you create an account.
{% endhint %}


# How can I get support?

If you encounter any technical issues integrating the API, please [**join our Slack Community**](https://join.slack.com/t/dynamicmockups/shared_invite/zt-2165e7s2a-sEo2vTTs22fL2tUZdNFUXg) and our engineers will be happy to assist you.

You can also visit our [FAQ](/getting-started/frequently-asked-questions) and [Troubleshooting](/getting-started/troubleshooting) pages which explain some of the most common issues you may encounter.

You can also contact us at <support@dynamicmockups.com> and we'll be happy to assist and answer as soon as possible.


# Frequently Asked Questions

## How can I monitor the remaining credits?

You can track the remaining credits on the [Subscription](https://app.dynamicmockups.com/subscription) page or sidebar.

<figure><img src="/files/BNft51ccmDijaFhrX9Ge" alt=""><figcaption></figcaption></figure>

## Is there a rate-limiting on API calls?

Yes, the default rate limit is 300 calls per minute.

When the rate limit has been reached, an error code `429` will be returned.

If you need more for your use case, please [contact us](/getting-started/how-can-i-get-support).

## How long rendered image links are saved and accessible?

Rendered image links will be available for 24 hours after creation.

Need longer image retention? We're happy to help! Please [contact us](/getting-started/how-can-i-get-support) to discuss extended retention options.

## How to get rid of a watermark when rendering images?

Our watermark is used when accessing the FREE plan.

To remove the watermark, subscribe to any available plan and the watermark will be removed.

You can find our pricing options by visiting [this link](https://dynamicmockups.com/pricing/).

## What is the response time of the rendered image?

This depends on the mockup complexity and the design asset size you provide.

You can expect to get your rendered image between 0.6 and 2.8 seconds.

If you use your own PSD files to create the mockup, please refer to our guide on [how to optimize the PSD file](https://dynamicmockups.com/knowledge/photoshop-psd-format/) to get the maximum performance.

## Can I use your mockups from a public library?

Sure! We have around 1000 available mockups for free! You can choose any you like and automate for your projects.

Visit our [Public library](https://app.dynamicmockups.com/create) and choose any one you like.

## I want to use my mockup

We fully support Photoshop files. You can upload them and create your mockups.

Please refer to our guide on [how to format the PSD file](https://dynamicmockups.com/knowledge/photoshop-psd-format/) before you upload it.

Once you upload the PSD file, your mockup will be instantly available and you can render images using [Render API](/api-reference/render-api).

## Can I send a binary file instead of a URL in Render API?

Yes, it is possible to send the binary file.

Please refer to our guide on [how to send the binary file instead of URL](https://docs.dynamicmockups.com/api-reference/render-api#smart_objects.asset.file).

## Can I render text instead of an image?

Yes! It is possible to provide a text instead of an image.

Please refer to our **\[Beta] Text Layers** feature in [Render API](/api-reference/render-api).

## I cannot find the right answers and want to ask a question

You can [join our Slack community](https://join.slack.com/t/dynamicmockups/shared_invite/zt-2165e7s2a-sEo2vTTs22fL2tUZdNFUXg) and our engineers will be happy to assist you!


# Troubleshooting

Here you can find the most common issues you may encounter in our API integration.

## Missing "Accept: application/json" header

Our API returns a JSON-formatted response.

If your client does not accept application/json, you may encounter some weird responses such as HTML or not well-formatted response messages.

To avoid any confusion, always send the "**Accept: application/json**" header parameter in any API call.

## (401) Missing API Key

If you get 401 status code and the following response:

```json
{
    "message": "Unauthorized"
}
```

You are probably missing the **x-api-key** header in your API call or your API key is not valid.

To get your API Key you can create one visiting [API Dashboard](https://app.dynamicmockups.com/dashboard-api) page.

## (422) Invalid Mockup UUID

Our [Render API](/api-reference/render-api) requires **Mockup UUID** to know what mockup you want to render.

If you provided an invalid Mockup UUID or didn't provide it at all you may see this response:

```json
{
    "message": "The selected mockup uuid is invalid.",
    "errors": {
        "mockup_uuid": [
            "The selected mockup uuid is invalid."
        ]
    }
}
```

There are two ways to fix this issue.

One is to copy **Mockup UUID** from the web application URL. Example image below.

<figure><img src="/files/WPi0RBEejLbZc61X7iaF" alt=""><figcaption></figcaption></figure>

Another way is to call [Get Mockups API](/api-reference/get-mockups-api) to get all the available mockups from your account and their Mockup UUIDs.

## (422) invalid Smart Object UUID

Same as Mockup UUID, our [Render API ](/api-reference/render-api)requires **Smart Object UUID** to know what place inside a mockup you want to render and where you probably want to put your design asset.

If you provided an invalid Smart Object UUID you may see this response:

```json
{
    "message": "The selected smart_objects.0.uuid is invalid.",
    "errors": {
        "smart_objects.0.uuid": [
            "The selected smart_objects.0.uuid is invalid."
        ]
    }
}
```

There are two ways to fix this issue.

One is to copy **Smart Object UUID** from the web application URL. Example image below.

<figure><img src="/files/WPi0RBEejLbZc61X7iaF" alt=""><figcaption></figcaption></figure>

Another way is to call [Get Mockups API](/api-reference/get-mockups-api) to get all the available mockups from your account and their available smart objects with UUIDs.

## (400) Wrong file URL extension provided

When you provide the design asset you want to render on the mockup using [Render API](/api-reference/render-api), we accept the following file extensions: JPG, JPEG, PNG, WEBP, GIF

If you provide any other, such as SVG, you may see this response:

```json
{
    "success": false,
    "message": "Wrong file URL extension provided. svg is not supported. Supported values are: jpg, jpeg, png, webp, gif"
}
```

## Getting 500 server errors?

This is not an expected behavior from our API.

In this case, please [contact us](/getting-started/how-can-i-get-support) and we will resolve the issue as soon as possible.


# MCP Setup

Let your AI agents interact with the Dynamic Mockups API by using our MCP server.

The Model Context Protocol (MCP) server provides a set of tools that AI agents can use to interact with the Dynamic Mockups account and implement entire workflows into your system.

### Connect to Dynamic Mockups MCP server

{% tabs %}
{% tab title="Lovable" %}
You can enable MCP servers on Lovable if you have a Business or Enterprise account.

Use the following parameters when setting up your custom connector:

* The server URL is `https://mcp.dynamicmockups.com`.
* Use “Api key” as the authentication mechanism and use the Dynamic Mockups API key from your account.
  {% endtab %}

{% tab title="Claude Code" %}
In a file `.mcp.json` in the project root, add the following:

```json
{
   "mcpServers": {
      "dynamic-mockups": {
         "command": "npx",
         "args": ["-y", "@dynamic-mockups/mcp"],
         "env": {
            "DYNAMIC_MOCKUPS_API_KEY": "dynamic_mockups_api_key"
         }
      }
   }
}
```

{% endtab %}

{% tab title="Cursor" %}
In a file `.cursor/mcp.json` in the project, add the following:

```json
{
   "mcpServers": {
      "dynamic-mockups": {
         "command": "npx",
         "args": ["-y", "@dynamic-mockups/mcp"],
         "env": {
            "DYNAMIC_MOCKUPS_API_KEY": "dynamic_mockups_api_key"
         }
      }
   }
}
```

{% endtab %}

{% tab title="ChatGPT" %}
You can enable MCP servers on ChatGPT if you have a Pro, Plus, Business, Enterprise or Education account.

Use the following parameters when setting up your custom connector:

* The server URL is `https://mcp.dynamicmockups.com`.
* Use “Api key” as the authentication mechanism and use the Dynamic Mockups API key from your account.
  {% endtab %}

{% tab title="Other" %}
MCP is an open protocol supported by many clients. Your specific client documentation can advise you on how to connect.

Use the server URL `https://mcp.dynamicmockups.com` and “API key” as the authentication mechanism if possible.

Example:

```json
{
  "dynamic-mockups": {
    "url": "https://mcp.dynamicmockups.com",
    "headers": {
      "x-api-key": "dynamic_mockups_api_key"
    }
  }
}
```

{% endtab %}
{% endtabs %}

### Tools

The server exposes the following MCP tools. If you have feedback or want to see more tools, [contact us](/getting-started/how-can-i-get-support).

<table><thead><tr><th width="257.8125">Tool</th><th>Description</th><th>API reference</th></tr></thead><tbody><tr><td>get_api_info</td><td>Get API knowledge base (billing, rate limits, formats, best practices, support)</td><td><a href="/pages/Ljto6pQA0JdnqmwxMWbS">API Info</a></td></tr><tr><td>embed_mockup_editor</td><td>Implement embeddable mockup editor in your app</td><td><a href="https://docs.dynamicmockups.com/mockup-editor-sdk/embed-editor">Embed Editor SDK</a></td></tr><tr><td>get_catalogs</td><td>Retrieve all available catalogs</td><td><a href="https://docs.dynamicmockups.com/api-reference/catalogs-api#get-catalogs">Get Catalogs</a></td></tr><tr><td>get_collections</td><td>Retrieve collections (optionally filter by catalog)</td><td><a href="https://docs.dynamicmockups.com/api-reference/get-collections-api#get-collections">Get Collections</a></td></tr><tr><td>create_collection</td><td>Create a new collection</td><td><a href="https://docs.dynamicmockups.com/api-reference/get-collections-api#post-collections">Create Collection</a></td></tr><tr><td>get_mockups</td><td>Get list of available mockups with optional filters</td><td><a href="https://docs.dynamicmockups.com/api-reference/get-mockups-api#get-mockups">Get Mockups</a></td></tr><tr><td>get_mockup_by_uuid</td><td>Retrieve a specific mockup by UUID</td><td><a href="https://docs.dynamicmockups.com/api-reference/get-mockups-api#get-mockup-uuid">Get Specific Mockup</a></td></tr><tr><td>create_mockup</td><td>Create a new AI mockup template from a prompt or image URL</td><td><a href="/pages/mhRBe5sEootYOkVk7jyp">MockAnything AI API</a></td></tr><tr><td>get_mockup_creation_status</td><td>Poll the status of a mockup creation task</td><td><a href="/pages/mhRBe5sEootYOkVk7jyp">MockAnything AI API</a></td></tr><tr><td>search_products</td><td>Search the POD product catalog used to ground AI Mockup creations</td><td><a href="/pages/mhRBe5sEootYOkVk7jyp">MockAnything AI API</a></td></tr><tr><td>get_product_details</td><td>Get a product's decoration areas (locations), colors and sizes - use a location to place artwork on a specific spot</td><td><a href="https://docs.dynamicmockups.com/api-reference/mockanything-ai-api#get-mock-anything-products-uuid">MockAnything AI API</a></td></tr><tr><td>get_styles</td><td>Get visual styles available for MockAnything AI mockup generation</td><td><a href="https://docs.dynamicmockups.com/api-reference/mockanything-ai-api#get-mock-anything-styles">MockAnything AI API</a></td></tr><tr><td>create_render</td><td>Create a single mockup render with design assets</td><td><a href="https://docs.dynamicmockups.com/api-reference/render-api#post-renders">Create a Mockup Render</a></td></tr><tr><td>create_batch_render</td><td>Render multiple mockups in one request</td><td><a href="https://docs.dynamicmockups.com/api-reference/batch-render-mockups-api#post-renders-batch">Render Multiple Mockups</a></td></tr><tr><td>export_print_files</td><td>Export high-resolution print files for production</td><td><a href="https://docs.dynamicmockups.com/api-reference/render-print-files-api#post-renders-print-files">Export Print Files</a></td></tr><tr><td>get_video_models</td><td>List MotionMockups AI (image-to-video) models with durations, credit costs and aspect ratios</td><td><a href="/pages/pMR59OVGM9htNMWd2fja">MotionMockups AI API</a></td></tr><tr><td>get_video_status</td><td>Poll the status of a MotionMockups AI video request; returns the video URL when complete</td><td><a href="/pages/pMR59OVGM9htNMWd2fja">MotionMockups AI API</a></td></tr><tr><td>create_video</td><td>Generate a AI video from a product image URL (MotionMockups AI) - returns a <code>request_id</code> to poll</td><td><a href="/pages/pMR59OVGM9htNMWd2fja">MotionMockups AI API</a></td></tr><tr><td>upload_psd</td><td>Upload a PSD file and optionally create a mockup template</td><td><a href="https://docs.dynamicmockups.com/api-reference/psd-upload-api#post-psd-upload">Upload a PSD File</a></td></tr><tr><td>delete_psd</td><td>Delete a PSD file with optional related mockups deletion</td><td><a href="https://docs.dynamicmockups.com/api-reference/psd-upload-api#post-psd-delete">Delete a PSD File</a></td></tr><tr><td>tool_create_embroidery_effect</td><td>Transform any image into a realistic embroidery/stitched effect</td><td><a href="/pages/96Vj9o99qPvpEaLWuSoz">Tool Create Embroidery Effect</a></td></tr></tbody></table>

### Use cases

Ask your AI assistant to:

| Use Case                       | Example Prompt                                                                                                                                |
| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Embed mockup editor            | "Add the full mockup editor to my web application"                                                                                            |
| List catalogs                  | "Get my Dynamic Mockups catalogs"                                                                                                             |
| Browse mockups                 | "Show me all mockups in my T-shirt collection"                                                                                                |
| Create a Mockup from Prompt    | "Create a mockup of a guy wearing a Gildan 5000 t-shirt while running, then render my logo from url: <https://example.com/my-logo.png> on it" |
| Create a Mockup from Image URL | "Turn this product photo into a mockup: <https://example.com/product.jpg>, and render my artwork on it"                                       |
| Decorate a specific area       | "Create a Gildan 5000 t-shirt mockup and place my logo from url: <https://example.com/my-logo.png> on the left chest"                         |
| Single render                  | "Create a mockup render using any T-shirt mockup with my artwork from url: <https://example.com/my-design.png>"                               |
| Batch render                   | "Render my artwork from url: <https://example.com/my-design.png> on all mockups in the Winter T-shirt collection"                             |
| Create a video from image      | "Create a video from this generated mockup image URL <https://example.com/my-logo.png>"                                                       |
| Create collection              | "Create a new collection called Winter 2025 Hoodies"                                                                                          |
| Upload PSD                     | "Upload my PSD mockup from url: <https://example.com/my-mockup.psd> and create a template from it"                                            |
| API info                       | "What are the rate limits and supported file formats for Dynamic Mockups?"                                                                    |
| Print files                    | "Export print-ready files at 300 DPI for my poster mockup"                                                                                    |
| Create Embroidery Effect       | "Transform my logo into an embroidery effect from url: <https://example.com/my-logo.png>"                                                     |


# Embroidery Effect API

## Create Embroidery Effect

> Processes an image to generate an embroidery effect. Requires either an image URL or base64-encoded image data.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/tools/embroidery":{"post":{"summary":"Create Embroidery Effect","description":"Processes an image to generate an embroidery effect. Requires either an image URL or base64-encoded image data.","operationId":"createEmbroidery","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string","description":"API key required for authentication."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"image_url":{"type":"string","format":"uri","description":"URL of the image to process. Either image_url or image_data_b64 must be provided."},"image_data_b64":{"type":"string","description":"Base64-encoded image data. Either image_url or image_data_b64 must be provided."}}}}}},"responses":{"200":{"description":"Embroidery effect successfully generated.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"export_path":{"type":"string","description":"The URL where the generated embroidery image can be accessed."}}},"success":{"type":"boolean","description":"Indicates if the API call was successful."},"message":{"type":"string","description":"A message about the API response."}}}}}},"400":{"description":"Bad request due to invalid input parameters. Either image_url or image_data_b64 must be provided."},"401":{"description":"Unauthorized request, invalid or missing API key."},"403":{"description":"Insufficient credits for this action.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"500":{"description":"Failed to process embroidery request.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}}}}}}}
```

### Overview

The Embroidery Tool transforms any image into a realistic embroidery or stitched effect. It's ideal to transform an existing artwork image into embroidery and render it on the selected mockup template.

The embroidery versions of designs are often needed for print-on-demand products.

### Provide artwork from a public URL or Base64

Provide your image via `image_url` using a public URL, or `image_data_b64` using a base64-encoded string. Only one input method is required per request. Supported formats include **PNG**, **JPG**, and **WEBP**.

### Output

The API returns an `export_path` containing a URL to the generated embroidery image. This output URL is temporary and should be downloaded or saved into permanent storage.

You can use the returned embroidery image in your mockup renders or save it to your asset library for later use.

### Credit cost

This endpoint consumes 6 credits per successful request. Credits are only deducted after successful processing.

### Tips for best results

For best results, use high-contrast images with clean edges. Simpler designs with fewer colors produce more realistic embroidery effects.

### Try it out in the API Playground

Visit our [API Playground link](https://playground.dynamicmockups.com/use-cases/embroidery-effect/) to try the Embroidery effect in real time.

{% embed url="<https://playground.dynamicmockups.com/use-cases/embroidery-effect/>" %}


# MockAnything AI API

## Create MockAnything AI Mockup

> Create a new MockAnything AI mockup. Exactly one of \`prompt\`, \`image\_url\`, or \`image\_file\` is required.\
> \
> \- \`prompt\`: text prompt used to AI-generate an image. Returns a \`task\_id\` that must be polled via \`/mock-anything/status/{taskId}\`.\
> \- \`image\_url\`: URL of an existing image to use as the mockup image. Completes synchronously.\
> \- \`image\_file\`: uploaded image file (use \`multipart/form-data\`). Completes synchronously.<br>

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups MockAnything AI API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}},"schemas":{"DecorationInput":{"type":"object","description":"A decoration to place on the product when creating a mockup.","properties":{"location":{"type":"string","description":"Decoration area to target, from `GET /mock-anything/products/{uuid}`. When omitted, the product's default decoration area is used."},"position_id":{"type":"string","description":"Exact stored decoration position identifier from `decorations[].position_id` in the product detail response. Use this to distinguish provider-specific positions that share a canonical location."},"source":{"type":"string","description":"Enabled provider source from the selected product-detail decoration's `sources` list. Matching trims surrounding whitespace and is case-insensitive; the canonical stored source is forwarded. When omitted, the position's default source is used."},"decoration_method":{"type":"string","description":"Decoration method to apply (e.g. `dtg`, `screen_print`, `embroidery`, `dtf`, `heat_transfer`)."},"imprint_size":{"type":"object","description":"Desired physical imprint size.","properties":{"width":{"type":"number"},"height":{"type":"number"},"unit":{"type":"string"}}}}},"MockAnythingWarning":{"type":"object","description":"Non-blocking warning returned on create and optionally echoed by status.","properties":{"location":{"type":"string","description":"Requested decoration location that triggered the warning."},"code":{"type":"string","description":"Machine-readable warning code."},"message":{"type":"string","description":"Partner-facing warning message."}}}}},"paths":{"/mock-anything/create":{"post":{"summary":"Create MockAnything AI Mockup","description":"Create a new MockAnything AI mockup. Exactly one of `prompt`, `image_url`, or `image_file` is required.\n\n- `prompt`: text prompt used to AI-generate an image. Returns a `task_id` that must be polled via `/mock-anything/status/{taskId}`.\n- `image_url`: URL of an existing image to use as the mockup image. Completes synchronously.\n- `image_file`: uploaded image file (use `multipart/form-data`). Completes synchronously.\n","operationId":"createMockAnythingMockup","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"prompt":{"type":"string","description":"Text prompt used to AI-generate the mockup image. Required unless `image_url` or `image_file` is provided."},"image_url":{"type":"string","format":"uri","description":"URL of an existing image to use as the mockup image. Required unless `prompt` or `image_file` is provided."},"enhance_prompt":{"type":"boolean","description":"Whether to run prompt enhancement before generation. Only applies to the `prompt` flow."},"product":{"type":"object","description":"Optional product context used to ground the AI generation.","properties":{"uuid":{"type":"string","format":"uuid","description":"UUID of a POD product (obtained via `GET /mock-anything/products`) to anchor the AI generation around a specific product type."},"selected_size":{"type":"string","maxLength":50,"description":"Optional product size. Must exactly match one of the product's `sizes[].label` values (from `GET /mock-anything/products/{uuid}`). A matched size is taken into account by the generation where the product's category and size data support it (real-world scale and/or output aspect). A value that matches none of the product's sizes is rejected with a 400 error naming the product's valid size labels; when the product cannot be resolved, the value is accepted without effect. Only meaningful together with `product.uuid`."},"color_name":{"type":"string","maxLength":255,"description":"Optional exact product color name from `GET /mock-anything/products/{uuid}`. The value is case-sensitive and must match one of `colors[].name`. Product detail must be available to validate this selector."},"decorations":{"type":"array","description":"Optional list of decoration areas to place on the product. Each item can target a canonical `location` or an exact `position_id`, and can select an exact enabled `source`, all from `GET /mock-anything/products/{uuid}`. When omitted, the product's default decoration area and source are used.\n","items":{"$ref":"#/components/schemas/DecorationInput"}}}},"model":{"type":"string","description":"AI model used for generation. Only applies to the `prompt` flow. Required when `style` is provided. When omitted, product-backed generations default to `nano_banana_2` and prompt-only generations without a product default to `seedream_4_0`. `nano_banana_lite` and `gpt_image_2` apply to product-backed generations (a `product.uuid` present).","enum":["nano_banana_2","nano_banana_lite","seedream_4_0","seedream_4_5","gpt_image_2"]},"style":{"type":"string","description":"Visual style applied to the AI generation (e.g. `polaroid-etsy`, `ugc`, `fashion`). Use `GET /mock-anything/styles?model={model}` to list the styles available for a given model; not every model supports every style. When `style` is provided, `model` is required."},"name":{"type":"string","maxLength":255,"description":"Optional mockup name shown in the dashboard and returned in the `mockup.name` field."},"collections":{"type":"array","description":"Optional collections to attach the mockup to. Each item is either an existing collection (by `uuid`) or a new collection to create (by `name`). Exactly one of `uuid` or `name` must be provided per item.","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","description":"UUID of an existing collection."},"name":{"type":"string","maxLength":255,"description":"Name of a new collection to create and attach."}}}},"catalog_uuid":{"type":"string","format":"uuid","description":"Optional UUID of the catalog the mockup belongs to. Defaults to the workspace's default catalog."}}}},"multipart/form-data":{"schema":{"type":"object","properties":{"image_file":{"type":"string","format":"binary","description":"Image file upload (JPG, JPEG, PNG, GIF, or WebP; max 10 MB). Required unless `prompt` or `image_url` is provided."},"name":{"type":"string","maxLength":255,"description":"Optional mockup name."},"collections":{"type":"array","description":"Collections to attach the mockup to. Send as `collections[0][uuid]` or `collections[0][name]` form fields.","items":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid"},"name":{"type":"string"}}}},"catalog_uuid":{"type":"string","format":"uuid"}},"required":["image_file"]}}}},"responses":{"200":{"description":"Template creation started.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"task_id":{"type":"string","format":"uuid","description":"The task identifier. Poll `GET /mock-anything/status/{taskId}` with this value to track progress. The same value will be used as the `mockup.uuid` once the mockup is created."},"status":{"type":"string","description":"Initial task status."},"selected_size":{"type":["string","null"],"description":"Echoes the requested `product.selected_size` value from the create request. The mockup has not run yet, so this is not an applied or resolved size."},"aspect_ratio":{"type":["string","null"],"description":"Echoes the requested `aspect_ratio` value from the create request. The mockup has not run yet."},"warnings":{"type":"array","description":"Non-blocking create-time warnings. A warning does not reject the request.","items":{"$ref":"#/components/schemas/MockAnythingWarning"}}}},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"Bad request due to invalid input parameters (e.g. missing prompt/image_url/image_file, invalid model, unsupported image type)."},"401":{"description":"Unauthorized request, invalid or missing API key."},"403":{"description":"No credits available, or the authenticated user does not have access to the provided catalog or collection."},"404":{"description":"The provided `catalog_uuid` or a `collections[].uuid` could not be found."},"422":{"description":"An exact product color, decoration position, or decoration source does not exist on the selected product."},"500":{"description":"Failed to start AI generation or upload the provided image."},"503":{"description":"Product detail is temporarily unavailable, so an explicit `color_name`, `position_id`, or `source` selector cannot be validated safely."}}}}}}
```

## Get MockAnything AI Mockup Status

> Poll the status of a MockAnything AI mockup creation task. The response contains a \`state\` field:\
> \
> \- \`PROGRESS\`: the task is still running. \`image\_url\` and \`mockup\` are \`null\`.\
> \- \`SUCCESS\`: the task finished and the mockup has been created. \`image\_url\` is populated and \`mockup\` contains a payload that can be used immediately as \`mockup\_uuid\` in the Render API.\
> \
> Other states (e.g. \`FAILURE\`) indicate the task terminated without producing a mockup.<br>

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups MockAnything AI API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}},"schemas":{"StatusProgressResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"task_id":{"type":"string","format":"uuid"},"state":{"type":"string","description":"Current task state.","enum":["PROGRESS","PENDING","FAILURE"]},"image_url":{"type":["string","null"],"description":"Always `null` while the task is in progress."},"status":{"type":"string","description":"Human-readable status."},"mockup":{"type":["object","null"],"description":"Always `null` while the task is in progress."},"warnings":{"type":"array","description":"Non-blocking create-time warnings. Usually absent from status responses.","items":{"$ref":"#/components/schemas/MockAnythingWarning"}}}},"success":{"type":"boolean"},"message":{"type":"string"}}},"MockAnythingWarning":{"type":"object","description":"Non-blocking warning returned on create and optionally echoed by status.","properties":{"location":{"type":"string","description":"Requested decoration location that triggered the warning."},"code":{"type":"string","description":"Machine-readable warning code."},"message":{"type":"string","description":"Partner-facing warning message."}}},"StatusSuccessResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"task_id":{"type":"string","format":"uuid"},"state":{"type":"string","enum":["SUCCESS"]},"image_url":{"type":"string","format":"uri","description":"URL of the generated or uploaded mockup image."},"status":{"type":"string"},"selected_size":{"type":["string","null"],"description":"Requested `product.selected_size` value echoed back by MockAnything AI when present. This confirms the requested size round-trip; it is not proof of the size applied to rendering."},"aspect_ratio":{"type":["string","null"],"description":"Aspect ratio actually used by MockAnything AI when present."},"mockup":{"$ref":"#/components/schemas/Mockup"},"warnings":{"type":"array","description":"Non-blocking create-time warnings. Usually absent from status responses.","items":{"$ref":"#/components/schemas/MockAnythingWarning"}}}},"success":{"type":"boolean"},"message":{"type":"string"}}},"Mockup":{"type":"object","description":"Mockup payload matching the MockAnything entry of the Get Mockups API. Use `uuid` as `mockup_uuid` in the Render API.","properties":{"type":{"type":"string","description":"Always `mockanything` for mockups created via this API."},"uuid":{"type":"string","format":"uuid","description":"Mockup UUID. Matches the `task_id`."},"name":{"type":"string","description":"Mockup name. Falls back to the prompt or a default if no `name` was provided on creation."},"thumbnail":{"type":"string","format":"uri","description":"URL of the mockup thumbnail."},"smart_objects":{"type":"array","description":"Print areas detected on the mockup. Each item corresponds to a renderable artwork slot and can be referenced by `uuid` in the Render API's `smart_objects` payload. Eligible templates may include a product-wide full-canvas entry identified by `kind: product_all_over`; it may be absent on other templates. That entry is explicit-only: referencing it affects a render only when the request supplies an artwork URL/file, while a bare, color-only, pattern-only, or geometry-only reference is inert. When artwork is supplied without an explicit size, it defaults to the full mockup canvas. Including this entry in a Render Print Files request rejects the whole request with HTTP 400 and produces no print files; omit it and send only named areas.","items":{"$ref":"#/components/schemas/SmartObject"}},"collections":{"type":"array","items":{"$ref":"#/components/schemas/Collection"}},"thumbnails":{"type":"array","description":"Additional thumbnail sizes. Always empty for MockAnything mockups.","items":{}},"products":{"type":"array","description":"Product context (when a POD product was associated with the mockup). Each item describes the grounding product.","items":{"$ref":"#/components/schemas/Product"}},"unrendered_decorations":{"type":"array","description":"Requested decoration areas that were not rendered, so no artwork should be placed there. Present on the status response; empty when all requested areas rendered.","items":{"$ref":"#/components/schemas/UnrenderedDecoration"}}}},"SmartObject":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","description":"The UUID of the smart object / print area. Use this as `smart_objects[].uuid` in the Render API."},"name":{"type":"string","description":"Name of the print area (e.g. \"Front\", \"All-over\")."},"kind":{"type":"string","enum":["product_all_over"],"description":"Present as `product_all_over` only on the product-wide full-canvas entry; absent on conventional named areas."},"size":{"type":"object","properties":{"width":{"type":"integer"},"height":{"type":"integer"}}},"position":{"type":"object","properties":{"top":{"type":"integer"},"left":{"type":"integer"}}},"print_area_presets":{"type":"array","description":"Always empty for MockAnything mockups.","items":{}},"decoration":{"type":"object","description":"The named decoration area this smart object renders. Absent when `kind` is `product_all_over`, even when the MockAnything mockup is product-grounded.","properties":{"location":{"type":"string","description":"Decoration area location. Matches a `decorations[].location` from the product detail endpoint."},"name":{"type":"string","description":"Human-readable area label."}}}}},"Collection":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"Product":{"type":"object","properties":{"name":{"type":"string"},"brand":{"type":["string","null"]},"category":{"type":["string","null"]},"subcategory":{"type":["string","null"]},"colors":{"type":"array","items":{"type":"object"}},"uuid":{"type":["string","null"],"description":"Canonical MockAnything product UUID when present. Legacy or alias-mapped identifiers may resolve as null."},"slug":{"type":["string","null"],"description":"Canonical human-readable product slug when present. Legacy or alias-mapped identifiers may resolve as null."}}},"UnrenderedDecoration":{"type":"object","properties":{"location":{"type":"string"},"reason":{"type":"string","description":"Open string describing why the requested decoration did not render. Known values:\n`not_visible_in_generated_image` means the area has placed render geometry but is hidden in this generated image.\n`no_placed_print_area_for_location` means the product has no placed print-area geometry for the requested location at product or profile tier.\nClients must treat unknown reason values as \"not rendered, place no artwork.\"\n"}}}}},"paths":{"/mock-anything/status/{taskId}":{"get":{"summary":"Get MockAnything AI Mockup Status","description":"Poll the status of a MockAnything AI mockup creation task. The response contains a `state` field:\n\n- `PROGRESS`: the task is still running. `image_url` and `mockup` are `null`.\n- `SUCCESS`: the task finished and the mockup has been created. `image_url` is populated and `mockup` contains a payload that can be used immediately as `mockup_uuid` in the Render API.\n\nOther states (e.g. `FAILURE`) indicate the task terminated without producing a mockup.\n","operationId":"getMockAnythingMockupStatus","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."},{"in":"path","name":"taskId","required":true,"schema":{"type":"string","format":"uuid"},"description":"The `task_id` returned from `POST /mock-anything/create`."}],"responses":{"200":{"description":"Task status retrieved successfully. Response shape depends on task `state`.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/StatusProgressResponse"},{"$ref":"#/components/schemas/StatusSuccessResponse"}]}}}},"401":{"description":"Unauthorized request, invalid or missing API key."},"500":{"description":"Failed to retrieve task status from the rendering service."}}}}}}
```

## Search POD Products

> Search the Print-on-Demand (POD) product catalog used to ground AI generations. The returned \`uuid\` can be passed as \`product.uuid\` when creating a mockup so the generated image is anchored to that specific product (e.g. a Gildan 5000 t-shirt).<br>

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups MockAnything AI API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}},"schemas":{"PodProduct":{"type":"object","properties":{"name":{"type":"string","description":"Product name."},"uuid":{"type":"string","format":"uuid","description":"Product UUID. Pass as `product.uuid` when creating a mockup."}}}}},"paths":{"/mock-anything/products":{"get":{"summary":"Search POD Products","description":"Search the Print-on-Demand (POD) product catalog used to ground AI generations. The returned `uuid` can be passed as `product.uuid` when creating a mockup so the generated image is anchored to that specific product (e.g. a Gildan 5000 t-shirt).\n","operationId":"searchMockAnythingProducts","parameters":[{"in":"header","name":"Accept","required":false,"schema":{"type":"string","enum":["application/json"]},"description":"JSON is recommended; errors return JSON regardless of this header."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."},{"in":"query","name":"query","required":true,"schema":{"type":"string","minLength":1},"description":"Search term matched against POD product names."}],"responses":{"200":{"description":"POD products matching the query.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PodProduct"}},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized request, invalid or missing API key."},"422":{"description":"Validation error. `query` is missing or empty."},"500":{"description":"Failed to fetch POD products."}}}}}}
```

## Get POD Product Details

> Get the full detail of a single POD product: its identity, available decoration areas (\`decorations\`), colors, and supported sizes. Use a decoration's \`position\_id\` and one of its \`sources\` for exact selection when creating a mockup. \`location\` remains available for canonical area selection.<br>

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups MockAnything AI API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}},"schemas":{"PodProductDetail":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid"},"name":{"type":"string"},"brand":{"type":["string","null"]},"style_code":{"type":["string","null"]},"category":{"type":["string","null"]},"subcategory":{"type":["string","null"]},"decorations":{"type":"array","description":"Decoration areas available on this product. For exact selection, pass a `position_id` and one of that position's `sources` when creating a mockup.","items":{"$ref":"#/components/schemas/DecorationArea"}},"colors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"hex":{"type":["string","null"]}}}},"supported_sizes":{"type":"array","items":{"type":"string"}}}},"DecorationArea":{"type":"object","properties":{"position_id":{"type":"string","description":"Exact stored decoration position identifier. Pass as `decorations[].position_id` when exact position selection is required."},"location":{"type":"string","description":"Canonical decoration area identifier. Pass as `decorations[].location` for legacy canonical selection."},"name":{"type":"string","description":"Human-readable area label."},"surface":{"type":"string","description":"Product surface the area belongs to."},"sources":{"type":"array","description":"Deduplicated enabled provider source identifiers available for this exact position. Pass one as `decorations[].source`.","items":{"type":"string"}}}}}},"paths":{"/mock-anything/products/{uuid}":{"get":{"summary":"Get POD Product Details","description":"Get the full detail of a single POD product: its identity, available decoration areas (`decorations`), colors, and supported sizes. Use a decoration's `position_id` and one of its `sources` for exact selection when creating a mockup. `location` remains available for canonical area selection.\n","operationId":"getMockAnythingProductDetail","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."},{"in":"path","name":"uuid","required":true,"schema":{"type":"string","format":"uuid"},"description":"UUID of the POD product (from `GET /mock-anything/products`)."}],"responses":{"200":{"description":"Product detail retrieved successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/PodProductDetail"},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized request, invalid or missing API key."},"404":{"description":"Product not found."},"500":{"description":"Failed to fetch the product detail."}}}}}}
```

## List Available Styles

> List the visual styles that can be applied to an AI-generated mockup. The returned \`id\` can be passed as \`style\` when creating a mockup to apply that aesthetic to the generation. Pass a \`model\` query parameter to scope the result to styles supported by that model; not every model supports every style. When \`model\` is omitted the response includes every known style across all models.<br>

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups MockAnything AI API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}},"schemas":{"Style":{"type":"object","properties":{"id":{"type":"string","description":"Style identifier. Pass as `style` when creating a mockup."},"description":{"type":"string","description":"Short description of the aesthetic this style produces."},"available_with":{"type":"array","description":"Models that support this style.","items":{"type":"string"}}}}}},"paths":{"/mock-anything/styles":{"get":{"summary":"List Available Styles","description":"List the visual styles that can be applied to an AI-generated mockup. The returned `id` can be passed as `style` when creating a mockup to apply that aesthetic to the generation. Pass a `model` query parameter to scope the result to styles supported by that model; not every model supports every style. When `model` is omitted the response includes every known style across all models.\n","operationId":"listMockAnythingStyles","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."},{"in":"query","name":"model","required":false,"schema":{"type":"string","enum":["nano_banana_2","nano_banana_lite","seedream_4_0","seedream_4_5","gpt_image_2"]},"description":"Optional model filter. When provided, only styles available for that model are returned."}],"responses":{"200":{"description":"Available styles.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Style"}},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"Bad request. Invalid `model` value."},"401":{"description":"Unauthorized request, invalid or missing API key."},"500":{"description":"Failed to fetch styles."}}}}}}
```

### Overview

MockAnything AI lets you create a new mockup on the fly, either by generating an image from a text prompt or by bringing an image you already have. Once created, each mockup behaves exactly like one from the [Get Mockups API](/api-reference/get-mockups-api) - you pass its `uuid` to the [Render Mockup API](/api-reference/render-api) to print artwork on it.

Creation is asynchronous: you submit a task, then poll until the mockup is ready.

### Workflow

1. *(Optional)* Search POD products to find a `product.uuid` for grounding the generation around a specific product.
2. *(Optional)* Get a product's decoration areas via `Get POD Product Details` action, then target one or more with `product.decorations` on the mockup creation.
3. (*Optional*) List available styles to set the visual direction of a mockup using a `style` parameter.
4. Call **Create MockAnything AI Mockup**. You get back a `task_id`.
5. Poll **Get MockAnything AI Mockup Status** until `state` is `SUCCESS`. The response includes a `mockup` object. Use `mockup.uuid` as the `mockup_uuid` in the [Render Mockup API](/api-reference/render-api).

### Three ways to create a mockup

`prompt` - Generate a brand-new image with AI. Best when you don't already have reference imagery, or when you want to quickly produce variations of a scene. Runs\
asynchronously.

`image_url` - Turn a publicly-accessible image into a MockAnything mockup. Use this when you already host product photos somewhere. Completes on the first status call.

`image_file` - Upload an image file directly (`multipart/form-data`). Best for private images you don't want to host publicly. Completes on the first status call.

Exactly one of these three must be provided per request. The remaining fields (`name`, `collections`, `catalog_uuid`) work the same for all three modes.

{% hint style="info" %}
`product.uuid`, `model`, and `enhance_prompt` only apply to the `prompt` flow. They're ignored when you send `image_url` or `image_file`.
{% endhint %}

### Polling for completion

After `POST /mock-anything/create`, poll `GET /mock-anything/status/{taskId}` with the returned `task_id`. The response contains a `state` field:

* `PROGRESS` - still running. `image_url` and `mockup` are `null`. Poll again in a moment.
* `SUCCESS` - ready. `image_url` is populated and `mockup` contains everything you need for the [Render Mockup API](/api-reference/render-api).
* `FAILURE` - the task terminated without producing a mockup.

{% hint style="info" %}
We recommend polling every 2 seconds. AI generations typically finish in 10–30 seconds; `image_url` and `image_file` flows are usually ready on the very first status call.
{% endhint %}

### Using your new mockup

Once `state` is `SUCCESS`, the `mockup` field looks identical to an entry from the [Get Mockups API](/api-reference/get-mockups-api), with `type: "mockanything"`. Three fields matter for rendering:

* `mockup.uuid` - pass as `mockup_uuid` in the [Render Mockup API](/api-reference/render-api).
* `mockup.smart_objects[].uuid` - each print area detected on the image. Reference these as `smart_objects[].uuid` in the [Render Mockup API](/api-reference/render-api) payload to place your artwork on each area.
* `mockup.smart_objects[].decoration` - optional decoration area for this product, when the mockup was grounded with a `product.uuid` on mockup creation. Use it to pick the right smart object for a specific spot.

From here everything works exactly like rendering a classic mockup. The [Render Mockup API](/api-reference/render-api) handles both types through the same endpoint, so you don't need a separate\
integration.

### Grounding the AI with a product

If you want the AI to anchor the generated image around a specific product (say a Gildan 5000 t-shirt rather than a generic tee), first look up a product with **Search POD Products**, then pass the returned `uuid` as `product.uuid` on the create request.

`GET /mock-anything/products?query=gildan`

The response is a simple list of `{ name, uuid }` entries. Pick the one that matches the product you're mocking up.

{% hint style="info" %}
Grounding is optional. Skip it if you just want the model to pick a natural composition based on the prompt alone.
{% endhint %}

### Targeting decoration areas

When you ground a generation with a product, you can also tell the AI where on that product the artwork should sit - the full chest, left chest, a sleeve, the back, and so on. These spots are called decorations.

First, look up the decorations a product offers with **Get POD Product Details**:

`GET /mock-anything/products/{uuid}`&#x20;

The response includes a `decorations` array. Each entry has a `location` (the ID you pass back on create), a human-readable `name`, and the `surface` it sits on:

```json
{
    "decorations": [
      { "location": "front_full_chest", "name": "Full Chest", "surface": "front" },
      { "location": "left_chest", "name": "Left Chest", "surface": "front" },
      { "location": "back_full", "name": "Full Back", "surface": "back" }
    ]
}
```

Then pass the `location`(s) you want as `product.decorations` on the mockup creation request:

```json
{
    "prompt": "a person wearing a t-shirt in a sunny park",
    "model": "nano_banana_2",
    "product": {
      "uuid": "8429f141-5289-4d3b-9a83-7417130adc3a",
      "decorations": [
        { "location": "front_full_chest" }
      ]
    }
}
```

{% hint style="info" %}
Decorations are optional. Omit \`product.decorations\` and the product's default area is used. Send no \`product\` at all and the AI composes freely, returning a single default area.
{% endhint %}

### Set visual direction with a style

If you want the AI mockup to land in a specific look (warm Polaroid, editorial flash, casual UGC, etc.) instead of the default photographic style, list the styles available for your chosen model with **List Available Styles**, then pass the returned `id` as `style` on the **create** request.

`GET /mock-anything/styles?model=nano_banana_2`&#x20;

The response is a list of `{ id, description, available_with }` entries. Read the description to pick the look you want, then send its `id` as `style`.

{% hint style="info" %}
Style is optional. Skip it for the default look. When you do pass `style`, `model` is also required - not every model supports every style.

The `style` will be applied only if you create a mockup using a `prompt`
{% endhint %}

### Catalogs and collections

MockAnything mockups live inside your catalogs and collections, the same as any other mockup:

* `catalog_uuid` - places the mockup in a specific catalog. Defaults to your workspace's default catalog. See the [Catalogs API](/api-reference/catalogs-api) to list available catalogs.
* `collections` - attaches the mockup to one or more collections. Each entry is either an existing collection referenced by `uuid`, or a new one referenced by `name` (which will find-or-create for you). See the [Collections API](/api-reference/get-collections-api) to manage collections.

{% hint style="info" %}
Passing `collections[].name` will create a collection if one with that name doesn't exist in the target catalog - a handy way to organize on the fly. Use `collections[].uuid` when you already know which collection to attach to.
{% endhint %}

### Choosing a model

The `model` parameter controls which AI model generates your image. Different models trade off speed, quality, and credit cost. If you don't set `model`, generation will use `seedream_4_0` as default.

<table><thead><tr><th>Model</th><th data-type="number">Credits</th><th>Speed</th><th>Quality</th><th>Best for</th></tr></thead><tbody><tr><td>seedream_4_0</td><td>5</td><td>~20s</td><td>Medium</td><td>Quick iterations and early exploration</td></tr><tr><td>seedream_4_5</td><td>6</td><td>~40s</td><td>Good</td><td>Higher fidelity without the pro price</td></tr><tr><td>nano_banana_2</td><td>14</td><td>~30s</td><td>High</td><td>Production-quality, final mockups</td></tr></tbody></table>

{% hint style="info" %}
Credits are charged when the task reaches `SUCCESS`. Failed generations (`FAILURE` state) don't cost anything.
{% endhint %}

{% hint style="info" %}
The credits pricing per `model` applies only if you use the `prompt` for mockup generation. If you generate a mockup from `image_url` or `image_file`, 4 credits cost is applied per generation.
{% endhint %}

### Rate Limit

**Create MockAnything AI Mockup** endpoint is limited to 50 requests per minute.

Requests exceeding this limit will receive a `429 Too Many Requests` response. If you expect\
higher throughput, contact support to discuss your use case.


# MotionMockups AI API

## Submit a MotionMockups AI Request

> Queue a video generation request for the provided image and return a \`request\_id\` to poll.\
> \
> Provide your own \`prompt\` for full control, or omit it to let the API generate a prompt from the image (set \`skip\_discovery: true\` to skip auto-prompting and use a neutral default instead). Allowed \`duration\` and \`aspect\_ratio\` values depend on the selected \`model\` — see \`GET /motion-mockups/models\`.<br>

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups MotionMockups AI API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/motion-mockups/submit":{"post":{"summary":"Submit a MotionMockups AI Request","description":"Queue a video generation request for the provided image and return a `request_id` to poll.\n\nProvide your own `prompt` for full control, or omit it to let the API generate a prompt from the image (set `skip_discovery: true` to skip auto-prompting and use a neutral default instead). Allowed `duration` and `aspect_ratio` values depend on the selected `model` — see `GET /motion-mockups/models`.\n","operationId":"submitMotionMockup","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"start_image_url":{"type":"string","format":"uri","maxLength":2000,"description":"Publicly accessible URL of the source image to animate."},"model":{"type":"string","description":"The MotionMockups AI model to use. Defaults to the standard model when omitted.","enum":["kling_v2.6","kling_v3_pro"]},"prompt":{"type":"string","maxLength":2500,"description":"Optional text prompt describing the desired video. When omitted, a prompt is generated from the image."},"negative_prompt":{"type":"string","maxLength":1000,"description":"Optional description of what to avoid in the generated video."},"duration":{"type":"integer","description":"Video length in seconds. Allowed values depend on the selected model (see `GET /motion-mockups/models`). Defaults to the model's default duration."},"aspect_ratio":{"type":"string","description":"Output aspect ratio. Only supported by some models, with a model-specific set of allowed values (see `GET /motion-mockups/models`)."},"generate_audio":{"type":"boolean","description":"Whether to also generate audio. Increases the credit cost by a model-specific multiplier."},"skip_discovery":{"type":"boolean","description":"When `true` and no `prompt` is provided, skip image auto-prompting and use a neutral default prompt."}},"required":["start_image_url"]}}}},"responses":{"200":{"description":"Request successfully queued.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"request_id":{"type":"string","description":"Identifier used to poll the request status."},"status":{"type":"string","description":"Initial queue status."},"model":{"type":"string"},"credits":{"type":"integer","description":"Credits reserved for this request."},"status_url":{"type":"string","description":"Convenience URL for polling this request's status."}}},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."},"403":{"description":"Insufficient credits, or no active workspace for the API key."},"422":{"description":"Validation failed."},"500":{"description":"Failed to submit the request to the generation service."}}}}}}
```

## Get MotionMockups AI Request Status

> Return the current status of a previously submitted request. While generation is in progress \`status\` is \`IN\_QUEUE\` or \`PROCESSING\`. On success \`status\` is \`COMPLETED\` and the response includes a \`video\` object with a permanent URL. Terminal failures report \`FAILED\`, \`CANCELLED\` or \`ERROR\` and any reserved credits are refunded automatically.<br>

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups MotionMockups AI API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/motion-mockups/status/{requestId}":{"get":{"summary":"Get MotionMockups AI Request Status","description":"Return the current status of a previously submitted request. While generation is in progress `status` is `IN_QUEUE` or `PROCESSING`. On success `status` is `COMPLETED` and the response includes a `video` object with a permanent URL. Terminal failures report `FAILED`, `CANCELLED` or `ERROR` and any reserved credits are refunded automatically.\n","operationId":"getMotionMockupStatus","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."},{"in":"path","name":"requestId","required":true,"schema":{"type":"string"},"description":"The `request_id` returned by the submit endpoint."}],"responses":{"200":{"description":"Current status of the request.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"request_id":{"type":"string"},"status":{"type":"string","description":"One of IN_QUEUE, PROCESSING, COMPLETED, FAILED, CANCELLED, ERROR."},"queue_position":{"type":"integer","nullable":true,"description":"Position in the queue while the status is IN_QUEUE or PROCESSING."},"video":{"type":"object","description":"Present only when status is COMPLETED.","properties":{"url":{"type":"string","description":"Permanent URL of the generated video."},"content_type":{"type":"string"},"file_name":{"type":"string"},"file_size":{"type":"integer","nullable":true}}}}},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized request, invalid or missing API key."},"403":{"description":"No active workspace for the API key."},"404":{"description":"No request with that `request_id` exists for this workspace."},"500":{"description":"Failed to retrieve the request status or result."}}}}}}
```

## List MotionMockups AI Models

> List the available models with their allowed durations, per-duration credit costs (with and without audio), estimated generation time and supported aspect ratios.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups MotionMockups AI API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/motion-mockups/models":{"get":{"summary":"List MotionMockups AI Models","description":"List the available models with their allowed durations, per-duration credit costs (with and without audio), estimated generation time and supported aspect ratios.","operationId":"listMotionMockupModels","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."}],"responses":{"200":{"description":"Available models.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"models":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"display_name":{"type":"string"},"default_duration":{"type":"string"},"durations":{"type":"array","items":{"type":"object","properties":{"seconds":{"type":"integer"},"credits":{"type":"object","properties":{"audio_off":{"type":"integer"},"audio_on":{"type":"integer"}}},"estimated_time_minutes":{"type":"integer"}}}},"aspect_ratios":{"type":"array","nullable":true,"items":{"type":"string"}},"default_aspect_ratio":{"type":"string","nullable":true},"supports_aspect_ratio":{"type":"boolean"}}}},"default_model":{"type":"string"}}},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

### Overview

MotionMockups AI is a standalone image-to-video endpoint - it doesn't need a mockup template or a product. Submit any publicly reachable image URL, and it returns a generated MP4.

### Workflow

1\. *(Optional)* Call **List MotionMockups AI Models** to see the available models, their valid durations, the credit cost of each, and which ones support an aspect ratio.

2\. Call **Create MotionMockups AI Video** with your `start_image_url` (and optionally a `model`, `duration`, or `prompt`). You get back a `request_id`.

3\. Poll **Get MotionMockups AI Video Status** with that `request_id` until `status` is `COMPLETED`, then use the returned `video.url`.

### Writing the prompt (or letting our AI decide)

A prompt is optional. Omit it and MotionMockups AI analyzes your image and writes one for you automatically - the fastest way to a good result.&#x20;

Pass your own `prompt` when you want to direct the motion (e.g., "slow cinematic push-in with soft studio lighting"), and use `negative_prompt` to describe what to avoid.

### Polling for completion

Generation is asynchronous and usually takes between 2 and 15 minutes, depending on the model and duration (see `estimated_time_minutes` from the models endpoint). Poll the status endpoint every \~5 seconds.

While the job runs, `status` is `IN_QUEUE` or `PROCESSING`; when it finishes, `status` is `COMPLETED` and the response includes a `video` object.

### Using your video

On `COMPLETED`, the `video` object contains a `url` plus `content_type`, `file_name`, and `file_size`. Download it or embed it directly - it's a standard MP4.

### Start image URL requirements

`start_image_url` must be a publicly reachable URL. We recommend clear, well-lit product shots to get the best results.

### Duration, aspect ratio, and audio

`duration` is the length in seconds and must be one of the selected model's allowed values. `aspect_ratio` is only available on models where `supports_aspect_ratio` is `true` - omit it otherwise.&#x20;

Set `generate_audio` to `true` to add a generated soundtrack; Omit any of these, and the model's defaults apply.

### Choosing a model

Two models are available. Use the **models** endpoint for the authoritative, up-to-date list of durations and prices.

| Model                         | Durations | Aspect ratio                                       | Audio                    | Best for                                       |
| ----------------------------- | --------- | -------------------------------------------------- | ------------------------ | ---------------------------------------------- |
| kling\_v2.6 (Kling v2.6 Pro)  | 5s, 10s   | Follows `start_image_url` ratio (not configurable) | Optional (≈2× credits)   | Quick, lower-cost clips                        |
| kling\_v3\_pro (Kling V3 Pro) | 3 - 15s   | 16:9, 9:16, 1:1                                    | Optional (≈1.5× credits) | Longer clips, framing control, higher fidelity |

{% hint style="info" %}
The default model is `kling_v2.6`.
{% endhint %}

### Credits cost

Each request costs credits based on the model, the duration, and whether audio is enabled. For example, Kling v2.6 Pro is 40 credits for a 5-second clip (80 with audio); Kling V3 Pro is 130 credits for 5 seconds (195 with audio).

You only pay for videos that are generated successfully.

### Rate Limit

The **submit** endpoint is limited to 10 requests per minute; the status and models endpoints are higher, so you can poll freely. Exceeding a limit returns 429. Contact support if you need a higher cap.


# Render Mockup API

## Create a Mockup Render

> Returns an image URL of the selected mockup template and provided design asset.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/renders":{"post":{"summary":"Create a Mockup Render","description":"Returns an image URL of the selected mockup template and provided design asset.","operationId":"createRender","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string","description":"API key required for authentication."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mockup_uuid":{"type":"string","description":"The UUID of the mockup template."},"export_label":{"type":"string","description":"A label for the exported image."},"export_options":{"type":"object","properties":{"image_format":{"type":"string","description":"The format of the exported image.","enum":["jpg","png","webp"]},"image_size":{"type":"integer","description":"The size in pixels of the exported image."},"mode":{"type":"string","description":"Determines whether the exported image should be viewed in the browser or downloaded.","enum":["view","download"]}}},"smart_objects":{"type":"array","description":"List of smart objects inside a chosen mockup.","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the smart object."},"asset":{"type":"object","properties":{"url":{"type":"string","description":"URL to the asset image."},"fit":{"type":"string","description":"How the asset fits within the designated area.","enum":["stretch","contain","cover"]},"size":{"type":"object","properties":{"width":{"type":"integer","description":"The width of the asset in pixels."},"height":{"type":"integer","description":"The height of the asset pixels."}}},"position":{"type":"object","properties":{"top":{"type":"integer","description":"The top position of the asset."},"left":{"type":"integer","description":"The left position of the asset."}}},"rotate":{"type":"number","description":"The rotation angle of the provided asset."}}},"pattern":{"type":"object","description":"Configuration for using the asset as a repeating pattern.","properties":{"enabled":{"type":"boolean","description":"Whether the asset is used as a repeating pattern."},"scale_percent":{"type":"number","description":"Scale of the pattern relative to the original asset size."}}},"color":{"type":"string","description":"Color overlay for the smart object in hex code."},"blending_mode":{"type":"string","description":"Blending mode applied to the smart object.","enum":["NORMAL","DISSOLVE","DARKEN","MULTIPLY","COLOR_BURN","LINEAR_BURN","DARKER_COLOR","LIGHTEN","SCREEN","COLOR_DODGE","LINEAR_DODGE","LIGHTER_COLOR","OVERLAY","SOFT_LIGHT","HARD_LIGHT","VIVID_LIGHT","LINEAR_LIGHT","PIN_LIGHT","HARD_MIX","DIFFERENCE","EXCLUSION","SUBTRACT","DIVIDE","HUE","SATURATION","COLOR","LUMINOSITY"]},"adjustment_layers":{"type":"object","description":"Optional adjustment layers applied to the smart object.","properties":{"brightness":{"type":"integer","description":"Brightness adjustment (from -150 to 150)."},"contrast":{"type":"integer","description":"Contrast adjustment (from -100 to 100)."},"opacity":{"type":"integer","description":"Opacity adjustment (from 0 to 100)."},"saturation":{"type":"integer","description":"Saturation adjustment (from -100 to 100)."},"vibrance":{"type":"integer","description":"Vibrance adjustment (from -100 to 100)."},"blur":{"type":"integer","description":"Blur adjustment (from 0 to 100)."}}},"print_area_preset_uuid":{"type":"string","description":"UUID of the print area preset to automatically position provided design asset."},"decoration_method":{"type":"object","description":"Render-time decoration method (print finish) applied to this smart object's artwork. Only affects MockAnything templates; classic PSD mockups ignore it. Every method except universal simulates a physical print or engraving process and intentionally alters the artwork's colors (ink absorption, desaturation, fabric show-through), most visibly on dark garments. To reproduce your artwork's original colors, set method to universal or omit this field (omitting keeps the template's default finish, which is universal unless the template was saved with a different one); scene lighting and shading still apply.","required":["method"],"properties":{"method":{"type":"string","description":"The decoration method to apply. universal = flat print that leaves artwork colors unchanged (your chosen blending_mode still applies); screen_print, dtg and uv_print are print finishes that simulate how ink sits on the material and shift artwork colors accordingly (dtg simulates ink soaked into fabric: expect desaturation and strong darkening on dark garments); laser_engrave_surface and laser_engrave_deep are engravings (the artwork acts as a stencil and its colors are replaced by the engraved material); deboss is a pressed-in impression.","enum":["universal","screen_print","dtg","uv_print","laser_engrave_surface","laser_engrave_deep","deboss"]},"options":{"type":"object","description":"Optional fine-tuning for the selected method. Only laser_engrave_surface, laser_engrave_deep and deboss read options; any value you omit uses a sensible default.","properties":{"material":{"type":"string","description":"Simulated material finish for engrave and deboss methods.","enum":["metal","leather","wood"]},"desaturation":{"type":"number","description":"laser_engrave_surface: how much of the artwork color is removed (0 to 1)."},"burn_darkness":{"type":"number","description":"laser_engrave_surface: darkness of the burned engraving (0 to 1)."},"wall_width":{"type":"number","description":"laser_engrave_deep: width of the engraved channel walls, in pixels."},"groove_darkness":{"type":"number","description":"laser_engrave_deep: shadow darkness inside the engraved grooves (0 to 1)."},"depth":{"type":"number","description":"deboss: depth of the pressed-in impression (0 to 1)."},"shadow_falloff":{"type":"number","description":"deboss: softness of the impression's shadow edge, in pixels."},"shadow_darkness":{"type":"number","description":"deboss: darkness of the impression's shadow (0 to 1)."},"highlight_brightness":{"type":"number","description":"deboss: brightness of the raised highlight."},"center_darkening":{"type":"number","description":"deboss: darkening toward the center of the impression (0 to 1)."}}}}}}}},"text_layers":{"type":"array","description":"List of text layers for the chosen mockup.","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the text layer."},"text":{"type":"string","description":"The text content for the text layer."},"font_family":{"type":"string","description":"The font family of the text."},"font_size":{"type":"number","description":"The font size for the text in pixels."},"font_color":{"type":"string","description":"The color of the text in hex code."}}}}},"required":["mockup_uuid","smart_objects"]}}}},"responses":{"200":{"description":"Image successfully rendered.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"export_label":{"type":"string","description":"A label for the exported image provided in request."},"export_path":{"type":"string","description":"The URL where the rendered image can be downloaded."}}},"success":{"type":"boolean","description":"Indicates if the render API call was successful."},"message":{"type":"string","description":"A message about the render API."}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

Export OpenAPI specification for Render API

{% file src="/files/llR2Nwx2JPb4kDDBZuCL" %}

{% hint style="info" %}

### You need multiple mockup renders in a single request?

See [Batch Render Mockups API](/api-reference/batch-render-mockups-api). A more efficient way to generate multiple mockups in a single request way much faster than the **Render Mockup API**.
{% endhint %}

## export\_label

When defining this optional parameter in your request, the same value will be returned in the response.

This parameter is used to help recognize the request you sent with the label.

## export\_options.image\_format

By default, we return a .png rendered image.

But sometimes, for example, you want to get a more optimized image for the web.

By providing some of the following values: `jpg, png, webp` you can control what image format you want from our API.

## export\_options.image\_size

Same as image\_format, you can tell our API if you need an image of a specific size.

We will return high image resolution, but sometimes you need smaller ones.

Provide `export_options.image_size = 720` to get the image with 720px width.

The provided value will define image width and height will auto-scale.

## export\_options.mode

Our API exports images as binary by default, causing the browser to download them automatically.

To display the image in the browser instead of downloading it, set `export_options.mode = "view"`.&#x20;

## smart\_objects.asset.url

The provided URL image will be rendered inside a chosen smart object UUID.

The image must be one of the following extensions: `jpg, jpeg, png, webp, gif`

{% hint style="info" %}
Make sure that the provided URL is publicly available since our API needs to download it and use it for render purposes.

This is especially important when providing links from Dropbox, Google Drive, and similar tools, make sure you provide the right URL with public permissions.

If not available or does not have permission to download, the API call will result in an error.
{% endhint %}

## smart\_objects.asset.file

In some cases, you will want to send the **binary file** instead of the **URL**.

To send the **binary file**, include it as part of the `smart_objects.asset` object, using the `file` property instead of `url`. Ensure that the file is sent using `FormData`.

When sending a binary file in an API request, you must use `FormData` instead of sending the file as part of a JSON payload. This is because binary files cannot be directly represented in JSON format.

The image must be one of the following extensions: `jpg, jpeg, png, webp, gif`

## smart\_objects.color

This optional field will paint the whole smart object with the provided color value.

You can provide two different value types:

* hexadecimal value, example: #AA411B
* or color names from [this link](https://drafts.csswg.org/css-color-4/#named-colors)

<figure><img src="/files/EtZuoETpunBZRwjEMFBH" alt=""><figcaption><p><strong><code>Left image without color - Right image with color</code></strong></p></figcaption></figure>

## smart\_objects.asset.fit

In our web application editor, you can utilize the power of Print Area to position and size assets. Each of your uploaded assets using the Render API will inherit this setting.

<figure><img src="/files/lt0lSM7tiKRFLECMCkUX" alt=""><figcaption></figcaption></figure>

You can optionally change the print area **fit mode** by selecting one of these: `stretch, contain, cover`

{% hint style="info" %}
If you do not provide fit mode using Render API, we will inherit your setup in the web application and the asset will be used in the selected **fit** mode, **size,** and **position**.
{% endhint %}

## smart\_objects.asset.position

You can optionally change the position of your asset using Render API.

Set `position.top` and `position.left` to tweak your asset position if necessary.

{% hint style="info" %}
If you do not provide a **position** using Render API, we will inherit your setup from the editor in the web application.

We highly recommend placing the **print area** in the web application editor. In that case, any assets provided to Render API will be automatically placed inside that print area box without providing any position values.
{% endhint %}

## smart\_objects.asset.size

You can optionally change the size of your asset using API.

Set `size.width` and `size.height` to tweak your asset size if necessary.

{% hint style="info" %}
Same as the asset.position, asset.size will be inherited from the editor in the web application if not provided.

This way, we allow you to visually set your asset position and size in our web application editor so you don't have to provide any asset positions and sizes using Render API.
{% endhint %}

## smart\_objects.print\_area\_preset\_uuid

You can optionally provide `print_area_preset_uuid` inside each smart object to automatically position the provided asset without explicitly setting any position, fit, rotate, or size.

Inside our web application editor, you can easily create new print area presets, which will automatically appear inside our [Get Mockups API](/api-reference/get-mockups-api) where you can get `print_area_presets` details for each mockup and smart object.

To create new print area presets, upload the design asset and set the print area you want. You can create any amount of print area presets.

{% embed url="<https://drive.google.com/file/d/1AOY_x0-OMSiOxgw-rZPa6M3KJ8XevHCn/view?usp=sharing>" fullWidth="false" %}

## smart\_objects.asset\_as\_pattern

You can optionally provide `asset_as_pattern: true` inside each smart object to automatically make a pattern(repeated asset) over the whole smart object area.

Within our web application editor, you can easily turn on the asset pattern feature and set up the desired pattern density and area, which will be automatically inherited when calling our **Render API.**

Use `asset_as_pattern` to override the default settings from the web application editor when calling our **Render API.**

<figure><img src="/files/V3bMbvvyP7J1IiKDkg0c" alt=""><figcaption></figcaption></figure>

## smart\_objects.blending\_mode

You can optionally apply `blending_mode` to the smart object.

Supported blending mode list:&#x20;

{% code overflow="wrap" %}

```
NORMAL, DISSOLVE, DARKEN, MULTIPLY, COLOR_BURN, LINEAR_BURN, DARKER_COLOR, LIGHTEN, SCREEN, COLOR_DODGE, LINEAR_DODGE, LIGHTER_COLOR, OVERLAY, SOFT_LIGHT, HARD_LIGHT,
VIVID_LIGHT, LINEAR_LIGHT, PIN_LIGHT, HARD_MIX, DIFFERENCE, EXCLUSION, SUBTRACT, DIVIDE, HUE, SATURATION, COLOR, LUMINOSITY
```

{% endcode %}

<div align="left"><figure><img src="/files/zPCtldyvDpu0PdkxHLjv" alt="" width="375"><figcaption><p>No Blending Mode</p></figcaption></figure> <figure><img src="/files/4mw83xaRnPQimpkzuhio" alt="" width="375"><figcaption><p>Blending mode "<strong>SCREEN</strong>" applied</p></figcaption></figure></div>

## smart\_objects.adjustment\_layers

You can optionally apply `adjustment_layers` to the smart object.

Supported adjustment layer list:

| Adjustment layer | Min value | Max value | Default value |
| ---------------- | --------- | --------- | ------------- |
| contrast         | -100      | 100       | 0             |
| brightness       | -150      | 150       | 0             |
| opacity          | 0         | 100       | 100           |
| saturation       | -100      | 100       | 0             |
| vibrance         | -100      | 100       | 0             |
| blur             | 0         | 100       | 0             |

```json
//Render API adjustment_layers request example

"smart_objects": [{
    "uuid": "...",
    "asset": {...},
    "color": "...",
    "adjustment_layers": {
        "brightness": 100,
        "contrast": 50,
        "opacity": 100,
        "saturation": 30,
        "vibrance": 15,
        "blur": 5
    }
}]
```

{% hint style="info" %}
Adjustment layers will be reflected in the Render API(*just like Asset position does*).

We will inherit your setup from the web application's editor if you do not explicitly provide adjustment\_layers using the Render API.

Set the **Adjustments** in the web application's editor to change the default values.
{% endhint %}

<figure><img src="/files/hR9HwUskuaUgeU9P6PoI" alt=""><figcaption></figcaption></figure>

## smart\_objects.decoration\_method

Each entry in `smart_objects` accepts an optional `decoration_method` object that sets the **print finish** applied to that artwork at render time - a flat print, screen print, DTG, UV print, laser engraving, or a debossed impression. These are the same finishes available in the Dynamic Mockups MockAnything editor, so your API renders match what you design in the app.

{% hint style="info" %}
`decoration_method` is applied for MockAnything templates only.
{% endhint %}

{% hint style="info" %}
We will inherit your setup from the web application's editor if you do not explicitly provide `decoration_method` using the Render API or the Batch Render Mockups API.

Set the **Decoration methods** in the web application's MockAnything editor to change the default values.
{% endhint %}

The object has two parts - a `method` and optional parameter `options`:

```json
{
  "mockup_uuid": "754a46c5-7693-43a1-9cd4-aedabd273f57",
  "smart_objects": [
    {
      "uuid": "0ff99239-c91a-47f8-86e6-61229ff93626",
      "asset": { "url": "https://.../artwork.png" },
      "decoration_method": {
        "method": "deboss",
        "options": {
          "material": "metal",
          "depth": 0.86
        }
      }
    }
  ]
}
```

`method` is required whenever `decoration_method` is present. `options` is optional and only the **engraving** and **deboss** methods read it.

#### Available methods

| method                  | Finish                                                             | Uses options                                                                                         |
| ----------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| `universal`             | Flat print - artwork printed directly, no special finish (default) | -                                                                                                    |
| `screen_print`          | Plastisol screen-print finish.                                     | -                                                                                                    |
| `dtg`                   | Direct-to-garment print finish.                                    | -                                                                                                    |
| `uv_print`              | UV print finish.                                                   | -                                                                                                    |
| `laser_engrave_surface` | Surface laser engraving.                                           | `material`, `desaturation`, `burn_darkness`                                                          |
| `laser_engrave_deep`    | Deep / 3D laser engraving with carved walls.                       | `material`, `wall_width`, `groove_darkness`                                                          |
| `deboss`                | Pressed-in (debossed) impression.                                  | `material`, `depth`, `shadow_falloff`, `shadow_darkness`, `highlight_brightness`, `center_darkening` |

#### Available options

| Option                 | Type                 | Applies to                                                | Description                                    | Default   |
| ---------------------- | -------------------- | --------------------------------------------------------- | ---------------------------------------------- | --------- |
| `material`             | metal, leather, wood | `laser_engrave_surface` + `laser_engrave_deep` + `deboss` | Simulated material finish.                     | `leather` |
| `desaturation`         | number (0–1)         | `laser_engrave_surface`                                   | How much of the artwork color is removed.      | `0.15`    |
| `burn_darkness`        | number               | `laser_engrave_surface`                                   | Darkness of the burned engraving.              | `1.0`     |
| `wall_width`           | number (px)          | `laser_engrave_deep`                                      | Width of the engraved channel walls.           | `4`       |
| `groove_darkness`      | number (0–1)         | `laser_engrave_deep`                                      | Shadow darkness inside the engraved grooves.   | `0.45`    |
| `depth`                | number (0–1)         | `deboss`                                                  | Depth of the pressed-in impression.            | `0.86`    |
| `shadow_falloff`       | number (px)          | `deboss`                                                  | Softness of the impression's shadow edge.      | `4.5`     |
| `shadow_darkness`      | number (0–1)         | `deboss`                                                  | Darkness of the impression's shadow.           | `0.62`    |
| `highlight_brightness` | number               | `deboss`                                                  | Brightness of the raised highlight.            | `1.12`    |
| `center_darkening`     | number (0–1)         | `deboss`                                                  | Darkening toward the center of the impression. | `1.0`     |

## \[Beta] Text Layers

In some cases, your custom psd files will contain text layers and you will want to provide the text to get the output.

Our text layer feature is in \[Beta] stage at the moment. Feel free to [contact our support](/getting-started/how-can-i-get-support) if you face any issues in implementation.

{% hint style="warning" %}
At the moment, at least one smart object needs to be provided in addition to text layers to work. You don't need to provide any image to the smart object if you don't want to, so it can stay invisible.
{% endhint %}

## text\_layers.uuid

If you upload the PSD files that contain text layers, text layers will be visible on our [Get Mockups API](/api-reference/get-mockups-api) besides smart objects.

Use this `UUID` field to refer to the text layer you want to put the text on.

## text\_layers.text

Provide text that will be applied to the text layer and output on the rendered image.

## text\_layers.font\_family

Default font used is `Roboto`, if you want, provide a custom font family.

List of available fonts: `Helvetica, Arial, Times New Roman, Futura, Garamond, Bebas Neue, Roboto, Lato, Montserrat, Open Sans, Raleway, Playfair Display, Avenir, Century Gothic, Georgia, Proxima Nova, Teko, Impact, Poppins, Merriweather`&#x20;

## text\_layers.font\_size

Default font size from the PSD file will be applied.&#x20;

Provide `font_size` to modify the default font size of the text layer.

## text\_layers.font\_color

Default font color from the PSD file will be applied.

Provide `font_color` in the hex color code to change the color of the text.


# Batch Render Mockups API

## Render Multiple Mockups

> Returns an array of image URLs for multiple mockup templates with provided design assets in a single batch request. Export options specified at the root level apply to all renders.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups Batch Render API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/renders/batch":{"post":{"summary":"Render Multiple Mockups","description":"Returns an array of image URLs for multiple mockup templates with provided design assets in a single batch request. Export options specified at the root level apply to all renders.","operationId":"createBatchRender","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string","description":"API key required for authentication."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"export_options":{"type":"object","description":"Export options applied to all renders in the batch.","properties":{"image_format":{"type":"string","description":"The format of the exported image.","enum":["jpg","png","webp"]},"image_size":{"type":"integer","description":"The size in pixels of the exported image."},"mode":{"type":"string","description":"Determines whether the exported image should be viewed in the browser or downloaded.","enum":["view","download"]}}},"renders":{"type":"array","description":"Array of render requests to process in the batch.","items":{"type":"object","properties":{"export_label":{"type":"string","description":"A label for the exported image."},"mockup_uuid":{"type":"string","description":"The UUID of the mockup template."},"smart_objects":{"type":"array","description":"List of smart objects inside the chosen mockup.","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the smart object."},"asset":{"type":"object","properties":{"url":{"type":"string","description":"URL to the asset image."},"fit":{"type":"string","description":"How the asset fits within the designated area.","enum":["stretch","contain","cover"]},"size":{"type":"object","properties":{"width":{"type":"integer","description":"The width of the asset in pixels."},"height":{"type":"integer","description":"The height of the asset in pixels."}}},"position":{"type":"object","properties":{"top":{"type":"integer","description":"The top position of the asset."},"left":{"type":"integer","description":"The left position of the asset."}}},"rotate":{"type":"number","description":"The rotation angle of the provided asset."}}},"pattern":{"type":"object","description":"Configuration for using the asset as a repeating pattern.","properties":{"enabled":{"type":"boolean","description":"Whether the asset is used as a repeating pattern."},"scale_percent":{"type":"number","description":"Scale of the pattern relative to the original asset size."}}},"color":{"type":"string","description":"Color overlay for the smart object in hex code."},"blending_mode":{"type":"string","description":"Blending mode applied to the smart object.","enum":["NORMAL","DISSOLVE","DARKEN","MULTIPLY","COLOR_BURN","LINEAR_BURN","DARKER_COLOR","LIGHTEN","SCREEN","COLOR_DODGE","LINEAR_DODGE","LIGHTER_COLOR","OVERLAY","SOFT_LIGHT","HARD_LIGHT","VIVID_LIGHT","LINEAR_LIGHT","PIN_LIGHT","HARD_MIX","DIFFERENCE","EXCLUSION","SUBTRACT","DIVIDE","HUE","SATURATION","COLOR","LUMINOSITY"]},"adjustment_layers":{"type":"object","description":"Optional adjustment layers applied to the smart object.","properties":{"brightness":{"type":"integer","description":"Brightness adjustment (from -150 to 150)."},"contrast":{"type":"integer","description":"Contrast adjustment (from -100 to 100)."},"opacity":{"type":"integer","description":"Opacity adjustment (from 0 to 100)."},"saturation":{"type":"integer","description":"Saturation adjustment (from -100 to 100)."},"vibrance":{"type":"integer","description":"Vibrance adjustment (from -100 to 100)."},"blur":{"type":"integer","description":"Blur adjustment (from 0 to 100)."}}},"print_area_preset_uuid":{"type":"string","description":"UUID of the print area preset to automatically position provided design asset."},"decoration_method":{"type":"object","description":"Render-time decoration method (print finish) applied to this smart object's artwork. Only affects MockAnything templates; classic PSD mockups ignore it. Every method except universal simulates a physical print or engraving process and intentionally alters the artwork's colors (ink absorption, desaturation, fabric show-through), most visibly on dark garments. To reproduce your artwork's original colors, set method to universal or omit this field (omitting keeps the template's default finish, which is universal unless the template was saved with a different one); scene lighting and shading still apply.","required":["method"],"properties":{"method":{"type":"string","description":"The decoration method to apply. universal = flat print that leaves artwork colors unchanged (your chosen blending_mode still applies); screen_print, dtg and uv_print are print finishes that simulate how ink sits on the material and shift artwork colors accordingly (dtg simulates ink soaked into fabric: expect desaturation and strong darkening on dark garments); laser_engrave_surface and laser_engrave_deep are engravings (the artwork acts as a stencil and its colors are replaced by the engraved material); deboss is a pressed-in impression.","enum":["universal","screen_print","dtg","uv_print","laser_engrave_surface","laser_engrave_deep","deboss"]},"options":{"type":"object","description":"Optional fine-tuning for the selected method. Only laser_engrave_surface, laser_engrave_deep and deboss read options; any value you omit uses a sensible default.","properties":{"material":{"type":"string","description":"Simulated material finish for engrave and deboss methods.","enum":["metal","leather","wood"]},"desaturation":{"type":"number","description":"laser_engrave_surface: how much of the artwork color is removed (0 to 1)."},"burn_darkness":{"type":"number","description":"laser_engrave_surface: darkness of the burned engraving (0 to 1)."},"wall_width":{"type":"number","description":"laser_engrave_deep: width of the engraved channel walls, in pixels."},"groove_darkness":{"type":"number","description":"laser_engrave_deep: shadow darkness inside the engraved grooves (0 to 1)."},"depth":{"type":"number","description":"deboss: depth of the pressed-in impression (0 to 1)."},"shadow_falloff":{"type":"number","description":"deboss: softness of the impression's shadow edge, in pixels."},"shadow_darkness":{"type":"number","description":"deboss: darkness of the impression's shadow (0 to 1)."},"highlight_brightness":{"type":"number","description":"deboss: brightness of the raised highlight."},"center_darkening":{"type":"number","description":"deboss: darkening toward the center of the impression (0 to 1)."}}}}}}}},"text_layers":{"type":"array","description":"List of text layers for the chosen mockup.","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the text layer."},"text":{"type":"string","description":"The text content for the text layer."},"font_family":{"type":"string","description":"The font family of the text."},"font_size":{"type":"number","description":"The font size for the text in pixels."},"font_color":{"type":"string","description":"The color of the text in hex code."}}}}},"required":["mockup_uuid","smart_objects"]}}},"required":["renders"]}}}},"responses":{"200":{"description":"Images successfully rendered. Returns array of render results.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","description":"Batch render result containing summary and individual render results.","properties":{"total_renders":{"type":"integer","description":"Total number of renders requested in the batch."},"successful_renders":{"type":"integer","description":"Number of renders that were successfully processed."},"failed_renders":{"type":"integer","description":"Number of renders that failed to process."},"renders":{"type":"array","description":"Array of individual render results.","items":{"type":"object","properties":{"status":{"type":"string","description":"Status of the individual render.","enum":["success","failed"]},"export_path":{"type":"string","description":"The URL where the rendered image can be downloaded."},"export_label":{"type":"string","description":"A label for the exported image provided in request."},"mockup_uuid":{"type":"string","description":"The UUID of the mockup template."}}}}}},"success":{"type":"boolean","description":"Indicates if the batch render API call was successful."},"message":{"type":"string","description":"A message about the batch render API."}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

Export OpenAPI specification for Render API

{% file src="/files/iRz57W8LIzaylzTXCgE1" %}

### Generate multiple mockups in a single request

The **Batch Render Mockups API** allows you to generate multiple mockups in a single request. It uses the same structure and fields as the [**Render Mockup API**](/api-reference/render-api), with one key difference:\
instead of submitting a single mockup object, you provide an array of mockups in the `renders` field.

Use this endpoint when you need to create several mockup images at once. While it’s possible to render images individually using multiple calls to the Render Mockup API, the batch endpoint is significantly more efficient.

### **Performance advantage**

The Batch Render Mockups API can generate **ten mockups in roughly the same time it takes the** [**Render Mockup API**](/api-reference/render-api) **to generate one**, making it the recommended method for high-volume or multi-image workflows.


# Get Mockups API

## Get Mockups

> Retrieves a list of available mockups from My Templates.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}},"schemas":{"Mockup":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the mockup."},"name":{"type":"string","description":"The name of the mockup."},"thumbnail":{"type":"string","description":"URL to the thumbnail of the mockup."},"smart_objects":{"type":"array","items":{"$ref":"#/components/schemas/SmartObject"}},"text_layers":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the text layer."},"name":{"type":"string","description":"The name of the text layer."}}}},"collections":{"type":"array","items":{"$ref":"#/components/schemas/Collection"}},"thumbnails":{"type":"array","items":{"$ref":"#/components/schemas/Thumbnail"}}}},"SmartObject":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the smart object."},"name":{"type":"string","description":"The name of the smart object."},"size":{"type":"object","properties":{"width":{"type":"integer"},"height":{"type":"integer"}}},"position":{"type":"object","properties":{"top":{"type":"integer"},"left":{"type":"integer"}}},"print_area_presets":{"type":"array","items":{"$ref":"#/components/schemas/PrintAreaPreset"}}}},"PrintAreaPreset":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the print area preset."},"name":{"type":"string","description":"The name of the print area preset."},"thumbnails":{"type":"array","items":{"$ref":"#/components/schemas/Thumbnail"}}}},"Thumbnail":{"type":"object","properties":{"width":{"type":"integer"},"url":{"type":"string","description":"URL to the thumbnail."}}},"Collection":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the collection."},"name":{"type":"string","description":"The name of the collection."}}}}},"paths":{"/mockups":{"get":{"summary":"Get Mockups","description":"Retrieves a list of available mockups from My Templates.","operationId":"getMockups","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."},{"in":"query","name":"catalog_uuid","required":false,"schema":{"type":"string"},"description":"Optional parameter to filter mockups by catalog UUID."},{"in":"query","name":"collection_uuid","required":false,"schema":{"type":"string"},"description":"Optional parameter to filter mockups by collection UUID."},{"in":"query","name":"include_all_catalogs","required":false,"schema":{"type":"boolean"},"description":"Optional parameter to include mockups from all catalogs. If false or omitted, only mockups from the default catalog are returned. Set to true to fetch from all catalogs."},{"in":"query","name":"name","required":false,"schema":{"type":"string"},"description":"Optional parameter to filter mockups by name."}],"responses":{"200":{"description":"A list of mockups retrieved successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Mockup"}},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

## Get Specific Mockup

> Retrieves a specific mockup from My Templates using its UUID.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}},"schemas":{"Mockup":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the mockup."},"name":{"type":"string","description":"The name of the mockup."},"thumbnail":{"type":"string","description":"URL to the thumbnail of the mockup."},"smart_objects":{"type":"array","items":{"$ref":"#/components/schemas/SmartObject"}},"text_layers":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the text layer."},"name":{"type":"string","description":"The name of the text layer."}}}},"collections":{"type":"array","items":{"$ref":"#/components/schemas/Collection"}},"thumbnails":{"type":"array","items":{"$ref":"#/components/schemas/Thumbnail"}}}},"SmartObject":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the smart object."},"name":{"type":"string","description":"The name of the smart object."},"size":{"type":"object","properties":{"width":{"type":"integer"},"height":{"type":"integer"}}},"position":{"type":"object","properties":{"top":{"type":"integer"},"left":{"type":"integer"}}},"print_area_presets":{"type":"array","items":{"$ref":"#/components/schemas/PrintAreaPreset"}}}},"PrintAreaPreset":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the print area preset."},"name":{"type":"string","description":"The name of the print area preset."},"thumbnails":{"type":"array","items":{"$ref":"#/components/schemas/Thumbnail"}}}},"Thumbnail":{"type":"object","properties":{"width":{"type":"integer"},"url":{"type":"string","description":"URL to the thumbnail."}}},"Collection":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the collection."},"name":{"type":"string","description":"The name of the collection."}}}}},"paths":{"/mockup/{uuid}":{"get":{"summary":"Get Specific Mockup","description":"Retrieves a specific mockup from My Templates using its UUID.","operationId":"getMockupByUUID","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."},{"in":"path","name":"uuid","required":true,"schema":{"type":"string"},"description":"The UUID of the mockup to retrieve."}],"responses":{"200":{"description":"The mockup retrieved successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Mockup"},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"Bad request."},"401":{"description":"Unauthorized request, invalid or missing API key."},"404":{"description":"Mockup with provided UUID not found."}}}}}}
```

Export OpenAPI specification for the Get Mockups API

{% file src="/files/i8E4CS7445mNejeN5IF2" %}

### `catalog_uuid` optional query parameter for `Get Mockups`

On the [My Templates](https://app.dynamicmockups.com/my-templates) page on the web application, you can create catalogs and add mockups to them to achieve better organization and more flexibility.

This optional filter allows you to list only mockups that belong to a specific catalog.

Get **Catalog UUID** by calling the [Catalogs API](/api-reference/catalogs-api).

### `collection_uuid` optional query parameter for `Get Mockups`

On the [My Templates](https://app.dynamicmockups.com/my-templates) page on the web application, you can create collections and add mockups to them to achieve better organization and more flexibility.

This optional filter allows you to list only mockups that belong to specific collections.

Also, you can get collections UUIDs by calling [Collections API](/api-reference/get-collections-api) which will retrieve all created collections and their UUIDs.


# Collections API

## Get Collections

> Retrieves a list of available collections. Optionally filter by catalog UUID.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/collections":{"get":{"summary":"Get Collections","description":"Retrieves a list of available collections. Optionally filter by catalog UUID.","operationId":"getCollections","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."},{"in":"query","name":"catalog_uuid","required":false,"schema":{"type":"string"},"description":"Optional UUID of the catalog to filter collections by."},{"in":"query","name":"include_all_catalogs","required":false,"schema":{"type":"boolean"},"description":"Optional parameter to include collections from all catalogs. If false or omitted, only collections from the default catalog are returned. Set to true to fetch from all catalogs."}],"responses":{"200":{"description":"A list of collections retrieved successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the collection."},"name":{"type":"string","description":"The name of the collection."},"mockup_count":{"type":"integer","description":"The number of mockups in this collection."},"created_at":{"type":"string","format":"date-time","description":"The creation time of the collection."},"updated_at":{"type":"string","format":"date-time","description":"The last update time of the collection."},"created_at_timestamp":{"type":"integer","description":"The creation time of the collection in UNIX timestamp format."},"updated_at_timestamp":{"type":"integer","description":"The last update time of the collection in UNIX timestamp format."}}}},"success":{"type":"boolean","description":"Indicates if the operation was successful."},"message":{"type":"string","description":"A message about the operation."}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

## Create Collection

> Creates a new collection.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/collections":{"post":{"summary":"Create Collection","description":"Creates a new collection.","operationId":"createCollection","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"The name of the collection to create."},"catalog_uuid":{"type":"string","nullable":true,"description":"Optional UUID of the catalog to place this collection in. If not provided, uses the default catalog."}}}}}},"responses":{"200":{"description":"Collection created successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"integer","description":"The ID of the newly created collection."},"uuid":{"type":"string","description":"The UUID of the newly created collection."},"workspace_id":{"type":"integer","description":"The workspace ID this collection belongs to."},"catalog_id":{"type":"integer","description":"The catalog ID this collection belongs to."},"name":{"type":"string","description":"The name of the collection."},"slug":{"type":"string","description":"The URL-friendly slug of the collection."},"is_published":{"type":"integer","description":"Whether the collection is published (1 = yes, 0 = no)."},"created_at":{"type":"string","format":"date-time","description":"The creation time of the collection."},"updated_at":{"type":"string","format":"date-time","description":"The last update time of the collection."}}},"success":{"type":"boolean","description":"Indicates if the operation was successful."},"message":{"type":"string","description":"A message about the operation."}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

Export OpenAPI specification for Collections API

{% file src="/files/EytiEO54mLPomcbIpIOs" %}

### Example Use case

Let's say you need to render images for all tea mugs with your company logo on them, but there's a problem: you have more than 100 mug mockups, and you have mugs for coffee, tea, and oatmeal.

Without collections, you would need to hardcode more than 30 mockup UUIDs manually for each tea mug.

The best way to achieve flexibility and render only mugs that are designed for the tea is to create a collection of "Tea mugs", put all tea mug mockups inside that collection, and call [Get Mockups API](/api-reference/get-mockups-api) with an optional `collection_uuid` filter.

Now that you have all the tea mug mockups retrieved, you can easily call [Render API](/api-reference/render-api) for each tea mug mockup and render an image.


# Render Collection API

## POST /renders/bulk

> Create Bulk Renders Based on Mockup Collection

```json
{"openapi":"3.0.3","info":{"title":"Product API Suite","version":"1.0.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-Api-Key"}}},"paths":{"/renders/bulk":{"post":{"summary":"Create Bulk Renders Based on Mockup Collection","tags":["Bulk Renders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["collection_uuid"],"properties":{"collection_uuid":{"type":"string","format":"uuid","description":"The unique identifier of collection created in My Templates section: https://app.dynamicmockups.com/my-templates\n"},"artworks":{"type":"object","additionalProperties":{"type":"string","format":"uri"}},"colors":{"type":"object","description":"Key-value map of color inputs using hex codes"},"export_label":{"type":"string"},"export_options":{"type":"object","description":"Optional settings used to control the format, size, and behavior of the exported images.","properties":{"image_format":{"type":"string","enum":["webp","jpg","png"]},"image_size":{"type":"integer"},"mode":{"type":"string","enum":["view","download"]}}}}}}}},"responses":{"200":{"description":"Successful response of bulk mockup renders","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object","properties":{"export_label":{"type":"string"},"exports":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"label":{"type":"string"}}}}}}}}}}},"400":{"description":"Bad request due to invalid input parameters"},"401":{"description":"Unauthorized request, invalid or missing API key"},"403":{"description":"Insufficient credits to perform this action"},"422":{"description":"Missing required input parameters"}}}}}}
```

### **How to get the collection\_uuid parameter?**

Before you begin, ensure that you have at least one collection created within the  [**My Templates**](https://app.dynamicmockups.com/my-templates) section.\
The following example demonstrates how to create a new collection using the **Dynamic Mockup** application:

> **Note:** A collection is required to store and manage your mockup templates for future use of bulk mockup renders.

<figure><img src="/files/bPVxMLG6hiCfwyuuLO7t" alt=""><figcaption><p><strong>Create New Collection</strong></p></figcaption></figure>

To use a template collection in API requests, you will need its unique identifier — `collection_uuid`&#x20;

Steps to Obtain the `collection_uuid`

1. **Open** the desired template collection in the **Dynamic Mockup** application.
2. **Locate** the **Collection UUID** menu item.
3. **Take** this value and use it as the `collection_uuid` parameter in your API request.

<figure><img src="/files/fXrNfzpfCh1fbd8yDymT" alt=""><figcaption><p><strong>Obtain Collection UUID</strong></p></figcaption></figure>

#### About Collections

A **collection** allows you to group multiple mockup template styles for a product. In this way you can generate multiple grouped mockup in one API call.\
\
For example, you can define two collections for the same product depanding on your needs:

* **Summer photoshoot session**
* **Winter photoshoot session**

By targeting different `collection_uuid` values, you can easily switch between template collections in each API call.

### Collection Mapping Inputs

Each collection can define **Artwork** and/or **Color** mapping inputs.\
This **Input Mapping** feature allows you to:

* Apply the same artwork or color to multiple mockup templates.
* Ensure consistent customization across different templates in the same collection.

<figure><img src="/files/uJSWzTLqZPfERMxVsI6P" alt=""><figcaption><p><strong>Open Collection Input Mapping</strong></p></figcaption></figure>

<figure><img src="/files/1GAC3acoNH6RbyFxZifh" alt=""><figcaption><p><strong>Create Collection Input Node</strong></p></figcaption></figure>

In the image below, the `artwork_main` and `color_main` collection mapping inputs have been added. The artwork specified for `artwork_main` and the colors specified for `color_main` will be applied to all associated mockups.

<figure><img src="/files/ltCeKiJjjxdpsTOg4kW3" alt=""><figcaption><p><strong>Link Inputs Nodes to Collection Mockup Templates</strong></p></figcaption></figure>

### artworks

Provided artworks can be attached to any mockup template from a targeted collection.

This is what we call **collection input mapping**.

You can create any number of artwork inputs and attach them to any mockup template from the collection and its smart objects.

For example, defined `artwork_main` mapping input will be used in the **Bulk Render API** like this:

```json
{
    "collection_uuid": "0663101b-f01c-4e85-89af-f90b4e9f983b",
    "artworks": {
        "artwork_main": "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png"
    }
}
```

You can provide any number of artworks, you can name them as you want. And you can do something like this:

```json
{
    "collection_uuid": "0663101b-f01c-4e85-89af-f90b4e9f983b",
    "artworks": {
        "artwork_main": "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png",
        "artwork_secondary": "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png",
        //add any number of artworks needed
    }
}
```

{% hint style="warning" %}
The number of artworks could potentially slow the rendering performance. The fewer artworks used, the faster the response.
{% endhint %}

#### Send artwork as a binary file instead of a URL

In some cases, you will want to send the **binary file** instead of the **URL**.

When sending a binary file in an API request, you must use `FormData` instead of sending the file as part of a JSON payload. This is because binary files cannot be directly represented in JSON format.

In this example, instead of:

```json
"artwork_main": "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png",
```

Send a binary file  `artwork_main`  using `FormData`&#x20;

When sending `FormData`, you don't need to send all the artworks as binary files; you can send a combination of URLs and binary files if needed.

In the case above, `artwork_main` could be sent as a binary file, but `artwork_secondary` can still be sent as a URL.

The image must be one of the following extensions: `jpg, jpeg, png, webp, gif`

### colors

Besides artworks, you can also attach `colors`.

From the image above, we've added  `color_main` only to the last template in a collection because we want to apply the color only to that template image when getting the rendered images.

The request would look something like this:

```json
{
    "collection_uuid": "0663101b-f01c-4e85-89af-f90b4e9f983b",
    "artworks": {
        "artwork_main": "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png"
    },
    "colors": {
        "color_main": "#C0375E"
    }
}
```

As we created our flow while mapping, this `color` will only be attached to the **last template**. The first and the second templates will only get the provided `artwork_main` .

### export\_label

When defining this optional parameter in your request, the response will return the same value.

This parameter is used to help recognize the request you sent with the label.

### export\_options.image\_format

By default, all the images are returned in PNG format.

But sometimes, for example, you want to get more optimized images for the web.

By providing some of the following values: `jpg, png, webp` you can control what image format you want from our API.

### export\_options.image\_size

Same as image\_format, you can tell our API if you need images of a specific size.

All the images will be returned in high resolution, but sometimes you need smaller ones.

Provide `export_options.image_size = 720` to get images with a 720px width.

The provided value will define the image's width. The height will auto-scale.

### export\_options.mode

Our API exports images as binary by default, causing the browser to download them automatically.

To display the images in the browser instead of downloading it, set `export_options.mode = "view"`.


# Catalogs API

## Get Catalogs

> Retrieves a list of available catalogs for the authenticated user.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups Catalog API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/catalogs":{"get":{"summary":"Get Catalogs","description":"Retrieves a list of available catalogs for the authenticated user.","operationId":"getCatalogs","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."}],"responses":{"200":{"description":"A list of catalogs retrieved successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the catalog."},"name":{"type":"string","description":"The name of the catalog."},"type":{"type":"string","description":"The type of the catalog (e.g., custom, default)."},"created_at":{"type":"string","format":"date-time","description":"The creation time of the catalog."},"created_at_timestamp":{"type":"integer","description":"The creation time of the catalog in UNIX timestamp format."}}}},"success":{"type":"boolean","description":"Indicates if the operation was successful."},"message":{"type":"string","description":"A message about the operation."}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

Export OpenAPI specification for the Get Mockups API

## Create Catalog

> Creates a custom catalog in the workspace bound to the API key. Keep the returned catalog UUID and pass it as catalog\_uuid when creating collections for that seller store. Requests are not idempotent; retrying a request can create another catalog with the same name.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups Catalog API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/catalogs":{"post":{"summary":"Create Catalog","description":"Creates a custom catalog in the workspace bound to the API key. Keep the returned catalog UUID and pass it as catalog_uuid when creating collections for that seller store. Requests are not idempotent; retrying a request can create another catalog with the same name.","operationId":"createCatalog","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":255,"description":"The name of the custom catalog to create."}}}}}},"responses":{"200":{"description":"The custom catalog was created successfully.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"uuid":{"type":"string","format":"uuid","description":"Use this catalog UUID as catalog_uuid when creating collections or filtering catalog content."},"name":{"type":"string"},"type":{"type":"string","enum":["custom"]},"created_at":{"type":"string","description":"The creation time of the catalog."},"created_at_timestamp":{"type":"integer","description":"The creation time of the catalog in UNIX timestamp format."}}},"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"The workspace is not eligible to create custom catalogs, or the catalog could not be created."},"401":{"description":"The API key is missing or invalid, or its user no longer has access to the key-bound workspace."},"422":{"description":"The name is missing, empty, or longer than 255 characters."}}}}}}
```

{% file src="/files/2YE9WZOTD0JOUZL1W7sp" %}

### Use catalog\_uuid to filter collections and mockups

Catalogs are powerful and give you more flexibility and organization in your projects.

Use the Catalog UUID as `catalog_uuid` an optional query parameter in the [Get Mockups API](/api-reference/get-mockups-api)  and [Collections API](/api-reference/get-collections-api) to list mockups and collections that belong to the provided catalog UUID.

This way, you can list only specific mockups and collections from the chosen catalog and switch between them as needed.

### Example Use Cases

There are many use cases where you can find the catalog useful:

#### **Multiple stores**

You run several e-commerce stores and want each store to show only its own mockups and collections.

#### **Season-specific catalogs**

You keep separate catalogs for different seasons so you can quickly switch between winter and summer mockups.

**Client-based catalogs**\
Agencies working with many clients can store each client’s collections and mockups in their own dedicated catalog for cleaner organization.

**Campaign-based catalogs**\
For marketing teams, each major campaign (e.g., “Back to School,” “Halloween,” “Black Friday”) can get its own catalog of relevant mockups and collections.

**Platform-specific catalogs**\
If you publish to multiple platforms like Etsy, Shopify, Amazon, or WooCommerce, you may want different mockup sets optimized for each platform’s image style and requirements.

**Experimental or beta content**\
If you test new mockups or designs, keep them in a “Beta” or “Experimental” catalog that doesn’t affect the main production workflow.

**Different membership access**\
Some mockups may be restricted to specific users or membership tiers; you can keep that in a separate catalog to control how it’s accessed.

[Tell us](/getting-started/how-can-i-get-support) about your use case and how the catalog feature fits into your workflow.


# Render Print Files API

## Export Print Files

> Returns print files for each smart object in selected mockup template.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/renders/print-files":{"post":{"summary":"Export Print Files","description":"Returns print files for each smart object in selected mockup template.","operationId":"exportPrintFiles","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string","description":"API key required for authentication."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mockup_uuid":{"type":"string","description":"The UUID of the mockup template."},"export_label":{"type":"string","description":"A label for the exported image."},"export_options":{"type":"object","properties":{"image_format":{"type":"string","description":"The format of the exported image.","enum":["jpg","png","webp"]},"image_size":{"type":"integer","description":"The size in pixels of the exported image."},"mode":{"type":"string","description":"Determines whether the exported image should be viewed in the browser or downloaded.","enum":["view","download"]},"image_dpi":{"type":"integer","description":"Dots per inch for the exported print file."}}},"smart_objects":{"type":"array","description":"List of smart objects inside a chosen mockup.","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the smart object."},"asset":{"type":"object","properties":{"url":{"type":"string","description":"URL to the asset image."},"fit":{"type":"string","description":"How the asset fits within the designated area.","enum":["stretch","contain","cover"]},"size":{"type":"object","properties":{"width":{"type":"integer","description":"The width of the asset in pixels."},"height":{"type":"integer","description":"The height of the asset pixels."}}},"position":{"type":"object","properties":{"top":{"type":"integer","description":"The top position of the asset."},"left":{"type":"integer","description":"The left position of the asset."}}},"rotate":{"type":"number","description":"The rotation angle of the provided asset."}}},"pattern":{"type":"object","description":"Configuration for using the asset as a repeating pattern.","properties":{"enabled":{"type":"boolean","description":"Whether the asset is used as a repeating pattern."},"scale_percent":{"type":"number","description":"Scale of the pattern relative to the original asset size."}}},"color":{"type":"string","description":"Color overlay for the smart object in hex code."},"blending_mode":{"type":"string","description":"Blending mode applied to the smart object.","enum":["NORMAL","DISSOLVE","DARKEN","MULTIPLY","COLOR_BURN","LINEAR_BURN","DARKER_COLOR","LIGHTEN","SCREEN","COLOR_DODGE","LINEAR_DODGE","LIGHTER_COLOR","OVERLAY","SOFT_LIGHT","HARD_LIGHT","VIVID_LIGHT","LINEAR_LIGHT","PIN_LIGHT","HARD_MIX","DIFFERENCE","EXCLUSION","SUBTRACT","DIVIDE","HUE","SATURATION","COLOR","LUMINOSITY"]},"adjustment_layers":{"type":"object","description":"Optional adjustment layers applied to the smart object.","properties":{"brightness":{"type":"integer","description":"Brightness adjustment (from -150 to 150)."},"contrast":{"type":"integer","description":"Contrast adjustment (from -100 to 100)."},"opacity":{"type":"integer","description":"Opacity adjustment (from 0 to 100)."},"saturation":{"type":"integer","description":"Saturation adjustment (from -100 to 100)."},"vibrance":{"type":"integer","description":"Vibrance adjustment (from -100 to 100)."},"blur":{"type":"integer","description":"Blur adjustment (from 0 to 100)."}}},"print_area_preset_uuid":{"type":"string","description":"UUID of the print area preset to automatically position provided design asset."}}}},"text_layers":{"type":"array","description":"List of text layers for the chosen mockup.","items":{"type":"object","properties":{"uuid":{"type":"string","description":"The UUID of the text layer."},"text":{"type":"string","description":"The text content for the text layer."},"font_family":{"type":"string","description":"The font family of the text."},"font_size":{"type":"number","description":"The font size for the text in pixels."},"font_color":{"type":"string","description":"The color of the text in hex code."}}}}},"required":["mockup_uuid","smart_objects"]}}}},"responses":{"200":{"description":"Print files successfully exported.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"export_label":{"type":"string","nullable":true},"print_files":{"type":"array","items":{"type":"object","properties":{"export_path":{"type":"string","description":"URL to download the print file."},"smart_object_uuid":{"type":"string","description":"UUID of the smart object used in rendering."},"smart_object_name":{"type":"string","description":"Name of the smart object."}}}}}},"success":{"type":"boolean","description":"Indicates if the print file export was successful."},"message":{"type":"string","description":"A message about the export process."}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

Export OpenAPI specification for Render Print Files API

{% file src="/files/6O2aoMXTGyrS5cQTLjVP" %}

{% hint style="info" %}
The Render Print Files API does not yet support MockAnything templates. We're actively working on this and expect support to be available soon.
{% endhint %}

## Explanation

The **Render Print Files API** is used to export print files of all smart objects in a mockup template and is mostly used for printing purposes.

The request payload used for this API is the same that the [Render API](/api-reference/render-api) uses.

The only additional option is **export\_options.image\_dpi**

## export\_options.image\_dpi

An optional parameter, the default **DPI**(Dots Per Inch), will be inherited from the PSD file.

## Credits usage calculation

The Render Print Files API consumes 2 credits for each exported print file.


# Photoshop Files API

## Upload a PSD file

> Uploads a PSD file and optionally creates a mockup template.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/psd/upload":{"post":{"summary":"Upload a PSD file","description":"Uploads a PSD file and optionally creates a mockup template.","operationId":"uploadPsd","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"psd_file_url":{"type":"string","description":"The URL to the PSD file."},"psd_name":{"type":"string","description":"An optional name for the PSD file."},"psd_category_id":{"type":"integer","description":"An optional category ID for the PSD file."},"mockup_template":{"type":"object","description":"Optional settings for creating a mockup template after the PSD upload.","properties":{"create_after_upload":{"type":"boolean","description":"Whether to create a mockup template after the PSD upload."},"collections":{"type":"array","description":"Optional list of collection UUIDs to associate with the mockup template.","items":{"type":"string"}},"catalog_uuid":{"type":"string","description":"Optional catalog UUID to add the created mockup to. If not provided, the mockup will be added to the default catalog."}}}},"required":["psd_file_url"]}}}},"responses":{"200":{"description":"Successful PSD upload operation.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","description":"Contains the uploaded PSD file details or the created mockup resource.","properties":{"uuid":{"type":"string","description":"The UUID of the uploaded PSD file."},"name":{"type":"string","description":"The name of the uploaded PSD file."}}},"success":{"type":"boolean","description":"Indicates if the PSD upload operation was successful."},"message":{"type":"string","description":"A message about the PSD upload operation."}}}}}},"400":{"description":"Bad request due to invalid input parameters."},"401":{"description":"Unauthorized request, invalid or missing API key."}}}}}}
```

## Delete a PSD file

> Deletes a PSD file by UUID with optional deletion of related mockups.

```json
{"openapi":"3.1.0","info":{"title":"Dynamic Mockups API","version":"1.0"},"servers":[{"url":"https://app.dynamicmockups.com/api/v1"}],"security":[{"apiKeyAuth":[]}],"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key","description":"API key required for authentication."}}},"paths":{"/psd/delete":{"post":{"summary":"Delete a PSD file","description":"Deletes a PSD file by UUID with optional deletion of related mockups.","operationId":"deletePsd","parameters":[{"in":"header","name":"Accept","required":true,"schema":{"type":"string","enum":["application/json"]},"description":"The request must accept JSON responses."},{"in":"header","name":"x-api-key","required":true,"schema":{"type":"string"},"description":"API key required for authentication."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"psd_uuid":{"type":"string","description":"The UUID of the PSD file to delete."},"delete_related_mockups":{"type":"boolean","description":"Whether to delete all mockups related to this PSD file."}},"required":["psd_uuid"]}}}},"responses":{"200":{"description":"Successful PSD deletion operation.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{}},"success":{"type":"boolean","description":"Indicates if the PSD deletion operation was successful."},"message":{"type":"string","description":"A message about the PSD deletion operation."}}}}}},"400":{"description":"Bad request due to invalid input parameters or PSD not found."},"401":{"description":"Unauthorized request, invalid or missing API key."},"403":{"description":"Forbidden, user does not have permission to delete this PSD file."}}}}}}
```

Export OpenAPI specification for PSD Upload API

{% file src="/files/S5G8Ybzq8Yj7aikxddj0" %}

{% hint style="info" %}
The rate limit for the **Upload a PSD file** action is **10 requests per minute**

Contact us if you need more
{% endhint %}

## psd\_category\_id

If you do not provide this optional parameter, your uploaded PSD file will automatically be assigned to the default "**Other**" category.

This is the list of available PSD Category IDs at this moment:

{% code fullWidth="false" %}

```json

        {
            "id": 1,
            "name": "T-shirts",
        },
        {
            "id": 2,
            "name": "Hoodies",    
        },
        {
            "id": 3,
            "name": "Wall Art",
        },
        {
            "id": 4,
            "name": "Mugs",
        },
        {
            "id": 5,
            "name": "Sweatshirts",
        },
        {
            "id": 6,
            "name": "Other", //default category if not provided as psd_category_id
        },
        {
            "id": 7,
            "name": "Pillows",
        },
        {
            "id": 8,
            "name": "Tote Bags",
        },
        {
            "id": 9,
            "name": "Phone Cases",
        },
        {
            "id": 10,
            "name": "Blankets",
        }
```

{% endcode %}

## mockup\_template.create\_after\_upload

If you are subscribed to our [PRO plans](https://dynamicmockups.com/pricing/) and have uploaded your own Photoshop files using our web application, you know that after uploading PSD files you need to create a Mockup first from the uploaded PSD file and then use **Mockup UUID** and all other Mockup components via [Render API](/api-reference/render-api).

**Now you can fully automate this flow!**

If you provide `mockup_template.create_after_upload: true` A mockup will be automatically created from the uploaded PSD file and our API will return in response a lot of useful data regarding the created mockup.

After mockup creation is successful, use the **Mockup** **UUID** and **Smart Object UUIDs** field to render images automatically using our [Render API](/api-reference/render-api).

### Response example

```json
{
    "data": {
        "uuid": "65c10d09-6724-4026-89a4-2cbf00f8670f", //Mockup UUID
        "name": "My mockup automatically created after PSD upload",
        "thumbnail": "https://app-design-copilot-localhost.s3.eu-central-1.amazonaws.com/mockup/251/thumbnail.webp",
        "smart_objects": [
            {
                "uuid": "c39de536-7255-40d4-9458-6215355a5e30",
                "name": "T-shirt"
            },
            {
                "uuid": "2574e3aa-74a3-4fee-b10d-aa3721f2ee26",
                "name": "Background"
            }
        ],
        "collections": [],
        "psd": {
            "uuid": "38607fc2-fa2d-4113-ba70-8bded3f44c23",
            "name": "My custom name"
        }
    },
    "success": true,
    "message": ""
}
```

This created Mockup will regularly show as any other created mockup in the web application. You can even fetch it using the [Get Mockups API](/api-reference/get-mockups-api) when you need it.

## mockup\_template.collections

You probably noticed the **collections** field that has an empty array from the previous example.

In the [Collections API](https://docs.dynamicmockups.com/api-reference/get-collections-api), you can create and retrieve collections.

You may provide a **collections** optional field to the PSD Upload API to automatically put the created mockup in the collections array of strings, which will be returned in the PSD Upload API response as well, instead of an empty array.

{% hint style="warning" %}
Please note that if you want to **add** the mockup to the **collections** automatically after the PSD Upload, **you must set** `mockup_template.create_after_upload` to `true`
{% endhint %}

## mockup\_template.catalog\_uuid

`catalog_uuid` optional parameter is used to add the mockup template directly to the selected catalog.

Use the [Catalog API](/api-reference/catalogs-api) to list all the available catalogs and use the UUID from them to set as `catalog_uuid`

If `catalog_uuid` is not provided or is `false`, the mockup will be added to the default catalog.


# SDK

You don't need to implement our API to add a great editor feature to your application.

For a quick solution, try using our editor iFrame.

You can easily embed it with just a few lines of JavaScript code.\
\
You can choose between our classic editor, or AI powered MockAnything editor.

<figure><img src="/files/fO6NvMsjIPFkWlRhsDUo" alt=""><figcaption><p>Classic Embed Editor</p></figcaption></figure>

<figure><img src="/files/YxfEPrpoHMpjduWYYKXc" alt=""><figcaption><p>MockAnything Embed Editor</p></figcaption></figure>

## How to embed?

### CDN use:

Embed the iFrame in your app at the location where you want to display the editor:

```html
<iframe
      id="dm-iframe"
      src="https://embed.dynamicmockups.com"
      style="width: 100%; height: 90vh"
></iframe>
```

To power the embedded editor, you'll need to include the necessary JavaScript code from the following CDN:

```javascript
// you must add this script before using initDynamicMockupsIframe function in next step
<script 
    src="https://cdn.jsdelivr.net/npm/@dynamic-mockups/mockup-editor-sdk@latest/dist/index.js"
></script>
```

Lastly, use the initDynamicMockupsIframe function from the SDK with the following script:

```javascript
<script>
      document.addEventListener("DOMContentLoaded", function () {
        DynamicMockups.initDynamicMockupsIframe({
          iframeId: "dm-iframe",
          data: { "x-website-key": "Generate for free via our APP" },
          mode: "download",
        });
      });
</script>
```

### JavaScript framework:

Embed the iFrame in your app at the location where you want to display the editor.:

```html
<iframe
      id="dm-iframe"
      src="https://embed.dynamicmockups.com"
      style="width: 100%; height: 90vh"
></iframe>
```

Install package via npm registry:

<pre class="language-sh"><code class="lang-sh"><strong>npm install @dynamic-mockups/mockup-editor-sdk@latest
</strong>or
yarn add @dynamic-mockups/mockup-editor-sdk@latest
</code></pre>

Include package in your project and init iFrame:

```javascript
import { initDynamicMockupsIframe } from "@dynamic-mockups/mockup-editor-sdk";

initDynamicMockupsIframe({
     iframeId: "dm-iframe",
     data: { "x-website-key": "Generate for free via our APP" },
     mode: "download",
});
```

You'll notice the `x-website-key` field, [you can generate it for free via our APP](https://app.dynamicmockups.com/mockup-editor-embed-integrations).

Our Mockup Editor SDK lets you configure the iFrame and control its behavior within your application by providing data to the initDynamicMockupsIframe function. For complete configuration details, visit the [Editor Configuration](/mockup-editor-sdk/classic-editor-configuration) page.&#x20;

<figure><img src="/files/bC3gdNcG4aBBkUemcNDb" alt=""><figcaption><p>Embed Editor</p></figcaption></figure>

### Open a specific mockup in the Mockup Editor

By default, when you embed the mockup editor, the whole catalog will show up. \
You can also open a specific mockup directly.

<figure><img src="/files/bhheaYXtLijmJzexB2tm" alt=""><figcaption><p>Open a specific mockup in the Mockup Editor</p></figcaption></figure>

To achieve that, modify the `src` attribute to open a specific mockup by providing the `mockup uuid`.

```html
<iframe
      id="dm-iframe"
      src="https://embed.dynamicmockups.com/mockup/43981bf4-3f1a-46cd-985e-3d9bb40cef36/"
      style="width: 100%; height: 90vh"
></iframe>
```

You can access the `mockup uuid` from the [Get Mockups API](/api-reference/get-mockups-api) or in the URL of our web application editor.


# Editor Configuration

You can change the default behavior of the Embedded Editor by changing the object inside the **initDynamicMockupsIframe** function from SDK.

```javascript
<script>
      document.addEventListener("DOMContentLoaded", function () {
        DynamicMockups.initDynamicMockupsIframe({
          iframeId: "dm-iframe",
          data: {
            "x-website-key": "Generate for free via our APP",
          },
          mode: "download",
        });
      });
</script>
```

<table data-full-width="false"><thead><tr><th width="140">Field</th><th width="115.906005859375">Default</th><th width="70.32421875">Required</th><th width="76.976318359375">Type</th><th>Description</th></tr></thead><tbody><tr><td>iframeId</td><td>dm-iframe</td><td>true</td><td>string</td><td>ID of iFrame element</td></tr><tr><td>data</td><td></td><td>true</td><td>object</td><td>Change embeded editor behaviour</td></tr><tr><td>mode</td><td>download</td><td>true</td><td>string</td><td>Choose "<strong>download</strong>" or  "<strong>custom</strong>"</td></tr><tr><td>callback</td><td></td><td>false</td><td>object</td><td>If <strong>mode</strong> is set to <strong>custom</strong>, use the callback</td></tr></tbody></table>

### data

**data** parameter allows you to change the functionality inside the embedded editor:

<table data-full-width="false"><thead><tr><th width="222.90374755859375">Field</th><th width="97.31207275390625">Default</th><th width="61.760986328125">Required</th><th width="194.1724853515625">Type</th><th>Description</th><th data-hidden>Example</th></tr></thead><tbody><tr><td>x-website-key</td><td>""</td><td>yes</td><td>string</td><td>Connect the embed editor with Dynamic Mockups. Generate free website-key on your account <a href="https://app.dynamicmockups.com/mockup-editor-embed-integrations">here</a> .</td><td>7OA6hzpunW</td></tr><tr><td>editorType</td><td>"classic"</td><td>no</td><td>"classic" | "mockanything"</td><td>Editor type. It can be used as classic or mockanything editor. Visit <a data-mention href="/pages/XCNSZqRl3ecRdw7dWZhb">/pages/XCNSZqRl3ecRdw7dWZhb</a> for more information.</td><td></td></tr><tr><td>themeAppearance</td><td>"light"</td><td>no</td><td>"light" | "dark"</td><td>Theme appearance: 'dark' or 'light'. If specified, it overrides the setting configured via account dashboard.</td><td>"dark"</td></tr><tr><td>showColorPicker</td><td>true</td><td>no</td><td>boolean</td><td>Show the color picker</td><td>true</td></tr><tr><td>showColorPresets</td><td>false</td><td>no</td><td>boolean</td><td>Show the color presets created in Dynamic Mockups APP on your account</td><td>true</td></tr><tr><td>showCollectionsWidget</td><td>true</td><td>no</td><td>boolean</td><td>Whether to show the collections widget in the UI</td><td></td></tr><tr><td>showSmartObjectArea</td><td>false</td><td>no</td><td>boolean</td><td>Displays smart object boundaries in the mockup editor</td><td></td></tr><tr><td>showTransformControls</td><td>true</td><td>no</td><td>boolean</td><td>Displays artwork transform controls, like width, height, rotate inputs.</td><td></td></tr><tr><td>showArtworkLibrary</td><td>false</td><td>no</td><td>boolean</td><td>Whether to show artwork library.</td><td></td></tr><tr><td>artworkLibrary</td><td>[]</td><td>no</td><td><code>{</code><br> <code>name: string;</code><br> <code>url: string;</code><br> <code>thumbnail?: string;</code><br> <code>id?: string;</code><br><code>}[]</code></td><td>Custom artwork items for the artwork library. showArtworkLibrary must be set to true.</td><td></td></tr><tr><td>showUploadYourArtwork</td><td>true</td><td>no</td><td>boolean</td><td>Whether to show "Upload your artwork" button.</td><td></td></tr><tr><td>showArtworkEditor</td><td>true</td><td>no</td><td>boolean</td><td>Whether to show artwork editor.</td><td></td></tr><tr><td>oneColorPerSmartObject</td><td>false</td><td>no</td><td>boolean</td><td>Restricts the user to one color per smart object</td><td></td></tr><tr><td>enableColorOptions</td><td>true</td><td>no</td><td>boolean</td><td>Displays color options</td><td></td></tr><tr><td>enableCreatePrintFiles</td><td>false</td><td>no</td><td>boolean</td><td>Enables the export of print files</td><td></td></tr><tr><td>enableCollectionExport</td><td>false</td><td>no</td><td>boolean</td><td>If enabled, exporting a single mockup from a collection will automatically export all mockups in the collection, retaining the position and size of the design from the edited mockup</td><td></td></tr><tr><td>exportMockupsButtonText</td><td>"Export Mockups"</td><td>no</td><td>string</td><td>Export Mockups button text</td><td></td></tr><tr><td>customLabels</td><td>{}</td><td>no</td><td><code>{</code><br> <code>artwork?: {</code><br>  <code>label?: string;</code><br>  <code>tooltip?: string;</code><br>  <code>icon?: string;</code><br> <code>};</code><br> <code>colorOptions?: {</code><br>  <code>label?: string;</code><br>  <code>tooltip?: string;</code><br>  <code>icon?: string;</code><br> <code>};</code><br> <code>artworkLibrary?: {</code><br>  <code>label?: string;</code><br>  <code>tooltip?: string;</code><br>  <code>icon?: string;</code><br> <code>};</code><br><code>}</code></td><td>Custom label configuration for UI text customization</td><td></td></tr><tr><td>designUrl</td><td>""</td><td>no</td><td>string</td><td>Provide the URL of the design file to render. When provided, users can't upload own designs</td><td>https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/api_sandbox_icon.png</td></tr><tr><td>customFields</td><td>""</td><td>no</td><td>object</td><td>Provide the JSON object of your custom fields and get them in a response</td><td><p>{</p><p>"userId": "143",</p><p>"productId": "1478",</p><p>"category": "Mugs"</p><p>}</p></td></tr><tr><td>mockupExportOptions.image_format</td><td>webp</td><td>no</td><td>string</td><td>webp|jpg|png</td><td>webp</td></tr><tr><td>mockupExportOptions.image_size</td><td>1080</td><td>no</td><td>number</td><td>Get the rendered image in strict image size defined in "width"</td><td>1080</td></tr><tr><td>mockupExportOptions.mode</td><td>download</td><td>no</td><td>"download" | "view"</td><td>Rendered image URL type – downloadable or viewable</td><td></td></tr><tr><td>colorPresets</td><td>[]</td><td>no</td><td>colorPresets?: {<br>name?: string;autoApplyColors?:boolean;<br>colors: {<br>hex: string;<br>name?: string;<br>}[];<br>}[]</td><td>List of color presets, each with optional name and an required array of hex colors. These presets appear in the colors popup and can be selected by the user.</td><td></td></tr></tbody></table>

#### data example

```javascript
// data example
<script>
      document.addEventListener("DOMContentLoaded", function () {
        DynamicMockups.initDynamicMockupsIframe({
          iframeId: "dm-iframe",
          data: { 
            "x-website-key": "Generate for free via our APP",
            "MORE DATA HERE": "VALUE" 
          },
          mode: "download"
        });
      });
</script>
```

### callback

Inside the callbackData you can find:

<table data-full-width="false"><thead><tr><th width="267.251953125">Field</th><th width="79.597900390625">Type</th><th width="199.7371826171875">Example</th><th>Description</th></tr></thead><tbody><tr><td>callbackData.mockupsExport[0].export_label</td><td>string</td><td>RIDN48UYR1</td><td>Get export_label in response once the render is done</td></tr><tr><td>callbackData.mockupsExport[0].export_path</td><td>string</td><td><a href="https://psd-engine-localhost.s3.eu-central-1.amazonaws.com/variation-exports/0fc9b38d-9a6c-4a50-808e-ac62ea7a6698_0686a84e-4521-41a4-a7fa-23be2ee98c7c.webp">https://psd-engine-localhost.s3.eu-central-1.amazonaws.com/variation-exports/0fc9b38d-9a6c-4a50-808e-ac62ea7a6698_0686a84e-4521-41a4-a7fa-23be2ee98c7c.webp</a></td><td>Get export_path in response once the render is done</td></tr><tr><td>callbackData.customFields</td><td>object</td><td><p>{</p><p>"userId": "143",</p><p>"productId": "1478",</p><p>"category": "Mugs"</p><p>}</p></td><td>Provide the JSON object of your custom fields and get them in a response</td></tr></tbody></table>

#### callback example

```javascript
// callback example
<script>
      document.addEventListener("DOMContentLoaded", function () {
        DynamicMockups.initDynamicMockupsIframe({
          iframeId: "dm-iframe",
          data: { "x-website-key": "Generate for free via our APP" },
          mode: "custom",
          callback: (callbackData) => { console.log(callbackData); },
        });
      });
</script>
```


# MockAnything Configuration

MockAnything is a powerful embeddable AI mockup editor that lets you turn any image into a professional, customizable product mockup directly inside your website or app. Easily embed the full editor via iFrame, image upload, prompt, or API call, and instantly give users a complete AI-powered mockup creation experience.

With advanced AI tools, you can change ethnicity, modify scenes or pose, replace environments, and enhance your original photo with natural, photorealistic results. Add your own artwork, switch product colors, and export a single mockup or a full AI-generated photoshoot in seconds.

MockAnything also includes smart product detection that automatically identifies product and unlocks real manufacturer color options, making it ideal for e-commerce, print-on-demand, apparel, packaging, and product designers who need accurate, brand-friendly variations.

Embed MockAnything once and offer your users a complete, production-ready mockup studio anywhere.

#### Here’s how AI credits work:

* **Prompt Image Generation** uses **Nano Banana 2** - **12 credits per generation**
* **Editor AI Tools** (scene change, ethnicity, camera angle, environment, etc.) use **NanoBanana - 5 credits per edit**
* **AI Photoshoot Generation** - **3 credits per generated variation**
* **Mockup Tools Are Free**  - artwork placement, product color changes (including real manufacturer colors), smart detection, and exports do **not** cost credits.

### Overview

MockAnything is a powerful embeddable AI mockup editor that can turn any image into a fully editable, production-ready mockup. You can start the editor in two ways:

1. **Iframe Embed (Direct Integration)**
   1. Embed the editor using a static iframe—ideal for simple integrations.
2. **API-initialized Editor (Dynamic Integration)**
   1. Call our API with parameters like prompt, image\_url, or artwork\_url.
   2. The API responds with:
      1. HTML for your iframe
      2. A dynamic initialization script
      3. A unique event listener name
   3. This gives you full control to inject the editor anywhere in your UI.

This document explains both approaches, editor configuration, event listeners, and how to handle authentication.

### Quick Start: Two Ways to Launch the Editor

#### 1. **Static iframe Embed**

You can change the default behavior of the Embedded Editor by changing the object inside the **initDynamicMockupsIframe** function from SDK.

```javascript
<script>
      document.addEventListener("DOMContentLoaded", function () {
        DynamicMockups.initDynamicMockupsIframe({
          iframeId: "dm-iframe",
          data: { 
            "x-website-key": "Generate for free via our APP", 
            editorType: "mockanything" 
          },
        });
      });
</script>
```

<table data-full-width="false"><thead><tr><th width="115.26458740234375">Field</th><th width="115.906005859375">Default</th><th width="109.2044677734375">Required</th><th width="124.31591796875">Type</th><th>Description</th></tr></thead><tbody><tr><td>iframeId</td><td>dm-iframe</td><td>true</td><td>string</td><td>ID of iFrame element</td></tr><tr><td>data</td><td></td><td>true</td><td>object</td><td>Change embeded editor behaviour</td></tr></tbody></table>

#### ***data***

**data** parameter allows you to change the functionality inside the embedded editor:

<table data-full-width="false"><thead><tr><th width="179.2120361328125">Field</th><th width="97.31207275390625">Default</th><th width="65.191650390625">Required</th><th width="194.1724853515625">Type</th><th>Description</th><th data-hidden>Example</th></tr></thead><tbody><tr><td>x-website-key</td><td>""</td><td>yes</td><td>string</td><td>Connect the embed editor with Dynamic Mockups. Generate free website-key on your account <a href="https://app.dynamicmockups.com/mockup-editor-embed-integrations">here</a> .</td><td>7OA6hzpunW</td></tr><tr><td>editorType</td><td>"classic"</td><td>no</td><td>"classic" | "mockanything"</td><td>Editor type. It can be used as classic or mockanything editor. </td><td></td></tr><tr><td>themeAppearance</td><td>"light"</td><td>no</td><td>"light" | "dark"</td><td>Theme appearance: 'dark' or 'light'. If specified, it overrides the setting configured via account dashboard.</td><td>"dark"</td></tr><tr><td>mockanything</td><td></td><td>yes</td><td>{"key": "value"}</td><td>Mockanything specifix options, defined in the table below.</td><td></td></tr></tbody></table>

***Mockanything options***

<table><thead><tr><th width="215.2484130859375">Field</th><th>Description</th></tr></thead><tbody><tr><td>eventListenerName</td><td>Name of event listener used for parent-child iframe communication.</td></tr><tr><td>customModelImage</td><td>Custom image url provided, instead of api generated approach. Used for custom iframe implementation via parameters.</td></tr><tr><td>prompt</td><td>Custom prompt provided, based on which an image will be generated.</td></tr></tbody></table>

```javascript
// data example
<script>
      document.addEventListener("DOMContentLoaded", function () {
        DynamicMockups.initDynamicMockupsIframe({
          iframeId: "dm-iframe",
          data: { 
            "x-website-key": "Generate for free via our APP",
            editorType: "mockanything" 
             mockanything: {
              customModelImage:
               "https://app-dynamicmockups-production.s3.eu-central-1.amazonaws.com/static/bdeccdc60a897e80ce9baf2098855723.jpg",
             },
          }
        });
      });
</script>
```

#### 2. **JS / API Approach (Dynamic Editor Injection)**

You can initialize the editor using a backend call that returns:

* `iframe_editor` → HTML for the iframe
* `init_function` → Script that binds the editor’s internal logic
* `event_listener_name` → Unique listener for postMessage events

This approach allows:

* Passing dynamic prompts
* Starting from an uploaded image
* Passing artwork
* Integrating deeply inside React, Vue, or any JS framework

**API Endpoint**

`POST /api/v1/mock-anything/embed/initialize`

**Example Payload**

```
{
    "prompt": "A guy wearing a Gildan 5000 in New York",
}
```

**Example Response**

```
{
  "data": {
    "iframe_editor": "<iframe ...>",
    "init_function": "window.initDynamicMockupsIframe(...)",
    "event_listener_name": "dm_174829182"
  }
}
```

| Field                 | Description                                                                      |
| --------------------- | -------------------------------------------------------------------------------- |
| `event_listener_name` | The identifier you use to listen for events from this specific editor instance   |
| `iframe_editor`       | Fully prepared iframe HTML you can inject directly into the DOM                  |
| `init_function`       | JavaScript bootstrap that connects the iframe, events, and internal editor logic |

### Full Example (React)

```typescript
import { useState, useEffect } from "react";
import { initDynamicMockupsIframe } from "../package";

// Expose init function globally for iframe communication
(window as any).initDynamicMockupsIframe = initDynamicMockupsIframe;

interface ApiResponse {
  event_listener_name: string;
  iframe_editor: string;
  init_function: string;
}

export default function ApiVersion() {
  const [isLoading, setIsLoading] = useState(false);
  const [prompt, setPrompt] = useState(
    "A guy wearing a Gildan 5000 t-shirt near St. Sava temple in Belgrade."
  );

  const [iframeData, setIframeData] = useState<ApiResponse>({
    event_listener_name: "",
    iframe_editor: "",
    init_function: "",
  });

  /** ----------------------------------------------------------------
   *  1) Call Dynamic Mockups API
   *  ---------------------------------------------------------------- */
  const requestEditorSession = async (): Promise<ApiResponse> => {
    const response = await fetch(
      "https://app.dynamicmockups.com/api/v1/mock-anything/embed/initialize",
      {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          "x-api-key": "YOUR_API_KEY",
        },
        body: JSON.stringify({
          prompt,
        }),
      }
    );

    if (!response.ok) {
      throw new Error("Dynamic Mockups API failed: " + response.status);
    }

    const result = await response.json();
    return result.data;
  };

  /** ----------------------------------------------------------------
   *  2) Load editor + run init function
   *  ---------------------------------------------------------------- */
  const launchEditor = async () => {
    setIsLoading(true);
    try {
      const data = await requestEditorSession();
      setIframeData(data);

      // Ensure iframe is present before running init
      setTimeout(() => {
        eval(data.init_function);
      }, 100);
    } catch (err) {
      console.error("Editor initialization failed:", err);
    } finally {
      setIsLoading(false);
    }
  };

  /** ----------------------------------------------------------------
   *  3) Listen for iframe events (image exports, etc.)
   *  ---------------------------------------------------------------- */
  useEffect(() => {
    const handleMessage = (event: MessageEvent) => {
      const isEditorEvent =
        event.data?.eventListenerName === iframeData.event_listener_name;

      if (!isEditorEvent) return;

      const payload = event.data.data;
      console.log("Editor event:", payload);
    };

    window.addEventListener("message", handleMessage);
    return () => window.removeEventListener("message", handleMessage);
  }, [iframeData.event_listener_name]);

  /** ----------------------------------------------------------------
   *  Render
   *  ---------------------------------------------------------------- */
  return (
    <div style={{ padding: "24px" }}>
      <button onClick={launchEditor} disabled={isLoading}>
        {isLoading ? "Loading…" : "Load Editor"}
      </button>
      {/* Inject returned iframe */}
      <div
        dangerouslySetInnerHTML={{
          __html: iframeData.iframe_editor,
        }}
      />
    </div>
  );
}

```

#### Event System

Each editor instance receives a **unique event listener key**.

You listen like this:

```ts
window.addEventListener("message", (event) => {
  if (event.data.eventListenerName === iframeData.event_listener_name) {
    console.log(event.data.data);
  }
});
```

Events include:

* `editor_ready`
* `export_completed`
* `photoshoot_completed`
* `artwork_updated`
* `variant_changed`


# Embed in bubble.io

Detailed step-by-step guide is as follows.

### 1. Add an HTML element to your page wherever you want to embed the editor

<figure><img src="/files/WD7aMMhQZTdKP0dAIb8F" alt=""><figcaption></figcaption></figure>

### 2. Use the embeddable shortcodes provided in the [Dynamic Mockups dashboard](https://app.dynamicmockups.com/mockup-editor-embed-integrations)

<mark style="color:red;">**Important:**</mark> You must select the option to "*Display as an iFrame*" for your HTML element. (see image below)

<figure><img src="/files/dF4yhkNYKaKspD21b44T" alt=""><figcaption></figcaption></figure>

### 3. Preview your page, and you should see the embedded iFrame.

<figure><img src="/files/V4CKo7mhd1aDpNlI098L" alt=""><figcaption></figcaption></figure>


# Tutorials

{% embed url="<https://dynamicmockups.com/knowledge/photoshop-psd-format/>" %}

{% content-ref url="/pages/23p0XoKgQXSsE3YU4h5U" %}
[How to provide image link from Google Drive to Render API](/knowledge-base/tutorials/how-to-provide-image-link-from-google-drive-and-dropbox-to-render-api-coming-soon)
{% endcontent-ref %}

{% content-ref url="/pages/R5ybWz7OBAobHAZvDP3R" %}
[Integrate using Etsy](/knowledge-base/tutorials/integrate-using-etsy)
{% endcontent-ref %}

{% content-ref url="/pages/Wz7nJR81vD0T3CYEAUaU" %}
[Integrate using Wordpress plugin](/knowledge-base/tutorials/integrate-using-wordpress-plugin)
{% endcontent-ref %}

{% content-ref url="/pages/cuVdN1PzpuvosP43FMsf" %}
[How to generate mockups using Make](/knowledge-base/tutorials/how-to-generate-mockups-using-make)
{% endcontent-ref %}

{% content-ref url="/pages/6i0zyh0Dc71EFbEIzncT" %}
[How to generate mockups using Zapier](/knowledge-base/tutorials/how-to-generate-mockups-using-zapier)
{% endcontent-ref %}


# How to provide image link from Google Drive to Render API

### Google Drive

**Step 1**: Go to [Google Drive](https://drive.google.com/) and right-click the file that you want to share, then click on "Share"

<figure><img src="/files/p5SoQFjR9IZexpgvjwi3" alt=""><figcaption></figcaption></figure>

**Step 2**: In the window that comes up, change the access to "Anyone with the link"

<br>

<figure><img src="/files/WJOmGBnXcCMKdqf2dVaa" alt=""><figcaption></figcaption></figure>

**Step 3**: Click "Copy link"

<figure><img src="/files/BjnlP7550BlTQY8GHiwM" alt=""><figcaption></figcaption></figure>

**As the final step**, you will get the link similar to this:

```
https://drive.google.com/file/d/1wMgCWAsqlw0nXcMhCldTbwSznMdXUmBT/view?usp=sharing
```

Where the bolded part **1wMgCWAsqlw0nXcMhCldTbwSznMdXUmBT** is the file ID

Now create the following link structure and use the file ID:

```
https://drive.google.com/uc?export=download&id=1wMgCWAsqlw0nXcMhCldTbwSznMdXUmBT
```

Done! Repeat these steps for each file from Google Drive and it will work.


# Integrate using Etsy

In just one click, connect your Etsy store with Dynamic Mockups and upload professional mockups directly from our web application editor to your Etsy listings!

After an account creation, access the **Etsy** integration from the sidebar and hit the **Connect** button.

<figure><img src="/files/BKgw8plhvOaH9C5XqCfc" alt=""><figcaption></figcaption></figure>

You will be redirected to your Etsy account to authorize the connection with our Dynamic Mockups application. Hit the **Grant access** button to finish the authorization.

<figure><img src="/files/k0axwYNzmKFQWwzMCCIU" alt=""><figcaption></figcaption></figure>

After allowing the access, you will see the confirmation that your Etsy shop is connected.

<figure><img src="/files/nkaHRo9zGUoOZvyoosO0" alt=""><figcaption></figcaption></figure>

Perfect, now, let's create mockups and upload them to the Etsy listing!

Click **Discover** from the main menu, and choose any mockup you like. You are free to use any from our public library.

<figure><img src="/files/T460OOAJjZ79TDstA6t5" alt=""><figcaption></figcaption></figure>

Now it's the fun part, designing with your artwork!

I've added the artwork and positioned it where I think it looks good.

<figure><img src="/files/JtTacmVed4IEyPBEimHl" alt=""><figcaption></figcaption></figure>

Now, let's upload it to the Etsy listing!

Click on the button **Etsy Store Integration**.

<figure><img src="/files/QsGYQ5y2FGb5BWBuvANI" alt=""><figcaption></figcaption></figure>

Now we need to wait for all our Etsy listings to get synced with our web application.

After the listings are synced, we can choose the listing we want to upload this mockup to.

<figure><img src="/files/uCTzXf30ClHMOjWcMyvC" alt=""><figcaption></figcaption></figure>

As we can see, our listing for a **Woman wearing a Gildan 5000 T-shirt** doesn't have any images. Let's upload it there!

**Click and drag** the mockup image to the first empty image slot.

<figure><img src="/files/tgrw8KUvykUgNjbWYKTq" alt=""><figcaption></figcaption></figure>

Now that the mockup image is dragged to the empty slot, we should see it in place and ready to upload to the Etsy listing.

Click **Save and Add to Etsy**

<figure><img src="/files/lAPChWO7Bla5IKF5bIuY" alt=""><figcaption></figcaption></figure>

Now, when we open our Etsy shop manager or the listing directly, we will see our professional mockup uploaded there in high quality!

<figure><img src="/files/jWdoPtDp3QgXWyP1gklJ" alt=""><figcaption></figcaption></figure>

The best part is that you can upload up to 10 images per listing, craft the mockups in **Batch Mode,** and upload more at once!

The mockups can be uploaded to listings in **draft** and **active** mode. If you upload a mockup to an **active** listing, the listing will instantly get new images live.

If you have any questions or need help with Etsy integration, contact us here on the [support page](https://docs.dynamicmockups.com/getting-started/how-can-i-get-support).


# Integrate using Wordpress plugin

In just one click connect your WordPress store and automatically sync products and mockups avoiding the need for repetitive and manual updates.

You can generate mockup images for **Product gallery** and even enable your customers to upload their designs and **buy personalized products** on your store!

If you prefer learning from videos, check the video for full integration with your Wordpress/WooCommerce shop:

{% embed url="<https://www.youtube.com/watch?v=Uk5GF1ILxkU>" %}

Integrate Wordpress/WooCommerce plugins in just a few steps:

1. Install [Dynamic Mockups](https://wordpress.org/plugins/dynamic-mockups/) plugin from [Wordpress repository](https://wordpress.org/plugins/dynamic-mockups/)
2. Connect with your Dynamic Mockups account directly from the Wordpress
3. Create Product Gallery and choose from 1000s of available mockups
4. Enable product personalization for both simple and variable products
5. Track ordered personalized products from WooCommerce order panel
6. [Upgrade to PRO](https://dynamicmockups.com/pricing/) to get more credits and features

### Install Dynamic Mockups plugin from Wordpress repository

Go to wordpress repository and search for "Dynamic Mockups".

Or just visit [this link](https://wordpress.org/plugins/dynamic-mockups/).

Click **install Now** and A**ctivate** after succesful installation.

<figure><img src="/files/jNmJhYcxXr5TWcA4r2Aw" alt=""><figcaption></figcaption></figure>

### Connect with your Dynamic Mockups account directly from the Wordpress

Right after the plugin installation, connect with Dynamic Mockups.

You will be directed to either create an account or sign in to existing one. After successful account creation, the plugin will setup automatically for you!

<figure><img src="/files/bHYFW47Qr2pWar4LEyii" alt=""><figcaption></figcaption></figure>

### Create Product Gallery and choose from 1000s of available mockups

When you open new or existing WooCommerce product, from the right side on the Product Gallery you will see **Create Mockups** button that comes from our plugin.

<figure><img src="/files/8DOUCWhu8JztolBBsLOe" alt=""><figcaption></figcaption></figure>

You will see our public library with over 1000s mockups you can use for free!

Choose any you like and use our editor to generate Product mockups!

<figure><img src="/files/XN7Drfs77ZbqukBAQLDc" alt=""><figcaption></figcaption></figure>

Adding artwork and designing mockups will be straightforward. Anyway, if you would like to see full tutorial on how to do that, please check out [this video here](https://youtu.be/Uk5GF1ILxkU?t=202).

### Enable product personalization for both simple and variable products

For any simple and variable products, you can choose the mockup from our library.

<figure><img src="/files/98XnqKQOEVr8k3RqKUej" alt=""><figcaption></figcaption></figure>

Chosen mockup will be available to your customers and they will be able to design with their own artwork.

<figure><img src="/files/zMUaAbDSX38Q1PakvdEV" alt=""><figcaption></figcaption></figure>

After they design their perfect product and they are satisfied, they can add it to the cart and make an purchase with customized design.

<figure><img src="/files/oljp5oY6tF0CJNOSVqa7" alt=""><figcaption></figcaption></figure>

Finally you can track their orders in WooCommerce order panel.

### Track ordered personalized products from WooCommerce order panel

On each purchased personalized item, you can access generated mockup and print files by clicking on the "View Mockup" and "Download Print File" links.

Also, "Download Print File" link will always have layer name in suffix so you are sure where should you print that file.

<figure><img src="/files/dPPAyKfIH3mssyfKI3aO" alt=""><figcaption></figcaption></figure>

### Upgrade to PRO to get more credits and features

You will get **50 credits for free** just on account creation.

Each purchased personalized product and generated mockup in product gallery spend credits, eventually on free plugin version you will left without credits. You can upgrade to our [PRO plans](https://dynamicmockups.com/pricing/) and increase sales using our plugin!

Visit [this link to subscribe](https://dynamicmockups.com/pricing/) to our PRO plan and get more credits.


# How to generate mockups using Make

Our tool is officially published on Make.com

<figure><img src="/files/noX5LhzegfmdUch66MxG" alt=""><figcaption></figcaption></figure>

You can easily connect your existing account in your scenario flow!

&#x20;Required steps:

1. Create an account on Dynamic Mockups
2. Create API Key and connect Dynamic Mockups in Make scenario
3. (example use-case)Use generated mockup to upload to your Google Drive account

### Create API Key and connect Dynamic Mockups in Make scenario

After you sign in into your account, navigate to the [API Dashboard](https://app.dynamicmockups.com/dashboard-api) and create an API Key.

<figure><img src="/files/FPdR5T4XAXGiLvxNope7" alt=""><figcaption></figcaption></figure>

Copy the API Key and navigate to the Make.com scenario where you want to use our integration.

For example, I created use-case where I want to upload generated mockups directly to my Google Drive account and keep them there.

### (example use-case)Use generated mockup to upload to your Google Drive account

To upload a generated mockup file from Dynamic Mockups to Google Drive, we will need to use three integrations:

1. Dynamic Mockups: To generate the mockup
2. HTTP: To download generated mockup from the URL
3. Google Drive: To upload the mockup there

This is how our scenario should look:

<figure><img src="/files/CWqTXPYjP1RR8kFEiA8F" alt=""><figcaption></figcaption></figure>

First, we will copy the API Key from Dynamic Mockups into Make integration:

<figure><img src="/files/DyIhT4DJalEKzCkViWTk" alt=""><figcaption></figcaption></figure>

After we save, we will be connected with our account using this API Key.

We will be asked to choose the specific **Mockup UUID** we want to generate, by clicking on that dropdown, we will get all of our templates listed and we can choose from the dropdown, we don't need to know specific UUID of the mockup.

The same works for **Smart Object UUID**, we will be able to choose from the dropdown after we select desired mockup.

<figure><img src="/files/j5OupjP3NLgty4OaDlF7" alt=""><figcaption></figcaption></figure>

Now, we need to use **Image URL** as the artwork we would like to place on that selected mockup. It must be valid URL image.

For this case, we choose Pikachu image to see how it looks on the selected mockup.

<figure><img src="/files/U6HTYYJOSPLM3xaXAqyq" alt="" width="188"><figcaption></figcaption></figure>

Now we need to go to **HTTP** module and use "**Get a file**" action to download the generated mockup image. We will use "**Export path**" from Dynamic Mockups module, this is where generated mockup URL is retrieved.

<figure><img src="/files/6qFn4JGL9ZPdrJsGLGk5" alt=""><figcaption></figcaption></figure>

Now, as final step, we need to go to **Google Drive** module and choose the folder where we want to upload our generated mockup image. For this example, We've created folder named "Make.com example folder" where we will see our image after we run this scenario.

Also, we will get the file from HTTP module, where generated mockup is at this moment.

<figure><img src="/files/blDOxwjDJhah4kpwTQ4w" alt=""><figcaption></figcaption></figure>

That's all, now we run the scenario and we see that all of our modules executed successfully!

<figure><img src="/files/iV8r0KVdWv6ILaojIOHs" alt=""><figcaption></figcaption></figure>

And when we go to our Google Drive account, we can see there's a generated mockup!

Amazing! We successfuly used Dynamic Mockups integration to generate our mockups and use them in our scenario!

<figure><img src="/files/T1qqb0uReo5WKNHRcnb6" alt=""><figcaption></figcaption></figure>

If you have any questions or need help with Make integration, contact us here on [support page](/getting-started/how-can-i-get-support).


# How to generate mockups using Zapier

Our tool is officially published on Zapier.com

<figure><img src="/files/QZNNORpq0HgaDLm07wzi" alt=""><figcaption></figcaption></figure>

You can easily connect your existing account to your Zap flow!

Required steps:

1. Create an account on Dynamic Mockups
2. Create API Key and connect Dynamic Mockups in a Zapier zap flow
3. (example use-case)Use generated mockup to upload to your Google Drive account

### Create API Key and connect Dynamic Mockups in Zapier zap flow

After you sign in into your account, navigate to the [API Dashboard](https://app.dynamicmockups.com/dashboard-api) and create an API Key.

<figure><img src="/files/dd7rFzPE7vrUs19EALer" alt=""><figcaption></figcaption></figure>

Copy the API Key and navigate to the Zapier.com zap flow where you want to use our integration.

For example, I created a use case where I want to upload generated mockups directly to my Google Drive account and keep them there.

### (example use-case)Use generated mockup to upload to your Google Drive account

To upload a generated mockup file from Dynamic Mockups to Google Drive, we will need to use three integrations:

1. Trigger: For example, a custom scheduler for the test purpose
2. Dynamic Mockups: To generate a mockup image
3. Google Drive: To upload the mockup there

This is how our zap flow should look:

<figure><img src="/files/8zsFeNcseIQduXOaIR8x" alt=""><figcaption></figcaption></figure>

First, we will copy the API Key from Dynamic Mockups into the Zapier integration:

<figure><img src="/files/UCSqHdemgFmvI0EVANE1" alt=""><figcaption></figcaption></figure>

After we are successfully connected with the Dynamic Mockups account, we will choose the **Create Mockup Render** action.

<figure><img src="/files/aNqYV6ijqdETwkzeDPRn" alt=""><figcaption></figcaption></figure>

We will be asked to choose the specific **Mockup UUID** we want to generate. By clicking on that dropdown, we will get all of our templates listed, and we can choose from the dropdown, we don't need to know the specific UUID of the mockup.

The same works for **Smart Object UUID**, we will be able to choose from the dropdown after we select the desired mockup.

<figure><img src="/files/WlAdUv6R40hpsM7FKNgz" alt=""><figcaption></figcaption></figure>

Now, we need to use the **Image URL** as the artwork we would like to place on that selected mockup. It must be a valid URL image.

For this case, we choose Pikachu image to see how it looks on the selected mockup.

<figure><img src="/files/SaY2iDyMhyj9emHA7O4d" alt="" width="188"><figcaption></figcaption></figure>

Now, as the final step, we need to go to the **Google Drive** integration and choose the folder where we want to upload our generated mockup image. For this example, we've created a folder named "Zapier.com example folder" where we will see our image after we run this Zap flow.

<figure><img src="/files/eYDWxrLfIWOGY8v3YOfQ" alt=""><figcaption></figcaption></figure>

The most important part is to provide the **Render URL** output from the Dynamic Mockups action as a **File** to upload to the Google Drive. The generated mockup image is stored in the **Render URL**.

After we run this zap flow, we see that all the actions are executed successfully!

<figure><img src="/files/dEku99HvSVDIU0KkLqMF" alt=""><figcaption></figcaption></figure>

And when we go to our Google Drive account, we can see there's a generated mockup!

Amazing! We successfully used the Dynamic Mockups Zapier integration to generate our mockups and use them in our Zap flow!

<figure><img src="/files/P0pNCEPGwELlj7H2GXlY" alt=""><figcaption></figcaption></figure>

If you have any questions or need help with Zapier integration, contact us here on the [support page](https://docs.dynamicmockups.com/getting-started/how-can-i-get-support).


# Photoshop API Feature Support

A comprehensive list of Adobe Photoshop features that we support via the API.

If there's something essential missing, feel free to [request a feature here](https://dynamicmockups.featurebase.app/).

<table data-full-width="false"><thead><tr><th width="249">Layer Types</th><th width="249">Support</th><th>Comment</th></tr></thead><tbody><tr><td>Smart Object Layers</td><td><p><mark style="color:green;">Full Support</mark></p><ul><li>Add Image</li><li>Add Background Color</li><li>Multiple Smart Objects</li></ul></td><td>Nested Smart Objects are not supported.</td></tr><tr><td>Text Layers</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Adjustment Layers</td><td><mark style="color:green;">Full Support</mark></td><td>Color Balance, Photo Filter, Color Lookup, Selective Color, Gradient Map will be supported soon.</td></tr></tbody></table>

<table data-full-width="false"><thead><tr><th width="250">Features</th><th width="249">Support</th><th>Comment</th></tr></thead><tbody><tr><td>Layer Opacity</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Layer Fill</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Clipping Masks</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Layer/Group Masks</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Blending Modes</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr></tbody></table>

<table data-full-width="false"><thead><tr><th width="251">Transformations</th><th width="249">Support</th><th>Comment</th></tr></thead><tbody><tr><td>Scale</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Rotate</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Skew</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Distort</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Perspective</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Warp (Default)</td><td><mark style="color:green;">Full Support</mark></td><td>Default 1x1 Warp Grids</td></tr><tr><td>Warp (Custom)</td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Warp Templates</td><td><mark style="color:green;">Full Support</mark></td><td>To use Warp Templates, make sure to select <em>Custom</em> after your pick a Template.</td></tr></tbody></table>

<table data-full-width="false"><thead><tr><th width="250">Layer Styles</th><th width="250">Support</th><th>Comment</th></tr></thead><tbody><tr><td>Blending Options </td><td><mark style="color:green;">Full Support</mark></td><td></td></tr><tr><td>Stroke</td><td><mark style="color:green;">Full Support</mark></td><td>Multiple Strokes are not supported.</td></tr><tr><td>Drop Shadow</td><td><mark style="color:green;">Full Support</mark></td><td>Multiple Drop Shadows are not supported.</td></tr><tr><td>Inner Shadow</td><td><mark style="color:red;">Not Supported</mark></td><td></td></tr><tr><td>Bevel &#x26; Emboss</td><td><mark style="color:red;">Not Supported</mark></td><td></td></tr><tr><td>Inner Glow</td><td><mark style="color:red;">Not Supported</mark></td><td></td></tr><tr><td>Outer Glow</td><td><mark style="color:red;">Not Supported</mark></td><td></td></tr><tr><td>Satin</td><td><mark style="color:red;">Not Supported</mark></td><td></td></tr><tr><td>Color Overlay</td><td><mark style="color:red;">Not Supported</mark></td><td></td></tr><tr><td>Gradient Overlay</td><td><mark style="color:red;">Not Supported</mark></td><td></td></tr><tr><td>Pattern Overlay</td><td><mark style="color:red;">Not Supported</mark></td><td></td></tr></tbody></table>


