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

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

# Render a PSD without Photoshop

> Turn Photoshop templates into finished images over HTTP.

If you already own the PSD templates, you do not need Photoshop in the loop to
produce images from them. Upload a template once and every later image is an
HTTP request: no Photoshop licence, no Actions or scripts, no machine to keep
running.

<Info>
  This page is the whole job end to end. The [Quickstart](/docs/quickstart) is the
  shorter version if you only want the two calls.
</Info>

## What stays in Photoshop and what leaves it

Photoshop keeps the work it is good at: building the template, placing the
smart objects, and setting the transforms and effects. That happens once per
product, and [Preparing a PSD](/docs/psd-mockups/preparing-a-psd) is where that
work gets done.

Everything that repeats leaves. Filling a slot with a design, swapping a
headline, changing a colour, exporting at print resolution: each of those is a
field on a render request rather than a session in front of the file.

What you authored still renders as authored: smart object transforms, warps,
perspective, layer masks, clipping masks, blend modes, opacity, and Drop
Shadow, Stroke and Blend If.
[PSD compatibility](/docs/psd-mockups/psd-compatibility) is the row-by-row list,
including what to send instead where a feature is not rendered today.

## The job end to end

<Steps>
  <Step title="Get an API key.">
    [Authentication](/docs/authentication) covers where the key lives and how to
    send it.
  </Step>

  <Step title="Upload the template once.">
    [Create a mockup from a PSD](/docs/api-reference/psd-mockups/create-a-mockup-from-a-psd)
    takes a file URL and a name, and one response carries every identifier a
    render needs.
  </Step>

  <Step title="Store the template id and its slot ids.">
    Keep `data.uuid` as the template and each `data.smart_objects[].uuid` as a
    slot, next to your product record. Nothing in your render loop touches
    the upload endpoint again. [Upload a PSD](/docs/psd-mockups/upload-a-psd) reads
    that response field by field, and
    [Smart objects](/docs/psd-mockups/smart-objects) matches slots by name rather
    than by order.
  </Step>

  <Step title="Send one render request per design.">
    [Render a PSD mockup](/docs/api-reference/psd-mockups/render-a-psd-mockup) takes
    the template id, the slots you are filling and the export options. The
    finished image is at `data.print_files[0].export_path`.
  </Step>

  <Step title="Walk your design list.">
    A design list plus one template is a catalogue of images, and this is the
    shape most integrations settle on: the request stays the same and only the
    artwork URL changes. [Python](/docs/render-with-python) and the [SDKs](/docs/sdks)
    carry that request in the language you are writing in.
  </Step>

  <Step title="Let a long run finish in the background.">
    Requests run in parallel up to your plan's concurrency, and one past that
    ceiling comes back as a `429` with a `Retry-After` you can wait out.
    [Usage limits](/docs/api-reference/usage-limits) holds both ceilings and the
    headers that report what you have left.

    <Tip>
      Send `is_async: true` and collect the result from a
      [webhook](/docs/webhooks/overview) rather than holding a connection open per
      image. A queued render holds no concurrency slot while it waits, and
      [Retrieve a single job](/docs/api-reference/jobs/retrieve-a-single-job) is
      there when you would rather ask.
    </Tip>
  </Step>
</Steps>

## Change more than the artwork

The same template also carries text and colour, so one file covers variants
that would otherwise be separate PSDs. Each one is another field on the
render request you are already sending.

| Field                   | What it changes                                             | Covered by                                                            |
| ----------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------- |
| `smart_objects[].asset` | The artwork in a slot, and how it fits, offsets and rotates | [Artwork placement](/docs/psd-mockups/artwork-placement)                   |
| `smart_objects[].color` | A hex overlay and its blending mode on that slot            | [Fit and blend modes](/docs/concepts/fit-and-blend-modes)                  |
| `text_layers`           | Wording, font, size and colour of live type                 | [Text layers](/docs/text/text-layers)                                      |
| `export_options`        | Image format, pixel size and the print resolution tag       | [Render a PSD mockup](/docs/api-reference/psd-mockups/render-a-psd-mockup) |

## Print-ready output

`dpi` stamps a print resolution tag into the file metadata; it does not change
the pixels. Size the pixels yourself with `image_size = print_inches x dpi`, so
a 12 inch print at 300 DPI is `image_size: 3600`. Choose `png` or `jpg` for the
widest print-tool support.

## Learn more

<CardGroup cols={2}>
  <Card title="Upload a PSD" icon="upload" href="/docs/psd-mockups/upload-a-psd">
    Register a template and read back every slot.
  </Card>

  <Card title="PSD compatibility" icon="table" href="/docs/psd-mockups/psd-compatibility">
    Check which Photoshop features render as authored.
  </Card>
</CardGroup>

## Next steps

<CardGroup cols={2}>
  <Card title="Preparing a PSD" icon="layers" href="/docs/psd-mockups/preparing-a-psd">
    Build the template so every slot is addressable.
  </Card>

  <Card title="Text layers" icon="type" href="/docs/text/text-layers">
    Personalise wording on the same template.
  </Card>
</CardGroup>
