GET /v1/recommendations (row-level evidence) and GET /v1/channels/{channel_id}/sponsors (the rollup).
When to use
- You sell sponsorships or negotiate them. Pull a channel’s recurring advertisers before a negotiation: “who already sponsors TBPN, at what cadence, since when?” Never go into a sponsorship negotiation blind.
- You model competitor spend. Row-level ad reads carry verbatim quotes, promo codes, and offers: “every Ramp ad read across business podcasts this year, with the codes they ran.”
- You find organic champions. Endorsements are unpaid recommendations from hosts and guests: “which shows organically endorsed Figma after the IPO?”
- You build advertiser dashboards. Re-expose the classification, confidence, and dispute machinery in your own product.
The two universes
Arcmira runs two independent extraction pipelines:| Universe | Endpoint | What it answers | Cost |
|---|---|---|---|
| Mentions | /v1/mentions | ”Where was this entity talked about?“ | 1 row each |
| Commercial | /v1/recommendations | ”Where was this entity paid for or endorsed?“ | 10 rows each |
/v1/mentions?details=full attaches matching commercial rows to mention rows, but the populations stay distinct.
Classification
Every commercial row carries amention_class:
| Class | Definition |
|---|---|
ad_read | A paid sponsor read. Typically explicit (“this episode is brought to you by…”), often with a promo code. |
endorsement | An organic recommendation from a host or guest. No money involved; the speaker vouches for it. |
mention | A lower-signal commercial reference that didn’t meet the ad_read/endorsement bar. Surfaced for context. |
min_ad_reads); a singleton ad_read with no sponsor language is downgraded to mention; canonical entity merges are followed automatically; rows with conflict_status: "disputed" are excluded unless you pass include_disputed=true.
Recommendations: row-level evidence
entity_id or entity_name is required (the entity-scoped form takes it from the path).
| Parameter | Default | Description |
|---|---|---|
entity_id / entity_name | — | Canonical ent_* or a name (pair names with entity_type). |
channel_id / channel_name | — | Restrict to one channel (YouTube UC... ID) or a name substring. |
mention_class | all | ad_read, endorsement, mention, or all. |
min_confidence | 0.7 | Float in [0, 1]. |
include_disputed | false | Include rows whose classification is disputed. |
date_from / date_to | — | Inclusive ISO-date bounds on published_at. |
limit / cursor | 20 / — | Standard cursor pagination. |
Response row
idis the publiccom_*form: pass it to Community Review to dispute a row.- Read
start_seconds/end_seconds(integer seconds;0means the full episode). Thestart_timestamp/end_timestampMM:SSstrings are deprecated and will be removed after a changelog-announced sunset. sentiment_scoreis the raw[-1, 1]number, matching mention rows. Thesentimentfield carries the same number and is deprecated; readsentiment_score.promo_codeandofferare nullable, populated when the extractor found explicit codes or offers in the quote.speaker_roledistinguishes host reads from guest recommendations.conflict_status/resolutionsurface cross-pass classification conflicts; disputed rows are excluded by default.
Channel sponsors: the rollup
{channel_id} is a YouTube channel ID (UC-DRzaGnL_vtBUpCFH5M0tg), not an ent_*.
| Parameter | Default | Description |
|---|---|---|
min_ad_reads | 3 | Minimum ad_read rows for an entity to count as recurring. 1 surfaces every one-off; 5-10 focuses on long-running relationships. Range 1-100. |
status | (any) | Filter by advertiser status: active, lapsed, ended, uncertain. |
limit | 100 | 1-200, ordered by ad-read count descending. |
Response (truncated)
channel.idisnullwhen there is no canonical entity for the channel;youtube_channel_idis always present.sponsor_statusisnullfor entities not in the known-advertiser registry; when present,statusisactive,lapsed,ended, oruncertain.meta.countis the returned page size, not a global total.
Discovery and teasers
GET /v1/entities/search?has_recommendations_data=truerestricts discovery to entities with commercial signal (free).- Entity reads on
organization/productentities include arecommendations_summaryaggregate for entitled callers (totals, unique shows, first/last seen,channels_as_sponsor). Zero rows. - Channel reads include a teaser under
recommendations_summary:recommendations_summary.sponsor_countis visible to every caller (a discoverability signal);recommendations_summary.top_sponsorsappears only with Pro+ andrecommendations:read.
Billing
Every row returned by/v1/recommendations and every sponsor in /v1/channels/{id}/sponsors bills at 10 rows (versus 1 for a standard mention row). recommendations_summary blocks and teasers cost zero rows. details=full on mentions charges the mention row plus 10 rows per attached commercial item. See Usage, limits & billing.
Community Review
Commercial rows are exactly where you should push back: a false paid read hurts a brand, a missed one hurts a negotiation. Dispute rows bycom_* ID, sponsors by ent_* + channel, for free:
false_positive_ad_read, false_positive_endorsement, missed_ad_read, missed_endorsement, wrong_classification, wrong_entity, other. Commercial review uses the same access as the data (Pro+ + recommendations:read); nothing auto-applies. Full catalog: Community Review.
Errors
| Code | When |
|---|---|
recommendations_not_enabled | Tier below Pro+ (independent of scope). |
insufficient_scope | Pro+ key missing recommendations:read. |
entity_not_found | entity_id/entity_name didn’t resolve. |
channel_not_found | No indexed media for the channel ID (use the UC... form, not a slug). |
invalid_query | Param validation failed; see error.message. |
Next
- Try it in the playground
- Search: the free evidence layer these rows enrich.
- Community Review: the correction contract for every commercial surface.