---
title: "Render a slide from a structured SSG intent (mirrors MCP create_slide)"
method: POST
path: "/v1/render/intent"
tags: ["render"]
---

# Render a slide from a structured SSG intent (mirrors MCP create_slide)

`POST /v1/render/intent`

## Request

- Base URL: `https://api.slideforge.dev`
- URL: `https://api.slideforge.dev/v1/render/intent`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Deterministic SSG render from a structured intent — the REST mirror of the MCP create_slide tool. Provide ONE of: `form` (+ typed content fields) for a typed intent, `prior_id` (+`content`) to render an exact catalog prior (no routing), `author_ssg` for a full AuthorSSG document, or a prose `brief`. $0.05 per slide.

`preview:true` → a FREE ephemeral PNG preview (no job, no charge, nothing downloadable). Eligible only for verbatim inputs (`prior_id`/`author_ssg`); briefs/images return 400 (use Generate).

Brief-mode style asks (dark/light, look adjectives) auto-map onto built-in themes unless `theme_id` is set — pick one explicitly via GET /v1/brands or browse_catalog(type=themes).

## Request body

- IntentRenderRequest: POST /v1/render/intent — structured SSG intent → deterministic render. The REST mirror of the MCP create_slide intent surface (the `_INTENT_FIELDS` allowlist in api/app/routers/ssg_v2.py). Provide a prose `brief`, a typed structured intent (`form` + the content slots below), an exact catalog prior (`prior_id` + `content`), or a full `author_ssg` document. $0.05 per slide. (A free PNG preview path is a follow-on per ADR-2026-06-13, built with the web themes/playground work.)
  - `brief` string, nullable
  - `form` string, nullable
  - `variant` string, nullable
  - `prior_id` string, nullable
  - `content` object, nullable
  - `author_ssg` object, nullable
  - `headline` string, nullable
  - `context` string, nullable
  - `subject` string, nullable
  - `takeaway` string, nullable
  - `caution` string, nullable
  - `highlight` string, nullable
  - `source_note` string, nullable
  - `date` string, nullable
  - `notes` string, nullable
  - `form_description` string, nullable
  - `density` string, nullable
  - `direction` 'ltr' | 'rtl', nullable
  - `blocks` unknown[], nullable
    - unknown
  - `metric` object, nullable
  - `data` object, nullable
  - `image_src` string, nullable
  - `image_prompt` string, nullable
  - `auto_decompose` boolean, nullable
  - `name` string, nullable
  - `theme_id` string, nullable
  - `brand` object, nullable
  - `source` string, nullable
  - `preview` boolean
  - `detail` string, nullable
  - `allow_fabrication` boolean
  - `allow_low_confidence` boolean
  - `allow_truncation` boolean
  - `dry_run` boolean
  - `quality_profile` string, nullable
  - `variant_policy` string, nullable
  - `allow_variant_fallback` boolean
  - `min_font_pt` number, nullable
  - `imagery` string, nullable
  - `imagery_tag` string, nullable
  - `styling` string, nullable
  - `verify` string, nullable

## Response `200`

Render complete (or free PNG preview)

- unknown

## Other responses

- `400`: Missing input, or preview not eligible (use Generate)
- `402`: Insufficient balance
- `422`: Intent could not be rendered — no charge

---

[API](https://skmtc.dev/slideforge/apis/slideforge-api.md) · [All operations](https://skmtc.dev/slideforge/apis/slideforge-api/llms.txt) · [OpenAPI document](https://skmtc.dev/slideforge/apis/slideforge-api/revisions/ae698e3d3c00?raw)
