# Apple Podcasts Chart Tracker — Track Rankings 32 Countries (`quaffable_mettle/apple-podcasts-charts`) Actor

Track Apple Podcasts rankings across 32 countries and discover which shows are rising, falling or dominating the charts. Get structured podcast chart data for market research, competitor analysis and podcast intelligence.

- **URL**: https://apify.com/quaffable\_mettle/apple-podcasts-charts.md
- **Developed by:** [Emir Llonviche](https://apify.com/quaffable_mettle) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$80.00 / 1,000 storefront processeds

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 Charts Scraper — New & Rising, 32 Storefronts

Get the top podcast charts for up to 32 countries in a single run, and get what a chart alone never tells you: **which shows are new, which ones are climbing, which ones chart in several countries at once, and which ones have stopped publishing.**

*This is an unofficial scraper. It is not affiliated with, endorsed by, or sponsored by Apple Inc. All trademarks belong to their respective owners.*

It reads Apple's public chart feed directly — no headless browser, no proxies, no API key, no login. A 3-storefront run finishes in a few seconds.

### What you get

One row per podcast, per storefront:

| Field | What it is |
|---|---|
| `storefront`, `storefrontName` | Country code and country name |
| `rank` | Position in the chart, 1 = top |
| `name`, `publisher` | Podcast title and the account that publishes it |
| `genres`, `primaryGenre` | Genres from the chart, plus Apple's primary genre |
| `podcastId`, `applePodcastsUrl`, `feedUrl` | Apple id, public page, and the show's RSS feed |
| `artworkUrl` | Cover art at 600×600 instead of the 100×100 the feed returns |
| **`isNew`** | The show was not in the chart on your previous run |
| **`rankChange`** | Positions gained since your previous run (12 → 4 = `+8`) |
| **`peakRank`** | Best rank the show has reached across all your runs |
| **`daysInChart`** | How long it has been charting without interruption |
| **`alsoChartingIn`, `storefrontCount`** | The other countries where it charts *right now* |
| **`episodeCount`, `lastEpisodeAt`, `daysSinceLastEpisode`** | How active the show actually is |
| `explicit`, `chartUpdatedAt`, `scrapedAt`, `sourceUrl` | Explicit flag, Apple's chart timestamp, your run timestamp, source |

### What makes it different

Most chart scrapers give you a snapshot: who is at number 12 today. This one gives you three things a snapshot cannot contain.

**Movement.** Each run is compared against your previous one, stored between runs, so you see what entered the chart and what is climbing. Shows are tracked by their Apple id, so a rebranded podcast is not mistaken for a new one.

**Cross-country presence.** Every storefront you ask for is fetched in the same run, so a show breaking out in four countries at once is visible as such. A scraper that does one country per run cannot compute this at all.

**Publishing activity.** A podcast sitting at rank 30 whose last episode is from 2023 is a very different thing from one publishing weekly. `daysSinceLastEpisode` tells you which is which — useful when you are looking for shows to pitch, sponsor or benchmark against.

On the **first** run there is no history to compare against, so `isNew`, `rankChange` and `daysInChart` are `null` — not `true`, not `0`. Claiming everything is new when we simply have no history would be a lie you could not detect. Run it a second time and the movement fields fill in.

### Input

```json
{
  "storefronts": ["US", "GB", "FR", "DE"],
  "chartSize": 100,
  "includeDetails": true,
  "genre": "",
  "timeoutSecs": 30
}
```

- **storefronts** — two-letter country codes. Verified: `AR AT AU BE BR CA CH CL CO DE DK ES FI FR GB IE IN IT JP KR MX NL NO NZ PL PT RU SE SG TR US ZA`. Other codes are attempted with a warning rather than refused.
- **chartSize** — 10 to 200 podcasts per chart, from the top down.
- **includeDetails** — episode count, latest-episode date and RSS feed. Costs one extra request per 100 *unique* shows, not one per row: a podcast charting in twelve countries is looked up once.
- **genre** — keep only podcasts whose genre contains this text (`News`, `Comedy`, `True Crime`…).

### Typical uses

- Spot a podcast breaking out before it is obvious — new entries climbing in several countries at once.
- Build a prospect list of active shows in one genre, with their RSS feeds and publishing cadence.
- Track your own show, or a competitor's, across countries on a schedule.
- Feed chart movement into a newsletter, dashboard or dataset.

### Pricing

**$0.05 per storefront processed.** A 3-country run costs $0.15; a 32-country sweep costs $1.60. You are charged only for storefronts that actually returned a chart — a country that fails costs you nothing. Chart size, enrichment and the genre filter are all included.

### Running it on a schedule

Movement fields need a previous run to compare against, so this Actor is at its best on a schedule — daily or every few hours. Use Apify's **Schedule** on the Actor, and keep the same storefronts between runs so the history stays comparable.

### Limits, stated plainly

- Apple publishes up to **200 podcasts per storefront**. Nobody, including this Actor, can return more than the chart contains.
- The chart is the **top-podcasts** chart. It is not episode-level, and it is not a search index.
- `rankChange` compares against **your** previous run, whatever its date. Two runs three weeks apart give you a three-week delta, not a daily one.
- A show that leaves the chart and comes back is counted as new on its return: `daysInChart` measures an uninterrupted stay.
- Apple's chart timestamp (`chartUpdatedAt`) tells you how fresh the underlying data is. It usually refreshes several times a day, so running more often than that adds cost without adding movement.
- Storefronts run in parallel and stay isolated: one country failing never stops the others, and `RUN_SUMMARY` records exactly which ones failed and why.

### Output

Alongside the dataset, each run writes a `RUN_SUMMARY` record: storefronts requested, how many succeeded, how many failed with the reason, total rows and how many shows chart in more than one country. Point a monitor at it and you will know a storefront broke before your users tell you.

### Support

Found a bug or a storefront that should be on the verified list? Open an issue on the Actor page and it will be looked at.

# Actor input Schema

## `storefronts` (type: `array`):

Two-letter country codes to fetch charts for. Each one is fetched independently, so a failing storefront never breaks the run. Verified: AR AT AU BE BR CA CH CL CO DE DK ES FI FR GB IE IN IT JP KR MX NL NO NZ PL PT RU SE SG TR US ZA.

## `chartSize` (type: `integer`):

How many podcasts to take from each chart, from the top down. Apple serves up to 200.

## `includeDetails` (type: `boolean`):

Add episode count, date of the latest episode, days since it, RSS feed URL and explicit flag. Costs one extra request per 100 unique shows, not one per row.

## `genre` (type: `string`):

Keep only podcasts whose genre contains this text, for example "News", "Comedy", "True Crime". Leave empty to keep the whole chart.

## `timeoutSecs` (type: `integer`):

How long to wait for each request before retrying. Raise it only if you see timeout warnings in the log.

## Actor input object example

```json
{
  "storefronts": [
    "US",
    "GB",
    "FR"
  ],
  "chartSize": 100,
  "includeDetails": true,
  "genre": "News",
  "timeoutSecs": 30
}
```

# Actor output Schema

## `charts` (type: `string`):

One row per podcast, per storefront: rank, movement since the last run, cross-country presence, publishing activity and artwork.

## `runSummary` (type: `string`):

Which storefronts were requested, how many succeeded or failed and why. Point a monitor at this to catch a storefront breaking before your users do.

# 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 = {
    "storefronts": [
        "US",
        "GB",
        "FR"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("quaffable_mettle/apple-podcasts-charts").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 = { "storefronts": [
        "US",
        "GB",
        "FR",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("quaffable_mettle/apple-podcasts-charts").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 '{
  "storefronts": [
    "US",
    "GB",
    "FR"
  ]
}' |
apify call quaffable_mettle/apple-podcasts-charts --silent --output-dataset

```

## MCP server setup

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

```

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/kPCBh4Q9qFp44QdPF/builds/rYwyWMLIKHfy2KSj9/openapi.json
