---
title: "Get a publisher's brand suitability profile"
method: GET
path: "/v1/podcasts/publishers/{id}/suitability"
tags: ["Podcast Publishers", "tier:premium"]
---

# Get a publisher's brand suitability profile

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

## Request

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

Returns a publisher-level rollup of IAB Tech Lab Brand Safety & Suitability Framework (formerly GARM) verdicts across the publisher's catalog: tier composition (SAFE / LIMITED / SENSITIVE / UNSAFE), confidence distribution, per-category exposure across all 12 GARM dimensions, and the top concerns surfaced from the category rollup. The coverage block (analyzed_coverage as a 0..1 share + a LOW/MEDIUM/HIGH quality enum) tells callers how representative the rollup is — analyses are still being backfilled across the long tail of the catalog. Identify the publisher by slug (e.g., 'iheartpodcasts', 'bbc-radio-4', 'bloomberg') or ID.

## Path parameters

- `id` string, required: Podcast publisher slug (e.g., 'iheartpodcasts', 'bbc-radio-4', 'bloomberg') or ID. Slugs are the recommended identifier.

## Response `200`

OK

- PublisherSuitabilityProfile
  - `category_breakdown` PublisherSuitabilityCategoryBreakdown[], nullable, required: Per-GARM-category roll-up across the publisher's analyzed catalog. Always 12 entries in canonical order so callers don't need to merge against the canonical category list. For an analyzed publisher with no exposure in a given category, none equals analyzed_podcasts and every other bucket is 0; only when the publisher has zero analyzed podcasts are all five prevalence buckets 0.
    - `code` string, required: Brand-safety category code (IAB Tech Lab Content Taxonomy 3.x): adult_sexual, arms_ammunition, crime_harmful_acts, death_injury_military_conflict, online_piracy, hate_speech_aggression, obscenity_profanity, illegal_drugs_alcohol_tobacco, spam_harmful, terrorism, debated_social_issues, misinformation.
    - `description` string, required: Human-readable description of the category.
    - `exposure_share` number, double, required: Share of analyzed podcasts with any non-NONE prevalence in this category (0..1).
    - `frequent` integer, required: Number where the category appears FREQUENTLY.
    - `glamorizing` integer, required: Number whose category row carries GLAMORIZING treatment (the most advertiser-toxic treatment).
    - `high_risk_count` integer, required: Number of analyzed podcasts with FREQUENT/PERVASIVE prevalence or GLAMORIZING treatment in this category — the advertiser-relevant 'this is a real problem' count.
    - `incidental` integer, required: Number where this category appears INCIDENTALLY (1-2 references in the analyzed window).
    - `none` integer, required: Number of analyzed podcasts where this category is absent.
    - `occasional` integer, required: Number where the category appears OCCASIONALLY.
    - `pervasive` integer, required: Number where the category is PERVASIVE.
    - `promotional` integer, required: Number of analyzed podcasts whose category row carries PROMOTIONAL treatment (endorsement without celebration).
  - `confidence_breakdown` PublisherSuitabilityConfidenceBreakdown, required
    - `high` integer, required: Number with HIGH confidence.
    - `low` integer, required: Number of analyzed podcasts whose verdict carries LOW confidence.
    - `medium` integer, required: Number with MEDIUM confidence.
  - `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).
  - `last_evaluated_at` string, date-time: Most recent evaluation timestamp across the publisher's analyses. Omitted when the publisher has zero analyzed podcasts.
  - `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).
  - `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).
  - `top_concerns` PublisherSuitabilityTopConcern[], nullable: Up to three highest-exposure GARM categories ranked by high_risk_count, surfaced separately so advertisers can scan the publisher's worst dimensions without traversing the full breakdown.
    - `code` string, required: GARM category code.
    - `description` string, required: Human-readable category description.
    - `exposure_share` number, double, required: Share of analyzed podcasts with any non-NONE prevalence in this category (0..1).
    - `high_risk_count` integer, required: FREQUENT+PERVASIVE or GLAMORIZING count for this category.

## 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)
