---
title: "Get Publication Feed"
method: GET
path: "/v2/datasets/odyssey/publications/feed"
tags: ["odyssey"]
---

# Get Publication Feed

`GET /v2/datasets/odyssey/publications/feed`

Chronological, cursor-paginated stream of articles.

Always live: every read builds the feed at request time — articles are gathered from publisher sources, merged, de-duplicated, and sorted by recency. The aggregated listing itself is never cached; only per-article enrichment work is. `fields=ids` is the cheap title-only mode. `fields=full` returns entity-linked articles; articles not yet enriched come back with `enrichment_status="pending"` — the list never enriches a whole page inline. Hydrate individual articles via `GET /v2/datasets/odyssey/publications/articles/{article_id}`, which enriches on demand. `since`/`until` window by time; page via `next_cursor`.

Filters: `publications=` is a cheap publisher allowlist applied before enrichment. `sector=` and `has_entities=` depend on enrichment, so they hydrate the page on demand — the page size is clamped low and each request carries an enrichment budget and wall-clock deadline; when a bound is hit you receive a partial page plus a cursor to continue.

## Query parameters

- `since` string, nullable
- `until` string, nullable
- `cursor` string, nullable
- `page_size` integer
- `publications` string[], nullable
- `publication` string[], nullable
- `sector` string, nullable
- `has_entities` boolean, nullable
- `fields` string
- `title_only` boolean, nullable

## Response `200`

Successful Response

- AppApiRoutesV2OdysseyFeedFeedResponse
  - `articles` AppApiRoutesV2OdysseyFeedFeedResponseArticlesItems[]
  - `has_more` boolean
  - `next_cursor` string, nullable
  - `page_size` integer, nullable

---

[API](https://skmtc.dev/runcaptain/apis/api-reference.md) · [All operations](https://skmtc.dev/runcaptain/apis/api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/runcaptain/api-reference/revisions/fe4649e3f4aa/schema)
