---
title: "Lazy Render Voice"
method: POST
path: "/v1/articles/{slug}/render-voice"
---

# Lazy Render Voice

`POST /v1/articles/{slug}/render-voice`

## Request

- Base URL: `https://api.storyflo.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.storyflo.com/v1/articles/{slug}/render-voice`
- Auth: none declared

Lazy-render an article in a non-default free voice.

When a listener picks a free-tier voice via /v1/listeners/{token}/voice
that the worker never pre-rendered, this endpoint produces it on
demand — NO Plus/Pro gate (the on-demand /rerender path above carries
that gate; this one is the free-tier counterpart so EVERY free voice
works once a listener selects it).

Flow:
  1. Cache hit on (slug, voice) → 200 with audio_url.
  2. Miss → enqueue a fresh render at 'prerender' priority + 202
     with a polling URL.

Auth: a valid (non-expired) listener_token is the only gate. We
don't bill the listener and don't decrement any quota; the audio
join the warm cache so the second listener who picks the same
(slug, voice) hits step 1.

## Path parameters

- `slug` string, required

## Request body

- LazyRenderRequest
  - `voice_id` string, required
  - `listener_token` string, required

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/storyflo/apis/storyflo-inference-router.md) · [All operations](https://skmtc.dev/storyflo/apis/storyflo-inference-router/llms.txt) · [OpenAPI document](https://skmtc.dev/storyflo/apis/storyflo-inference-router/revisions/c3a1a735ac7a?raw)
