---
title: "List Source Pages (per URL)"
method: POST
path: "/api/v1/source-pages"
tags: ["Sources"]
---

# List Source Pages (per URL)

`POST /api/v1/source-pages`

Returns individual cited URLs for a website with citation, mention, and impression metrics — one row per `normalized_url`. Each row also includes a `daily_mentions` sparkline (citation percentage per day across the date range) and the same source-type classification as [POST /api/v1/sources](/api-reference/sources/list-sources).

Use this when you need URL-level resolution (e.g. drill into which specific articles on a partner domain drove citations). For the root-domain rollup, use [POST /api/v1/sources](/api-reference/sources/list-sources).

## Request body

- SourcePagesListRequest — Request body for listing per-URL cited pages.
  - `website_id` string, uuid, required — The website to list cited URLs for.
  - `filters` ApiFilters, required — Filters for querying responses and metrics. Pass location filters in the JSON body as `filters.location_ids`.
    - `start_date` string, date-time, required — Filter start date (UTC)
    - `end_date` string, date-time — Filter end date (UTC)
    - `models` string[] — Filter by AI models
    - `prompt_ids` string[] — Filter by specific prompt IDs
    - `competitor_ids` string[] — Filter by specific competitor IDs
    - `location_ids` string[] — Filter by location IDs. Pass this in the JSON body as `filters.location_ids`, even when filtering by a single location. Use IDs returned by `GET /api/v1/locations`.
    - `prompt_status` 'active' | 'paused' — Filter by prompt status
    - `prompt_type` 'branded' | 'non_branded' — Filter by prompt type
  - `page_num` integer
  - `page_size` integer
  - `sort_field` 'citation_percentage' | 'estimated_impressions' | 'total_mentions' | 'mentions_count' | 'normalized_url' | 'competitor_ids' | 'first_seen'
  - `sort_direction` 'asc' | 'desc'
  - `search` string, nullable — Substring filter on `normalized_url` AND `normalized_root_domain`. Protocol (`https://`), `www.`, query, and fragment are stripped before matching; path is preserved so URL-specific searches still work.
  - `mentioned` 'yes' | 'no' — If `yes`, only count sources where your brand was mentioned in the citing response. If `no`, only count sources where your brand was NOT mentioned. Omit the field to count every cited source.
  - `competitors_mentioned` 'yes' | 'no' — If `yes`, only count sources where your brand was mentioned in the citing response. If `no`, only count sources where your brand was NOT mentioned. Omit the field to count every cited source.

## Response `200`

Successful response with the page of cited URLs.

- SourcePagesListResponse
  - `pages` SourcePageItem[], required
    - `normalized_url` string, required — The cited URL after protocol/www/trailing-slash normalization. Domain is lower-cased; path case is preserved.
    - `domain` string, required — Display-form domain (may include `www.`, subdomains).
    - `root_domain` string, required — Display-form root domain.
    - `normalized_root_domain` string, required — Lower-cased root domain — useful for joining against `POST /api/v1/sources` rows.
    - `total_mentions` number, required — Total citations of this URL (one per citing response) in the date range.
    - `estimated_impressions` number, required — Estimated impressions attributable to this URL across the date range.
    - `citation_percentage` number, required — Citations of this URL as a percentage of all matching responses.
    - `mentions_count` number, required — Count of citing responses on this URL where the brand was mentioned.
    - `competitor_ids` string[], required — Tracked competitors mentioned in responses that cite this URL.
    - `default_source_type` 'owned' | 'competitor' | 'partner' | 'third_party', required — How the source row is classified relative to the website. `owned` covers the website's own domains (including configured url-pattern owned domains). `competitor` matches tracked competitor root domains. `partner` matches configured affiliate domains. `third_party` is the residual bucket (Wikipedia, news, etc.). Per-website source-type overrides can promote/demote individual domains or URLs.
    - `source_type_ids` string[], required — Custom source-type tag UUIDs attached to this URL or its root domain.
    - `first_seen` string, required — Earliest citation date for this URL in the date range.
    - `daily_mentions` SourcePageDailyMention[], required — Per-day citation percentage sparkline for this URL across the date range. Empty array when no citations occurred.
      - `date` string, required — Date (YYYY-MM-DD) the citation percentage was measured on.
      - `citation_percentage` number, required — Percentage of all responses on this date that cite the URL.
  - `pagination` SourcesPagination, required — Pagination metadata. Unlike `Pagination` (which uses `has_more` lookahead), the sources surfaces expose a precise `total` count — the underlying ClickHouse query computes it as a window function in the same scan, so there's no extra round-trip cost.
    - `page_num` integer, required — Zero-indexed page number returned.
    - `page_size` integer, required — Maximum items per page.
    - `total` integer, required — Total number of rows matching the filters (across all pages).

## 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 a sub-resource ID (`prompt_ids`, `competitor_ids`, `location_ids`) belongs to another website.
- `404` — Website not found.
- `500` — Internal server error.

---

[API](https://skmtc.net/athenahq/apis/athenahq-api.md) · [All operations](https://skmtc.net/athenahq/apis/athenahq-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/athenahq/athenahq-api/revisions/6c5d71622cb9/schema)
