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

# Update an existing PSD mockup

> Rename a mockup, or set the colours it answers to by name.

<RequestExample>
  ```js Node.js theme={"theme":{"light":"github-light","dark":"vesper"}}
  const response = await fetch("https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6", {
    method: "PATCH",
    headers: {
      "x-api-key": "sm_your_api_key",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      "name": "Updated Mockup Name"
    }),
  });

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

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

  $payload = <<<'JSON'
  {
    "name": "Updated Mockup Name"
  }
  JSON;

  $ch = curl_init("https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6");
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      "x-api-key: sm_your_api_key",
      "Content-Type: application/json",
  ]);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);

  $response = curl_exec($ch);
  curl_close($ch);

  echo $response;
  ```

  ```python Python theme={"theme":{"light":"github-light","dark":"vesper"}}
  import requests

  payload = {
      "name": "Updated Mockup Name"
  }

  response = requests.patch(
      "https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6",
      headers={"x-api-key": "sm_your_api_key"},
      json=payload,
  )

  response.raise_for_status()
  print(response.json())
  ```

  ```ruby Ruby theme={"theme":{"light":"github-light","dark":"vesper"}}
  require "net/http"
  require "uri"

  uri = URI("https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6")
  request = Net::HTTP::Patch.new(uri)
  request["x-api-key"] = "sm_your_api_key"
  request["Content-Type"] = "application/json"

  request.body = <<~JSON
    {
      "name": "Updated Mockup Name"
    }
  JSON

  response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
    http.request(request)
  end

  puts response.body
  ```

  ```go Go theme={"theme":{"light":"github-light","dark":"vesper"}}
  package main

  import (
  	"bytes"
  	"fmt"
  	"io"
  	"net/http"
  )

  func main() {
  	payload := []byte(`{
    "name": "Updated Mockup Name"
  }`)

  	req, err := http.NewRequest("PATCH", "https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6", bytes.NewBuffer(payload))
  	if err != nil {
  		panic(err)
  	}
  	req.Header.Set("x-api-key", "sm_your_api_key")
  	req.Header.Set("Content-Type", "application/json")

  	res, err := http.DefaultClient.Do(req)
  	if err != nil {
  		panic(err)
  	}
  	defer res.Body.Close()

  	body, _ := io.ReadAll(res.Body)
  	fmt.Println(string(body))
  }
  ```

  ```java Java theme={"theme":{"light":"github-light","dark":"vesper"}}
  import java.net.URI;
  import java.net.http.HttpClient;
  import java.net.http.HttpRequest;
  import java.net.http.HttpResponse;

  String payload = """
  {
    "name": "Updated Mockup Name"
  }
  """;

  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6"))
      .header("x-api-key", "sm_your_api_key")
      .header("Content-Type", "application/json")
      .method("PATCH", HttpRequest.BodyPublishers.ofString(payload))
      .build();

  HttpResponse<String> response = HttpClient.newHttpClient()
      .send(request, HttpResponse.BodyHandlers.ofString());

  System.out.println(response.body());
  ```

  ```csharp .NET theme={"theme":{"light":"github-light","dark":"vesper"}}
  using System.Net.Http;
  using System.Text;

  var payload = """
  {
    "name": "Updated Mockup Name"
  }
  """;

  var request = new HttpRequestMessage(HttpMethod.Patch, "https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6");
  request.Headers.Add("x-api-key", "sm_your_api_key");
  request.Content = new StringContent(payload, Encoding.UTF8, "application/json");

  var client = new HttpClient();
  var response = await client.SendAsync(request);

  Console.WriteLine(await response.Content.ReadAsStringAsync());
  ```

  ```bash cURL theme={"theme":{"light":"github-light","dark":"vesper"}}
  curl -X PATCH "https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
    -H "x-api-key: sm_your_api_key" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Updated Mockup Name"
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json Response theme={"theme":{"light":"github-light","dark":"vesper"}}
  {
    "data": {
      "collections": [],
      "group_layers": [],
      "height": 5000,
      "name": "Heavyweight tee front",
      "smart_objects": [
        {
          "blend_mode": "multiply",
          "layer_name": "Front print",
          "name": "Front print",
          "position": {
            "height": 3413,
            "width": 3000,
            "x": 512,
            "y": 730
          },
          "print_area_presets": [
            {
              "name": "Default",
              "position": {
                "height": 3413,
                "width": 3000,
                "x": 0,
                "y": 0
              },
              "size": {
                "height": 3413,
                "width": 3000
              },
              "thumbnails": [],
              "uuid": "d07f5b18-2c94-4e83-a6b1-95f3c8e27a40"
            }
          ],
          "quad": [
            [
              512.0,
              742.0
            ],
            [
              3512.0,
              730.0
            ],
            [
              3499.0,
              4143.0
            ],
            [
              524.0,
              4131.0
            ]
          ],
          "size": {
            "height": 3413,
            "width": 3000
          },
          "uuid": "b41a7e52-93c8-4d61-8f07-2ae5c9d04713"
        }
      ],
      "text_layers": [],
      "thumbnail": "https://cdn.sudomock.com/thumbnails/8f2c1d90_720.webp",
      "thumbnails": [
        {
          "url": "https://cdn.sudomock.com/thumbnails/8f2c1d90_720.webp",
          "width": 720
        },
        {
          "url": "https://cdn.sudomock.com/thumbnails/8f2c1d90_480.webp",
          "width": 480
        },
        {
          "url": "https://cdn.sudomock.com/thumbnails/8f2c1d90_240.webp",
          "width": 240
        }
      ],
      "uuid": "8f2c1d90-6b4e-4a37-9e55-0d1c7a3f21b8",
      "width": 4000
    },
    "message": "",
    "success": true
  }
  ```
</ResponseExample>


## OpenAPI

````yaml openapi.json PATCH /api/v1/psd-mockups/{uuid}
openapi: 3.1.0
info:
  title: SudoMock API
  description: >-
    Product mockup API. Render PSD templates, turn product photos into reusable
    mockups, create still images and videos, personalize text with fonts, and
    manage asynchronous jobs and signed webhooks.


    Every endpoint answers failures with the same envelope, so the status codes,
    the error_code values and the retry rule are documented once at
    https://sudomock.com/docs/errors rather than repeated per operation.
  version: 1.0.0
servers:
  - url: https://api.sudomock.com
    description: Production
security: []
tags:
  - name: PSD mockups
    description: Turn a Photoshop file into a reusable mockup, then render it.
  - name: Photo mockups
    description: Turn a product photo into a reusable mockup, then render artwork onto it.
  - name: Video mockups
    description: Render a mockup as a short video.
  - name: Fonts
    description: Upload and manage the fonts available to text layers.
  - name: Background removal
    description: Isolate a subject from its background as a standalone step.
  - name: Studio
    description: Open an embedded editor session and read what the customer produced in it.
  - name: Webhook endpoints
    description: Register signed endpoints and manage their secrets.
  - name: Webhook deliveries
    description: Inspect, replay and retry what those endpoints received.
  - name: Jobs
    description: Poll queued renders and read their results.
  - name: Account
    description: Read the current account, its plan and its remaining credits.
paths:
  /api/v1/psd-mockups/{uuid}:
    patch:
      tags:
        - PSD mockups
      summary: Update an existing PSD mockup
      description: Rename a mockup, or set the colours it answers to by name.
      operationId: update_mockup_api_v1_psd_mockups__uuid__patch
      parameters:
        - name: uuid
          in: path
          required: true
          schema:
            type: string
            minLength: 36
            description: Mockup UUID
          description: Mockup UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MockupUpdateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UploadResponse'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: Node.js
          source: >-
            const response = await
            fetch("https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6",
            {
              method: "PATCH",
              headers: {
                "x-api-key": "sm_your_api_key",
                "Content-Type": "application/json",
              },
              body: JSON.stringify({
                "name": "Updated Mockup Name"
              }),
            });


            const data = await response.json();

            console.log(data);
        - lang: PHP
          source: >-
            <?php


            $payload = <<<'JSON'

            {
              "name": "Updated Mockup Name"
            }

            JSON;


            $ch =
            curl_init("https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6");

            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                "x-api-key: sm_your_api_key",
                "Content-Type: application/json",
            ]);

            curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);


            $response = curl_exec($ch);

            curl_close($ch);


            echo $response;
        - lang: Python
          source: |-
            import requests

            payload = {
                "name": "Updated Mockup Name"
            }

            response = requests.patch(
                "https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6",
                headers={"x-api-key": "sm_your_api_key"},
                json=payload,
            )

            response.raise_for_status()
            print(response.json())
        - lang: Ruby
          source: >-
            require "net/http"

            require "uri"


            uri =
            URI("https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6")

            request = Net::HTTP::Patch.new(uri)

            request["x-api-key"] = "sm_your_api_key"

            request["Content-Type"] = "application/json"


            request.body = <<~JSON
              {
                "name": "Updated Mockup Name"
              }
            JSON


            response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do
            |http|
              http.request(request)
            end


            puts response.body
        - lang: Go
          source: "package main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n)\n\nfunc main() {\n\tpayload := []byte(`{\n  \"name\": \"Updated Mockup Name\"\n}`)\n\n\treq, err := http.NewRequest(\"PATCH\", \"https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6\", bytes.NewBuffer(payload))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treq.Header.Set(\"x-api-key\", \"sm_your_api_key\")\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\n\tres, err := http.DefaultClient.Do(req)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdefer res.Body.Close()\n\n\tbody, _ := io.ReadAll(res.Body)\n\tfmt.Println(string(body))\n}"
        - lang: Java
          source: |-
            import java.net.URI;
            import java.net.http.HttpClient;
            import java.net.http.HttpRequest;
            import java.net.http.HttpResponse;

            String payload = """
            {
              "name": "Updated Mockup Name"
            }
            """;

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6"))
                .header("x-api-key", "sm_your_api_key")
                .header("Content-Type", "application/json")
                .method("PATCH", HttpRequest.BodyPublishers.ofString(payload))
                .build();

            HttpResponse<String> response = HttpClient.newHttpClient()
                .send(request, HttpResponse.BodyHandlers.ofString());

            System.out.println(response.body());
        - lang: .NET
          source: >-
            using System.Net.Http;

            using System.Text;


            var payload = """

            {
              "name": "Updated Mockup Name"
            }

            """;


            var request = new HttpRequestMessage(HttpMethod.Patch,
            "https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6");

            request.Headers.Add("x-api-key", "sm_your_api_key");

            request.Content = new StringContent(payload, Encoding.UTF8,
            "application/json");


            var client = new HttpClient();

            var response = await client.SendAsync(request);


            Console.WriteLine(await response.Content.ReadAsStringAsync());
        - lang: cURL
          source: >-
            curl -X PATCH
            "https://api.sudomock.com/api/v1/psd-mockups/3fa85f64-5717-4562-b3fc-2c963f66afa6"
            \
              -H "x-api-key: sm_your_api_key" \
              -H "Content-Type: application/json" \
              -d '{
                "name": "Updated Mockup Name"
              }'
components:
  schemas:
    MockupUpdateRequest:
      properties:
        name:
          anyOf:
            - type: string
              maxLength: 255
              minLength: 1
            - type: 'null'
          description: New mockup name
        colors:
          anyOf:
            - items:
                $ref: '#/components/schemas/MockupColour'
              type: array
              maxItems: 96
            - type: 'null'
          description: >-
            The colours this mockup answers to by name. Replaces the whole list,
            so send every colour you want to keep. Send [] to clear it.
      type: object
      title: MockupUpdateRequest
      description: Update request for PATCH /api/v1/psd-mockups/{uuid}
      example:
        name: Updated Mockup Name
    UploadResponse:
      properties:
        data:
          $ref: '#/components/schemas/UploadResponseData'
          description: Response data
        success:
          type: boolean
          description: Success status
          default: true
        message:
          type: string
          description: Optional message about the operation
          default: ''
        warnings:
          anyOf:
            - items:
                $ref: '#/components/schemas/UploadWarning'
              type: array
            - type: 'null'
          description: >-
            Non-fatal advisories about this upload (e.g. hidden smart object
            layers that are not exposed for personalization). Omitted when none.
      type: object
      required:
        - data
      title: UploadResponse
      description: >-
        The ingested mockup with every layer you can address in a render.
        specification
      example:
        data:
          collections: []
          group_layers: []
          height: 5000
          name: Heavyweight tee front
          smart_objects:
            - blend_mode: multiply
              layer_name: Front print
              name: Front print
              position:
                height: 3413
                width: 3000
                x: 512
                'y': 730
              print_area_presets:
                - name: Default
                  position:
                    height: 3413
                    width: 3000
                    x: 0
                    'y': 0
                  size:
                    height: 3413
                    width: 3000
                  thumbnails: []
                  uuid: d07f5b18-2c94-4e83-a6b1-95f3c8e27a40
              quad:
                - - 512
                  - 742
                - - 3512
                  - 730
                - - 3499
                  - 4143
                - - 524
                  - 4131
              size:
                height: 3413
                width: 3000
              uuid: b41a7e52-93c8-4d61-8f07-2ae5c9d04713
          text_layers: []
          thumbnail: >-
            https://cdn.sudomock.com/mockup-assets/8f2c1d90-6b4e-4a37-9e55-0d1c7a3f21b8/thumbnails/thumb_720.webp
          thumbnails:
            - url: >-
                https://cdn.sudomock.com/mockup-assets/8f2c1d90-6b4e-4a37-9e55-0d1c7a3f21b8/thumbnails/thumb_720.webp
              width: 720
            - url: >-
                https://cdn.sudomock.com/mockup-assets/8f2c1d90-6b4e-4a37-9e55-0d1c7a3f21b8/thumbnails/thumb_480.webp
              width: 480
            - url: >-
                https://cdn.sudomock.com/mockup-assets/8f2c1d90-6b4e-4a37-9e55-0d1c7a3f21b8/thumbnails/thumb_240.webp
              width: 240
          uuid: 8f2c1d90-6b4e-4a37-9e55-0d1c7a3f21b8
          width: 4000
        message: ''
        success: true
    MockupColour:
      properties:
        label:
          type: string
          maxLength: 32
          minLength: 1
          description: >-
            What you call this colour, e.g. 'blue jean'. Matched exactly when a
            render asks for it.
        hex:
          type: string
          pattern: ^#[0-9A-Fa-f]{6}$
          description: The colour the name paints, e.g. '#6A8296'.
      type: object
      required:
        - label
        - hex
      title: MockupColour
      description: A name this mockup answers to, and the colour it paints.
    UploadResponseData:
      properties:
        uuid:
          type: string
          description: Unique identifier for the mockup
          examples:
            - 8f2c1d90-6b4e-4a37-9e55-0d1c7a3f21b8
        name:
          type: string
          description: Name of the mockup
          examples:
            - Heavyweight tee front
        thumbnail:
          type: string
          description: Main thumbnail URL (720px width). Empty string if generation failed.
          default: ''
          examples:
            - >-
              https://cdn.sudomock.com/mockup-assets/8f2c1d90-6b4e-4a37-9e55-0d1c7a3f21b8/thumbnails/thumb_720.webp
        width:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            Always populated after successful upload. Represents original PSD
            canvas width in pixels.
          examples:
            - 4000
        height:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            Always populated after successful upload. Represents original PSD
            canvas height in pixels.
          examples:
            - 5000
        smart_objects:
          items:
            $ref: '#/components/schemas/SmartObjectResponse'
          type: array
          description: List of smart objects in the PSD
        text_layers:
          items:
            $ref: '#/components/schemas/TextLayer'
          type: array
          description: >-
            Text layers detected in the PSD. Editable layers accept text
            replacement at render time.
        group_layers:
          items:
            $ref: '#/components/schemas/GroupLayer'
          type: array
          description: >-
            Group layers whose outlines can be recolored. Changing a group
            outline affects everything inside that group; groups not listed keep
            their authored effects.
        collections:
          items: {}
          type: array
          description: Reserved for future use. Currently always empty.
        thumbnails:
          items:
            $ref: '#/components/schemas/ThumbnailSize'
          type: array
          description: Array of thumbnail URLs at different sizes
      type: object
      required:
        - uuid
        - name
        - smart_objects
      title: UploadResponseData
      description: Data payload in upload response
    UploadWarning:
      properties:
        code:
          type: string
          description: >-
            Stable advisory code (PSD_HIDDEN_SMART_OBJECTS, FREE_PSD_RETENTION,
            PSD_LIGHT_ADJUSTMENT_UNSUPPORTED)
        message:
          type: string
          description: Human-readable, non-fatal advisory
      type: object
      required:
        - code
        - message
      title: UploadWarning
      description: >-
        Non-fatal advisory attached to a successful upload.


        Three codes today, and they are INDEPENDENT -- one upload can earn
        several:
          - PSD_LIGHT_ADJUSTMENT_UNSUPPORTED: the PSD carries a Photoshop 27.10 Light
            adjustment layer, which renders read as plain Brightness/Contrast and so
            drop its exposure lift (renders come out darker than Photoshop).
          - PSD_HIDDEN_SMART_OBJECTS: the PSD carries hidden smart object layers that
            are not exposed for personalization.
          - FREE_PSD_RETENTION: the account is in trial, so this uploaded template is
            removed after N days without a render. Emitted only for an account the
            retention sweep can actually reach; a funded account never sees it.

        `code` is API surface -- integrators switch on it, so it is stable, and
        the

        message is the part that may be reworded.
    SmartObjectResponse:
      properties:
        uuid:
          type: string
          description: Unique identifier for the smart object
          examples:
            - b41a7e52-93c8-4d61-8f07-2ae5c9d04713
        name:
          type: string
          description: Display name of the smart object
          examples:
            - Front print
        size:
          $ref: '#/components/schemas/Size'
          description: Size dimensions of the smart object
        position:
          $ref: '#/components/schemas/Position'
          description: Position coordinates (x, y, width, height)
        print_area_presets:
          items:
            $ref: '#/components/schemas/PrintAreaPreset'
          type: array
          description: Print area preset configurations
        layer_name:
          anyOf:
            - type: string
            - type: 'null'
          description: Original PSD layer name
          examples:
            - Front print
        quad:
          anyOf:
            - items:
                items:
                  type: number
                type: array
              type: array
            - type: 'null'
          description: >-
            Four display coordinates for the editable area. Only available on
            Scale tier plans (null on Free/Starter/Pro).
          examples:
            - - - 512
                - 742
              - - 3512
                - 730
              - - 3499
                - 4143
              - - 524
                - 4131
        blend_mode:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            The blend mode this smart object layer carries in the PSD, lowercase
            (e.g. 'normal', 'multiply', 'soft_light'). Null in the mockup list;
            request a single mockup to read it.
          examples:
            - multiply
        instance_count:
          anyOf:
            - type: integer
            - type: 'null'
          description: >-
            Number of PSD layers this input drives (smart object instancing);
            null/1 = single layer
          examples:
            - 3
      type: object
      required:
        - uuid
        - name
        - size
        - position
        - print_area_presets
      title: SmartObjectResponse
      description: >-
        A smart object found in the uploaded file, with the UUID you address it
        by.
      example:
        blend_mode: normal
        layer_name: Smart Object 1
        name: Main Design
        position:
          height: 600
          width: 800
          x: 100
          'y': 100
        print_area_presets:
          - name: Default
            position:
              height: 3413
              width: 3000
              x: 0
              'y': 0
            size:
              height: 3413
              width: 3000
            thumbnails: []
            uuid: preset-uuid-here
        quad:
          - - 100
            - 100
          - - 900
            - 100
          - - 900
            - 700
          - - 100
            - 700
        size:
          height: 3413
          width: 3000
        uuid: 123e4567-e89b-12d3-a456-426614174000
    TextLayer:
      properties:
        uuid:
          type: string
          description: Unique identifier for the text layer
          examples:
            - c7d41f6a-2b58-4e93-9a10-6f83b2c5d417
        name:
          type: string
          description: Name of the text layer
          examples:
            - Brand name
        text_content:
          anyOf:
            - type: string
            - type: 'null'
          description: Current text content of the layer
          examples:
            - SUMMER CLUB
        font_postscript_name:
          anyOf:
            - type: string
            - type: 'null'
          description: PostScript name of the font used by this layer
          examples:
            - Montserrat-Bold
        font_size:
          anyOf:
            - type: number
            - type: 'null'
          description: Effective font size in pixels at the PSD's native resolution
          examples:
            - 120
        color:
          anyOf:
            - type: string
            - type: 'null'
          description: 'Text color as hex (e.g. #FFFFFF)'
          examples:
            - '#FFFFFF'
        font_available:
          anyOf:
            - type: boolean
            - type: 'null'
          description: >-
            Whether the layer's font is available for editable rendering. When
            false, edits render with a default font unless a font is supplied.
        is_editable:
          type: boolean
          description: Whether this layer's text can be replaced at render time
          default: false
        segment_count:
          type: integer
          description: >-
            Number of styled segments in this layer. 1 = single-style (edit with
            'text'); 2+ = styled segments (edit with 'segments', each segment
            keeps its own styling)
          default: 1
        segments:
          anyOf:
            - items:
                $ref: '#/components/schemas/TextSegment'
              type: array
            - type: 'null'
          description: >-
            The layer's styled segments, present when segment_count > 1.
            Override any subset by index at render time; omitted segments keep
            their original text.
        visible:
          anyOf:
            - type: boolean
            - type: 'null'
          description: >-
            Whether the layer is shown by default in the source file. A hidden
            layer can still be targeted; its text then renders. Null when
            unknown (older mockups).
        has_stroke_effect:
          type: boolean
          description: Whether this text layer has at least one outline of its own.
          default: false
        stroke_count:
          type: integer
          description: >-
            Number of outlines owned by this text layer, in front-to-back
            stroke_color order.
          default: 0
        has_color_overlay:
          type: boolean
          description: >-
            Whether the layer's visible color comes from a color effect. When
            true, a color override changes that effect's color.
          default: false
        has_clipped_artwork:
          anyOf:
            - type: boolean
            - type: 'null'
          description: >-
            Whether some content in the design is clipped to this layer's
            letters. When true, replacing this text also re-shapes that clipped
            content to the new letters. Null when it could not be determined for
            this mockup.
        suggested_edit_together:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          description: >-
            UUIDs of other text layers that carry the same text stacked with
            this one, such as a fill plus an outline copy. Sending the same
            replacement text to all of them keeps the design consistent.
            Advisory only: each layer is still edited on its own by UUID, never
            linked automatically. Null when it could not be determined.
          examples:
            - - a2f9c481-30d7-4b6e-8c52-1d9e7f34ab60
        enclosing_group_layers:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          description: >-
            UUIDs of enclosing group layers whose outlines also affect this text
            layer, nearest first. Advisory only: each group is edited separately
            through group_layers. Null when it could not be determined.
          examples:
            - - 5e8b0c72-9a41-4d36-b7f8-2c60d1e94537
      type: object
      required:
        - uuid
        - name
      title: TextLayer
      description: Text layer metadata in upload/detail responses
    GroupLayer:
      properties:
        uuid:
          type: string
          description: Unique identifier for the group layer
          examples:
            - 5e8b0c72-9a41-4d36-b7f8-2c60d1e94537
        name:
          type: string
          description: Name of the group layer
          examples:
            - Outlined logo
        has_stroke_effect:
          type: boolean
          description: Whether the group has at least one outline of its own
          default: true
        stroke_count:
          type: integer
          minimum: 1
          description: >-
            Number of outlines owned by this group, in front-to-back
            stroke_color order
          examples:
            - 2
      type: object
      required:
        - uuid
        - name
        - stroke_count
      title: GroupLayer
      description: Group layer with editable outlines in upload/detail responses.
    ThumbnailSize:
      properties:
        width:
          type: integer
          description: Thumbnail width in pixels
        url:
          type: string
          description: Public URL to the thumbnail image
      type: object
      required:
        - width
        - url
      title: ThumbnailSize
      description: Thumbnail with size and URL
    Size:
      properties:
        width:
          type: integer
          description: Width in pixels
        height:
          type: integer
          description: Height in pixels
      type: object
      required:
        - width
        - height
      title: Size
      description: Width and height in pixels.
    Position:
      properties:
        x:
          type: integer
          description: Position on PSD canvas in pixels (top-left origin).
        'y':
          type: integer
          description: Position on PSD canvas in pixels (top-left origin).
        width:
          type: integer
          description: Width in pixels
        height:
          type: integer
          description: Height in pixels
      type: object
      required:
        - x
        - 'y'
        - width
        - height
      title: Position
      description: Position coordinates for smart objects (bounding box)
    PrintAreaPreset:
      properties:
        uuid:
          type: string
          description: Unique identifier for the preset
          examples:
            - d07f5b18-2c94-4e83-a6b1-95f3c8e27a40
        name:
          type: string
          description: Name of the preset (e.g., 'Default')
          examples:
            - Default
        thumbnails:
          items:
            $ref: '#/components/schemas/ThumbnailSize'
          type: array
          description: Thumbnail previews of the preset
        size:
          $ref: '#/components/schemas/Size'
          description: Size dimensions of the print area
        position:
          $ref: '#/components/schemas/Position'
          description: Position relative to smart object (x, y, width, height)
      type: object
      required:
        - uuid
        - name
        - size
        - position
      title: PrintAreaPreset
      description: Print area preset configuration for smart object
    TextSegment:
      properties:
        index:
          type: integer
          description: Stable segment position within the layer (0-based)
        text:
          type: string
          description: The segment's current text
          default: ''
        font_postscript_name:
          anyOf:
            - type: string
            - type: 'null'
          description: PostScript name of the segment's font
        font_size:
          anyOf:
            - type: number
            - type: 'null'
          description: Segment font size in pixels at the PSD's native resolution
        color:
          anyOf:
            - type: string
            - type: 'null'
          description: 'Segment text color as hex (e.g. #FFFFFF)'
      type: object
      required:
        - index
      title: TextSegment
      description: >-
        One styled segment of a multi-style text layer (upload/detail
        responses).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API key with sm_ prefix. Get your key at
        https://sudomock.com/dashboard/api-keys

````