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

# Retrieve a single delivery

> Full single delivery row including the captured request body + headers (every attempt) and, for failed/dead attempts, the response body + headers. Fetched on demand, so the LIST endpoints stay lean and never carry these large fields.

<RequestExample>
  ```js Node.js theme={"theme":{"light":"github-light","dark":"vesper"}}
  const response = await fetch("https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6", {
    method: "GET",
    headers: { "x-api-key": "sm_your_api_key" },
  });

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

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

  $ch = curl_init("https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6");
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      "x-api-key: sm_your_api_key",
  ]);

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

  echo $response;
  ```

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

  response = requests.get(
      "https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6",
      headers={"x-api-key": "sm_your_api_key"},
  )

  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/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6")
  request = Net::HTTP::Get.new(uri)
  request["x-api-key"] = "sm_your_api_key"

  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 (
  	"fmt"
  	"io"
  	"net/http"
  )

  func main() {
  	req, err := http.NewRequest("GET", "https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6", nil)
  	if err != nil {
  		panic(err)
  	}
  	req.Header.Set("x-api-key", "sm_your_api_key")

  	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;

  HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6"))
      .header("x-api-key", "sm_your_api_key")
      .GET()
      .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 request = new HttpRequestMessage(HttpMethod.Get, "https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6");
  request.Headers.Add("x-api-key", "sm_your_api_key");

  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 GET "https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6" \
    -H "x-api-key: sm_your_api_key"
  ```
</RequestExample>

<ResponseExample>
  ```json Response theme={"theme":{"light":"github-light","dark":"vesper"}}
  {
    "id": "string",
    "endpoint_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "event_type": "string",
    "status": "string",
    "attempt": 1,
    "created_at": "2026-01-01T00:00:00Z"
  }
  ```
</ResponseExample>


## OpenAPI

````yaml openapi.json GET /api/v1/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}
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/webhook-endpoints/{endpoint_id}/deliveries/{delivery_id}:
    get:
      tags:
        - Webhook deliveries
      summary: Retrieve a single delivery
      description: >-
        Full single delivery row including the captured request body + headers
        (every attempt) and, for failed/dead attempts, the response body +
        headers. Fetched on demand, so the LIST endpoints stay lean and never
        carry these large fields.
      operationId: >-
        get_delivery_detail_api_v1_webhook_endpoints__endpoint_id__deliveries__delivery_id__get
      parameters:
        - name: endpoint_id
          in: path
          required: true
          schema:
            type: string
        - name: delivery_id
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookDeliveryDetailResponse'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: Node.js
          source: >-
            const response = await
            fetch("https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6",
            {
              method: "GET",
              headers: { "x-api-key": "sm_your_api_key" },
            });


            const data = await response.json();

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


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

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

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            curl_setopt($ch, CURLOPT_HTTPHEADER, [
                "x-api-key: sm_your_api_key",
            ]);


            $response = curl_exec($ch);

            curl_close($ch);


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

            response = requests.get(
                "https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6",
                headers={"x-api-key": "sm_your_api_key"},
            )

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

            require "uri"


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

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

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


            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\"fmt\"\n\t\"io\"\n\t\"net/http\"\n)\n\nfunc main() {\n\treq, err := http.NewRequest(\"GET\", \"https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6\", nil)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treq.Header.Set(\"x-api-key\", \"sm_your_api_key\")\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;

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6"))
                .header("x-api-key", "sm_your_api_key")
                .GET()
                .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 request = new HttpRequestMessage(HttpMethod.Get,
            "https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6");

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


            var client = new HttpClient();

            var response = await client.SendAsync(request);


            Console.WriteLine(await response.Content.ReadAsStringAsync());
        - lang: cURL
          source: >-
            curl -X GET
            "https://api.sudomock.com/api/v1/webhook-endpoints/3fa85f64-5717-4562-b3fc-2c963f66afa6/deliveries/3fa85f64-5717-4562-b3fc-2c963f66afa6"
            \
              -H "x-api-key: sm_your_api_key"
components:
  schemas:
    WebhookDeliveryDetailResponse:
      properties:
        id:
          type: string
          examples:
            - 3d682132-5477-4ffc-b33d-6e750c9c9f1f
        endpoint_id:
          type: string
          examples:
            - b5cd6284-f6a0-4cfc-94df-781353e30dfd
        job_id:
          type: string
          examples:
            - 4a4bfe21-d9d2-43a4-9877-b6ca4aec4349
        event_type:
          type: string
          examples:
            - render.succeeded
        status:
          type: string
          examples:
            - failed
        http_status:
          anyOf:
            - type: integer
            - type: 'null'
          examples:
            - 500
        attempt:
          type: integer
          examples:
            - 0
        last_error:
          anyOf:
            - type: string
            - type: 'null'
          examples:
            - 'non-2xx response: 500'
        created_at:
          type: string
          format: date-time
          examples:
            - '2026-09-18T09:24:12.615000Z'
        updated_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          examples:
            - '2026-09-18T09:24:12.983000Z'
        request_body:
          anyOf:
            - type: string
            - type: 'null'
          examples:
            - >-
              {"created_at":"2026-09-18T09:24:11.482713+00:00","error":null,"event":"render.succeeded","job_id":"4a4bfe21-d9d2-43a4-9877-b6ca4aec4349","kind":"render","result_url":"https://cdn.sudomock.com/mockup-assets/renders/c315f78f-d2c7-4541-b240-a9372842de94/render_8f2c1d4e.webp","status":"succeeded"}
        request_headers:
          anyOf:
            - type: string
            - type: 'null'
          examples:
            - >-
              {"Content-Type":"application/json","User-Agent":"SudoMock-Webhook/1.0","X-SudoMock-Signature":"2b4ddbe7024e2e0e732fb27374c3e0dedda3dbf2392abe78e9785c836f54832b","X-SudoMock-Timestamp":"1789723451"}
        response_body:
          anyOf:
            - type: string
            - type: 'null'
          examples:
            - Internal Server Error
        response_headers:
          anyOf:
            - type: string
            - type: 'null'
          examples:
            - '{"content-type":"text/plain;charset=UTF-8"}'
      type: object
      required:
        - id
        - endpoint_id
        - job_id
        - event_type
        - status
        - attempt
        - created_at
      title: WebhookDeliveryDetailResponse
      description: >-
        A single delivery row WITH the captured request/response detail.


        Returned ONLY by the per-delivery detail endpoint; the LIST endpoints

        (/deliveries, /events) stay lean: these large fields are fetched on
        demand,

        never carried per row. Capture rules (latest attempt; a retry overwrites
        the

        same row):
          - request_body / request_headers  -> captured on EVERY delivery attempt.
          - response_body / response_headers -> captured ONLY on failed/dead attempts
            (NULL on success, because a 2xx body is intentionally not stored). response_body
            is truncated to 16384 chars.

        Headers are stored as JSON strings (both backends; the CF/D1 path stores
        them

        the same way) and passed through as strings here, not re-parsed.
  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

````