# Apple Podcasts Search Scraper (`cirkit/apple-podcasts-search-scraper`) Actor

Search the Apple Podcasts catalogue across any storefront and get back the show plus what Apple's directory leaves out: owner email, website, true episode count, latest episode date and publishing cadence, read from each show's own RSS feed.

- **URL**: https://apify.com/cirkit/apple-podcasts-search-scraper.md
- **Developed by:** [Crikit](https://apify.com/cirkit) (community)
- **Categories:** News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.70 / 1,000 podcast returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Apple Podcasts Search Scraper

**Scrape the Apple Podcasts catalogue** across any storefront — and get what Apple's own directory leaves out. This **Apple Podcasts scraper** enriches every show from its **own RSS feed** to return the **owner email address**, website, true episode count, latest episode date, publishing cadence, and an active/inactive flag.

No Apple Podcasts API key, no login, and no headless browser. Results land in a structured dataset you can export to JSON, CSV, Excel, or XML, or pull straight from the Apify API.

### What is Apple Podcasts Search Scraper?

Apple Podcasts Search Scraper is an [Apify Actor](https://apify.com/actors) that extracts podcast shows enriched from their own RSS feeds from [Apple Podcasts](https://podcasts.apple.com) and returns them as clean, structured records. The owner email is the standout field. Apple does not display it, but podcast RSS feeds carry it by specification, which makes this one of the few reliable routes to a direct contact for podcast outreach.

### What data can this Apple Podcasts scraper extract?

Every run writes one row per show. The full schema carries **41 fields**; the most-used ones are below.

| Field | Type | Description |
| --- | --- | --- |
| `podcastId` | string | Apple Podcasts' numeric identifier for the show. Stable across runs and storefronts, and the key this Actor... |
| `title` | string | Show name as published on Apple Podcasts. |
| `publisher` | string | The network or person Apple lists as the show's creator. |
| `feedUrl` | string | The show's RSS feed. Apple omits this on a small share of shows, so treat it as nullable. |
| `applePodcastsUrl` | string | Public Apple Podcasts page for the show. |
| `publisherUrl` | string | Apple Podcasts page listing everything this publisher makes. |
| `description` | string | Show description, taken from the RSS feed. Null when the RSS read is switched off. |
| `primaryGenre` | string | Apple's main category for the show, for example "True Crime". |
| `genres` | array | Every genre Apple files the show under. The catch-all "Podcasts" entry is removed. |
| `genreIds` | array | Numeric Apple genre IDs matching the genres above. Feed one back in as genreId to search only that genre. |
| `episodeCount` | integer | Episode count as Apple reports it. Apple caps this figure, so rssEpisodeCount is the more reliable number when the... |
| `latestReleaseDate` | string | Apple's own date for the most recent episode. Can lag the feed by days. |
| `contentRating` | string | Apple's advisory rating, typically "Clean" or "Explicit". |
| `isExplicit` | boolean | True when Apple flags the show as explicit. |
| `country` | string | Storefront country Apple returned the show under. |
| `artworkUrl` | string | Cover art at 600x600. |
| `artworkUrlSmall` | string | Cover art at 100x100. |
| `ownerEmail` | string | Contact email the show publishes in its own RSS feed. This is the field that makes a result reachable rather than... |
| `ownerName` | string | Owner name from the RSS feed, which is often a real person where the Apple publisher field is a brand. |
| `author` | string | Author as declared in the RSS feed. |
| `website` | string | The show's own website, from the RSS feed. |
| `language` | string | Language code declared in the RSS feed, for example "en" or "de-DE". |

See the **Output** tab in Apify Console for all 41 fields.

### How to scrape Apple Podcasts podcast listings

1. Open [Apple Podcasts Search Scraper](https://apify.com/cirkit/apple-podcasts-search-scraper) and click **Try for free**.
2. Add `searchTerms` and `countries`, or pass specific `podcastIds`.
3. Use `chartCountries` and `chartLimit` to pull podcast charts instead.
4. Leave `enrichFromRss` on — it is what produces owner email, cadence, and true episode counts.
5. Set `onlyActive` to skip dead shows, and `includeEpisodes` for episode-level rows.
6. Click **Start** and watch rows appear live in the **Output** tab.
7. Export the dataset as JSON, CSV, Excel, or XML — or fetch it from the [Apify API](https://docs.apify.com/api/v2) once the run finishes.

### Apple Podcasts Search Scraper input options

| Input | Type | What it does | Default |
| --- | --- | --- | --- |
| `searchTerms` | array | Keywords to search the Apple Podcasts catalogue for. Apple caps every search at 100 shows and ignores paging, so add... | `see schema` |
| `countries` | array | Two-letter country codes for the Apple storefronts to search. Each storefront has its own catalogue and ranking, so... | `["us"]` |
| `podcastIds` | array | Look specific shows up directly. Accepts a numeric Apple Podcasts ID (1322200189) or a full show URL — the ID is... |  |
| `chartCountries` | array | Two-letter country codes to pull Apple's official Top Shows chart for. Every row from a chart carries its chartRank.... |  |
| `chartLimit` | integer | How many ranked shows to take from each chart. | `50` |
| `maxItems` | integer | Hard cap on how many shows this run returns, and therefore on what it costs. Duplicates are dropped before this cap... | `25` |
| `maxResultsPerTerm` | integer | How many shows to take from each keyword-and-storefront pair. Apple's own hard ceiling is 100 regardless of what is... | `50` |
| `genreId` | integer | Restrict results to one Apple Podcasts genre, for example 1489 News, 1488 True Crime, 1321 Business, 1303 Comedy,... |  |
| `searchAttribute` | string | Which field the keyword has to match. 'Show title' and 'Publisher' are much stricter than the default, which matches... | `"any"` |
| `enrichFromRss` | boolean | Adds the fields Apple's own directory does not carry: owner email, owner name, show website, language, true episode... | `true` |
| `onlyActive` | boolean | Drop any show whose most recent episode is more than 90 days old. Needs the RSS read above. | `false` |
| `includeEpisodes` | boolean | Attach recent episodes to each show row, with title, publish date, duration, episode and season number, and the... | `false` |
| `maxEpisodesPerShow` | integer | How many recent episodes to attach when the option above is on. | `10` |

Proxy is configured through the standard `proxyConfiguration` object; the defaults shipped with this Actor are already tuned for the target site.

### Example output

```json
{
  "podcastId": "a1b2c3d4",
  "title": "Example title",
  "publisher": "...",
  "feedUrl": "https://example.com/item/12345",
  "applePodcastsUrl": "https://example.com/item/12345",
  "publisherUrl": "https://example.com/item/12345",
  "description": "Example text ...",
  "primaryGenre": "...",
  "genres": [
    "..."
  ],
  "genreIds": [
    "..."
  ],
  "episodeCount": 1483,
  "latestReleaseDate": "2026-08-30T12:00:00.000Z",
  "contentRating": "...",
  "isExplicit": true,
  "country": "US",
  "artworkUrl": "https://example.com/item/12345",
  "artworkUrlSmall": "...",
  "ownerEmail": "contact@example.com"
}
```

### How much does it cost to scrape Apple Podcasts?

This Actor runs on **pay per result** pricing: **$0.0007 per show record** ($0.7 per 1,000).

| Results | Approximate cost |
| --- | --- |
| 1,000 | $0.70 |
| 10,000 | $7.00 |
| 100,000 | $70.00 |

You pay for rows you actually receive, so a search that returns nothing costs nothing beyond the start fee. Every Apify account includes free monthly usage credit, so you can trial Apple Podcasts Search Scraper at no cost.

### What can you build with Apple Podcasts data?

#### Build podcast advertising and outreach lists

Owner email plus publishing cadence plus episode count qualifies a show for sponsorship outreach in a single row — normally three separate research steps.

#### Find active shows and filter out dead ones

`daysSinceLatestEpisode` and `episodesLast90Days` separate genuinely active podcasts from the large share of abandoned feeds in Apple's directory.

#### Pitch guests to relevant shows

Genre, cadence, and recency together identify shows actually booking guests right now.

#### Research a niche's podcast landscape

Chart positions and episode counts across a genre show who the established players are and where gaps remain.

#### Monitor competitor podcasts

Track a competitor's publishing rhythm and episode volume over time from their own feed.

### Apple Podcasts scraping tips and limits

- `enrichFromRss` is the whole point of this Actor. With it off you get roughly what Apple's directory shows and none of the differentiated fields.
- `rssStatus` tells you whether the feed resolved. A missing owner email usually means a broken or restricted feed rather than an Actor failure.
- `onlyActive` cuts a lot of noise — a large share of the Apple directory has not published in over a year.
- Owner emails are personal data and podcast hosts are identifiable people. Comply with GDPR and CAN-SPAM before using them for outreach.

### Integrations and automation

Run Apple Podcasts Search Scraper on a [schedule](https://docs.apify.com/platform/schedules) to keep a Apple Podcasts dataset fresh, or trigger it from your own stack through the [Apify API](https://docs.apify.com/api/v2) and the official [JavaScript](https://docs.apify.com/sdk/js) and [Python](https://docs.apify.com/sdk/python) clients. Native [integrations](https://docs.apify.com/platform/integrations) push results into Google Sheets, Slack, Airtable, Zapier, Make, GitHub, or any webhook endpoint. The Actor also works as an [MCP](https://docs.apify.com/platform/integrations/mcp) tool, so an AI agent can call it directly.

### Related scrapers

| Actor | What it does |
| --- | --- |
| [App Store Search Scraper](https://apify.com/cirkit/app-store-search-scraper) | Apple App Store apps, charts, and free reviews. |
| [YouTube Search Scraper](https://apify.com/cirkit/youtube-search-scraper) | Video-side content research. |
| [Google Trends Scraper](https://apify.com/cirkit/google-trends-scraper) | Search demand for podcast topics. |
| [Reddit Posts Scraper - Subreddit, Search, User Posts API](https://apify.com/cirkit/reddit-posts-scraper) | Where a show's audience is discussing it. |

### Frequently asked questions

#### How does it get podcast owner email addresses?

Podcast RSS feeds carry an owner email by specification. The Actor fetches each show's feed and reads it from there, which is why `enrichFromRss` must be on.

#### Can I tell which podcasts are still active?

Yes. `latestEpisodeDate`, `daysSinceLatestEpisode`, `episodesLast90Days`, and `isActive` all speak to recency, and `onlyActive` filters dormant shows out entirely.

#### Do I need a Apple Podcasts API key?

No. Apple Podcasts Search Scraper reads publicly available Apple Podcasts pages and endpoints directly, so there is no key to obtain, no OAuth app to register, and no account to connect.

#### Can I export Apple Podcasts data to CSV, Excel, or Google Sheets?

Yes. Every run stores results in an Apify dataset that exports to JSON, JSONL, CSV, Excel, XML, or HTML with one click, and the Google Sheets integration writes rows straight into a spreadsheet.

#### Can I run Apple Podcasts Search Scraper on a schedule?

Yes. Apify schedules run the Actor hourly, daily, weekly, or on any cron expression, and webhooks can notify your systems the moment a run finishes.

#### Is it legal to scrape Apple Podcasts?

Scraping publicly available data is broadly lawful in the US and EU, but the answer depends on what you collect and how you use it. This Actor is built to gather public podcast directory information Apple publishes publicly plus data podcasters publish in their own RSS feeds — owner emails are personal data. Personal data carries extra obligations under GDPR and CCPA. Read Apify's guide on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/) and take your own legal advice for your use case.

### Support and feedback

Found a bug, a missing field, or a Apple Podcasts page shape this Actor does not handle yet? Open an issue from the **Issues** tab on the Actor page. Feature requests and custom-scraper enquiries are welcome there too.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search the Apple Podcasts catalogue for. Apple caps every search at 100 shows and ignores paging, so add more keywords (and more storefronts below) rather than expecting one keyword to return thousands.

## `countries` (type: `array`):

Two-letter country codes for the Apple storefronts to search. Each storefront has its own catalogue and ranking, so searching us + gb + de returns roughly three times as many distinct shows as us alone. Duplicates are removed across storefronts before anything is charged.

## `podcastIds` (type: `array`):

Look specific shows up directly. Accepts a numeric Apple Podcasts ID (1322200189) or a full show URL — the ID is read out of the URL for you.

## `chartCountries` (type: `array`):

Two-letter country codes to pull Apple's official Top Shows chart for. Every row from a chart carries its chartRank. Apple publishes charts per country only, not per genre.

## `chartLimit` (type: `integer`):

How many ranked shows to take from each chart.

## `maxItems` (type: `integer`):

Hard cap on how many shows this run returns, and therefore on what it costs. Duplicates are dropped before this cap applies.

## `maxResultsPerTerm` (type: `integer`):

How many shows to take from each keyword-and-storefront pair. Apple's own hard ceiling is 100 regardless of what is asked for here.

## `genreId` (type: `integer`):

Restrict results to one Apple Podcasts genre, for example 1489 News, 1488 True Crime, 1321 Business, 1303 Comedy, 1512 Health & Fitness, 1318 Technology. Leave empty to search every genre.

## `searchAttribute` (type: `string`):

Which field the keyword has to match. 'Show title' and 'Publisher' are much stricter than the default, which matches titles, publishers and descriptions.

## `enrichFromRss` (type: `boolean`):

Adds the fields Apple's own directory does not carry: owner email, owner name, show website, language, true episode count, date of the latest episode and how many episodes shipped in the last 90 days. Costs about a second per show. Switch off for a faster catalogue-only run.

## `onlyActive` (type: `boolean`):

Drop any show whose most recent episode is more than 90 days old. Needs the RSS read above.

## `includeEpisodes` (type: `boolean`):

Attach recent episodes to each show row, with title, publish date, duration, episode and season number, and the direct audio URL. Episodes ride along inside the show row, so they cost nothing extra.

## `maxEpisodesPerShow` (type: `integer`):

How many recent episodes to attach when the option above is on.

## `proxyConfiguration` (type: `object`):

Apple's endpoints are open and answer datacenter IPs, so the default proxy setting is all this Actor needs. Residential is available but buys nothing here.

## Actor input object example

```json
{
  "searchTerms": [
    "true crime",
    "personal finance"
  ],
  "countries": [
    "us"
  ],
  "podcastIds": [],
  "chartCountries": [],
  "chartLimit": 50,
  "maxItems": 25,
  "maxResultsPerTerm": 50,
  "searchAttribute": "any",
  "enrichFromRss": true,
  "onlyActive": false,
  "includeEpisodes": false,
  "maxEpisodesPerShow": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `podcasts` (type: `string`):

Every show collected in this run, as JSON.

## `podcastsCsv` (type: `string`):

The same shows as a CSV download.

## `podcastsExcel` (type: `string`):

The same shows as an Excel workbook.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "true crime",
        "personal finance"
    ],
    "countries": [
        "us"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/apple-podcasts-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": [
        "true crime",
        "personal finance",
    ],
    "countries": ["us"],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/apple-podcasts-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "true crime",
    "personal finance"
  ],
  "countries": [
    "us"
  ],
  "maxItems": 25
}' |
apify call cirkit/apple-podcasts-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/apple-podcasts-search-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/k0KZj8o6eGMOabJm4/builds/NuzbdwtOU8B5CunZ3/openapi.json
