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

# Rename or move a folder

> Renames a folder, moves it into another one, or both. Send parent_uuid null to move it to the top of the library; leave a field out to leave it alone. Everything inside the folder moves with it.

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

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

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

$payload = <<<'JSON'
{
  "name": "Frames 8x10"
}
JSON;

$ch = curl_init("https://api.sudomock.com/api/v1/folders/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': 'Frames 8x10'}

response = requests.patch(
    "https://api.sudomock.com/api/v1/folders/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/folders/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": "Frames 8x10"
  }
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": "Frames 8x10"
}`)

	req, err := http.NewRequest("PATCH", "https://api.sudomock.com/api/v1/folders/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": "Frames 8x10"
}
""";

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.sudomock.com/api/v1/folders/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": "Frames 8x10"
}
""";

var request = new HttpRequestMessage(HttpMethod.Patch, "https://api.sudomock.com/api/v1/folders/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/folders/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "x-api-key: sm_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Frames 8x10"
  }'
```

```json Response theme={"theme":{"light":"github-light","dark":"vesper"}}
{
  "success": true,
  "data": {
    "uuid": "c4f1a7d2-3b85-4e60-9a1f-7d2c5e8b4061",
    "name": "Frames",
    "parent_uuid": "9e3b6c14-27af-4d58-b0e1-5c8a2f9d7340",
    "created_at": "2026-01-01T00:00:00Z",
    "updated_at": "2026-01-01T00:00:00Z",
    "folder_count": 3,
    "psd_mockup_count": 12,
    "photo_mockup_count": 4,
    "path": [
      {
        "uuid": "9e3b6c14-27af-4d58-b0e1-5c8a2f9d7340",
        "name": "My mockups"
      }
    ],
    "total_folder_count": 5,
    "total_psd_mockup_count": 31,
    "total_photo_mockup_count": 8
  }
}
```


## OpenAPI

````yaml openapi.json PATCH /api/v1/folders/{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: Patterns
    description: Check a repeating pattern tile for seams and fix them.
  - 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 seam fixes, and read their results.
  - name: Account
    description: Read the current account, its plan and its remaining credits.
  - name: Folders
    description: Group mockups into folders that nest.
paths:
  /api/v1/folders/{uuid}:
    patch:
      tags:
        - Folders
      summary: Rename or move a folder
      description: >-
        Renames a folder, moves it into another one, or both. Send parent_uuid
        null to move it to the top of the library; leave a field out to leave it
        alone. Everything inside the folder moves with it.
      operationId: patch_folder_api_v1_folders__uuid__patch
      parameters:
        - name: uuid
          in: path
          required: true
          schema:
            type: string
            description: Folder UUID
          description: Folder UUID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FolderUpdateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FolderDetailResponse'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: Node.js
          source: >-
            const response = await
            fetch("https://api.sudomock.com/api/v1/folders/3fa85f64-5717-4562-b3fc-2c963f66afa6",
            {
              method: "PATCH",
              headers: {
                "x-api-key": "sm_your_api_key",
                "Content-Type": "application/json",
              },
              body: JSON.stringify({
                "name": "Frames 8x10"
              }),
            });


            const data = await response.json();

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


            $payload = <<<'JSON'

            {
              "name": "Frames 8x10"
            }

            JSON;


            $ch =
            curl_init("https://api.sudomock.com/api/v1/folders/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': 'Frames 8x10'}

            response = requests.patch(
                "https://api.sudomock.com/api/v1/folders/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/folders/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": "Frames 8x10"
              }
            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\": \"Frames 8x10\"\n}`)\n\n\treq, err := http.NewRequest(\"PATCH\", \"https://api.sudomock.com/api/v1/folders/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": "Frames 8x10"
            }
            """;

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.sudomock.com/api/v1/folders/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": "Frames 8x10"
            }

            """;


            var request = new HttpRequestMessage(HttpMethod.Patch,
            "https://api.sudomock.com/api/v1/folders/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/folders/3fa85f64-5717-4562-b3fc-2c963f66afa6"
            \
              -H "x-api-key: sm_your_api_key" \
              -H "Content-Type: application/json" \
              -d '{
                "name": "Frames 8x10"
              }'
components:
  schemas:
    FolderUpdateRequest:
      properties:
        name:
          anyOf:
            - type: string
            - type: 'null'
          description: A new name for the folder.
          examples:
            - Frames 8x10
        parent_uuid:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            The folder to move this one into. Send null to move it to the top of
            the library.
          examples:
            - 9e3b6c14-27af-4d58-b0e1-5c8a2f9d7340
      type: object
      title: FolderUpdateRequest
      description: >-
        Rename or move request for PATCH /api/v1/folders/{uuid}.


        A field left out is left alone. `parent_uuid: null` moves the folder to
        the

        top of the library, which is why "left out" and "sent as null" cannot be
        the

        same thing here and are told apart by what the caller actually sent.
      example:
        name: Frames 8x10
    FolderDetailResponse:
      properties:
        success:
          type: boolean
          description: Always true on a successful response.
          default: true
          examples:
            - true
        data:
          $ref: '#/components/schemas/FolderDetail'
          description: The folder, its trail and its totals.
      type: object
      required:
        - data
      title: FolderDetailResponse
      description: Single folder response for GET /api/v1/folders/{uuid}.
    FolderDetail:
      properties:
        uuid:
          type: string
          description: The folder's unique identifier.
          examples:
            - c4f1a7d2-3b85-4e60-9a1f-7d2c5e8b4061
        name:
          type: string
          description: The folder's name.
          examples:
            - Frames
        parent_uuid:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            The folder this one sits in. Null means it sits at the top of the
            library.
          examples:
            - 9e3b6c14-27af-4d58-b0e1-5c8a2f9d7340
        created_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          description: When the folder was created.
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          description: When the folder was last renamed or moved.
        folder_count:
          type: integer
          description: Folders directly inside this one.
          default: 0
          examples:
            - 3
        psd_mockup_count:
          type: integer
          description: PSD mockups directly inside this one.
          default: 0
          examples:
            - 12
        photo_mockup_count:
          type: integer
          description: Photo mockups directly inside this one.
          default: 0
          examples:
            - 4
        path:
          items:
            $ref: '#/components/schemas/FolderPathEntry'
          type: array
          description: >-
            The folders above this one, topmost first. Empty when the folder
            sits at the top of the library.
        total_folder_count:
          type: integer
          description: Folders inside this one at any depth.
          default: 0
          examples:
            - 5
        total_psd_mockup_count:
          type: integer
          description: PSD mockups inside this one at any depth.
          default: 0
          examples:
            - 31
        total_photo_mockup_count:
          type: integer
          description: Photo mockups inside this one at any depth.
          default: 0
          examples:
            - 8
      type: object
      required:
        - uuid
        - name
      title: FolderDetail
      description: |-
        A folder, the trail above it, and everything it holds at any depth.

        The totals count the whole subtree, which is what a delete takes, so a
        confirmation can say the number out loud before anything is removed.
    FolderPathEntry:
      properties:
        uuid:
          type: string
          description: The folder's unique identifier.
          examples:
            - 9e3b6c14-27af-4d58-b0e1-5c8a2f9d7340
        name:
          type: string
          description: The folder's name.
          examples:
            - My mockups
      type: object
      required:
        - uuid
        - name
      title: FolderPathEntry
      description: One step on the trail from the top of the library down to a folder.
  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

````

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