---
title: "Rank publishers by political bias metric"
method: GET
path: "/v1/podcasts/bias/publishers/leaderboard"
tags: ["Podcast Bias", "tier:premium"]
---

# Rank publishers by political bias metric

`GET /v1/podcasts/bias/publishers/leaderboard`

## Request

- Base URL: `https://api.particle.pro`
- URL: `https://api.particle.pro/v1/podcasts/bias/publishers/leaderboard`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Returns a paginated leaderboard ranking publishers by a chosen bias metric: most_left_leaning, most_right_leaning, most_political, most_diverse, most_monolithic, or most_analyzed. min_analyzed_podcasts and min_political_podcasts gate small-sample publishers from the ranking. Optional political_context, since, and until restrict the corpus before aggregation.

## Query parameters

- `limit` integer: Results per page
- `cursor` string: Opaque pagination cursor from previous response
- `metric` 'most_left_leaning' | 'most_right_leaning' | 'most_political' | 'most_diverse' | 'most_monolithic' | 'most_analyzed', required: Ranking metric. most_left/right_leaning rank by avg_lean_score; most_political by share of political podcasts in the catalog; most_diverse / most_monolithic by stddev of lean across political podcasts; most_analyzed by catalog coverage.
- `political_context` 'US' | 'UK' | 'EU' | 'CANADA' | 'AUSTRALIA' | 'INDIA' | 'OTHER' | 'UNKNOWN': Restrict the underlying corpus to a single political framework before aggregating.
- `min_analyzed_podcasts` integer: Only rank publishers with at least this many analyzed podcasts. Below the default of 5, aggregate signals are unreliable.
- `min_political_podcasts` integer: Only rank publishers with at least this many political podcasts. Applied to score and diversity metrics; ignored for coverage metrics.
- `since` string: Restrict to analyses evaluated on or after this ISO 8601 date or date-time
- `until` string: Restrict to analyses evaluated strictly before this ISO 8601 date-time. A bare date includes that whole UTC day.

## Response `200`

OK

- PagePodcastPublisherBiasLeaderboardEntry
  - `cursor` string: Pass to next request for more results
  - `data` PodcastPublisherBiasLeaderboardEntry[], nullable, required: List of results
    - `coverage` PodcastPublisherBiasCoverage, required
      - `analyzed_coverage` number, double, required: analyzed_podcasts / total_podcasts (0..1). Treat as a confidence proxy for the rolled-up verdict.
      - `analyzed_podcasts` integer, required: Number of catalog podcasts with at least one non-deleted bias analysis
      - `total_podcasts` integer, required: Number of podcasts in the publisher's catalog (denormalized from podcast_publishers.podcast_count)
    - `last_evaluated_at` string, date-time: Most recent evaluated_at across the publisher's analyses
    - `lean` PodcastPublisherBiasLean
      - `avg_score` number, double, nullable, required: Average lean across political podcasts on a -3 (extreme left) to +3 (extreme right) ordinal scale: EXTREME_LEFT=-3, LEFT=-2, LEANS_LEFT=-1, CENTER=0, LEANS_RIGHT=+1, RIGHT=+2, EXTREME_RIGHT=+3.
      - `dominant_bias` string, required: Modal political bias bucket across the publisher's political podcasts.
      - `stddev` number, double, nullable, required: Sample standard deviation of the lean score across political podcasts — a diversity signal. Low = monolithic publisher; high = heterogeneous catalog. Null when only one political podcast (stddev undefined for n=1).
    - `political_content` PodcastPublisherBiasPoliticalContent, required
      - `avg_topic_percentage` number, double: Average share of episodes flagged under one of the political root topics across analyzed podcasts (0..1). Sparse — omitted when no analyzed podcast carries this signal.
      - `podcasts` integer, required: Analyzed podcasts whose latest result is not NOT_POLITICAL
      - `share` number, double, required: podcasts / analyzed_podcasts (0..1) — distinguishes news-heavy publishers from entertainment-heavy publishers
    - `publisher` PodcastPublisherCompact, required
      - `id` string, required: Publisher ID
      - `name` string, required: Publisher name
      - `slug` string: Human-readable slug identifier (e.g., 'goalhanger', 'iheartpodcasts'). When present, accepted in place of the ID anywhere a publisher reference is taken in the API. Occasionally absent on publishers whose name doesn't slugify (e.g., scripts not representable in ASCII URL slugs).
    - `rank` integer, required: Position in the leaderboard
  - `has_more` boolean, required: Whether more results exist

## Other responses

- `402`: Payment Required. Read error_code. payment_required is the x402 path: either a keyless request being challenged — pay $0.04 in USDC per request (requirements in the PAYMENT-REQUIRED header) or send a pp_ API key — or a supplied payment that failed settlement (details in the PAYMENT-RESPONSE header; retry the same signature before signing a new one). See https://docs.particle.pro/x402. Any other code means the credential was accepted but does not cover this request (a plan or session gate such as premium_required or paid_plan_confirmation_required); its resolve says how to obtain access, and no payment header is sent.
- `default`: Error

---

[API](https://skmtc.dev/particle/apis/particle-api.md) · [All operations](https://skmtc.dev/particle/apis/particle-api/llms.txt) · [OpenAPI document](https://skmtc.dev/particle/apis/particle-api/revisions/416ba82ab9d7?raw)
