{
  "openapi": "3.0.1",
  "info": {
    "title": "Podcast RSS Scraper — Episodes, Transcripts & Apple Podcasts",
    "description": "Scrape podcast RSS feeds, Apple Podcasts URLs or search terms into show and episode records (title, pubDate, duration, audio URL, chapters, Podcasting 2.0 transcripts) with optional transcript text. Pay per episode ($0.0003), feed ($0.01) and transcript ($0.005).",
    "version": "0.1",
    "x-build-id": "2osYjZ3Gc6ehqwak2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/owlabee~podcast-rss-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-owlabee-podcast-rss-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/owlabee~podcast-rss-scraper/runs": {
      "post": {
        "operationId": "runs-sync-owlabee-podcast-rss-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/owlabee~podcast-rss-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-owlabee-podcast-rss-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": [
          "feeds"
        ],
        "properties": {
          "feeds": {
            "title": "Feeds",
            "minItems": 1,
            "type": "array",
            "description": "One entry per line. Accepts podcast RSS/Atom feed URLs, Apple Podcasts show URLs (https://podcasts.apple.com/…/id123456789, resolved through the public iTunes Lookup API), bare Apple IDs, and search terms written as `search:the daily` (resolved through the iTunes Search API; the top result is used and the other matches are recorded on the show record). A show's web page works too when it carries an RSS autodiscovery link. Opt-in discovery and lookup inputs: `charts:us` or `charts:gb/technology` (shows in Apple's top-shows chart for a country, optionally narrowed to one genre, each resolved to its public RSS feed), `fyyd:<term>` and `gpodder:<term>` (top result of a fyyd.de or gpodder.net directory search, other matches recorded), and Podcast Index GUIDs (`pi:<guid>` or a bare GUID; needs your own Podcast Index key below). The prefilled feeds are the cheap, always-available examples used by Apify's daily automated test.",
            "items": {
              "type": "string"
            }
          },
          "maxEpisodesPerFeed": {
            "title": "Max episodes per feed",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Newest-first cap on episode records per feed. The show record still reports the full `episodeCount`. With `onlyNewSinceLastRun`, new episodes beyond the cap are left for the next run.",
            "default": 100
          },
          "includeShowRecord": {
            "title": "Include show record",
            "type": "boolean",
            "description": "Write one `recordType: \"show\"` item per feed with the show-level metadata (title, description, author, categories, image, podcast GUID, funding, episode count). Turn off to get episode records only.",
            "default": true
          },
          "fetchTranscripts": {
            "title": "Fetch transcripts",
            "type": "boolean",
            "description": "Download each episode's `<podcast:transcript>` file (first available in order text, VTT, SRT, JSON, HTML; max 2 MB) and attach `transcriptText` (plain text, cue timestamps stripped) and `transcriptWords`. Charged per transcript on top of the episode event; episodes without a transcript tag are not charged for it.",
            "default": false
          },
          "fetchChapters": {
            "title": "Fetch chapters",
            "type": "boolean",
            "description": "Download each episode's Podcasting 2.0 chapters file (`<podcast:chapters>`, JSON format, max 1 MB, 10 s deadline) and attach `chapters`: a list of `{startTime, endTime, title, img, url, toc}`. Charged per chapters file requested (`chapters-fetched`) on top of the episode event, also when the file times out or is invalid (recorded in `chaptersError`); episodes without a chapters tag are not charged for it. Off by default.",
            "default": false
          },
          "onlyNewSinceLastRun": {
            "title": "Only new episodes since the last run",
            "type": "boolean",
            "description": "Remember the episode GUIDs of each feed in the state store and return only episodes not seen before. The first run for a feed is a baseline and returns the newest episodes up to the cap. Ideal for scheduled monitoring and webhooks.",
            "default": false
          },
          "stateStoreName": {
            "title": "State key-value store",
            "pattern": "^[a-zA-Z0-9-]{3,63}$",
            "type": "string",
            "description": "Named key-value store that keeps the seen-episode GUIDs per feed when `onlyNewSinceLastRun` is on. Use a different name for independent monitors (e.g. per client or schedule).",
            "default": "podcast-rss-scraper-state"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Parallel transcript downloads per feed. Requests to the same host are additionally spaced at least 500 ms apart (about 2 requests per second per host).",
            "default": 5
          },
          "maxSecondsPerFeed": {
            "title": "Max seconds per feed",
            "minimum": 60,
            "maximum": 21600,
            "type": "integer",
            "description": "Time budget for one feed (download plus transcript downloads). When it runs out, or when no episode was saved for 60 seconds because transcript downloads keep timing out, the remaining episodes of that feed are not saved (and with onlyNewSinceLastRun they stay new for the next run). Items already saved are kept and charged. If the feed itself cannot be downloaded in time, one error item with `error: \"TIME_BUDGET\"` is saved.",
            "default": 1800
          },
          "chartLimit": {
            "title": "Chart size (charts: inputs)",
            "minimum": 10,
            "maximum": 100,
            "type": "integer",
            "description": "How many of the top shows to read from Apple's chart for each `charts:` input: 10, 25, 50 or 100 (other values are rounded up to the next of these). With a genre (`charts:us/technology`) only the shows Apple files under that genre are kept, so fewer feeds are fetched. Each show with a public feed is then scraped and charged like any other feed. Ignored when there is no `charts:` input.",
            "default": 25
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "pattern": "^https?://.+",
            "type": "string",
            "description": "If set, the Actor POSTs a JSON summary of the run (per-feed counts and, with `onlyNewSinceLastRun`, the list of new episodes) to this URL — 10 s timeout, 2 retries. Failures are logged, never fatal."
          },
          "podcastIndexApiKey": {
            "title": "Podcast Index API key (optional, your own)",
            "type": "string",
            "description": "Your own free key from api.podcastindex.org, used only to resolve Podcast Index GUID inputs to the publisher's feed URL during this run (nothing from the Podcast Index response is stored). Without it, GUID inputs return GUID_RESOLUTION_UNAVAILABLE. owlabee never supplies a key."
          },
          "podcastIndexApiSecret": {
            "title": "Podcast Index API secret (optional, your own)",
            "type": "string",
            "description": "The secret that belongs to your Podcast Index API key. Both are needed."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}