# Apple Podcasts Scraper

> Apple Podcasts Scraper is a paid API for AI agents from api.scrapeforagents.tech, paid per call via x402, $0.025/call, status unknown (last checked 2026-10-02).

Searches, discovers, and extracts structured episode and show metadata from Apple Podcasts via search terms, show URLs, podcast IDs, or RSS feeds

## Facts

- Endpoint: POST https://api.scrapeforagents.tech/v1/apple-podcasts?utm_source=zero.xyz
- Price: $0.025/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-02
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/apple-podcasts-scraper-b074d966
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_P_8src5rOEaKP0IzVbam9

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability apple-podcasts-scraper-b074d966 -d '<json body>'
```

Example prompt: Search Apple Podcasts in the US for shows about 'true crime', grab up to 5 shows per search, only keep episodes from 2023-01-01 onwards that are at least 10 minutes long, and include full show metadata like author, genres, and description.

## When to prefer this

Use this endpoint when you need structured, queryable episode and show data from Apple Podcasts — especially when you want to search by keyword, filter by date range or duration, retrieve full back-catalogs via RSS, or look up specific shows by ID or URL. Prefer it over generic web scrapers when Apple Podcasts-specific fields like catalog episode count, storefront, and explicit content filters are needed.

## Known failure modes

- Empty result if search terms return no matching podcasts in the given storefront
- Podcast ID or URL not found in Apple catalog returns empty items array
- RSS feed URL is inaccessible or private, causing that feed to be skipped
- Invalid country code may default to US or return an error
- Truncated results if maxItems cap is hit before all episodes are fetched
- No charge on failed or empty runs per service policy

## How this service works

Pay-per-call structured web data. Failed or empty runs are not charged.

## Output

Returns a JSON object with a count and an array of episode items, each containing fields such as episodeTitle, episodeNumber, episodeGuid, episodeId, podcastName, podcastId, author, and season; show-level metadata (creator, genres, country, language, description) included when fetchShowMetadata is true.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "country": {
   "type": "string",
   "default": "us",
   "description": "Two-letter storefront code for search, charts, and lookup, such as us, gb, or tr."
  },
  "explicit": {
   "enum": [
    "all",
    "clean",
    "explicit"
   ],
   "type": "string",
   "default": "all",
   "description": "Filter to all, clean, or explicit episodes."
  },
  "maxItems": {
   "type": "integer",
   "default": 100,
   "minimum": 0,
   "description": "Stop after this many episode rows across all inputs. Zero removes the cap."
  },
  "rssFeeds": {
   "type": "array",
   "default": [],
   "description": "Direct public podcast RSS URLs. These can be used without a catalog ID."
  },
  "podcastIds": {
   "type": "array",
   "default": [],
   "description": "Numeric collection IDs from podcast page URLs."
  },
  "podcastUrls": {
   "type": "array",
   "default": [],
   "description": "Full Apple Podcasts show URLs; the numeric show ID is extracted automatically."
  },
  "searchTerms": {
   "type": "array",
   "default": [],
   "description": "Podcast keywords. Each query discovers up to maxPodcastsPerSearch shows."
  },
  "maxReleaseDate": {
   "type": "string",
   "default": null,
   "description": "Include episodes released on or before this date, YYYY-MM-DD."
  },
  "minReleaseDate": {
   "type": "string",
   "default": null,
   "description": "Include episodes released on or after this date, YYYY-MM-DD."
  },
  "fetchShowMetadata": {
   "type": "boolean",
   "default": true,
   "description": "Include creator, genres, country, language, show description, and catalog episode count."
  },
  "minDurationSeconds": {
   "type": "integer",
   "default": 0,
   "minimum": 0,
   "description": "Only keep episodes at least this many seconds long. Episodes without duration are excluded when this is greater than zero."
  },
  "maxPodcastsPerSearch": {
   "type": "integer",
   "default": 10,
   "maximum": 200,
   "minimum": 1,
   "description": "Maximum shows per search term or chart default. The catalog caps a query at 200."
  },
  "useRssForFullArchive": {
   "type": "boolean",
   "default": true,
   "description": "Read each discovered show’s public RSS feed to collect older episodes and enrich show notes, episode numbers, and enclosure metadata."
  },
  "maxEpisodesPerPodcast": {
   "type": "integer",
   "default": 100,
   "maximum": 200,
   "minimum": 1,
   "description": "Maximum recent episodes requested from catalog lookup. RSS archive mode
… (truncated)
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "count": 1,
  "items": [
   {
    "author": null,
    "season": null,
    "episodeId": null,
    "podcastId": null,
    "episodeGuid": null,
    "podcastName": null,
    "episodeTitle": null,
    "episodeNumber": null
   }
  ],
  "product": "apple-podcasts"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/apple-podcasts-scraper-b074d966/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from api.scrapeforagents.tech](https://www.zero.xyz/host/api.scrapeforagents.tech/llms.txt)
