{
  "openapi": "3.0.1",
  "info": {
    "title": "🎙️ Podcast Directory Scraper — Host Contacts & Emails",
    "description": "Turn Apple Podcasts searches, charts, or links into podcast host emails, websites, and social contacts. No API key needed. Get RSS-enriched leads with confidence-scored emails and an outreach lead score for podcast outreach and PR pitching.",
    "version": "1.0",
    "x-build-id": "EAYsq36ALFtfg2fCX"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/data_minds~podcast-directory-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-data_minds-podcast-directory-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/data_minds~podcast-directory-scraper/runs": {
      "post": {
        "operationId": "runs-sync-data_minds-podcast-directory-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/data_minds~podcast-directory-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-data_minds-podcast-directory-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",
        "properties": {
          "searchTerms": {
            "title": "🔎 Search keywords",
            "maxItems": 100,
            "type": "array",
            "description": "🎯 Topics, niches or show names — for example `b2b saas marketing`, `true crime`, `health and fitness`, `startup founders`. Each keyword is searched on its own. Bulk input supported — paste one per line.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "urls": {
            "title": "🔗 Podcast URLs, show IDs or RSS feeds (bulk)",
            "type": "array",
            "description": "📎 Scrape exact shows instead of (or on top of) a keyword search. Accepts <b>Apple Podcasts links</b> (`https://podcasts.apple.com/us/podcast/.../id1322200189`), <b>bare show IDs</b> (`1322200189`) and <b>direct RSS feed URLs</b> (`https://feeds.simplecast.com/qm_9xx0g`). Bulk input supported — one per line, or upload a file.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "podcastIds": {
            "title": "🆔 Podcast show IDs (bulk)",
            "type": "array",
            "description": "🔢 Bare Apple Podcasts show IDs, one per line — for example `1322200189`. Use this when you have plain IDs rather than full links; the URL field above only accepts real URLs. Both fields are processed together.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerTerm": {
            "title": "📬 Podcasts per keyword",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "🎁 How many shows to collect for each keyword. Start with 10–25 for a quick sample, raise it for a full harvest.",
            "default": 50
          },
          "country": {
            "title": "🌍 Podcast store country",
            "type": "string",
            "description": "🗺️ Which country's Apple Podcasts store to search. Charts and rankings are country-specific, so this changes what you get. Pick one or type any two-letter code — 175 stores are supported.",
            "default": "us"
          },
          "mode": {
            "title": "🎛️ Discovery mode",
            "enum": [
              "search",
              "episodes",
              "charts",
              "ids"
            ],
            "type": "string",
            "description": "🔀 <b>Keyword search</b> matches show titles and authors. <b>Episode keyword search</b> finds shows that actually <i>talked about</i> your topic, even when their title never mentions it. <b>Top charts</b> harvests the store's own rankings. <b>Direct links</b> uses only the URLs/IDs you pasted above.",
            "default": "search"
          },
          "episodeSearchTerms": {
            "title": "🎧 Episode keywords",
            "type": "array",
            "description": "🗣️ Used only by <b>Episode keyword search</b>. Phrases to look for inside episode titles and notes — `series B funding`, `cold outreach`, `menopause`. Leave empty to reuse your main search keywords.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "chart": {
            "title": "🏆 Which chart",
            "enum": [
              "top-series",
              "top",
              "top-subscriber"
            ],
            "type": "string",
            "description": "📈 Used only by <b>Top charts</b> mode. `top-series` is the classic most-popular-shows chart.",
            "default": "top-series"
          },
          "chartGenres": {
            "title": "🗂️ Chart categories",
            "type": "array",
            "description": "🎨 Used only by <b>Top charts</b> mode. Category names such as `business`, `comedy`, `true crime`, `health & fitness`. Leave empty to sweep every top-level category.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxPodcasts": {
            "title": "🧮 Total podcast cap",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "🛑 Hard stop for the whole run, across every keyword and category. `0` means no limit. You are only charged for podcasts actually saved.",
            "default": 0
          },
          "fetchRss": {
            "title": "📡 Read each show's feed for contact details",
            "type": "boolean",
            "description": "📬 Opens the show's own feed to pull the <b>host email</b>, owner name, real website, credited hosts, publishing cadence, funding link and episode list. Turn off for a fast metadata-only run.",
            "default": true
          },
          "scrapeWebsite": {
            "title": "🌐 Check the show website when the feed has no email",
            "type": "boolean",
            "description": "🔍 Also checks the podcast's own website — homepage plus contact/about pages — for an address.",
            "default": true
          },
          "websiteMaxPages": {
            "title": "📄 Extra website pages to check",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "🗂️ How many contact/about pages to open beyond the homepage. Higher finds more addresses but takes longer.",
            "default": 2
          },
          "includeSocialLinks": {
            "title": "🔗 Collect social profiles",
            "type": "boolean",
            "description": "📱 Twitter/X, LinkedIn, Instagram, YouTube, Facebook and TikTok profiles belonging to the show (guest and sponsor links are filtered out).",
            "default": true
          },
          "includeEpisodes": {
            "title": "🎧 Include episode listings",
            "type": "boolean",
            "description": "📻 Adds recent episodes per show — title, description, publish date, duration, audio URL, episode/season number, transcript link and credited guests. Turn off for smaller, faster rows.",
            "default": false
          },
          "maxEpisodesPerShow": {
            "title": "🔢 Max episodes per podcast",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "📦 How many recent episodes to include per show. `0` returns every episode in the feed (can be very large). Publishing cadence is always calculated from the full feed regardless of this cap.",
            "default": 10
          },
          "includeRatingHistogram": {
            "title": "📊 Include the full star breakdown",
            "type": "boolean",
            "description": "⭐ Adds the 1★–5★ vote counts alongside the average rating.",
            "default": false
          },
          "activeOnly": {
            "title": "🟢 Active podcasts only",
            "type": "boolean",
            "description": "📅 Keep only shows that published an episode in the last 90 days. Shows whose feed could not be read are dropped too, since activity cannot be confirmed.",
            "default": false
          },
          "activeWithinDays": {
            "title": "🗓️ …or set your own activity window",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "⏳ Keep only shows with an episode in the last N days. Overrides the 90-day switch above. `0` disables it.",
            "default": 0
          },
          "excludeCompleted": {
            "title": "🚫 Skip finished shows",
            "type": "boolean",
            "description": "🎬 Drop shows the store flags as completed/ended — they will never book a guest.",
            "default": false
          },
          "requireEmail": {
            "title": "📧 Only keep podcasts with a host email",
            "type": "boolean",
            "description": "💰 Skip any show with no usable contact address. Filtered shows are never saved and never charged, so you only pay for contactable leads.",
            "default": false
          },
          "requireWebsite": {
            "title": "🌐 Only keep podcasts with a website",
            "type": "boolean",
            "description": "🔗 Skip shows that publish no website of their own.",
            "default": false
          },
          "excludeExplicit": {
            "title": "🔞 Skip explicit shows",
            "type": "boolean",
            "description": "🧹 Drop shows marked explicit — useful for brand-safe sponsorship lists.",
            "default": false
          },
          "minLeadScore": {
            "title": "🏆 Minimum lead score",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "🎯 Skip shows scoring below this (0–100). Roughly: <b>60</b> keeps shows with at least one direct contact channel, <b>80</b> keeps active, well-rated shows with a real inbox. `0` keeps everything.",
            "default": 0
          },
          "minEpisodes": {
            "title": "🎧 Minimum episodes",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "📚 Drop shows with fewer episodes than this — a quick way to filter out abandoned pilots.",
            "default": 0
          },
          "minRatingCount": {
            "title": "🗳️ Minimum number of ratings",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "📈 Drop shows with fewer listener ratings than this — a sign of real audience size.",
            "default": 0
          },
          "minRating": {
            "title": "⭐ Minimum star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "🌟 Drop shows rated below this on the 0–5 scale. A minimum rating count of 1 is applied automatically, because a 5.0 from zero raters is not a 5.0.",
            "default": 0
          },
          "emailTypes": {
            "title": "🏷️ Keep only these email types",
            "type": "array",
            "description": "📮 <b>role</b> = booking@/press@/hello@ · <b>personal</b> = a named human · <b>generic</b> = support@/admin@ · <b>platform</b> = a podcast host's own inbox. Leave empty to keep every type.",
            "items": {
              "type": "string",
              "enum": [
                "role",
                "personal",
                "generic",
                "platform"
              ],
              "enumTitles": [
                "🎯 Role (booking, press, hello)",
                "👤 Personal (a named human)",
                "🏢 Generic (support, admin)",
                "🧰 Platform (hosting provider)"
              ]
            },
            "default": []
          },
          "frequencies": {
            "title": "📅 Keep only these publishing rhythms",
            "type": "array",
            "description": "⏱️ Calculated from the real gaps between episodes, not from what the show claims. Leave empty to keep every cadence.",
            "items": {
              "type": "string",
              "enum": [
                "daily",
                "multiple-per-week",
                "weekly",
                "biweekly",
                "monthly",
                "irregular",
                "infrequent"
              ],
              "enumTitles": [
                "🌅 Daily",
                "🔁 Multiple per week",
                "📆 Weekly",
                "🗓️ Biweekly",
                "📇 Monthly",
                "🌀 Irregular",
                "🐢 Infrequent"
              ]
            },
            "default": []
          },
          "languages": {
            "title": "🗣️ Keep only these languages",
            "type": "array",
            "description": "🌐 Two-letter codes such as `en`, `es`, `de`. `en` also matches `en-US` and `en-GB`. Leave empty for every language.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "categoryFilter": {
            "title": "🗂️ Keep only these categories",
            "type": "array",
            "description": "🎨 Partial matches count — `business` keeps `Business` and `Business News`. Leave empty for every category.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "🚦 The run manages its own connection by default. Only change this if you need a specific connection setup for your run.",
            "default": {
              "useApifyProxy": false
            }
          },
          "concurrency": {
            "title": "⚡ Podcasts in parallel",
            "minimum": 1,
            "maximum": 25,
            "type": "integer",
            "description": "🏎️ How many show feeds and websites to open at the same time.",
            "default": 8
          },
          "requestDelaySeconds": {
            "title": "🐢 Pause between requests",
            "minimum": 0,
            "maximum": 10,
            "type": "number",
            "description": "⏸️ Seconds to wait between requests. `0` is fine for normal runs; raise it if you are sweeping very large keyword sets.",
            "default": 0
          },
          "maxRetries": {
            "title": "♻️ Retries per request",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "🔁 Attempts before a request gives up.",
            "default": 3
          },
          "maxScanned": {
            "title": "🔬 Maximum shows to examine",
            "minimum": 0,
            "maximum": 200000,
            "type": "integer",
            "description": "🧭 Safety valve: stop after checking this many shows, even if your filters rejected all of them. `0` means no limit.",
            "default": 20000
          },
          "maxRunSeconds": {
            "title": "⏱️ Maximum run time",
            "minimum": 0,
            "maximum": 86400,
            "type": "integer",
            "description": "⌛ Stop cleanly after this many seconds, keeping everything already saved. `0` means no time limit.",
            "default": 0
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}