Skip to main content
POST
/
render
Render Slides
curl --request POST \
  --url https://api.supapost.so/render \
  --header 'Content-Type: application/json' \
  --data '
{
  "slides": [
    {}
  ],
  "texts": [
    {}
  ],
  "images": [
    {}
  ]
}
'
{
  "jobId": "0b1e9a5f-...",
  "status": "pending"
}
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 jobId immediately and the actual rendering happens on a background queue. Poll GET /jobs/:id until status is completed, then read result.slides.

Authentication

Authorization
string
Bearer token. Bearer <api-key-or-jwt>.

Body

slides
object[]
required
Array of slide definitions. Each slide has a name and background.
texts
object[]
Array of text layers to place on slides. Each entry has slideIndex and a text object with full styling (see Generate Slides for the full text schema).
images
object[]
Optional array of background image overrides. Each entry has slideIndex and imageUrl. When provided, the slide’s background type is set to image.

Polling pattern

# 1. Submit
curl -X POST https://api.supapost.so/render \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"slides": [...], "texts": [...]}'
# → 202 { "jobId": "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": "...", "imageUrl": "..." }] } }
{
  "jobId": "0b1e9a5f-...",
  "status": "pending"
}