{
  "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": "tKm2FRatLfWCKQcdO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/citrine_venus~podcast-directory-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-citrine_venus-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/citrine_venus~podcast-directory-scraper/runs": {
      "post": {
        "operationId": "runs-sync-citrine_venus-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/citrine_venus~podcast-directory-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-citrine_venus-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": "🔍 Falls back to the podcast's own website — homepage plus contact/about pages — to recover an address the feed did not publish. Measurably lifts email coverage.",
            "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 proxy for 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": "🚦 By default the run starts on a <b>direct connection</b> and automatically switches to a <b>datacenter</b> and then a <b>residential</b> route only if the podcast directory pushes back. Once it switches it stays there for the rest of the run, and every change is logged. Pick your own route here to override that.",
            "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 the run escalates to the next network route.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}