---
title: "Get a cross-publisher suitability leaderboard"
method: GET
path: "/v1/podcasts/suitability/publishers/leaderboard"
tags: ["Podcast Brand Suitability", "tier:premium"]
---

# Get a cross-publisher suitability leaderboard

`GET /v1/podcasts/suitability/publishers/leaderboard`

## Request

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

Returns a paginated, ranked list of podcast publishers by IAB/GARM brand-suitability composition. Pick a metric (safest, riskiest, most_placeable, most_analyzed) to choose how the ranking is constructed. min_analyzed_podcasts guards against tiny catalogs dominating share-based metrics. The ranking reflects each publisher's current catalog composition; paginate the audit history per show via GET /v1/podcasts/{id}/suitability?include=history when you need point-in-time analysis. Each row carries the full tier_breakdown (counts + shares) plus the metric_value the row was ranked by.

## Query parameters

- `limit` integer: Results per page
- `cursor` string: Opaque pagination cursor from previous response
- `metric` 'safest' | 'riskiest' | 'most_placeable' | 'most_analyzed': How to rank publishers. safest sorts by SAFE share of the analyzed catalog (desc); riskiest sorts by UNSAFE share (desc); most_placeable sorts by combined SAFE + LIMITED share (desc) — the 'broadly buyable' slice; most_analyzed sorts by absolute analyzed_podcasts count (desc).
- `min_analyzed_podcasts` integer: Exclude publishers with fewer than this many analyzed podcasts. Guards against tiny catalogs dominating share-based metrics.

## Response `200`

OK

- PagePublisherSuitabilityLeaderboardEntry
  - `cursor` string: Pass to next request for more results
  - `data` PublisherSuitabilityLeaderboardEntry[], nullable, required: List of results
    - `coverage` PublisherSuitabilityCoverage, required
      - `analyzed_coverage` number, double, required: analyzed_podcasts / total_podcasts, clamped to [0, 1]. Treat as a confidence proxy for the rolled-up verdict.
      - `analyzed_podcasts` integer, required: Number of catalog podcasts that have an IAB/GARM suitability analysis.
      - `quality` string, required: Qualitative read on how representative the rollup is given current analysis coverage: LOW (< 0.3), MEDIUM (0.3-0.7), HIGH (>= 0.7).
      - `total_podcasts` integer, required: Total number of non-deleted podcasts attributed to this publisher (denormalized from podcast_publishers.podcast_count).
    - `metric_value` number, double, required: Value of the metric used to rank — a share in [0, 1] for safest/riskiest/most_placeable, an absolute count for most_analyzed.
    - `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: 1-indexed rank within the current ordering.
    - `tier_breakdown` PublisherSuitabilityTierBreakdown, required
      - `limited` integer, required: Number assigned LIMITED (Medium Risk).
      - `limited_share` number, double, required: Share assigned LIMITED (0..1).
      - `placeable_share` number, double, required: Combined SAFE + LIMITED share (0..1) — the 'broadly buyable' slice an advertiser without category restrictions can typically reach.
      - `safe` integer, required: Number of analyzed podcasts assigned the SAFE (Low Risk) tier.
      - `safe_share` number, double, required: Share of analyzed podcasts assigned SAFE (0..1).
      - `sensitive` integer, required: Number assigned SENSITIVE (High Risk).
      - `sensitive_share` number, double, required: Share assigned SENSITIVE (0..1).
      - `unsafe` integer, required: Number assigned UNSAFE (Brand Safety Floor).
      - `unsafe_share` number, double, required: Share assigned UNSAFE (0..1).
  - `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)
