# Reddit Subreddit Post Filter & Moderation Scraper (`nimbryxo-studio/reddit-subreddit-post-filter-and-moderation`) Actor

Scrape public subreddit listings and filter posts by keyword, score, comments, upvote ratio, age, flair, type, author, domain, NSFW or stickied status. Returns media, gallery, video, poll and crosspost fields. No login or API key.

- **URL**: https://apify.com/nimbryxo-studio/reddit-subreddit-post-filter-and-moderation.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** Social media, Automation, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

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

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Reddit Subreddit Post Filter & Moderation Scraper

Pull posts from public subreddits, then keep only the ones that matter. This actor reads Reddit's public subreddit listings, applies a full set of filters before it counts toward your limit, and writes clean post records with score, comments, flair, media, gallery, video, poll and crosspost data.

No Reddit login, API key, cookie or proxy setup is required.

### What it does

- Scrapes one or many public subreddits, sorted hot, new, top, rising, controversial or best.
- Applies the time filter for top and controversial.
- Keeps paging until it finds the requested number of **matching** posts or reaches Reddit's listing limit.
- Filters by keywords, score, comment count, upvote ratio, date/age, flair, post type, author, domain, NSFW and stickied status.
- Emits explicit `status` or `error` records when a subreddit is blocked, private, banned, missing or empty, instead of silently returning nothing.
- Optionally emits one community metadata record per subreddit.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `subreddits` | array | — | Subreddit names, `r/` names or full Reddit URLs. Required. |
| `sort` | select | `hot` | `hot`, `new`, `top`, `rising`, `controversial` or `best`. |
| `timeFilter` | select | `day` | `hour`, `day`, `week`, `month`, `year` or `all`; used with top/controversial. |
| `maxPosts` | integer | `25` | Maximum matching posts per subreddit (1–1000). |
| `maxItems` | integer | `1000` | Overall cap across all subreddits (1–10,000). |
| `includeKeywords` | array | `[]` | Keep posts containing any/all of these words or phrases. |
| `excludeKeywords` | array | `[]` | Drop posts containing any of these words or phrases. |
| `keywordMatch` | select | `any` | `any`, `all` or `exact` (join include keywords into one phrase). |
| `searchIn` | select | `title-and-body` | `title-and-body`, `title` or `body`. |
| `minScore` / `maxScore` | integer | empty | Score range. |
| `minComments` / `maxComments` | integer | empty | Comment-count range. |
| `minUpvoteRatio` | number | empty | Minimum upvote ratio, 0–1. |
| `postedAfter` / `postedBefore` | string | empty | ISO date or relative value such as `7 days` or `24 hours`. |
| `maxAgeDays` | integer | empty | Shortcut for a recent-post cutoff. |
| `flairAllowlist` | array | `[]` | Only these exact flair names (case-insensitive). |
| `postType` | select | `all` | `all`, `text`, `link`, `image`, `video`, `gallery`, `poll`, `crosspost`, `gif` or `multi_media`. |
| `excludeStickied` | boolean | `false` | Drop pinned posts. |
| `excludeNsfw` | boolean | `false` | Drop posts marked NSFW. |
| `authorAllowlist` / `authorBlocklist` | array | `[]` | Username allow/block lists. |
| `domainAllowlist` / `domainBlocklist` | array | `[]` | Link-domain allow/block lists. Self-posts pass. |
| `includeSubredditInfo` | boolean | `false` | Emit one community metadata record per subreddit. |

#### Examples

High-score, clean posts:

```json
{
  "subreddits": ["python", "programming"],
  "sort": "top",
  "timeFilter": "week",
  "minScore": 100,
  "excludeNsfw": true,
  "excludeStickied": true,
  "maxPosts": 50
}
```

Keyword monitoring:

```json
{
  "subreddits": ["technology", "artificial"],
  "sort": "new",
  "includeKeywords": ["regulation", "policy"],
  "excludeKeywords": ["giveaway"],
  "postedAfter": "7 days",
  "maxPosts": 100
}
```

Trusted-domain links only:

```json
{
  "subreddits": ["machinelearning"],
  "sort": "hot",
  "domainAllowlist": ["arxiv.org", "github.com"],
  "maxPosts": 30
}
```

### Output

Each post record includes:

- `recordType` (`post`), `post_id`, `post_name`, `title`
- `author`, `author_fullname`, `author_id`
- `subreddit`, `subreddit_prefixed`, `subreddit_id`
- `content`, `content_length` (self-post body; `content` is capped at 1,000 characters)
- `score`, `num_comments`, `upvote_ratio`
- `url`, `permalink`, `old_reddit_url`, `external_url`, `domain`
- `post_type`, `post_hint`, `language`
- `link_flair`, `link_flair_background_color`
- `thumbnail_url`, `preview_url`, `image_url`, `image_urls`
- `gallery_id`, `gallery_images`, `gallery_count`
- `is_self`, `is_stickied`, `is_nsfw`, `is_spoiler`, `is_gallery`, `is_crosspost`
- `crosspost_parent`, `crosspost_parent_id`, `crosspost_parent_subreddit`, `crosspost_parent_url`
- `total_awards_received`, `top_award_id`, `top_award_icon_url`
- `has_media`, `media_type`
- `video_url`, `video_hls_url`, `video_mp4_url`, `video_poster_url`, `video_duration_seconds`, `video_width`, `video_height`, `video_bitrate_kbps`
- `embed_provider`, `embed_html`, `embed_title`
- `poll_data` (closed state, total votes, option positions/votes where rendered)
- `title_word_count`, `post_age_seconds`, `created_utc`, `created_at`, `crawled_at`

Optional community record (`recordType: "subreddit"`): `subreddit`, `subreddit_prefixed`, `subreddit_id`, `display_name`, `description`, `subscribers`, `created_utc`, `created_at`, `crawled_at`. `weekly_active_users` and `weekly_contributions` are included only when the direct Reddit page header provides them; the Arctic Shift metadata fallback does not expose those two values, so they are omitted rather than fabricated.

Status/error records explain what happened without failing the run:

- `recordType: "error"` with `reason` (`blocked`, `login_required`, `private`, `banned`, `not_found`, `nsfw_gated`, `rate_limited`, `http_error`), `message`, `subreddit`, optional `page_title` and `httpStatus`.
- `recordType: "status"` with `reason` (`empty`, `no_matches`, `rising_cap`, `info_unavailable`), `message`, `postCount`, `filteredCount`.

Fields Reddit does not expose anonymously are never fabricated. `is_promoted`, `is_original_content`, `gilded_count` and `num_crossposts` remain documented for compatibility but are omitted because the public listing does not carry reliable values. `old_reddit_url` may redirect to a login page on old Reddit.

### Limits and behavior

- Reddit's full HTML listing feeds stop at roughly **1,000 posts** for hot/new and roughly **500** for top/controversial. The cloud RSS fallback is capped at **100 posts per subreddit**. Split by sort, time range or subreddit to collect more.
- `rising` is a small live listing; it may return fewer posts than `maxPosts`.
- `maxPosts` counts **matching** posts, not scanned posts. If a filter is restrictive, the actor pages deeper until it finds matches or reaches the listing ceiling.
- NSFW-only communities are age-gated for anonymous visitors and may appear as `not_found` or `nsfw_gated`. Per-post NSFW filtering works when the listing carries the flag.
- Poll option labels are not always rendered in the public listing; vote counts and positions are captured when present.
- Video HLS/MP4 URLs can be signed and expire. `video_url` uses a stable low-resolution fallback; the HLS/MP4 fields are provided for convenience.
- If Reddit blocks the direct listing, the actor first reads the same listing through a Google Translate mirror. That mirror keeps the full post fields. If it is unavailable, the actor falls back to the public Atom/RSS feed. The RSS fallback carries title, author, URL, body and timestamps, but not score, comment count, media, gallery, video or poll fields; the run status message says when it is used.
- If score, comment-count or upvote-ratio filters are set and only RSS is available, the actor does **not** silently pass those filters. It emits a clear `metrics_unavailable` error record for that subreddit and skips it, rather than returning unfiltered posts as if they matched.
- When `includeSubredditInfo` is enabled, the actor tries the direct subreddit page header first and falls back to Arctic Shift's public `subreddits/search` endpoint. Arctic supplies subscribers, description and creation time; weekly active users and weekly contributions are not available there, so those fields are omitted.
- The actor paces requests and backs off on rate limits. It never uses a wall-clock stop that silently under-delivers rows.

### FAQ

**Do I need a Reddit account, API key or proxy?**
No. The actor reads public listing HTML directly and escalates its own internal proxy only if Reddit blocks the request.

**Why did I get a status or error record instead of posts?**
The subreddit may be private, banned, missing, age-gated, temporarily blocked or empty. The record's `reason` and `message` explain which case applies. The rest of the run continues.

**Why did I get a `metrics_unavailable` error?**
Reddit’s RSS fallback has no score, comment count or upvote ratio. The actor will not pretend a metric filter passed on RSS-only data. It skips that subreddit and emits the error; retry when the full listing or Translate mirror is available, or remove the metric filter.

**Why are my filters returning fewer posts than `maxPosts`?**
`maxPosts` is the number of posts that pass your filters. If the source runs out before that, the actor returns what exists. The run status message reports filtered outages.

**Can I scrape comments?**
No. This actor is focused on subreddit posts and moderation filters. Use a dedicated Reddit comment scraper for threads.

**Is this affiliated with Reddit?**
No. This is an independent, third-party actor that reads public Reddit pages. It is not affiliated with or endorsed by Reddit, Inc.

# Actor input Schema

## `subreddits` (type: `array`):

Public subreddits to scrape. Accepts names, r/ names or full Reddit URLs.

## `sort` (type: `string`):

How to order posts in each subreddit. Top and controversial use the time filter.

## `timeFilter` (type: `string`):

Time window used when Sort is Top or Controversial. Ignored for other sorts.

## `maxPosts` (type: `integer`):

Stop after this many posts pass your filters. The actor keeps paging until it finds them or reaches Reddit's listing limit.

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

Overall cap across all subreddits.

## `includeKeywords` (type: `array`):

Keep posts containing at least one of these words or phrases. Matching is case-insensitive.

## `excludeKeywords` (type: `array`):

Drop posts containing any of these words or phrases.

## `keywordMatch` (type: `string`):

Any keyword, all keywords, or the exact phrase formed by joining the include keywords.

## `searchIn` (type: `string`):

Search the title, the body, or both.

## `minScore` (type: `integer`):

Drop posts with a lower score. Leave empty for no minimum.

## `maxScore` (type: `integer`):

Drop posts with a higher score. Leave empty for no maximum.

## `minComments` (type: `integer`):

Drop posts with fewer comments. Leave empty for no minimum.

## `maxComments` (type: `integer`):

Drop posts with more comments. Leave empty for no maximum.

## `minUpvoteRatio` (type: `number`):

Keep posts with at least this upvote ratio, from 0 to 1. Leave empty for no minimum.

## `postedAfter` (type: `string`):

ISO date (2026-10-01) or a relative value such as 7 days or 24 hours. Leave empty for no lower bound.

## `postedBefore` (type: `string`):

ISO date or a relative value such as 7 days. Leave empty for no upper bound.

## `maxAgeDays` (type: `integer`):

Shortcut for keeping only recent posts. Posted after can also be used.

## `flairAllowlist` (type: `array`):

Case-insensitive exact flair names. Leave empty for any flair.

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

Keep one post type or all types.

## `excludeStickied` (type: `boolean`):

Drop pinned moderator/announcement posts.

## `excludeNsfw` (type: `boolean`):

Drop posts marked NSFW. NSFW-only communities are hidden anonymously, so this is a per-post filter.

## `authorAllowlist` (type: `array`):

Case-insensitive usernames. Leave empty for any author.

## `authorBlocklist` (type: `array`):

Case-insensitive usernames to drop.

## `domainAllowlist` (type: `array`):

Keep posts linking to these domains. Self-posts always pass. Accepts bare domains or URLs.

## `domainBlocklist` (type: `array`):

Drop posts linking to these domains. Self-posts always pass.

## `includeSubredditInfo` (type: `boolean`):

Emit one extra record per subreddit with its description, weekly active users and weekly contributions. Adds one request per subreddit.

## Actor input object example

```json
{
  "subreddits": [
    "python",
    "programming"
  ],
  "sort": "new",
  "timeFilter": "day",
  "maxPosts": 3,
  "maxItems": 10,
  "includeKeywords": [
    "release",
    "python"
  ],
  "excludeKeywords": [],
  "keywordMatch": "any",
  "searchIn": "title-and-body",
  "flairAllowlist": [
    "Discussion",
    "News"
  ],
  "postType": "all",
  "excludeStickied": false,
  "excludeNsfw": false,
  "authorAllowlist": [],
  "authorBlocklist": [],
  "domainAllowlist": [
    "github.com",
    "arxiv.org"
  ],
  "domainBlocklist": [],
  "includeSubredditInfo": false
}
```

# Actor output Schema

## `recordType` (type: `string`):

post, error, status or subreddit.

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

Set on error and status records.

## `reason` (type: `string`):

Why an error or status record was emitted, for example blocked, private, empty, no_matches or info_unavailable.

## `message` (type: `string`):

Human-readable explanation for an error or status record.

## `page_title` (type: `string`):

Title of the Reddit page that could not be read.

## `httpStatus` (type: `string`):

HTTP status from the failed request.

## `postCount` (type: `string`):

Number of posts emitted for a status record.

## `filteredCount` (type: `string`):

Number of fetched posts removed by filters.

## `scrapedAt` (type: `string`):

ISO 8601 timestamp for an error or status record.

## `post_id` (type: `string`):

Reddit post ID without the t3\_ prefix.

## `post_name` (type: `string`):

Full Reddit post name, for example t3_abc123.

## `title` (type: `string`):

Post title.

## `author` (type: `string`):

Post author username.

## `author_fullname` (type: `string`):

Author account fullname, for example t2_abc123.

## `author_id` (type: `string`):

Author account ID.

## `subreddit` (type: `string`):

Subreddit name without r/.

## `subreddit_prefixed` (type: `string`):

Subreddit name with the r/ prefix.

## `subreddit_id` (type: `string`):

Subreddit fullname, for example t5_abc123.

## `display_name` (type: `string`):

Subreddit display name on an optional subreddit record.

## `description` (type: `string`):

Subreddit description on an optional subreddit record.

## `weekly_active_users` (type: `string`):

Reddit's weekly active user count on an optional subreddit record.

## `weekly_contributions` (type: `string`):

Reddit's weekly contribution count on an optional subreddit record.

## `subscribers` (type: `string`):

Subreddit subscriber count when the metadata source provides it.

## `content` (type: `string`):

Text body of a self post, first 1000 characters. Omitted for posts without a body.

## `content_length` (type: `string`):

Full character length of the text body.

## `score` (type: `string`):

Post score.

## `num_comments` (type: `string`):

Reported comment count.

## `upvote_ratio` (type: `string`):

Upvote ratio from 0 to 1.

## `url` (type: `string`):

Reddit permalink of the post.

## `permalink` (type: `string`):

Reddit permalink of the post.

## `old_reddit_url` (type: `string`):

Old Reddit permalink. Old Reddit may require a login.

## `external_url` (type: `string`):

Off-Reddit link, image, gallery or video URL when distinct from the permalink.

## `domain` (type: `string`):

Link domain, self.<subreddit> for text posts, or reddit.com for galleries.

## `post_type` (type: `string`):

text, link, image, video, gallery, poll, crosspost, gif or multi_media.

## `post_hint` (type: `string`):

Normalized post classification: self, image, gallery, hosted:video, rich:video or link.

## `link_flair` (type: `string`):

Post flair text when the post has one.

## `link_flair_background_color` (type: `string`):

Flair background color when Reddit provides one.

## `thumbnail_url` (type: `string`):

Post thumbnail or external preview image.

## `preview_url` (type: `string`):

Reddit preview image.

## `image_url` (type: `string`):

Full image URL for image and GIF posts.

## `image_urls` (type: `string`):

Image URLs belonging to the post, including gallery renditions.

## `gallery_id` (type: `string`):

Gallery identifier for gallery posts.

## `gallery_images` (type: `string`):

Full-size gallery image URLs.

## `gallery_count` (type: `string`):

Number of gallery images captured.

## `is_self` (type: `string`):

True for text and poll posts.

## `is_stickied` (type: `string`):

True when the post is pinned.

## `is_nsfw` (type: `string`):

True when the post is marked NSFW.

## `is_spoiler` (type: `string`):

True when the post is marked as a spoiler.

## `is_promoted` (type: `string`):

Not exposed by anonymous Reddit listings; omitted.

## `is_original_content` (type: `string`):

Not exposed by anonymous Reddit listings; omitted.

## `is_gallery` (type: `string`):

True for gallery posts.

## `is_crosspost` (type: `string`):

True for crossposts.

## `gilded_count` (type: `string`):

Not exposed as a gilded breakdown by anonymous Reddit listings; omitted.

## `num_crossposts` (type: `string`):

Not exposed by anonymous Reddit listings; omitted.

## `crosspost_parent` (type: `string`):

Parent post of a crosspost.

## `crosspost_parent_id` (type: `string`):

Parent post ID for a crosspost.

## `crosspost_parent_subreddit` (type: `string`):

Parent subreddit for a crosspost.

## `crosspost_parent_url` (type: `string`):

Parent post URL for a crosspost.

## `total_awards_received` (type: `string`):

Award count reported by Reddit.

## `top_award_id` (type: `string`):

ID of the top award when Reddit provides one.

## `top_award_icon_url` (type: `string`):

Icon URL of the top award when Reddit provides one.

## `has_media` (type: `string`):

True when the post has an image, gallery, video, embed or poll.

## `media_type` (type: `string`):

image, gallery, video, gif, poll or embed.

## `video_url` (type: `string`):

Stable direct video URL when available.

## `video_hls_url` (type: `string`):

HLS playlist URL. Signed URLs may expire.

## `video_mp4_url` (type: `string`):

MP4 rendition URL. Signed URLs may expire.

## `video_poster_url` (type: `string`):

Video poster image URL.

## `video_duration_seconds` (type: `string`):

Video duration in seconds.

## `video_width` (type: `string`):

Video width in pixels.

## `video_height` (type: `string`):

Video height in pixels.

## `video_bitrate_kbps` (type: `string`):

Video bitrate in kilobits per second.

## `embed_provider` (type: `string`):

Provider name for an external embed, for example YouTube.

## `embed_html` (type: `string`):

Embed iframe HTML when Reddit provides it.

## `embed_title` (type: `string`):

Title from the embed iframe.

## `poll_data` (type: `string`):

Poll state. Vote counts and option positions are captured; option labels are not always rendered anonymously.

## `language` (type: `string`):

Post language code reported by Reddit.

## `title_word_count` (type: `string`):

Number of words in the title.

## `post_age_seconds` (type: `string`):

Age of the post in seconds at scrape time.

## `created_utc` (type: `string`):

Unix timestamp of post creation.

## `created_at` (type: `string`):

ISO 8601 creation time.

## `crawled_at` (type: `string`):

ISO 8601 timestamp of this scrape.

# 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 = {
    "subreddits": [
        "python"
    ],
    "sort": "new",
    "timeFilter": "day",
    "maxPosts": 3,
    "maxItems": 10,
    "includeKeywords": [],
    "excludeKeywords": [],
    "keywordMatch": "any",
    "searchIn": "title-and-body",
    "flairAllowlist": [],
    "postType": "all",
    "excludeStickied": false,
    "excludeNsfw": false,
    "authorAllowlist": [],
    "authorBlocklist": [],
    "domainAllowlist": [],
    "domainBlocklist": [],
    "includeSubredditInfo": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/reddit-subreddit-post-filter-and-moderation").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 = {
    "subreddits": ["python"],
    "sort": "new",
    "timeFilter": "day",
    "maxPosts": 3,
    "maxItems": 10,
    "includeKeywords": [],
    "excludeKeywords": [],
    "keywordMatch": "any",
    "searchIn": "title-and-body",
    "flairAllowlist": [],
    "postType": "all",
    "excludeStickied": False,
    "excludeNsfw": False,
    "authorAllowlist": [],
    "authorBlocklist": [],
    "domainAllowlist": [],
    "domainBlocklist": [],
    "includeSubredditInfo": False,
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/reddit-subreddit-post-filter-and-moderation").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "subreddits": [
    "python"
  ],
  "sort": "new",
  "timeFilter": "day",
  "maxPosts": 3,
  "maxItems": 10,
  "includeKeywords": [],
  "excludeKeywords": [],
  "keywordMatch": "any",
  "searchIn": "title-and-body",
  "flairAllowlist": [],
  "postType": "all",
  "excludeStickied": false,
  "excludeNsfw": false,
  "authorAllowlist": [],
  "authorBlocklist": [],
  "domainAllowlist": [],
  "domainBlocklist": [],
  "includeSubredditInfo": false
}' |
apify call nimbryxo-studio/reddit-subreddit-post-filter-and-moderation --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/reddit-subreddit-post-filter-and-moderation"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BDohv5moYWUVpwVMB/builds/BLjZQoaYOw4cv3DKH/openapi.json
