# Substack Publication Scraper (`parseforge/substack-publication-scraper`) Actor

Pull every public post from any Substack publication with title, subtitle, body preview, author, publish date, podcast URL, audience type, comment count, and reactions. Filter by post type and date range. Export to JSON, CSV, or Excel for newsletter research and competitive intelligence.

- **URL**: https://apify.com/parseforge/substack-publication-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** News, Marketing, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.25 / 1,000 items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 📰 Substack Publication Scraper

> 🚀 **Pull every public post from any Substack publication.** Title, body preview, author, podcast, paywall flag, comment count, reactions. No login, no API key, no manual scrolling.

> 🕒 **Last updated:** 2026-05-01 · **📊 27 fields** per post · **📰 millions of newsletters** · **🎙️ podcast metadata included** · **💎 paid + free posts**

The **Substack Publication Scraper** queries the public Substack archive endpoints for any publication and returns every post in the feed. Each record includes the post title, social title, subtitle, description, slug, canonical URL, publish date, post type, audience flag, paywall status, cover image, podcast duration, word count, reaction count, comment count, restack count, section info, and a truncated body preview.

Substack hosts millions of newsletters and is the largest creator-operated publishing platform on the internet. Top publications cross hundreds of thousands of paid subscribers and rival traditional media in influence. This Actor exports the full archive of any publication in a single run, letting you research content cadence, audience signals, and editorial mix without a manual subscribe-and-scroll workflow.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Newsletter writers, content marketers, ghost writers, journalists, podcasters, researchers | Content research, cadence analysis, audience mining, podcast discovery, competitive benchmarking |

---

### 📋 What the Substack Publication Scraper does

Five filtering workflows in a single run:

- 📰 **Full archive export.** Submit one publication subdomain or custom domain and pull its entire post archive.
- 📅 **Date range filter.** Pin to a specific year, quarter, or month using `minDate` and `maxDate`.
- 🎙️ **Type filter.** Restrict to `newsletter`, `podcast`, or `thread` posts.
- 💎 **Paywall awareness.** Each record flags whether the post is `everyone` (free) or `only_paid` (subscriber-only).
- 🔍 **Engagement signals.** Comment count, reaction count, restack count, and word count surface engagement patterns.

Each row reports the publication slug, post ID, full title and subtitle, slug, canonical URL, publish timestamp, type, audience, cover image URL, podcast duration when present, word count, engagement counters, and a 200-character body preview.

> 💡 **Why it matters:** Substack publications are time-machines for content strategy. Cadence, average word count, paywall ratio, and reaction-to-comment ratios all reveal what resonates. Researchers cite Substack archives in studies of opinion journalism. Ghost writers reverse-engineer voice from existing posts. Content marketers benchmark themselves against the best operators in their niche.

---

### 🎬 Full Demo

_🚧 Coming soon: a 3-minute walkthrough showing how to go from sign-up to a downloaded dataset._

---

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td><code>maxItems</code></td><td>integer</td><td><code>10</code></td><td>Posts to return. Free plan caps at 10, paid plan at 1,000,000.</td></tr>
<tr><td><code>publication</code></td><td>string</td><td><code>"lex"</code></td><td>Subdomain (<code>lex</code>) or full custom domain (<code>www.lennysnewsletter.com</code>).</td></tr>
<tr><td><code>postType</code></td><td>string</td><td><code>"all"</code></td><td>Filter to <code>newsletter</code>, <code>podcast</code>, <code>thread</code>, or <code>all</code>.</td></tr>
<tr><td><code>minDate</code></td><td>string</td><td>empty</td><td>ISO date <code>YYYY-MM-DD</code>. Only posts on or after this date.</td></tr>
<tr><td><code>maxDate</code></td><td>string</td><td>empty</td><td>ISO date <code>YYYY-MM-DD</code>. Only posts on or before this date.</td></tr>
</tbody>
</table>

**Example: 100 most recent posts from a custom-domain publication.**

```json
{
    "maxItems": 100,
    "publication": "www.lennysnewsletter.com"
}
````

**Example: every paid podcast episode in 2026.**

```json
{
    "maxItems": 200,
    "publication": "lex",
    "postType": "podcast",
    "minDate": "2026-01-01",
    "maxDate": "2026-12-31"
}
```

> ⚠️ **Good to Know:** Substack subdomains are case sensitive in the URL but the Actor normalizes to lowercase before the request. Paid posts return only the truncated free preview in `truncatedBodyText`. Subscriber-only full body content is not exposed by the public archive endpoint and is out of scope.

***

### 📊 Output

Each post record contains **27 fields**. Download as CSV, Excel, JSON, or XML.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🏷️ `publication` | string | `"lex"` |
| 🆔 `postId` | integer | `195849359` |
| 📰 `title` | string | `"Analysis: The Machines are working..."` |
| 🪧 `subtitle` | string | `"AI capital is being mobilized..."` |
| 🔖 `slug` | string | `"analysis-the-machines-are-working"` |
| 🔗 `url` | string | `"https://lex.substack.com/p/..."` |
| 📅 `postDate` | ISO 8601 | `"2026-04-29T16:14:34.158Z"` |
| 🏷️ `type` | string | `"newsletter"` |
| 👥 `audience` | string | `"only_paid"` |
| 💎 `isPaid` | boolean | `true` |
| 🖼️ `coverImage` | string | null | `"https://substackcdn.com/..."` |
| 🎙️ `podcastDuration` | integer | null | `1820` |
| 📝 `wordCount` | integer | null | `2116` |
| 💬 `commentCount` | integer | null | `1` |
| ❤️ `reactionCount` | integer | null | `6` |
| 🔁 `restackCount` | integer | null | `4` |
| 🎧 `audioItems` | integer | `1` |
| 🎬 `videoUploadId` | integer | null | `null` |
| 🆔 `podcastUploadId` | integer | null | `null` |
| 🗂️ `sectionId` | integer | null | `27625` |
| 🏷️ `sectionName` | string | null | `"👑 Premium Analysis "` |
| 📝 `truncatedBodyText` | string | `"Gm Fintech Architects..."` |
| 🕒 `scrapedAt` | ISO 8601 | `"2026-05-01T00:35:02.344Z"` |

#### 📦 Sample records

<details>
<summary><strong>💎 Paid newsletter post: Lex Sokolin on AI capital flows</strong></summary>

```json
{
    "publication": "lex",
    "postId": 195849359,
    "title": "Analysis: The Machines are working, while their Banks are getting robbed",
    "subtitle": "AI capital is being mobilized at nation-state scale. DeFi capital is being drained at nation-state scale. The two stories are the same story.",
    "slug": "analysis-the-machines-are-working",
    "url": "https://lex.substack.com/p/analysis-the-machines-are-working",
    "postDate": "2026-04-29T16:14:34.158Z",
    "type": "newsletter",
    "audience": "only_paid",
    "isPaid": true,
    "wordCount": 2116,
    "reactionCount": 6,
    "commentCount": 1,
    "sectionName": "👑 Premium Analysis "
}
```

</details>

<details>
<summary><strong>🆓 Free newsletter post with full preview text</strong></summary>

```json
{
    "publication": "lex",
    "postId": 195755133,
    "title": "The Fintech Unicorn Playbook: the roadmap I wish I'd had",
    "subtitle": "Reading another founder interview won't get you to a unicorn",
    "slug": "the-fintech-unicorn-playbook-the",
    "url": "https://lex.substack.com/p/the-fintech-unicorn-playbook-the",
    "postDate": "2026-04-28T14:36:05.124Z",
    "type": "newsletter",
    "audience": "everyone",
    "isPaid": false,
    "wordCount": 4287,
    "reactionCount": 38,
    "commentCount": 12
}
```

</details>

<details>
<summary><strong>🎙️ Podcast episode with audio metadata</strong></summary>

```json
{
    "publication": "lex",
    "postId": 195102874,
    "title": "Episode 142: The State of Crypto Custody",
    "type": "podcast",
    "audience": "everyone",
    "isPaid": false,
    "podcastDuration": 3247,
    "audioItems": 1,
    "podcastUploadId": 884412,
    "wordCount": 412,
    "reactionCount": 22,
    "commentCount": 4,
    "postDate": "2026-04-22T11:00:00.000Z"
}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 🆓 | **No login.** Reads the public Substack archive endpoints, no subscription needed. |
| 📰 | **Subdomain or custom domain.** Works with `slug.substack.com` and bring-your-own domains alike. |
| 🎙️ | **Podcast and newsletter.** Full coverage of all post types. |
| 💎 | **Paywall flag.** Each post tells you whether it is free or subscriber-only. |
| 📊 | **Engagement signals.** Reactions, comments, restacks, and word count out of the box. |
| 📅 | **Date filtering.** Restrict to a specific year, quarter, or month. |
| 🔄 | **Bulk pagination.** Pull thousands of posts per run with built-in throttling. |

> 📊 In a single 13-second run the Actor returned 100 posts from a single publication including paid and free items.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Filters | Setup |
|---|---|---|---|---|---|
| Manual subscribe + scroll | Free + paywall | Limited per session | One-shot | Date only | Account per publication |
| Generic web scrapers | $$ subscription | Brittle CSS | Daily | None | Engineer hours |
| RSS readers | Free | Latest 20 only | Live | None | Per-feed setup |
| **⭐ Substack Publication Scraper** *(this Actor)* | Pay-per-event | Full archive | Live | Type, dates, paywall flag | None |

The same archive endpoints Substack itself uses, exposed as clean structured records.

***

### 🚀 How to use

1. 🆓 **Create a free Apify account.** [Sign up here](https://console.apify.com/sign-up?fpr=vmoqkp) and get $5 in free credit.
2. 🔍 **Open the Actor.** Search for "Substack Publication" in the Apify Store.
3. ⚙️ **Set the publication.** Enter the subdomain or custom domain and any filters.
4. ▶️ **Click Start.** A 100-post run finishes in under 15 seconds.
5. 📥 **Download.** Export as CSV, Excel, JSON, or XML.

> ⏱️ Total time from sign-up to first dataset: under five minutes.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%">

#### 📰 Content marketing

- Reverse-engineer top newsletter cadence
- Mine high-engagement headlines for inspiration
- Track competitor launch announcements
- Build editorial calendars from real archives

</td>
<td width="50%">

#### 👻 Ghost writing

- Match author voice from past posts
- Research recurring themes per publication
- Identify gap topics the audience asks for
- Quote and credit accurately by date and post ID

</td>
</tr>
<tr>
<td width="50%">

#### 📰 Journalism

- Find sources for stories on creator economy
- Track newsletter consolidation and migrations
- Cite specific posts with stable canonical URLs
- Cross-reference posts with public reactions

</td>
<td width="50%">

#### 📊 Market research

- Size niche communities by post engagement
- Spot rising newsletters before mainstream pickup
- Build alternative data feeds for finance and policy
- Benchmark your own newsletter against operators in the same niche

</td>
</tr>
</table>

***

### 🌟 Beyond business use cases

Data like this powers more than commercial workflows. The same structured records support research, education, civic projects, and personal initiatives.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- Empirical datasets for papers, thesis work, and coursework
- Longitudinal studies tracking changes across snapshots
- Reproducible research with cited, versioned data pulls
- Classroom exercises on data analysis and ethical scraping

</td>
<td width="50%">

#### 🎨 Personal and creative

- Side projects, portfolio demos, and indie app launches
- Data visualizations, dashboards, and infographics
- Content research for bloggers, YouTubers, and podcasters
- Hobbyist collections and personal trackers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Transparency reporting and accountability projects
- Advocacy campaigns backed by public-interest data
- Community-run databases for local issues
- Investigative journalism on public records

</td>
<td width="50%">

#### 🧪 Experimentation

- Prototype AI and machine-learning pipelines with real data
- Validate product-market hypotheses before engineering spend
- Train small domain-specific models on niche corpora
- Test dashboard concepts with live input

</td>
</tr>
</table>

***

### 🔌 Automating Substack Publication Scraper

Run this Actor on a schedule, from your codebase, or inside another tool:

- **Node.js** SDK: see [Apify JavaScript client](https://docs.apify.com/api/client/js/) for programmatic runs and dataset exports.
- **Python** SDK: see [Apify Python client](https://docs.apify.com/api/client/python/) for the same flow in Python.
- **HTTP API**: see [Apify API docs](https://docs.apify.com/api/v2) for raw REST integration.

Schedule daily, weekly, or monthly runs from the Apify Console. Pipe results into Google Sheets, S3, BigQuery, or your own webhook with the built-in [integrations](https://docs.apify.com/platform/integrations).

***

### ❓ Frequently Asked Questions

<details>
<summary><strong>📰 What publications does this support?</strong></summary>

Any public Substack publication, whether it sits on `{name}.substack.com` or a custom domain. The Actor sends the request to the publication host's `/api/v1/archive` endpoint, which Substack serves identically for both setups.

</details>

<details>
<summary><strong>💎 Can I read full body content of paid posts?</strong></summary>

No. The public archive endpoint returns the truncated free preview in `truncatedBodyText` for paid posts. Full subscriber-only content requires a paid subscription and a session cookie, which is out of scope for this Actor.

</details>

<details>
<summary><strong>🔠 How do I find the publication slug?</strong></summary>

For Substack-hosted publications, the slug is the part before `.substack.com`. For custom domains, use the full host like `www.lennysnewsletter.com`. The actor normalizes both forms.

</details>

<details>
<summary><strong>📅 How far back does the data go?</strong></summary>

The archive returns every public post the publication has ever published, going back to the publication's first post. Some long-running publications have thousands of posts.

</details>

<details>
<summary><strong>📦 How many posts can I pull at once?</strong></summary>

Free plan caps at 10 posts per run. Paid plans allow up to 1,000,000 posts. Each run paginates through the archive automatically.

</details>

<details>
<summary><strong>🎙️ Are podcast episodes included?</strong></summary>

Yes. Set `postType` to `podcast` to filter, or leave as `all` to mix newsletters, podcasts, and threads in the same dataset. Podcast posts include duration in seconds.

</details>

<details>
<summary><strong>📊 Do reactions and comments work for paid posts?</strong></summary>

Yes. Engagement counters are visible to non-subscribers and surfaced in every record regardless of paywall status.

</details>

<details>
<summary><strong>💼 Can I use this for commercial work?</strong></summary>

Yes. Substack post metadata is publicly accessible and the Actor reads only what Substack already publishes. Always respect each publication's terms of service when republishing content.

</details>

<details>
<summary><strong>💳 Do I need a paid Apify plan?</strong></summary>

The free plan returns up to 10 posts per run. Paid plans return up to 1,000,000 posts. The Actor uses pay-per-event pricing, so you only pay for the posts you receive.

</details>

<details>
<summary><strong>⚠️ What if a run fails or returns empty?</strong></summary>

The most common cause is a misspelled publication slug or a publication that has been deleted. Verify the URL works in a browser, then retry. If the issue persists, [open a contact form](https://tally.so/r/BzdKgA) and include the run URL.

</details>

<details>
<summary><strong>🔁 How fresh is the data?</strong></summary>

Live. The Actor calls the Substack archive endpoint at run time, so you get whatever is publicly visible on the publication right now.

</details>

<details>
<summary><strong>⚖️ Is scraping Substack legal?</strong></summary>

This Actor reads Substack's own public archive endpoints, the same ones browsers use to render the archive page. It does not bypass paywalls or use credentials.

</details>

***

### 🔌 Integrate with any app

- [**Make**](https://apify.com/integrations/make) - drop run results into 1,800+ apps with a no-code visual builder.
- [**Zapier**](https://apify.com/integrations/zapier) - trigger automations off completed runs.
- [**Slack**](https://apify.com/integrations/slack) - post run summaries to a channel.
- [**Google Sheets**](https://apify.com/integrations/google-sheets) - sync each run into a spreadsheet.
- [**Webhooks**](https://docs.apify.com/platform/integrations/webhooks) - notify your own services on run finish.
- [**Airbyte**](https://apify.com/integrations/airbyte) - load runs into Snowflake, BigQuery, or Postgres.

***

### 🔗 Recommended Actors

- [**🐝 Beehiiv Newsletter Scraper**](https://apify.com/parseforge/beehiiv-newsletter-scraper) - the same workflow for Beehiiv-hosted newsletters.
- [**📚 Wikipedia Pageviews Scraper**](https://apify.com/parseforge/wikipedia-pageviews-scraper) - cross-reference newsletter trends with public-interest spikes.
- [**💼 Indie Hackers Posts Scraper**](https://apify.com/parseforge/indiehackers-posts-scraper) - mine founder commentary that often parallels Substack content.
- [**🐙 GitHub Trending Repos Scraper**](https://apify.com/parseforge/github-trending-scraper) - pair with technical newsletters for a developer-attention signal.
- [**🅱️ Bing Search Scraper**](https://apify.com/parseforge/bing-search-scraper) - track which posts rank for which keywords.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more pre-built scrapers and data tools.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) and we'll route the question to the right person.

***

> Substack is a registered trademark of Substack Inc. This Actor is not affiliated with or endorsed by Substack. It reads only publicly accessible archive endpoints and respects per-publication terms of service.

# Actor input Schema

## `maxItems` (type: `integer`):

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000.

## `publications` (type: `array`):

Substack publication subdomains or full URLs. Examples: `lex`, `stratechery`, `https://www.platformer.news`.

## `sortBy` (type: `string`):

How to order posts: `new` (newest first), `top` (most liked), or `community` (community picks).

## `postType` (type: `string`):

Filter by post type: `all`, `newsletter`, `podcast`, `thread`, or `discussion`.

## Actor input object example

```json
{
  "maxItems": 10,
  "publications": [
    "lex",
    "stratechery"
  ],
  "sortBy": "new",
  "postType": "all"
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10,
    "publications": [
        "lex",
        "stratechery"
    ],
    "sortBy": "new",
    "postType": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/substack-publication-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxItems": 10,
    "publications": [
        "lex",
        "stratechery",
    ],
    "sortBy": "new",
    "postType": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/substack-publication-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "publications": [
    "lex",
    "stratechery"
  ],
  "sortBy": "new",
  "postType": "all"
}' |
apify call parseforge/substack-publication-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/substack-publication-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Substack Publication Scraper",
        "description": "Pull every public post from any Substack publication with title, subtitle, body preview, author, publish date, podcast URL, audience type, comment count, and reactions. Filter by post type and date range. Export to JSON, CSV, or Excel for newsletter research and competitive intelligence.",
        "version": "1.0",
        "x-build-id": "3pwtLwFJReRa4pOam"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~substack-publication-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-substack-publication-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/parseforge~substack-publication-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-substack-publication-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/parseforge~substack-publication-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-substack-publication-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": {
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000."
                    },
                    "publications": {
                        "title": "Substack publications",
                        "type": "array",
                        "description": "Substack publication subdomains or full URLs. Examples: `lex`, `stratechery`, `https://www.platformer.news`.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "new",
                            "top",
                            "community"
                        ],
                        "type": "string",
                        "description": "How to order posts: `new` (newest first), `top` (most liked), or `community` (community picks).",
                        "default": "new"
                    },
                    "postType": {
                        "title": "Post type",
                        "enum": [
                            "all",
                            "newsletter",
                            "podcast",
                            "thread",
                            "discussion"
                        ],
                        "type": "string",
                        "description": "Filter by post type: `all`, `newsletter`, `podcast`, `thread`, or `discussion`.",
                        "default": "all"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
