> ## Documentation Index
> Fetch the complete documentation index at: https://docs.particle.pro/llms.txt
> Use this file to discover all available pages before exploring further.

# Podcast Publisher Bias

> Aggregate political bias intelligence at the podcast publisher level: catalog-wide lean, diversity, regional distribution, and cross-publisher rankings.

Particle API analyzes every well-classified podcast against a seven-point political bias scale, calibrated against a regional political framework (US, UK, EU, CANADA, AUSTRALIA, INDIA, or OTHER). The publisher-level endpoints described here roll those per-podcast verdicts up across every podcast a publisher controls, so advertisers, researchers, and platforms can reason about a publisher's full footprint rather than evaluating shows one at a time.

<Note>Publisher-level bias intelligence is a Premium endpoint. The per-podcast bias rating remains available on the standard tier through [GET /v1/podcasts/{id}/bias](/podcasts/overview#bias-analysis).</Note>

## What the profile gives you

A bundle-buy decision (or a publisher-fit audit) needs more than the modal lean of a single show. Particle's publisher bias profile captures the catalog along five dimensions:

* **Coverage** (`coverage` block) — `total_podcasts`, `analyzed_podcasts`, and `analyzed_coverage` so callers know how much of the catalog the verdict draws from. Backfill is in flight; a value of `coverage.analyzed_coverage` materially below 1.0 means there are still un-analyzed shows.
* **Political content** (`political_content` block) — `political_content.share` is the fraction of analyzed podcasts the agent rated as political (i.e. not `NOT_POLITICAL`). Distinguishes news-heavy publishers from entertainment-heavy publishers.
* **Lean** (`lean` block, absent from the response when the publisher has no political content) — `lean.avg_score` on a –3 (extreme left) to +3 (extreme right) ordinal scale, restricted to political content.
* **Diversity** — `lean.stddev`, the standard deviation of the lean across political podcasts. Low values indicate a monolithic publisher (e.g. The Daily Wire, MeidasTouch); high values indicate a heterogeneous catalog (iHeartPodcasts spans EXTREME\_RIGHT to LEFT).
* **Distributions** (`distributions` block) — bucket-level counts across the seven directional buckets plus `NOT_POLITICAL`, and a per-region breakdown by political\_context so callers can audit the verdict directly.

## The bias scale

| Bucket          | Score | Description                                     |
| --------------- | ----- | ----------------------------------------------- |
| `EXTREME_LEFT`  | –3    | Far-left content with overt partisan framing.   |
| `LEFT`          | –2    | Clearly left-leaning editorial perspective.     |
| `LEANS_LEFT`    | –1    | Center-left orientation; mild partisan signal.  |
| `CENTER`        | 0     | Even-handed treatment of political topics.      |
| `LEANS_RIGHT`   | +1    | Center-right orientation; mild partisan signal. |
| `RIGHT`         | +2    | Clearly right-leaning editorial perspective.    |
| `EXTREME_RIGHT` | +3    | Far-right content with overt partisan framing.  |
| `NOT_POLITICAL` | —     | Not substantively political content.            |

The numeric score is exposed so callers can sort, average, and visualize across podcasts; it is not a substitute for the literal bucket and `NOT_POLITICAL` content is excluded from score-based metrics.

## Get a publisher's bias profile

<CodeGroup>
  ```bash curl theme={"dark"}
  curl "https://api.particle.pro/v1/podcasts/publishers/iheartpodcasts/bias" \
    -H "X-API-Key: $PARTICLE_API_KEY"
  ```

  ```js JavaScript theme={"dark"}
  const res = await fetch(
    "https://api.particle.pro/v1/podcasts/publishers/iheartpodcasts/bias",
    { headers: { "X-API-Key": process.env.PARTICLE_API_KEY } },
  );
  const profile = await res.json();
  ```

  ```python Python theme={"dark"}
  res = httpx.get(
      "https://api.particle.pro/v1/podcasts/publishers/iheartpodcasts/bias",
      headers={"X-API-Key": os.environ["PARTICLE_API_KEY"]},
  )
  profile = res.json()
  ```
</CodeGroup>

```jsonc Response theme={"dark"}
{
  "publisher": { "id": "...", "slug": "iheartpodcasts", "name": "iHeartPodcasts" },
  "coverage": {
    "total_podcasts": 210,
    "analyzed_podcasts": 85,
    "analyzed_coverage": 0.4048
  },
  "political_content": {
    "podcasts": 17,
    "share": 0.20,
    "avg_topic_percentage": 0.41
  },
  "lean": {                  // absent when political_content.podcasts == 0
    "avg_score": -0.47,
    "stddev": 1.62,
    "dominant_bias": "LEANS_LEFT"
  },
  "distributions": {
    "bias": [
      { "result": "NOT_POLITICAL", "count": 68 },
      { "result": "LEANS_LEFT", "count": 9 },
      { "result": "LEFT", "count": 4 },
      { "result": "RIGHT", "count": 3 },
      { "result": "EXTREME_RIGHT", "count": 1 }
    ],
    "region": [
      { "political_context": "UNKNOWN", "count": 68 },
      { "political_context": "US", "count": 17 }
    ]
  },
  "last_evaluated_at": "2026-04-12T18:33:21Z"
}
```

The response is intentionally grouped: `coverage` is "how much of the catalog the verdict draws from", `political_content` is "how political the catalog is", and `lean` is "where the political content sits on the ideological axis". When a publisher has no political content at all (e.g. a sports-only network), the `lean` block is absent from the response — a single `"lean" in obj` check answers "is there a lean signal at all?". Leaderboard entries share the same nested shape minus `distributions`.

## List a publisher's analyzed podcasts

Drill into the underlying podcasts that drove the profile. Filter by bias bucket(s) (comma-separated) or `political_context`, exclude NOT\_POLITICAL podcasts, and sort by lean, recency, or name.

```bash theme={"dark"}
curl "https://api.particle.pro/v1/podcasts/publishers/npr/bias/podcasts?bias=LEFT,LEANS_LEFT&sort=lean_score&order=asc" \
  -H "X-API-Key: $PARTICLE_API_KEY"
```

Sort options:

| Sort           | Description                                              |
| -------------- | -------------------------------------------------------- |
| `lean_score`   | -3..+3 ordinal lean. Default.                            |
| `evaluated_at` | Most recent analysis first (or oldest with `order=asc`). |
| `name`         | Alphabetical.                                            |

## Cross-publisher leaderboard

Rank publishers by a chosen bias metric. Useful for discovery (what are the most right-leaning podcast publishers in the US?) and reporting (which publishers are most catalog-diverse?). Score-based metrics gate small-sample publishers via `min_analyzed_podcasts` and `min_political_podcasts`.

```bash theme={"dark"}
curl "https://api.particle.pro/v1/podcasts/bias/publishers/leaderboard?metric=most_right_leaning&political_context=US&min_political_podcasts=5" \
  -H "X-API-Key: $PARTICLE_API_KEY"
```

Available metrics:

| Metric               | Description                                                                                           |
| -------------------- | ----------------------------------------------------------------------------------------------------- |
| `most_left_leaning`  | Lowest `lean.avg_score` first. Requires ≥ `min_political_podcasts` political podcasts.                |
| `most_right_leaning` | Highest `lean.avg_score` first. Requires ≥ `min_political_podcasts` political podcasts.               |
| `most_political`     | Highest `political_content.share` first. Distinguishes news publishers from entertainment publishers. |
| `most_diverse`       | Highest `lean.stddev` first — publishers whose catalog spans a wide political range.                  |
| `most_monolithic`    | Lowest `lean.stddev` first — publishers whose catalog is tightly clustered around one lean.           |
| `most_analyzed`      | Highest `coverage.analyzed_coverage` first — publishers whose catalog is closest to fully analyzed.   |

## Flip view: which publishers carry the most podcasts in a given bias bucket?

The symmetric "given a bucket, which publishers?" lens. Useful when the question is "who carries the most RIGHT-leaning content?" rather than "where does publisher X stand?".

```bash theme={"dark"}
curl "https://api.particle.pro/v1/podcasts/bias/RIGHT/publishers?sort=share&min_count=3" \
  -H "X-API-Key: $PARTICLE_API_KEY"
```

`sort=count` ranks by raw `podcasts_in_bucket`; `sort=share` ranks by `podcasts_in_bucket / analyzed_podcasts`. Use `share` to surface publishers whose catalog is concentrated in the bucket regardless of catalog size; `count` to surface the largest absolute footprints. Every entry includes up to five `sample_podcast_ids` so callers can spot-check the verdict without an extra request.

## Methodology notes

* **Latest analysis only.** Every aggregate is computed from the most recent non-deleted analysis per podcast (`DISTINCT ON (podcast_id) ORDER BY evaluated_at DESC`). Historical analyses are kept for audit but never contribute to the rolled-up profile.
* **NOT\_POLITICAL is not 0.** `NOT_POLITICAL` content is excluded from `lean.avg_score`, `lean.stddev`, and `lean.dominant_bias`. Including it as a `CENTER` proxy would silently muddy the lean signal for entertainment-heavy publishers.
* **Sample standard deviation.** `lean.stddev` is the sample standard deviation (Bessel's correction, `n−1`). It is `null` when there is fewer than two political podcasts.
* **Coverage caveat.** Analysis backfill is in flight. Treat `coverage.analyzed_coverage` as a confidence proxy on the rolled-up verdict — publishers with low coverage should be re-checked once the backfill completes.
