{
  "openapi": "3.0.1",
  "info": {
    "title": "Apple Podcasts Scraper: Reviews, Charts, Episodes, Channels",
    "description": "Scrape Apple Podcasts in one actor: keyword search, show details with ratings, listener reviews, top charts, episode archives, every podcast by a publisher, trending episodes, episode keyword search, and paid podcast networks. Ten modes. $3 per 1,000 results, no per-run fee.",
    "version": "0.1",
    "x-build-id": "uz1WodkfPHQgVlt8w"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sourabhbgp~apple-podcast-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sourabhbgp-apple-podcast-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/sourabhbgp~apple-podcast-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sourabhbgp-apple-podcast-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/sourabhbgp~apple-podcast-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sourabhbgp-apple-podcast-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "podcast",
              "reviews",
              "charts",
              "episodes",
              "artist",
              "trending-episodes",
              "episode-search",
              "channels",
              "top-episodes"
            ],
            "type": "string",
            "description": "What to scrape. 'search' = find podcasts by keyword. 'podcast' = details for a specific show. 'reviews' = user reviews. 'charts' = top podcasts by genre/country. 'episodes' = episodes from an RSS feed. 'artist' = every podcast by a publisher. 'trending-episodes' = Apple's Trending Episodes chart. 'episode-search' = search Apple's episode catalog by keyword. 'channels' = Apple's paid subscription networks and their shows. 'top-episodes' = a show's most popular episodes rather than its newest.",
            "default": "search"
          },
          "searchTerm": {
            "title": "Search Term",
            "type": "string",
            "description": "Keyword to search for podcasts. Used in 'search' mode."
          },
          "searchTerms": {
            "title": "Search Terms (multiple)",
            "type": "array",
            "description": "Search for several keywords in one run. Used in 'search' mode. Combined with the single Search Term field above if both are set. Results are deduplicated, so overlapping terms are never charged twice.",
            "items": {
              "type": "string"
            }
          },
          "podcastUrl": {
            "title": "Podcast URL",
            "type": "string",
            "description": "Apple Podcasts URL for a specific podcast (e.g., https://podcasts.apple.com/us/podcast/the-daily/id1200361736). Used in 'podcast' and 'reviews' modes."
          },
          "podcastUrls": {
            "title": "Podcast URLs (multiple)",
            "type": "array",
            "description": "Several Apple Podcasts URLs or numeric IDs in one run. Used in 'podcast' and 'reviews' modes. Combined with the single Podcast URL field above if both are set.",
            "items": {
              "type": "string"
            }
          },
          "rssFeedUrl": {
            "title": "RSS Feed URL",
            "type": "string",
            "description": "Direct RSS feed URL to extract episodes from (e.g., https://feeds.simplecast.com/54nAGcIl). Used in 'episodes' mode. With enrichWithAmp:true, paste an Apple Podcasts URL or numeric ID instead: the actor pulls episodes from Apple's AMP catalog (precise audio asset URL, duration in ms, per-episode contentRating)."
          },
          "rssFeedUrls": {
            "title": "RSS Feed URLs (multiple)",
            "type": "array",
            "description": "Several RSS feeds (or Apple Podcasts URLs/IDs) in one run. Used in 'episodes' mode. Combined with the single RSS Feed URL field above if both are set.",
            "items": {
              "type": "string"
            }
          },
          "artistId": {
            "title": "Apple Artist ID",
            "type": "string",
            "description": "Apple Podcasts publisher/artist ID (e.g., '121664449' for The New York Times). Used in 'artist' mode. If omitted, the actor will derive it from podcastUrl via Apple's public oEmbed endpoint: no JWT needed for discovery."
          },
          "artistIds": {
            "title": "Apple Artist IDs (multiple)",
            "type": "array",
            "description": "Several publisher/artist IDs in one run. Used in 'artist' mode. Combined with the single Apple Artist ID field above if both are set.",
            "items": {
              "type": "string"
            }
          },
          "channelId": {
            "title": "Apple Channel ID",
            "type": "string",
            "description": "Apple Podcasts channel ID for 'channels' mode, e.g. '6442465405' for SiriusXM Podcasts. Leave empty to get the Top Subscriber Channels chart, which is how you find channel IDs."
          },
          "channelIds": {
            "title": "Apple Channel IDs (multiple)",
            "type": "array",
            "description": "Several channel IDs in one run. Combined with the single Apple Channel ID field above if both are set.",
            "items": {
              "type": "string"
            }
          },
          "genre": {
            "title": "Genre",
            "type": "string",
            "description": "Genre filter for charts and trending episodes. Accepted: arts, business, comedy, education, fiction, government, health-fitness, history, kids-family, leisure, music, news, religion-spirituality, science, society-culture, sports, technology, true-crime, tv-film. Leave empty for the all-genres chart."
          },
          "genres": {
            "title": "Genres (multiple)",
            "type": "array",
            "description": "Several genres in one run: one chart per genre. Same accepted values as Genre above. Combined with the single Genre field if both are set.",
            "items": {
              "type": "string"
            }
          },
          "chartType": {
            "title": "Chart Type",
            "enum": [
              "top",
              "top-series",
              "top-subscriber"
            ],
            "type": "string",
            "description": "Which Apple chart to return in 'charts' mode. Top Shows is the main Apple Podcasts chart and the default. Top Series ranks limited-run series; Top Subscriber Shows ranks paid subscription shows. Top Series and Top Subscriber Shows list at most 100 shows.",
            "default": "top"
          },
          "trackDeltas": {
            "title": "Track chart rank changes",
            "type": "boolean",
            "description": "Charts mode only: persist chart snapshots between runs. Each entry gets priorRank, rankChange, and status (new/up/down/same). Podcasts that left the chart are emitted with status=\"exited\". On the first run all entries are marked \"new\".",
            "default": true
          },
          "sortBy": {
            "title": "Review Sort",
            "enum": [
              "mostRecent",
              "mostHelpful"
            ],
            "type": "string",
            "description": "Order for 'reviews' mode. Most Recent returns newest first, up to 2,000 where Apple has them. Most Helpful returns the reviews Apple ranks as most useful and stops where Apple's helpful list ends, which can be fewer than Max Results.",
            "default": "mostRecent"
          },
          "sortEpisodes": {
            "title": "Episode Order",
            "enum": [
              "source",
              "newest",
              "oldest"
            ],
            "type": "string",
            "description": "Order for 'episodes' mode. Source order is whatever the feed returns and is the default. Newest first and Oldest first sort the whole feed by publish date. With Enrich with Apple AMP catalog on, Oldest first reads the RSS feed, since Apple's catalog only holds the newest episodes.",
            "default": "source"
          },
          "country": {
            "title": "Country",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter country code for the Apple Podcasts store to read (e.g., us, gb, au, ca, de). Used in every mode.",
            "default": "us"
          },
          "countries": {
            "title": "Countries (multiple)",
            "type": "array",
            "description": "Several two-letter country codes in one run, e.g. us, gb, de: one pass per country. Used in 'search', 'episode-search', 'charts', 'trending-episodes' and 'channels' (top channels) modes. Always combined with the single Country field above, which is prefilled with us: set Country to one of these to leave us out.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "Max Results",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Maximum number of results for the WHOLE run, across every search term, podcast, feed or chart you provide. This is the ceiling on what you are charged. Use Max Results Per Item to also cap each individual item.",
            "default": 50
          },
          "maxResultsPerItem": {
            "title": "Max Results Per Item",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Optional cap per search term, podcast, feed, or chart, including when you give only one. Max Results above stays the total for the whole run, so your bill never exceeds it. Leave empty to let each item use whatever the run total allows."
          },
          "completeResults": {
            "title": "Complete results",
            "type": "boolean",
            "description": "On (default): read every page Apple offers and keep every chart position, up to Max results. Top episodes goes past the first 4 per show, episode search past Apple's first short page, and duplicates do not count toward Max results. Off: the shorter lists this actor returned before November 2026.",
            "default": true
          },
          "enrichWithRss": {
            "title": "Enrich with RSS metadata",
            "type": "boolean",
            "description": "Search mode only: fetch each podcast's RSS feed to extract owner email, website, language, episode frequency, and active status. Adds one HTTP request per podcast: slower but ideal for lead generation. Podcast Details mode always enriches automatically.",
            "default": false
          },
          "enrichWithAmp": {
            "title": "Enrich with Apple AMP catalog",
            "type": "boolean",
            "description": "Add subscription/paid-status fields, episodic-vs-serial 'kind', Apple's release-frequency label, podcast launch date, BCP-47 language tag, publisher artist ID, and (in episodes mode) precise audio URL + duration in milliseconds + content rating. Available in search, podcast, charts, and episodes modes. Episodes mode requires the input to be an Apple Podcasts URL or numeric ID (not a raw RSS URL).",
            "default": false
          },
          "webhookUrl": {
            "title": "Webhook URL",
            "pattern": "^https?://",
            "type": "string",
            "description": "Optional HTTPS endpoint to POST each emitted record to as it is collected. Records are still pushed to the dataset (the webhook is additive). Payload: {event:'result', actorRunId, timestamp, record}. 5-second timeout, 1 retry on failure."
          },
          "dryRun": {
            "title": "Dry run (preview only)",
            "type": "boolean",
            "description": "Preview mode: fetch from Apple as usual but skip dataset writes, webhook calls, and charging. Logs how many records would be emitted. Useful for validating inputs before scheduling a run.",
            "default": false
          },
          "spotifyClientId": {
            "title": "Spotify Client ID",
            "type": "string",
            "description": "Optional and rarely needed. Adds a matching Spotify show ID to each Apple record, which requires you to register your own free Spotify app. For Spotify data itself, use the dedicated Spotify Scraper: https://apify.com/sourabhbgp/spotify-scraper"
          },
          "spotifyClientSecret": {
            "title": "Spotify Client Secret",
            "type": "string",
            "description": "Spotify Client Secret. Only required if you set a Spotify Client ID above."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}