---
title: "List Content Items"
method: GET
path: "/api/v1/content/items"
tags: ["Content"]
---

# List Content Items

`GET /api/v1/content/items`

## Request

- Base URL: `https://api.athenahq.ai`
- URL: `https://api.athenahq.ai/api/v1/content/items`
- Auth: API key in header `x-api-key`

Returns every content item in a website's Content Hub, published or not: in-flight drafts, briefs, snipes, optimize and slice runs, scheduled and failed items, plus tracked pages. This is the enumeration path from a `sheet_id` to its unpublished rows. `POST /api/v1/content` lists only finished pipeline rows, with citation and impression metrics, so a sheet full of generated drafts appears empty there; use this endpoint to see them.

Returns identity fields only (id, title, type, stage, sheet, URL, timestamps, target prompt ids), no metrics. Reads from the primary store and is uncached, so an item is listable the moment `POST /api/v1/content/generate` returns its `content_id`. Read a row's text with `GET /api/v1/content/{content_id}`.

`stage` is the raw pipeline workflow state, not a publication flag: `null` means no pipeline record (most external and imported tracked pages), and manual editor items carry `generated`. Treat an item as published only when its stage is `done` (or it is an external or imported page) and it has a `url`; `done` without a `url` is an unpublished orphan.

Passing the `sheet_id` of a view-type tab (see `sheet_type` on `GET /api/v1/content/sheets`) lists the shared main pool without the view's saved filters. Hidden content (`is_hidden = true`) is excluded. Pagination uses `page_size + 1` lookahead: `pagination.has_more === true` means the next page exists; there is no total-count field. Pass an unknown `sheet_id` or `prompt_id` (or one from another website) and the endpoint returns 403.

Also exposed as the MCP tool `list_content`.

## Query parameters

- `website_id` string, uuid, required
- `sheet_id` string, uuid
- `content_type` 'external' | 'imported' | 'athena_created' | 'draft' | 'snipe' | 'optimize' | 'slice' | 'manual'
- `stage` 'scheduled' | 'pending' | 'pending_brief' | 'generated_brief' | 'pending_article' | 'generated' | 'done' | 'failed'
- `prompt_id` string, uuid
- `page_num` integer
- `page_size` integer

## Response `200`

Successful response with the page of content items.

- ContentItemsListResponse
  - `content` ContentInventoryItem[], required
    - `content_id` string, uuid, required: Unique identifier for the content item. Pass it to `GET /api/v1/content/{content_id}` to read the brief and body.
    - `title` string, nullable, required: Page or post title (nullable for unscraped URLs).
    - `type` string, nullable, required: How the content entered the hub: `draft` (Athena-written article), `optimize` (rewrite of an existing page), `snipe`, `slice`, `manual` (authored in the editor), `external` (added manually), `imported` (via GA4). `null` for legacy rows.
    - `stage` 'scheduled' | 'pending' | 'pending_brief' | 'generated_brief' | 'pending_article' | 'generated' | 'done' | 'failed', nullable, required: Raw pipeline workflow state, not a publication flag. `null` when the item has no pipeline record (most external and imported tracked pages). `generated` means the text is ready but unpublished (manual editor items carry it too); `done` means published or marked done; `scheduled` means a publish is scheduled. An item counts as published only when its stage is `done` (or it is an external or imported page) and it has a `url`.
    - `url` string, nullable, required: Canonical URL (display form, may include `www.`). `null` until the item is published somewhere.
    - `normalized_url` string, nullable, required: URL after protocol/trailing-slash normalization. Used to join with citation data.
    - `sheet_id` string, uuid, nullable, required: Content Hub tab the item is pinned to. `null` for content in the shared main pool.
    - `sheet_name` string, nullable, required: Human-readable name of the tab. `null` when `sheet_id` is null.
    - `topic_name` string, nullable, required: Topic the content is paired with (if any).
    - `prompt_ids` string[], required: The prompts this item was written for (its targeting), capped at 25 per row; `prompt_count` is the untruncated size. Includes soft-deleted prompts, which `GET /api/v1/prompts` does not list. Empty when no targeting was recorded, which is normal for imported or externally tracked pages. Not the prompts whose answers cited the page; see `POST /api/v1/content/prompts` for that.
    - `prompt_count` integer, required: Total number of prompts this item targets, including any beyond the 25 in `prompt_ids`. Read the rest through `GET /api/v1/content/{content_id}`.
    - `mark_as_done_time` string, date-time, nullable, required: When the content was marked as published / done in Content Hub. `null` while unpublished.
    - `created_at` string, date-time, required: When the content row was created (UTC).
    - `updated_at` string, date-time, required: The newer of the content row's and its pipeline record's last update (UTC), so generation progress bumps it.
  - `pagination` Pagination, required: Pagination metadata. Uses `page_size + 1` lookahead — `has_more=true` means the next page is non-empty. No total-count field, by design (avoids the extra `COUNT(*)` round-trip).
    - `page_num` integer, required: Zero-indexed page number returned.
    - `page_size` integer, required: Maximum items per page.
    - `has_more` boolean, required: `true` if another page is available.

## Other responses

- `400`: Bad request, invalid parameters.
- `401`: Unauthorized, invalid or missing API key.
- `403`: Forbidden, you don't have access to this website, or the `sheet_id` / `prompt_id` belongs to another website.
- `500`: Internal server error.

## Changes

- **2026-11-03** `2d1d86d5e067`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/athenahq/apis/athenahq-api/changes/api/v1/content/items/get.md)

---

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