---
title: "Get publisher political bias profile"
method: GET
path: "/v1/podcasts/publishers/{id}/bias"
tags: ["Podcast Bias", "tier:premium"]
---

# Get publisher political bias profile

`GET /v1/podcasts/publishers/{id}/bias`

## Request

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

Returns political bias intelligence rolled up across every analyzed podcast attributed to the publisher: coverage stats, political share, average lean (on a -3..+3 ordinal scale), lean diversity, the bias-bucket and regional distributions, and the most recent evaluation timestamp. Score-based metrics are omitted when the publisher has no political podcasts.

## Path parameters

- `id` string, required: Podcast publisher slug (e.g., 'iheartpodcasts', 'npr', 'bbc-radio-4') or ID

## Response `200`

OK

- PodcastPublisherBiasProfile
  - `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)
  - `distributions` PodcastPublisherBiasDistributions, required
    - `bias` PodcastPublisherBiasBucketCount[], nullable, required: Per-bucket counts of analyzed podcasts by their latest result
      - `count` integer, required: Number of analyzed podcasts in the publisher's catalog whose latest result matches this bucket
      - `result` string, required: Bias bucket: NOT_POLITICAL or one of EXTREME_LEFT, LEFT, LEANS_LEFT, CENTER, LEANS_RIGHT, RIGHT, EXTREME_RIGHT
    - `region` PodcastPublisherBiasContextCount[], nullable, required: Per-region counts of analyzed podcasts by political_context
      - `count` integer, required: Number of analyzed podcasts whose latest analysis is calibrated against this political framework
      - `political_context` string, required: Political framework: US, UK, EU, CANADA, AUSTRALIA, INDIA, OTHER, or UNKNOWN
  - `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).

## Other responses

- `402`: Payment Required. Read error_code. payment_required is the x402 path: either a keyless request being challenged — pay $0.03 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)
