---
title: "List Content"
method: GET
path: "/api/domains/{domain_id}/content"
tags: ["content_attribution"]
---

# List Content

`GET /api/domains/{domain_id}/content`

## Request

- Base URL: `https://api-v1.unusual.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api-v1.unusual.ai/api/domains/{domain_id}/content`
- Auth: OAuth 2
  - Password
  - Token URL: `/auth/login`

List content items for a domain, paginated.

Filters apply BEFORE sort + cursor — the cursor is only meaningful
within the same filter combination. Changing any filter (or sort)
requires the client to start from the top (no cursor).

The default ``limit`` is 500 so most domains' Owned and Competitor
tabs come back in a single page, letting the frontend route
sort/filter operations client-side and stay instant. Third-party (or
"all") tabs at large domains will paginate via ``nextCursor``.

## Path parameters

- `domain_id` string, required

## Query parameters

- `category_slug` string, nullable
- `ownership` string, nullable: owned|competitor|third_party
- `source` 'company_docs' | 'website', nullable: Filter to one side of the response's own `source` split: 'company_docs' (source_kind = company_doc) or 'website' (everything else).
- `sort` 'visits' | 'recent' | 'title' | 'impact'
- `dir` 'asc' | 'desc', nullable: Sort direction. Defaults to the natural direction for the chosen sort (visits/recent/impact = desc, title = asc). Pass 'asc' or 'desc' to override.
- `cursor` string, nullable: Opaque cursor from a previous response's nextCursor
- `limit` integer
- `q` string, nullable: Free-text search across title + canonical_url

## Headers

- `x-view-as` string, nullable

## Response `200`

Successful Response

- ContentItemListPage: Paginated response for the list endpoint. ``totalEstimate`` is the count of items matching the active filter combination at the moment the cache was populated — accurate within the cache TTL (60s), slightly stale after. The frontend uses it for "Showing 50 of 12,237" + the "all items fit in one page" decision that re-enables instant client-side sort/filter. Capped at ``_MAX_SORTED_KEYS``: on a domain with more matches than the cap this is a FLOOR, not the true total (the frontend should render a value equal to the cap as ``N+``). ``sort=impact`` further narrows the universe to cited items, so its ``totalEstimate`` is the cited-item count, not the catalog size — both are intentional and go away with the WS3 rollup + keyset rewrite. ``botVisitWindowDays`` reports how many days of bot-visit history we actually have for this domain — computed from the oldest ``BotVisit.hour_bucket`` we hold. The Content tab uses it to render an honest "visits Nd" label instead of always saying "7d" even when only a few hours of data exist (which is the case in the first 30 days after a customer enables Cloudflare ingestion). Capped at 30 since we backfill that far at most. ``None`` means "no bot visits at all (proxy or Cloudflare)" — caller hides the metric.
  - `items` ContentItemSummaryOut[], required
    - `id` string, required
    - `title` string, nullable
    - `slug` string, required
    - `url` string, required
    - `pageType` string, nullable
    - `topic` string, required
    - `topicLabel` string, required
    - `source` 'company_docs' | 'website', required
    - `ownership` 'owned' | 'competitor' | 'third_party', required
    - `publishedAt` string, nullable
    - `personaIds` string[], required
    - `buyingContextIds` BuyingContextIdOut[], required
      - `personaId` string, required
      - `contextId` string, required
    - `priorityIds` string[], required
    - `visitsByDay` VisitPointOut[], required
      - `date` string, required
      - `visits` integer, required
    - `citationsByDay` VisitPointOut[], required
      - `date` string, required
      - `visits` integer, required
    - `totalVisits` integer, required
    - `totalCitations` integer, required
    - `recentVisits` integer
    - `impactScore` integer
  - `nextCursor` string, nullable
  - `totalEstimate` integer, required
  - `botVisitWindowDays` integer, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/unusual/apis/dashboard-server.md) - [All operations](https://skmtc.dev/unusual/apis/dashboard-server/llms.txt) - [OpenAPI document](https://skmtc.dev/unusual/apis/dashboard-server/revisions/89f716930ead?raw)
