{
  "openapi": "3.0.1",
  "info": {
    "title": "Substack Scraper & Medium Scraper - Newsletter & Blog Posts",
    "description": "Posts from Substack, Medium, Ghost, Beehiiv, WordPress or any RSS/Atom feed: title, author, date, text, tags, image. Date and keyword filters, new-post alerts, paywall-aware full text. $1/1k posts.",
    "version": "0.1",
    "x-build-id": "Xj29FyhQoOljWTMHg"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tidytools~substack-medium-posts-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tidytools-substack-medium-posts-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/tidytools~substack-medium-posts-scraper/runs": {
      "post": {
        "operationId": "runs-sync-tidytools-substack-medium-posts-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/tidytools~substack-medium-posts-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-tidytools-substack-medium-posts-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": {
          "sources": {
            "title": "Newsletters, blogs or feeds",
            "type": "array",
            "description": "Main input: the run needs at least one line here. One per line, any mix of: a Substack newsletter (https://name.substack.com, its custom domain such as https://www.lennysnewsletter.com, or substack:name), a Medium author, publication or tag (https://medium.com/@user, @user, https://medium.com/tag/python), any other blog's home page (Ghost, Beehiiv, WordPress...: the feed is found automatically) or a feed URL (RSS, Atom, JSON Feed). Invalid lines and sources without a feed get a free error row.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerSource": {
            "title": "Max posts per source",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Newest first, counted after your filters. Feeds carry the latest posts only (Medium 10, Substack 20, most blogs 10–50); for Substack the public archive list adds older posts (see below).",
            "default": 50
          },
          "maxPosts": {
            "title": "Max posts (whole run)",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after this many posts in total. You pay only for posts returned: 1,000 posts cost at most $1.00 on the Free plan (plus full texts, if turned on).",
            "default": 1000
          },
          "sinceDate": {
            "title": "Posts published since",
            "type": "string",
            "description": "A date (2026-09-01) or a period (24 hours, 7 days, 2 weeks, 3 months). Older posts are skipped and not charged."
          },
          "keywords": {
            "title": "Post contains (any of)",
            "type": "array",
            "description": "Keep posts whose title, subtitle, text or tags contain at least one of these words or phrases (case-insensitive), e.g. AI agents, pricing, layoffs.",
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Post must not contain",
            "type": "array",
            "description": "Drop posts whose title, subtitle, text or tags contain any of these, e.g. sponsored, podcast.",
            "items": {
              "type": "string"
            }
          },
          "authors": {
            "title": "Authors",
            "type": "array",
            "description": "Keep posts by these authors only (part of the name is enough; useful for publications with many writers).",
            "items": {
              "type": "string"
            }
          },
          "includeText": {
            "title": "Include the post text",
            "type": "boolean",
            "description": "The post's plain text as far as the feed (or the page, with full text on) has it. Turn off for a lighter dataset of titles, links and excerpts.",
            "default": true
          },
          "includeHtml": {
            "title": "Include the feed's HTML",
            "type": "boolean",
            "description": "Also return the post HTML exactly as the feed carries it (contentHtml), e.g. to republish formatting in your own reader.",
            "default": false
          },
          "substackArchive": {
            "title": "Substack: paid/free status, likes and older posts",
            "type": "boolean",
            "description": "For Substack newsletters, also read the public archive list (the one the newsletter's /archive page shows): adds audience (free or paid), the full post's word count, likes and restacks, and posts older than the feed's latest 20 (title, subtitle, date, excerpt; no text unless full text is on and the post is free).",
            "default": true
          },
          "fetchFullText": {
            "title": "Fetch full text of truncated posts (extra charge)",
            "type": "boolean",
            "description": "For posts whose feed has only a summary or snippet, read the post page and return its full public text. Charged per post only when the page had more text than the feed ($0.001 on the Free plan). Paywalls are respected: for paid-only posts you get the public preview, marked paywalled: true, and no full-text charge.",
            "default": false
          },
          "onlyNewPosts": {
            "title": "Only new posts since the last run",
            "type": "boolean",
            "description": "Remember the posts of every source and return only posts that were not there on the previous run of the same monitor (the first run returns everything and becomes the baseline). Posts already seen are not output and not charged. Ideal for daily or hourly schedules.",
            "default": false
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Runs with the same name are compared with each other (letters, digits, dashes). Use different names for different source lists. Default: \"default\"."
          },
          "httpVia": {
            "title": "Feed requests from",
            "enum": [
              "auto",
              "direct",
              "vm"
            ],
            "type": "string",
            "description": "Feeds are read as plain HTTP. A few sites refuse data-center networks; Auto retries those from a second network. Full-text page reads use the same setting, with a real browser as the last resort for JavaScript pages.",
            "default": "auto"
          },
          "maxConcurrency": {
            "title": "Sources in parallel",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many sources are processed at the same time.",
            "default": 5
          },
          "requestIntervalMs": {
            "title": "Pause between requests to the same site (ms)",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Polite spacing of requests to one host (feed, archive pages, post pages). Rate-limited answers (HTTP 429) are retried after the time the site asks for.",
            "default": 500
          },
          "sourceTimeoutSecs": {
            "title": "Time limit per source (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "A source that takes longer gets a timeout error row (not charged) so one slow site cannot hold the run.",
            "default": 600
          },
          "proxyConfiguration": {
            "title": "Proxy (optional)",
            "type": "object",
            "description": "Only used for requests sent from Apify's network. Apify proxy usage is billed to your Apify account. Not needed normally."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}