---
title: "Stories Feed"
method: GET
path: "/v1/stories/feed"
---

# Stories Feed

`GET /v1/stories/feed`

## 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/stories/feed`
- Auth: none declared

Public trending feed. Defaults to ``audio_ready_only=True`` so
visitors only see articles with rendered audio they can actually
play. Pass ``?audio_ready_only=false`` for admin/diagnostic
surfaces that want the full picture.

SEO · pass ``?exclude_stubs=true`` to get ONLY the articles this API
renders in full to an anonymous viewer — the ones /story/[slug]
lets Google index. Everything else is a thin ``publisher_only`` /
``listener_private`` attribution stub that the story page marks
``noindex``. The frontend sitemap builder uses this so it no longer
has to fetch every candidate slug's detail just to learn which are
indexable (that per-slug hydration ran under a 15s wall-clock
deadline and was silently truncating the sitemap to a fraction of
the real catalogue).

Item #15 · Pass ``?personalized=true&listener_token=...`` to rank
by cosine similarity to the listener's taste vector (pgvector +
text-embedding-3-small). Falls back gracefully to recency when
the listener has no taste vector yet or pgvector isn't installed.

## Query parameters

- `vertical` string, nullable
- `limit` integer
- `offset` integer
- `curated_only` boolean
- `audio_ready_only` boolean
- `personalized` boolean
- `exclude_stubs` boolean
- `listener_token` string, nullable

## Response `200`

Successful Response

- object

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