---
title: "Public Article Audio"
method: GET
path: "/v1/articles/{article_slug}/audio"
---

# Public Article Audio

`GET /v1/articles/{article_slug}/audio`

## 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/{article_slug}/audio`
- Auth: none declared

Public audio resolve by slug — works for anonymous visitors
on /story/[slug]. No listener token required, no api_key gate.
Three states:

  200 → audio is ready. Body: {audio_url, audio_status: "ready"}
  202 → article exists but render-job is queued / running. We
        kick off a render-on-demand if no job exists yet, then
        return {audio_status, retry_after_seconds}.
  404 → article slug doesn't exist OR is listener-private and the
        viewer doesn't own it (audio_status='listener_private').

AudioPlayer treats 202 as "still rendering — show friendly UI
and poll" rather than throwing an error like 404 used to.

Wrapped end-to-end in try/except so any unexpected failure
surfaces as a 202 'unavailable' rather than a 500 the listener
can see. The exception still hits Sentry + structured logs.

## Path parameters

- `article_slug` string, required

## Headers

- `x-listener-token` string, nullable
- `x-storyflo-email-token` string, nullable

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