IDs and slugs
Most endpoints with an{id} path parameter accept either:
- The canonical opaque ID (e.g.
17PzxG1t12xznofor Sam Altman,3CensCwu5G2oKCFgPrNf89for Nvidia), or - A human-readable slug (e.g.
sam-altman,nvidia,pivot,the-joe-rogan-experience).
entity_slug: "nvidia"), you can pass it directly to any other endpoint without first looking up the canonical ID.
Slugs are short handles Particle assigns, not names slugified: 20VC is the-twenty-minute-vc, Lenny’s Podcast is lennys, All-In is all-in. Take them from responses; a constructed slug returns 404, and trying other spellings never resolves it. A podcast slug is not an episode id: list the show’s episodes to get one. To turn a name into a slug, use the search endpoints below; each returns the slug alongside the match.
/v1/companies/{id} resolves slug, domain, and canonical ID directly. To look up by ticker, CIK, or QID, use the corresponding query filter on GET /v1/companies (?ticker=…, ?cik=…, ?qid=…) and pass the returned slug, domain, or ID through the singular endpoint. See Companies → Identifiers.
Podcasts accept one extra form: every podcast {id} slot (and the podcast_id filter on list endpoints) also resolves a numeric Apple/iTunes collection ID directly (e.g. 1535809341) — so a client that already holds an iTunes ID can call any podcast endpoint without a prior lookup. To resolve a Spotify show ID, YouTube channel ID, RSS feed URL, or other platform identifier, use GET /v1/podcasts/lookup.
The podcast_id filter also accepts a particle.pro or Radar show link (https://particle.pro/podcast/<show>, https://radar.particle.pro/podcasts/<show>), and a Radar episode link resolves to its show. The episode_id filter accepts a particle.pro or Radar episode link (https://particle.pro/episode/<episode>, https://radar.particle.pro/podcasts/<show>/episodes/<episode>). Links to other sites are not parsed; use the lookup endpoints for those.
Podcast and episode {id} slots also take a raw UUID (a759e894-51e2-4ae9-94f9-883b6d146cfb), the form a web_url uses for a record without a slug.
Moment links
Every hit that points into an episode carries a link that plays that moment on Radar, Particle’s podcast reader. Cite it, post it, or put it in a digest, and the reader lands on the exact quote:tis the offset in seconds from the start of the episode audio, rounded up to a tenth of a second (?t=87.2,?t=2702), so the link never lands before the moment it names.<podcast>and<episode>are slugs, or the raw UUID for the rare record without one. Either form round-trips: pass the link back as a podcast or episode{id}and it resolves to the same record.- Radar starts playback at
t, scrolls to the line and highlights it. A signed-out visitor reads the whole segment containingt.
The embedded
episode on those responses carries web_url, the episode’s page without t. Append ?t=<seconds> to it for any other offset, such as a transcript line’s start_seconds. web_url is omitted for back-catalogue episodes we have not ingested, which have no page yet.
Cursor pagination
List endpoints share a single response envelope:cursor value back as a query parameter:
422 validation_error rather than read as the first page. data is always an array: an empty result is [], never null. Send the same filters and limit with the cursor: it continues the request that produced it, and changing a filter starts a new walk without one. The default page size is endpoint-specific (often 25); use limit to override (typically up to 100).
Authentication
Two header forms are accepted;X-API-Key is recommended.
/v1/embed/*) intentionally do not require authentication so the responses can be used as public iframe payloads, and GET /v1/podcasts/stats is open so anyone can read the catalog size.
A missing, mistyped, revoked, or expired key all return the same 401 with error_code: "api_key_required", so on a 401 check the header name (X-API-Key) and the key itself at platform.particle.pro/tokens rather than looking for a more specific code. GET /v1/me is free and confirms a key works, naming the organization and project it belongs to.
GET /v1/me/usage, also free, reports what the key used: requests this billing period (or today) by endpoint and MCP tool, and how many requests they billed. On a plan billed in requests, billable_requests counts what each call draws from your included requests (or, past them, as overage): most calls draw 1, and a transcription request that queues an episode draws 100. On a plan billed in dollars each billed call counts once; billable_basis says which applies. A refunded transcription request no longer counts. Free endpoints never count as billable, and neither do endpoints billed through plan features and add-ons rather than per call (alerts, the episode archive and stream), or a retried write answered from its first response under an Idempotency-Key. Counts come from the request log, which keeps 90 days: an annual billing period reports counts_since, the date its counts begin. MCP calls made through an OAuth grant carry no API key and appear under none.
Pricing weight
Every endpoint is available on every account — there is no tier lock. Endpoints are priced differently, though: heavier endpoints (full transcripts, transcript mentions, advertising analytics, cross-podcast clip search, competitor lookups) consume more credits per call than lighter ones (entity, topic, and podcast metadata; episode lookups and sub-resources; clip listings; embed). The OpenAPI tag on every operation declares the pricing class —tier:standard or tier:premium. Treat it as a hint about cost, not a hint about access. Your usage dashboard breaks down spend by endpoint so you can see where credits are going.
Choosing the right endpoint
The API exposes overlapping ways to find content. Pick by what you actually need.
Quickstart walks through several of these patterns end-to-end.
Time windows
An endpoint that bounds its results in time takessince and until. Each accepts an ISO 8601 date (2026-09-01) or date-time (2026-09-01T12:00:00Z); a value without a timezone is read as UTC. Where an endpoint’s until takes a bare date, it covers that whole day.
Which side is inclusive is not uniform: some bounds read “on or after”, others “after”. Each parameter’s description says which, and what timestamp it bounds. That is usually publication, but publisher bias bounds when an analysis was evaluated, rankings bound when a chart was captured, and alert matches bound when a match was detected.
Some endpoints took other spellings before they converged on since/until. They still work, are marked deprecated in the API reference, and are rejected with a 422 only when they disagree with since/until in the same request:
A few parameters look like windows but bound something else, so they keep their names:
Errors
Errors follow RFC 9457 (Problem Details for HTTP APIs). Every error response isapplication/problem+json with at minimum status, title, and detail, plus a stable error_code for programmatic branching and an optional resolve object pointing at how to fix the issue.
See Errors → Overview for the full envelope, the catalog of error codes, and patterns for handling them in UI clients and agents.
Rate limits
Every organization may make 10,000 requests per minute across all of its API keys and projects, on every plan. Rate-limited responses carryX-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (seconds until the window resets). A request over the limit returns HTTP 429 with error_code: "rate_limit_exceeded" and a Retry-After header; wait that long and retry. See rate_limit_exceeded.