Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.particle.pro/llms.txt

Use this file to discover all available pages before exploring further.

A podcast lives in many places: it’s on Apple Podcasts and Spotify, the host posts to X, the publisher runs a YouTube channel, and there’s a marketing site on its own domain. The external-links endpoint returns every one of those presences in a single, normalized shape — with the platform-native identifier, a ready-to-use web URL, and a list of optional per-platform attributes (subscribers, followers, handle, etc.). Use this endpoint when you want to:
  • Build a “follow this podcast on…” UI without hard-coding per-platform URL templates.
  • Compare audience size across platforms (Spotify followers vs. YouTube subscribers vs. Castbox subscribers).
  • Pull the publisher’s website and social handles for outreach or research.
  • Reconcile a podcast across third-party catalogs (Apple ID ↔ Spotify show ID ↔ Podchaser ID).
curl "https://api.particle.pro/v1/podcasts/hard-fork/external-links" \
  -H "X-API-Key: $PARTICLE_API_KEY"
The path parameter accepts either a slug (hard-fork, all-in) or a base62-encoded podcast ID — same as every other podcast sub-resource.
Response (truncated)
{
  "data": [
    {
      "platform": {
        "name": "apple",
        "display_name": "Apple Podcasts",
        "type": "podcast_directory"
      },
      "identifier": "1528594034",
      "url": "https://podcasts.apple.com/podcast/id1528594034"
    },
    {
      "platform": {
        "name": "spotify",
        "display_name": "Spotify",
        "type": "music_service"
      },
      "identifier": "44fllCS2FTFr2x2kjP9xeT",
      "url": "https://open.spotify.com/show/44fllCS2FTFr2x2kjP9xeT",
      "attributes": [
        {
          "name": "followers",
          "category": "audience_size",
          "value": 3902,
          "observed_at": "2026-04-22T11:00:00Z"
        }
      ]
    },
    {
      "platform": {
        "name": "youtube",
        "display_name": "YouTube",
        "type": "video_channel"
      },
      "identifier": "UCZcR2SVWaGWNlMqPxvQS3vw",
      "url": "https://www.youtube.com/channel/UCZcR2SVWaGWNlMqPxvQS3vw",
      "attributes": [
        { "name": "handle",      "category": "profile",       "value": "hardfork" },
        { "name": "subscribers", "category": "audience_size", "value": 245000 },
        { "name": "videos",      "category": "content",       "value": 200 },
        { "name": "views",       "category": "audience_size", "value": 12345678 }
      ]
    },
    {
      "platform": { "name": "tiktok", "display_name": "TikTok", "type": "social_profile" },
      "identifier": "hardfork",
      "url": "https://www.tiktok.com/@hardfork"
    },
    {
      "platform": { "name": "twitter", "display_name": "X (Twitter)", "type": "social_profile" },
      "identifier": "HardFork",
      "url": "https://twitter.com/HardFork"
    },
    {
      "platform": { "name": "website", "display_name": "Website", "type": "website" },
      "url": "https://www.nytimes.com/column/hard-fork"
    }
    // …
  ],
  "has_more": false
}
Per-podcast cardinality is bounded — at most one entry per platform — so the endpoint returns the full set in a single response by default. Pass ?limit= and ?cursor= if you specifically want to page through results.

Anatomy of an entry

Every entry has the same shape regardless of platform. Optional fields are omitted when no data is available.
FieldDescription
platform.nameStable machine name (e.g. spotify, youtube). Suitable for filtering, routing, or persistence.
platform.display_nameHuman-readable name suitable for UI display (Apple Podcasts, X (Twitter)).
platform.typeBroad category. Use this to group presences in a UI rather than enumerating every name.
identifierPlatform-native value (numeric id, slug, handle, or URL). Omitted entirely for the website platform — the JSON key is absent, not an empty string.
urlCanonical web URL for this presence. Built from a per-platform template, or passed through for website.
attributesOptional per-platform metadata (audience size, profile fields, etc.). May be absent or empty.

Platform types

platform.type lets clients render related platforms with a shared treatment without knowing the full list of names:
TypeWhat it covers
podcast_directoryApple Podcasts, Spotify-as-podcast-directory replicas, Castbox, Podchaser, Player FM, Podcast Addict, Podbean, Podcast Republic, Goodpods, The Podcast App, TuneIn, iHeartRadio.
music_serviceSpotify, Apple Music–adjacent stores, Audible, Amazon Music — services whose primary brand is audio playback.
social_profileX (Twitter), Instagram, Threads, TikTok, Facebook, LinkedIn — handle-based identity.
video_channelYouTube channel for the podcast (and any future video-first platforms).
communityReddit, Discord, Patreon — where listeners gather around the show.
websiteThe publisher’s own marketing site for the podcast. The identifier is omitted; url carries the destination.
otherReserved for future platforms that don’t fit the above. Treat as opaque.

Attributes

Each entry’s attributes is a list of typed records. The set of attribute names that may appear varies per platform — and grows over time as upstream sources expose richer metadata. Clients should treat unknown attribute names additively rather than enumerating them.
FieldDescription
namePlatform-native attribute name (subscribers, followers, handle, etc.).
categoryBroad grouping. Use this to render unfamiliar attributes without recognising the exact name.
valueThe attribute value. JSON type matches the category — numbers for audience/content tallies, strings for profile/account fields, booleans for flags.
observed_atISO 8601 timestamp of when the attribute was last observed from the upstream source. Omitted when unavailable.

Attribute categories

CategoryTypical namesValue type
audience_sizesubscribers, followers, viewsinteger
contentvideosinteger
profilehandle, display_name, thumbnail_url, foundedstring (or RFC 3339 timestamp for founded)
account_statusverified (forthcoming)boolean

Platform reference

The full list of platforms surfaced today, with the URL templates the API uses to build the url field. New platforms may be added without notice; existing platform names are stable.
namedisplay_nametypeURL pattern
amazon_musicAmazon Musicmusic_servicehttps://music.amazon.com/podcasts/{id}
appleApple Podcastspodcast_directoryhttps://podcasts.apple.com/podcast/id{id}
audibleAudiblemusic_servicehttps://www.audible.com/pd/{id}
castboxCastboxpodcast_directoryhttps://castbox.fm/channel/id{id}
discordDiscordcommunityhttps://discord.gg/{id}
facebookFacebooksocial_profilehttps://www.facebook.com/{id}
goodpodsGoodpodspodcast_directoryhttps://www.goodpods.com/podcasts/{id}
iheartradioiHeartRadiopodcast_directoryhttps://www.iheart.com/podcast/{id}/
instagramInstagramsocial_profilehttps://www.instagram.com/{id}/
itunesiTunespodcast_directoryhttps://podcasts.apple.com/podcast/id{id}
linkedinLinkedInsocial_profilehttps://www.linkedin.com/company/{id}/
patreonPatreoncommunityhttps://www.patreon.com/{id}
playerfmPlayer FMpodcast_directoryhttps://player.fm/series/{id}
podaddictPodcast Addictpodcast_directoryhttps://podcastaddict.com/podcast/{id}
podbeanPodbeanpodcast_directoryhttps://www.podbean.com/podcast-detail/{id}
podchaserPodchaserpodcast_directoryhttps://www.podchaser.com/podcasts/{id}
podrepublicPodcast Republicpodcast_directoryhttps://www.podcastrepublic.net/podcast/{id}
redditRedditcommunityhttps://www.reddit.com/r/{id}/
spotifySpotifymusic_servicehttps://open.spotify.com/show/{id}
threadsThreadssocial_profilehttps://www.threads.net/@{id}
tiktokTikToksocial_profilehttps://www.tiktok.com/@{id}
tpaThe Podcast Apppodcast_directoryhttps://thepodcastapp.com/p/{id}
tuneinTuneInpodcast_directoryhttps://tunein.com/podcasts/{id}/
twitterX (Twitter)social_profilehttps://twitter.com/{id}
websiteWebsitewebsiteURL only; no separate identifier field
youtubeYouTubevideo_channelhttps://www.youtube.com/channel/{id} for channel-ID identifiers (UC + 22 chars), https://www.youtube.com/@{id} for handle identifiers

YouTube: richer attributes

YouTube is currently the most heavily-enriched platform. A YouTube entry can carry up to four attributes today:
{
  "platform": { "name": "youtube", "display_name": "YouTube", "type": "video_channel" },
  "identifier": "UCZcR2SVWaGWNlMqPxvQS3vw",
  "url": "https://www.youtube.com/channel/UCZcR2SVWaGWNlMqPxvQS3vw",
  "attributes": [
    { "name": "handle",       "category": "profile",       "value": "hardfork" },
    { "name": "subscribers",  "category": "audience_size", "value": 245000 },
    { "name": "videos",       "category": "content",       "value": 200 },
    { "name": "views",        "category": "audience_size", "value": 12345678 }
  ]
}
The display_name, thumbnail_url, and founded attributes may also appear when known.

Notes and gotchas

apple and itunes are usually duplicates

Apple Podcasts uses a single numeric ID across both its modern and iTunes-era surfaces. Most podcasts therefore have two entries — apple and itunes — with the same identifier and the same resolved url. This faithfully reflects what upstream catalog sources report; clients that want a single Apple entry can de-duplicate by (type, identifier).

Attributes are forward-compatible

Both attributes[].name and attributes[].category are open enumerations. New names (e.g. a future engagement_rate for Instagram) and new categories will be added without a versioning event. Always render unknown attributes additively — match on category for grouping when the name isn’t recognized.

observed_at is best-effort

Some attributes don’t have a known observation timestamp; the field is then omitted. When present, the timestamp reflects the last time the value was refreshed from the upstream source — not the last time the podcast itself was updated.

Identifier formats vary

The identifier is whatever the platform natively uses. Examples:
PlatformSample identifierShape
apple / itunes1528594034Numeric Apple Podcasts ID
spotify44fllCS2FTFr2x2kjP9xeTSpotify show ID
youtubeUCZcR2SVWaGWNlMqPxvQS3vwChannel ID (or short handle for some podcasts)
twitter / tiktokHardFork / hardforkAccount handle (no @)
podbeandir2423160,nrwgxPodbean-internal pair (don’t try to parse)
The website platform is the exception: there’s no separate identifier — the entry omits identifier entirely and only carries url. If you need a clickable link, prefer the resolved url over building one yourself; URL templates change.

Choosing the right endpoint

You want to…Use this
Show a “find this podcast on …” list of platformsexternal-links
Compare audience size (followers / subscribers) across platformsexternal-links (filter by attributes[].category=audience_size)
Get the podcast’s own metadata (title, publisher, description, RSS feed, episode counts)GET /v1/podcasts/{id}
List episodes for a podcastGET /v1/podcasts/{id}/episodes
Sponsor / advertising profileGET /v1/podcasts/{id}/advertising
Political bias analysisGET /v1/podcasts/{id}/bias