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

# Render Slides

> Queue a slide rendering job

Renders an array of slide definitions to PNG images via Satori + Resvg, uploads them to R2, and returns the public URLs through the job result.

**This endpoint is always async** — it returns a `job_id` immediately and the actual rendering happens on a background queue. Poll [`GET /jobs/:id`](/api-reference/jobs/get) until `status` is `completed`, then read `result.slides`.

## Authentication

<ParamField header="Authorization" type="string">
  Bearer token. `Bearer <api-key-or-jwt>`.
</ParamField>

## Body

<ParamField body="slides" type="object[]" required>
  Array of slide definitions. Each slide has a `name` and `background`.
</ParamField>

<ParamField body="texts" type="object[]">
  Array of text layers to place on slides. Each entry has `slide_index` and a `text` object with full styling (see [Generate Slides](/api-reference/slides/generate) for the full text schema).
</ParamField>

<ParamField body="images" type="object[]">
  Optional array of background image overrides. Each entry has `slide_index` and `image_url`. When provided, the slide's background type is set to `image`.
</ParamField>

## Polling pattern

```bash theme={null}
# 1. Submit
curl -X POST https://api.supapost.so/render \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"slides": [...], "texts": [...]}'
# → 202 { "job_id": "0b1e...", "status": "pending" }

# 2. Poll every 1-2 seconds
curl https://api.supapost.so/jobs/0b1e... \
  -H "Authorization: Bearer $KEY"
# → { "status": "processing" }
# → { "status": "completed", "result": { "slides": [{ "name": "...", "image_url": "..." }] } }
```

<ResponseExample>
  ```json 202 theme={null}
  {
    "job_id": "0b1e9a5f-...",
    "status": "pending"
  }
  ```

  ```json 400 theme={null}
  {
    "success": false,
    "message": "slides are required"
  }
  ```
</ResponseExample>
