# Podcast Search Scraper (`67-labs/podcast-search-scraper`) Actor

Find podcasts by keyword, genre and country, and get their latest episodes: title, date, length, audio link, description. CSV or Sheets.

- **URL**: https://apify.com/67-labs/podcast-search-scraper.md
- **Developed by:** [Mokksh Bhatt](https://apify.com/67-labs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 result (one episode row)s

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Podcast Search Scraper — find podcasts by keyword and get their latest episodes, with audio links

Search Apple Podcasts for any word or phrase, in any country, and get the podcasts and their newest episodes in one table: podcast name, artist, genres, number of episodes, feed link, and for each episode the title, date, length, audio link and description. Filter by genre. Export to CSV, JSON, Excel or Google Sheets. It reads the Apple Podcasts search and then each podcast's own RSS feed, so the episode data is exactly what the podcast publishes.

**Who uses this:** podcast guest bookers and PR teams, advertisers and sponsorship buyers researching shows, podcast makers checking competitors, market researchers, content marketers, newsletter writers, transcription and AI teams that need audio links, analysts.

### What you get per row

One row per episode. With **Episodes per podcast** set to 0 you get one row per podcast instead.

| Field | What it is |
|---|---|
| `query` | Which search text found the podcast |
| `podcastId`, `podcastName`, `artist` | The podcast and who makes it |
| `podcastUrl`, `feedUrl`, `website` | Apple Podcasts page, the RSS feed, and the podcast's own website |
| `genres`, `primaryGenre` | Genres from Apple Podcasts |
| `podcastEpisodeCount`, `lastEpisodeDate` | How many episodes Apple lists, and when the newest one came out |
| `country`, `language`, `explicit` | Store country, feed language, and Apple's explicit flag |
| `artworkUrl` | Cover image |
| `episodeTitle`, `episodeDate` | The episode and when it was published (ISO time, UTC) |
| `episodeDurationSeconds` | Length in seconds |
| `episodeNumber`, `seasonNumber` | When the podcast gives them |
| `audioUrl`, `audioType` | Link to the audio file and its type |
| `episodeDescription`, `episodeUrl`, `episodeGuid` | Text, page and ID of the episode |
| `feedError` | If the feed could not be read, why (the row is then free) |
| `scrapedAt` | When the row was collected |

### Price

**$0.01 per run + $1 per 1,000 rows.** That is two pay-per-event charges: `actor-start` ($0.01) once per run and `result` ($0.001) per row, that is per episode. A podcast whose feed cannot be read is saved as a free row with the reason. No compute fees on top. The free Apify plan ($5 per month credit) covers about 4,900 rows a month at no cost. A run where the search does not answer is not charged.

### How to use

1. Open the Input tab and type your **Search texts**, for example `python`, `true crime` or `startup founders`. Pick the **Country** of the Apple Podcasts store.
2. Set **Max podcasts per search** and **Episodes per podcast**. Rows = podcasts x episodes, and that is also your cost cap. Add **Genres** if you want only some, for example Business.
3. Click Start. When it is done, open the Output tab and export the table as CSV, JSON or Excel, or send it to Google Sheets with Apify's Google Sheets integration.

### Input examples

Five newest episodes of the top 20 podcasts about Python:

```json
{ "queries": ["python"], "maxPodcasts": 20, "episodesPerPodcast": 5 }
```

Business podcasts about startups in the UK, two newest episodes each:

```json
{
    "queries": ["startup founders", "venture capital"],
    "country": "GB",
    "genres": ["Business"],
    "maxPodcasts": 25,
    "episodesPerPodcast": 2
}
```

Only the list of podcasts, no episodes:

```json
{ "queries": ["history"], "maxPodcasts": 100, "episodesPerPodcast": 0 }
```

### Output example

```json
{
    "query": "python",
    "podcastId": "979020229",
    "podcastName": "Talk Python To Me",
    "artist": "Michael Kennedy",
    "feedUrl": "https://talkpython.fm/episodes/rss",
    "podcastUrl": "https://podcasts.apple.com/us/podcast/talk-python-to-me/id979020229",
    "genres": ["Technology"],
    "primaryGenre": "Technology",
    "podcastEpisodeCount": 563,
    "country": "USA",
    "explicit": false,
    "lastEpisodeDate": "2026-09-22T18:24:00Z",
    "language": "en-us",
    "website": "https://talkpython.fm/",
    "episodeTitle": "#564: EVE Online Departs for Python 3",
    "episodeDate": "2026-09-22T18:24:30.000Z",
    "episodeDurationSeconds": 4072,
    "episodeNumber": 564,
    "seasonNumber": null,
    "audioUrl": "https://talkpython.fm/episodes/download/564/eve-online-departs-for-python-3.mp3",
    "audioType": "audio/mpeg",
    "episodeDescription": "Every ship in EVE Online eventually undocks and leaves the station. This time, it's the whole game. ...",
    "episodeUrl": "https://talkpython.fm/episodes/show/564/eve-online-departs-for-python-3",
    "episodeGuid": "ce3be7eb-ceac-47d1-b733-2a579f67b78c",
    "feedError": null,
    "scrapedAt": "2026-09-26T10:00:00.000Z"
}
```

The description and the cover image link are shortened or left out in this example.

### Limits

- Apple Podcasts search returns at most 200 podcasts for one search text, ranked by Apple.
- Episodes come from the podcast's own RSS feed: the newest ones by date. Podcasts that hide episodes behind a paid feed show what the public feed shows.
- Feeds are run by many different hosts. A feed that is down, slow or removed gives a free row with `feedError`. The other podcasts are not affected.
- Genres are matched by name against Apple's genre names, in English.
- Descriptions are plain text. Some podcasts do not give a length, then `episodeDurationSeconds` is empty.

### FAQ

**Can I get every episode of a podcast?** Set **Episodes per podcast** to 100 for the newest 100. Very old episodes are not included.

**Can I track new episodes every week?** Yes. Schedule the actor in Apify with the same searches and compare `episodeGuid` values between runs.

**Can an AI agent use it?** Yes. It works through Apify's API and MCP server. Give it search texts and limits.

**Something is wrong. What now?** Open an issue on the Issues tab with the search and the input you used. Field requests are welcome.

### Changelog

- **0.1** First release: Apple Podcasts search, genre and country filters, latest episodes from the RSS feeds, pay per event.

# Actor input Schema

## `queries` (type: `array`):

One entry per search: a word or phrase, for example python or true crime. Each search finds podcasts on Apple Podcasts.

## `country` (type: `string`):

Apple Podcasts store to search, as a 2-letter code: US, GB, IN, DE, BR.

## `genres` (type: `array`):

Keep only podcasts in one of these genres, for example Technology, Business, Comedy, News, Education, Health & Fitness. Leave empty for all.

## `maxPodcasts` (type: `integer`):

How many podcasts to take for each search text, 1 to 200.

## `episodesPerPodcast` (type: `integer`):

How many of the newest episodes to read from each podcast feed, 0 to 100. With 0 you get one row per podcast and no episodes. You pay per row, so podcasts x episodes is your cost.

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

Leave off. Podcast feeds and the search are open.

## Actor input object example

```json
{
  "queries": [
    "python",
    "true crime",
    "startup founders"
  ],
  "country": "US",
  "maxPodcasts": 5,
  "episodesPerPodcast": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `episodes` (type: `string`):

One row per episode: podcast, artist, feed, genres, episode title, date, length, audio link, description.

## `episodesCsv` (type: `string`):

Same rows as CSV for Google Sheets or Excel.

# 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 = {
    "queries": [
        "python"
    ],
    "maxPodcasts": 5,
    "episodesPerPodcast": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("67-labs/podcast-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 = {
    "queries": ["python"],
    "maxPodcasts": 5,
    "episodesPerPodcast": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("67-labs/podcast-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 '{
  "queries": [
    "python"
  ],
  "maxPodcasts": 5,
  "episodesPerPodcast": 2
}' |
apify call 67-labs/podcast-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,67-labs/podcast-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/fEfCXTenWv5fefc6c/builds/fM5xUNe0sErDSpbUx/openapi.json
