{
  "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": "ajg9uh2lLyQ8WWqfb"
  },
  "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.",
            "default": "top"
          },
          "sortBy": {
            "title": "Review Sort",
            "enum": [
              "mostRecent",
              "mostHelpful"
            ],
            "type": "string",
            "description": "Order for 'reviews' mode. Most Recent returns newest first. Most Helpful returns the reviews Apple ranks as most useful, which is usually what you want for reputation analysis.",
            "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.",
            "default": "source"
          },
          "country": {
            "title": "Country",
            "pattern": "^[A-Za-z]{2}$",
            "type": "string",
            "description": "Two-letter country code for localized results (e.g., us, gb, au, ca, de). Used in 'search' and 'charts' modes.",
            "default": "us"
          },
          "countries": {
            "title": "Countries (multiple)",
            "type": "array",
            "description": "Several two-letter country codes in one run, e.g. us, gb, de. Used in 'search' and 'charts' modes: one pass per country. Combined with the single Country field above if both are set.",
            "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. 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."
          },
          "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
          },
          "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
          },
          "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}