# Reddit Posting V2 — Text/Link/Image/Gallery/Video/Poll/Cross (`red_crawler/reddit-posting-v2`) Actor

Create any Reddit post type from your saved account: text, link, image (URL), gallery (2–20 URLs), video, poll, crosspost. 7 endpoints. Reddit account required — use Token V2 + matching proxy or a saved account from the Reddit Vault actor.

- **URL**: https://apify.com/red\_crawler/reddit-posting-v2.md
- **Developed by:** [Red Crawler](https://apify.com/red_crawler) (community)
- **Categories:** Social media, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$1.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Reddit Posting V2

![Endpoints](https://img.shields.io/badge/endpoints-7-blue) ![Auth](https://img.shields.io/badge/Reddit_account-required_for_all_7-red) ![Proxy](https://img.shields.io/badge/proxy-required-red) ![Pricing](https://img.shields.io/badge/pricing-pay_per_result-orange)

**Create any kind of Reddit post — text, link, image, gallery, video, poll, or crosspost — from your account.** One actor, one input form, seven post types. Pick the type, fill the matching section, supply credentials (saved by name in the **Reddit Vault** actor, or pasted inline), and the actor publishes the post on your behalf.

Every endpoint here is authenticated — you must supply a Reddit Token V2 + the matching proxy that minted it (or pull both from the [Reddit Vault](https://apify.com/red_crawler/reddit-vault) by name).

Pick an endpoint, fill the matching section, hit Start.

---

### What you can post

For every post type the **subreddit** field accepts a name in any of these formats:

- raw name — `pics`
- prefixed — `r/pics`
- subreddit URL — `https://www.reddit.com/r/pics`
- old-Reddit URL — `https://old.reddit.com/r/pics`

#### 1. Text post — markdown self-post

Most subs allow text posts. The body supports full Reddit markdown (`**bold**`, `*italic*`, `> quote`, `[link](url)`, `- bullet`, code fences).

**Inputs:**
- **Subreddit** (required)
- **Title** (required, max 300 chars)
- **Body** (optional markdown)
- **Flair ID + Flair text** (optional)
- **NSFW / Spoiler** (optional booleans)
- Optional `text_brand_affiliate` boolean — set to `true` to mark the post as a brand affiliate disclosure (Reddit-required for sponsored content).

**Use it when:** AskReddit-style posts, discussion starters, announcements, written content of any kind.

**Example**

**Input**

```json
{
  "endpoint": "text",
  "text_subreddit": "test",
  "text_title": "Hello from RedCrawler Posting V2 text post",
  "text_body": "**Markdown** is supported — *italic*, [links](https://example.com), `code`.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
````

**Output** *(one dataset record)*

```json
{
  "endpoint": "text",
  "success": true,
  "id": "t3_1tc6jwx",
  "title": "Hello from RedCrawler Posting V2 text post",
  "isNsfw": false,
  "createdAt": "2026-05-13T17:27:32.079000+0000",
  "url": "https://www.reddit.com/r/test/comments/1tc6jwx/hello_from_redcrawler_posting_v2_text_post/",
  "authorInfo": { "id": "t2_29onm7dc32" },
  "subreddit": { "id": "t5_2qh23", "name": "test" },
  "ok": true,
  "rate_limit_used": 8,
  "rate_limit_remaining": 1792,
  "rate_limit_reset_at": "2026-05-13T17:30:00Z"
}
```

#### 2. Link post — share an outbound URL

Share an external URL with an optional caption.

**Inputs:**

- **Subreddit** (required)
- **Title** (required, max 300 chars)
- **Link URL** (required) — the URL you want to share
- **Body** (optional caption)
- **Flair / NSFW / Spoiler** (optional)
- Optional `link_brand_affiliate` boolean — set to `true` to mark the post as a brand affiliate disclosure (Reddit-required for sponsored content).

**Use it when:** sharing news articles, blog posts, external resources, or any non-Reddit URL.

**Example**

**Input**

```json
{
  "endpoint": "link",
  "link_subreddit": "test",
  "link_title": "RedCrawler Posting V2 — link post sample",
  "link_url": "https://example.com",
  "link_body": "Discovered this last week — short read.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record)*

```json
{
  "endpoint": "link",
  "success": true,
  "id": "t3_1tc6k18",
  "title": "RedCrawler Posting V2 — link post sample",
  "isNsfw": false,
  "createdAt": "2026-05-13T17:27:39.035000+0000",
  "url": "https://example.com",
  "authorInfo": { "id": "t2_29onm7dc32" },
  "subreddit": { "id": "t5_2qh23", "name": "test" },
  "ok": true,
  "rate_limit_used": 9,
  "rate_limit_remaining": 1791,
  "rate_limit_reset_at": "2026-05-13T17:30:00Z"
}
```

#### 3. Image post — single image upload

Upload a JPG / PNG / GIF / WebP from a public URL. The actor downloads the image and uploads it to Reddit's CDN on your behalf.

**Inputs:**

- **Subreddit** (required)
- **Title** (required, max 300 chars)
- **Image URL** (required) — publicly reachable image URL
- **Body** (optional caption)
- **Flair / NSFW / Spoiler** (optional)
- Optional `image_brand_affiliate` boolean — set to `true` to mark the post as a brand affiliate disclosure (Reddit-required for sponsored content).

**Use it when:** sharing a photo, screenshot, meme, infographic — anything that's a single image.

**Example**

**Input**

```json
{
  "endpoint": "image",
  "image_subreddit": "test",
  "image_title": "RedCrawler Posting V2 — image post sample",
  "image_url": "https://i.imgur.com/KAeuBNn.jpeg",
  "image_body": "Single-image upload via RedCrawler.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record — Reddit re-hosts the image on its own CDN; `url` becomes `i.redd.it`)*

```json
{
  "endpoint": "image",
  "success": true,
  "id": "t3_1tc6ixi",
  "title": "RedCrawler Posting V2 — image post sample",
  "isNsfw": false,
  "createdAt": "2026-05-13T17:26:37.744000+0000",
  "url": "https://i.redd.it/n4lbhvw2wx0h1",
  "authorInfo": { "id": "t2_29onm7dc32" },
  "subreddit": { "id": "t5_2qh23", "name": "test" },
  "ok": true,
  "rate_limit_used": 4,
  "rate_limit_remaining": 1796,
  "rate_limit_reset_at": "2026-05-13T17:30:00Z"
}
```

#### 4. Gallery post — 2–20 images

Upload multiple images as a single gallery post. Each image can have its own caption.

**Inputs:**

- **Subreddit** (required)
- **Title** (required, max 300 chars)
- **Image URLs** (required) — 2–20 publicly reachable image URLs, one per row (or JSON array)
- **Captions** (optional) — one per image, aligned by index
- **Body** (optional caption shown above the gallery)
- **Flair / NSFW / Spoiler** (optional)
- Optional `gallery_brand_affiliate` boolean — set to `true` to mark the post as a brand affiliate disclosure (Reddit-required for sponsored content).

**Use it when:** photo dumps, side-by-side comparisons, multi-image stories, before/after sequences.

**Example**

**Input** *(3 images, aligned captions)*

```json
{
  "endpoint": "gallery",
  "gallery_subreddit": "test",
  "gallery_title": "RedCrawler Posting V2 — three-shot gallery sample",
  "gallery_image_urls": [
    "https://i.imgur.com/B9omOe6.jpeg",
    "https://i.imgur.com/GGhH70K.jpeg",
    "https://i.imgur.com/TPMezMZ.jpeg"
  ],
  "gallery_captions": ["Frame one", "Frame two", "Frame three"],
  "gallery_body": "Three-image gallery via RedCrawler.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record — `url` is the Reddit gallery URL)*

```json
{
  "endpoint": "gallery",
  "success": true,
  "id": "t3_1tc6j65",
  "title": "RedCrawler Posting V2 — three-shot gallery sample",
  "isNsfw": false,
  "createdAt": "2026-05-13T17:26:51.773000+0000",
  "url": "https://www.reddit.com/gallery/1tc6j65",
  "authorInfo": { "id": "t2_29onm7dc32" },
  "subreddit": { "id": "t5_2qh23", "name": "test" },
  "ok": true,
  "rate_limit_used": 5,
  "rate_limit_remaining": 1795,
  "rate_limit_reset_at": "2026-05-13T17:30:00Z"
}
```

#### 5. Video post — single video upload

Upload an MP4 from a public URL. Reddit transcodes the file before the post becomes visible — expect 30–90 seconds end-to-end.

**Inputs:**

- **Subreddit** (required)
- **Title** (required, max 300 chars)
- **Video URL** (required) — publicly reachable `.mp4` URL
- **Poster URL** (optional) — thumbnail. If omitted, a frame is auto-extracted from the video
- **Body** (optional caption)
- **Flair / NSFW / Spoiler** (optional)
- Optional `video_brand_affiliate` boolean — set to `true` to mark the post as a brand affiliate disclosure (Reddit-required for sponsored content).

**Use it when:** sharing video clips, screen recordings, montages, anything that's a single video file.

**Example**

**Input**

```json
{
  "endpoint": "video",
  "video_subreddit": "test",
  "video_title": "RedCrawler Posting V2 — video sample",
  "video_url": "https://i.imgur.com/BuzoHUZ.mp4",
  "video_body": "Short clip — uploaded via RedCrawler.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record — Reddit re-hosts the video on `v.redd.it`)*

```json
{
  "endpoint": "video",
  "success": true,
  "id": "t3_1tc6jgu",
  "title": "RedCrawler Posting V2 — video sample",
  "isNsfw": false,
  "createdAt": "2026-05-13T17:27:08.562000+0000",
  "url": "https://v.redd.it/o7xpwux5wx0h1",
  "authorInfo": { "id": "t2_29onm7dc32" },
  "subreddit": { "id": "t5_2qh23", "name": "test" },
  "ok": true,
  "rate_limit_used": 6,
  "rate_limit_remaining": 1794,
  "rate_limit_reset_at": "2026-05-13T17:30:00Z"
}
```

#### 6. Poll post — 2+ options, 1–7 day duration

Create a poll with multiple options.

**Inputs:**

- **Subreddit** (required) — must allow polls
- **Title** (required, max 300 chars) — the poll question
- **Poll options** (required) — 2 or more options, one per row (or JSON array)
- **Poll duration** (required, default `3`) — 1 to 7 days
- **Body** (optional description shown above the poll)
- **Flair / NSFW / Spoiler** (optional)
- Optional `poll_brand_affiliate` boolean — set to `true` to mark the post as a brand affiliate disclosure (Reddit-required for sponsored content).

**Use it when:** asking the community a question, gathering opinions, A/B testing copy, picking a name for something.

**Example**

**Input** *(4 options, 5-day duration)*

```json
{
  "endpoint": "poll",
  "poll_subreddit": "test",
  "poll_title": "Which language should I learn next?",
  "poll_options": ["Rust", "Go", "Zig", "TypeScript"],
  "poll_duration": 5,
  "poll_body": "Currently writing Python full-time.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record)*

```json
{
  "endpoint": "poll",
  "success": true,
  "id": "t3_1tc6ncq",
  "title": "Which language should I learn next?",
  "isNsfw": false,
  "createdAt": "2026-05-13T17:30:40.433000+0000",
  "url": "https://www.reddit.com/r/test/comments/1tc6ncq/which_language_should_i_learn_next/",
  "authorInfo": { "id": "t2_29onm7dc32" },
  "subreddit": { "id": "t5_2qh23", "name": "test" },
  "ok": true,
  "rate_limit_used": 1,
  "rate_limit_remaining": 1799,
  "rate_limit_reset_at": "2026-05-13T17:40:00Z"
}
```

#### 7. Crosspost — republish an existing post

Republish an existing Reddit post (or comment) into a different subreddit. The destination sub must allow crossposts (per-sub setting).

**Inputs:**

- **Subreddit** (required) — the destination
- **Title** (required, max 300 chars) — independent of the source post's title
- **Source ID** (required) — accepts any of:
  - Full Reddit post URL — `https://www.reddit.com/r/.../comments/abc123/...`
  - `t3_` fullname — `t3_abc123`
  - Raw post ID — `abc123`
  - Comment URL — `https://www.reddit.com/r/.../comments/.../xyz789/`
  - `t1_` fullname — `t1_xyz789`
- **Body** (optional comment shown above the crossposted source)
- **NSFW / Spoiler** (optional). Crossposts inherit the source post's flair.
- Optional `crosspost_brand_affiliate` boolean — set to `true` to mark the post as a brand affiliate disclosure (Reddit-required for sponsored content).

**Use it when:** boosting a great post into more communities, republishing your own content, surfacing community gold to a wider audience.

**Example**

**Input** *(republish an existing post URL into `r/test`)*

```json
{
  "endpoint": "crosspost",
  "crosspost_subreddit": "test",
  "crosspost_title": "Crosspost sample — AITAH chair story",
  "crosspost_id": "https://www.reddit.com/r/AITAH/comments/1p3hgw2/someone_at_work_stole_my_chair_so_i_had_them/",
  "crosspost_body": "Crosspost created via RedCrawler Posting V2.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record — the crosspost lives in `r/test`; `url` points at the source post)*

```json
{
  "endpoint": "crosspost",
  "success": true,
  "id": "t3_1tc6kgf",
  "title": "Crosspost sample — AITAH chair story",
  "isNsfw": false,
  "createdAt": "2026-05-13T17:28:04.737000+0000",
  "url": "https://www.reddit.com/r/AITAH/comments/1p3hgw2/someone_at_work_stole_my_chair_so_i_had_them/",
  "authorInfo": { "id": "t2_29onm7dc32" },
  "subreddit": { "id": "t5_2qh23", "name": "test" },
  "ok": true,
  "rate_limit_used": 11,
  "rate_limit_remaining": 1789,
  "rate_limit_reset_at": "2026-05-13T17:30:00Z"
}
```

***

### Credentials

Every endpoint in this actor requires a Reddit Token V2 cookie + the proxy that minted it. Fill the **Reddit credentials** section at the bottom of the input form.

#### Credential lifetimes

| Credential | Lifetime | When to refresh |
|---|---|---|
| **Token V2** (`token_v2` cookie) | ~24 hours | Daily — or save a Reddit Session in the vault and let it auto-refresh |
| **Reddit Session** (`reddit_session` cookie) | ~180 days | Roughly twice a year, or when a run reports `unauthorized` |

> **How to extract these from your browser:** open Reddit in Chrome / Brave / Edge / Firefox, then **DevTools → Application → Cookies → `https://www.reddit.com`**. Filter by `token_v2` or `reddit_session` and copy the **Value** column.
>
> ![Token V2 cookie in DevTools](https://docs.redcrawler.com/img/credentials/token-v2-cookie.jpg)
>
> ![Reddit Session cookie in DevTools](https://docs.redcrawler.com/img/credentials/reddit-session-cookie.jpg)

You have two options:

#### Option A — Use a saved account (recommended)

1. Run the **Reddit Vault** actor once to store a Reddit account under a name you choose (e.g. `motor_tip8865`, `alt-account`, `burner1`). The vault encrypts the Token V2 + matching proxy and stores them keyed by name. If you save a long-lived `reddit_session` cookie alongside it, the vault auto-refreshes the Token V2 for you (~180 days).
2. In this actor, set **Credential source = Use saved account (vault)** and put the same name in **Saved account name**.
3. Done — Token V2 + proxy load automatically on every run.

#### Option B — Paste Token V2 + proxy directly

For one-off runs without setting up the vault:

1. Set **Credential source = Paste Token V2 + proxy**.
2. Paste your Reddit `token_v2` cookie value (`eyJ...`) into **Token V2**.
3. Paste the matching proxy in `ip:port:user:pass` format into **Proxy**.

**Critical:** Reddit IP-binds Token V2 cookies. The proxy MUST be the exact same IP that originally minted the Token V2 — otherwise Reddit returns 401 on every call. Both fields are stored encrypted by Apify (`isSecret: true`).

***

### How to run

1. **Pick a post type** in the "What to create" dropdown at the top.
2. **Open the matching section** below it and fill its fields (subreddit, title, plus the body / URL / options for that type).
3. **Fill the Reddit credentials section** at the bottom (vault account name OR Token V2 + proxy).
4. **Click Start.**

Each post-type section is independent — fields outside your chosen section are ignored, so you can leave them as-is between runs.

***

### Output

Every run pushes exactly **one record** to the run's default dataset.

#### Success record

```json
{
  "endpoint": "text",
  "success": true,
  "id": "1abc23",
  "name": "t3_1abc23",
  "permalink": "/r/test/comments/1abc23/hello_from_apify/",
  "url": "https://www.reddit.com/r/test/comments/1abc23/hello_from_apify/",
  "subreddit": "test",
  "title": "Hello from Apify!",
  "createdAt": "2026-05-08T19:42:18+00:00"
}
```

The most useful columns (`endpoint`, `success`, `id`, `name`, `permalink`, `url`, `subreddit`, `title`, `createdAt`) are placed first so the dataset Table view is readable without horizontal scrolling.

#### Failure record

```json
{
  "success": false,
  "endpoint": "link",
  "error": "URL has already been submitted",
  "error_kind": "ALREADY_SUB",
  "raw": { "...": "full raw response payload for debugging" }
}
```

`error_kind` echoes Reddit's structured error code when available (`SUBREDDIT_NOTALLOWED`, `RATELIMIT`, `BAD_FLAIR_TEMPLATE_ID`, `ALREADY_SUB`, etc.). The plain `error` string is always set. The `raw` field carries the full raw response payload for debugging.

***

### Common errors and what to do

| Error / `error_kind` | What it means | Fix |
|-------|---------------|-----|
| `URL has already been submitted` (link post) | Someone already posted that URL to that subreddit | Pick a different URL or sub |
| `SUBREDDIT_NOTALLOWED` | Sub doesn't allow this post type, or your account has too little karma / age | Pick a different sub, or read `r/{sub}`'s posting rules |
| `RATELIMIT` / `you are doing that too much` | Reddit's per-account post throttle (often 9 minutes between posts on new accounts) | Wait, then re-run |
| `BAD_FLAIR_TEMPLATE_ID` | Flair ID doesn't exist on this sub | Drop the flair fields, or fetch the right ID via the **Reddit Flairs V2** actor |
| `bearer_expired` | Your Token V2 expired (24-hour lifetime) | Refresh the vault entry, or paste a fresh Token V2 in manual mode |
| `Bearer minted on a different IP` | The Token V2's binding IP doesn't match the supplied proxy | Re-mint the Token V2 on the proxy you'll use, save both together |
| `failed to resolve image_url` / `failed to resolve video_url` | Media URL not publicly reachable | Use a CDN URL the actor can `GET` without auth |
| `crossposting is not enabled in this community` | Source sub disables crossposting | Pick a different source post |

***

### Limits and quirks

- **Title length:** Reddit caps post titles at 300 characters.
- **Body length:** 40,000 characters.
- **Per-account rate limit:** Reddit enforces per-account write limits — pace your runs accordingly to avoid throttling.
- **New-account throttle:** Brand-new accounts (low age or low karma) get extra cooldowns between posts (sometimes 9 min apart). This is a Reddit-side anti-spam measure, not an actor bug.
- **Datacenter proxies:** Reddit zero-weights votes from datacenter IPs and aggressively rate-limits them for posting. Use **mobile or residential** proxies for sustained automation.
- **File extension must match:** Reddit rejects images whose actual format doesn't match the URL extension (e.g. a `.jpg` URL serving a PNG). Make sure the URL extension reflects the real file type.
- **Video processing:** Reddit processes videos asynchronously, so the post can show "Processing" for 30–90 seconds before becoming visible.
- **Crosspost source restrictions:** Some subreddits disable crossposting from their content.
- **Gallery captions:** if you supply captions, they align by index — caption #1 attaches to image #1. Trailing missing captions are blank.

***

### Best practices

1. **Use the Reddit Vault.** Save your accounts once with a Reddit Session — Token V2 auto-refresh keeps everything working for ~180 days.
2. **Match account ↔ subreddit.** Brand-new accounts can't post to large default subs. Build account reputation first by commenting in small communities.
3. **Stagger posts.** Reddit's anti-spam looks at velocity — schedule with the Apify Scheduler instead of bursting.
4. **Mobile / residential proxies only** for posting. Datacenter IPs work for read-only scraping but are visibility-degraded for vote / post actions (March 2026 Reddit policy change).
5. **Respect subreddit rules.** Each sub's `r/{sub}/about/rules.json` lists posting requirements. The **Reddit Subreddits V2** actor can fetch them programmatically.

***

### Why this actor is fast

- **Speed — 1–3 seconds per call for text/link/poll/crosspost; 5–90 seconds for media.** Pure HTTP to Reddit's API. No browser to boot, no Playwright / Selenium / Puppeteer overhead. Competing browser-based scrapers typically take 15–60 seconds per call.
- **Reliability — zero browser flakiness.** No headless-Chromium crashes. No JS-render timeouts. No captcha pages.
- **Footprint — under 512 MB RAM per run for non-media; up to 2 GB for video.** Most browser-based scrapers need 1–4 GB even for a tiny text post.

***

### Pricing

Pay-per-result. **You're only charged when a record is pushed to the dataset — validation errors that never reach Reddit cost nothing.** Failed runs still emit a structured failure record (so you can debug), and that single row is the only thing billed.

| Event | Trigger | Price (per 1,000) |
|-------|---------|--------------------|
| `result` | Each row pushed to the dataset (success or failure) | **$1.99** |

Every endpoint — text / link / image / gallery / video / poll / crosspost — is one row, one charge.

***

### Status & error reference

**Run status** *(Apify-side, shown on the run page)*

| Status | Apify message | Meaning | What to do |
|---|---|---|---|
| <img src="https://redcrawler.com/s/apify_pill_succeeded_v11.png" alt="Succeeded" height="40" style="max-width:none" /> | "Actor succeeded with N results in the dataset" | Run finished. Some or zero records pushed. | Open the dataset to view results. |
| <img src="https://redcrawler.com/s/apify_pill_failed_v11.png" alt="Failed" height="40" style="max-width:none" /> | "The Actor process failed…" | Validation error or upstream Reddit fault. | Check the run log. You are NOT charged for failed runs. |
| <img src="https://redcrawler.com/s/apify_pill_timed_out_v11.png" alt="Timed out" height="40" style="max-width:none" /> | "The Actor timed out. You can resurrect it with a longer timeout to continue where you left off." | Run exceeded its timeout. | Re-run; consider narrowing inputs. |
| <img src="https://redcrawler.com/s/apify_pill_aborted_v11.png" alt="Aborted" height="40" style="max-width:none" /> | "The Actor process was aborted. You can resurrect it to continue where you left off." | You stopped the run manually. | No charge for unpushed results. |

**Common in-run conditions** *(visible in run log)*

| Condition | Cause | Result |
|---|---|---|
| `RATELIMIT` from Reddit | Per-account write throttle hit. | Run `SUCCEEDED`, failure row with `error_kind: RATELIMIT`. |
| Bearer expired / invalid | Saved Token V2 past 24 h, no vault Reddit Session for refresh. | Run `SUCCEEDED`, failure row, no Reddit call made. |
| Bearer minted on a different IP | Saved Token V2's IP doesn't match the saved proxy. | Run `SUCCEEDED`, failure row. |
| `SUBREDDIT_NOTALLOWED` | Account is banned, muted, or restricted in the subreddit. | Run `SUCCEEDED`, failure row. |
| `NO_TEXT` / `MISSING_TITLE` | Required post body or title missing. | Run `SUCCEEDED`, failure row with `error_kind`. |
| Media upload failed | Image / video upload rejected by Reddit. | Run `SUCCEEDED`, failure row. |
| Validation error: missing required field | Required input not provided. | Run `FAILED` immediately, no charge. |

***

### Companion actors

- **[Reddit Vault](https://apify.com/red_crawler/reddit-vault)** — save Reddit accounts once, reuse them by name across every Reddit actor (free)
- **[Reddit Flairs V2](https://apify.com/red_crawler/reddit-flairs-v2)** — list, set, or remove user / link flair
- **[Reddit Subreddits V2](https://apify.com/red_crawler/reddit-subreddits-v2)** — subreddit info, rules, leaderboards, settings
- **[Reddit Posts & Feeds V2](https://apify.com/red_crawler/reddit-posts-feeds-v2)** — allowed post types, home feed, post state controls (save / hide / pin / delete / etc.)
- **[Reddit Manage Posts V1](https://apify.com/red_crawler/reddit-manage-posts-v1)** — edit, delete, lock, sticky, NSFW / spoiler toggles, vote
- **[Reddit Commenting V1](https://apify.com/red_crawler/reddit-commenting-v1)** — reply to posts and comments
- **[Reddit Voting V1](https://apify.com/red_crawler/reddit-voting-v1)** — upvote / downvote posts and comments

All of them accept the same `accountName` field, so saving credentials in Reddit Vault unlocks them all.

***

### Need a different shape of data?

- For **scraping** posts, comments, users, subreddits — see the V2 read actors (Scrape V2, Search V2, Users V2, Subreddits V2, Bulk V2, Feeds V2).
- For **post state controls** (save / hide / nsfw / spoiler / pin / delete / 14 more) on posts you've already created — see **Reddit Posts & Feeds V2**.
- For **commenting / voting / moderation** — see the V1 action actors.

***

### Support and feedback

Found a bug, want a feature, hit a Reddit error code we don't translate clearly? Open an issue via the actor's Apify Console feedback link, or reach out at the RedCrawler support channel.

***

*Reddit Posting V2 is part of the RedCrawler family of Reddit actors. RedCrawler is independent — not affiliated with, endorsed by, or sponsored by Reddit, Inc. Use it within Reddit's API terms and within each subreddit's posting rules.*

# Actor input Schema

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

Choose which post type to create. All 7 require a Reddit account — fill the **Reddit credentials** section at the bottom of the form.

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

Target subreddit — name (e.g. test), r/name, or full URL.

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

Post title (max 300 chars).

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

Optional markdown body. Leave blank for a title-only post.

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

Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor.

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

Custom flair text shown beside the post.

## `text_nsfw` (type: `boolean`):

Flag the post as NSFW.

## `text_spoiler` (type: `boolean`):

Flag the post as a spoiler.

## `text_brand_affiliate` (type: `boolean`):

Mark the post as commercial / brand-affiliate content.

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

Target subreddit — name, r/name, or full URL.

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

Post title (max 300 chars).

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

Outbound URL to share.

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

Optional markdown caption. Some subreddits accept body alongside the link, others silently drop it.

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

Subreddit flair template ID.

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

Custom flair text shown beside the post.

## `link_nsfw` (type: `boolean`):

Flag the post as NSFW.

## `link_spoiler` (type: `boolean`):

Flag the post as a spoiler.

## `link_brand_affiliate` (type: `boolean`):

Mark the post as commercial / brand-affiliate content.

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

Target subreddit — name, r/name, or full URL.

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

Post title (max 300 chars).

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

Public image URL (jpg / png / gif / webp).

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

Optional markdown body / caption.

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

Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor.

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

Custom flair text shown beside the post.

## `image_nsfw` (type: `boolean`):

Flag the post as NSFW.

## `image_spoiler` (type: `boolean`):

Flag the post as a spoiler.

## `image_brand_affiliate` (type: `boolean`):

Mark the post as commercial / brand-affiliate content.

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

Target subreddit — name, r/name, or full URL.

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

Post title (max 300 chars).

## `gallery_image_urls` (type: `array`):

List of public image URLs. Min 2, max 20. Order matters — first URL is the cover.

## `gallery_captions` (type: `array`):

Optional captions, aligned with the image URLs. Leave entries blank to skip.

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

Optional markdown body. Leave blank for none.

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

Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor.

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

Custom flair text shown beside the post.

## `gallery_nsfw` (type: `boolean`):

Flag the post as NSFW.

## `gallery_spoiler` (type: `boolean`):

Flag the post as a spoiler.

## `gallery_brand_affiliate` (type: `boolean`):

Mark the post as commercial / brand-affiliate content.

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

Target subreddit — name, r/name, or full URL.

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

Post title (max 300 chars).

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

Public video URL (mp4).

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

Optional thumbnail image URL. If blank, the first video frame is auto-extracted.

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

Optional markdown body. Leave blank for none.

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

Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor.

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

Custom flair text shown beside the post.

## `video_nsfw` (type: `boolean`):

Flag the post as NSFW.

## `video_spoiler` (type: `boolean`):

Flag the post as a spoiler.

## `video_brand_affiliate` (type: `boolean`):

Mark the post as commercial / brand-affiliate content.

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

Target subreddit — name, r/name, or full URL. The subreddit must allow poll posts.

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

Post title (max 300 chars).

## `poll_options` (type: `array`):

Poll options — 2 minimum. Each entry is a separate option.

## `poll_duration` (type: `integer`):

How long the poll stays open. 1–7 days.

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

Optional markdown body. Leave blank for none.

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

Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor.

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

Custom flair text shown beside the post.

## `poll_nsfw` (type: `boolean`):

Flag the post as NSFW.

## `poll_spoiler` (type: `boolean`):

Flag the post as a spoiler.

## `poll_brand_affiliate` (type: `boolean`):

Mark the post as commercial / brand-affiliate content.

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

Where the crosspost will be created — name, r/name, or full URL.

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

Title for the crosspost (max 300 chars).

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

Source post or comment — accepts a post URL, t3\_ID, raw post ID, full comment URL, or t1\_ comment ID.

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

Optional markdown body. Leave blank for none.

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

Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor.

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

Custom flair text shown beside the post.

## `crosspost_nsfw` (type: `boolean`):

Flag the post as NSFW.

## `crosspost_spoiler` (type: `boolean`):

Flag the post as a spoiler.

## `crosspost_brand_affiliate` (type: `boolean`):

Mark the post as commercial / brand-affiliate content.

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

Every post type here requires a Reddit account. **Use saved account (vault)** loads your stored Token V2 + proxy from the **reddit-vault** actor — only the 'Saved account name' field is used. **Paste Token V2 + proxy** uses the values you paste below.

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

The name you used in the **reddit-vault** actor when you stored this account. Token V2 + proxy load automatically from the vault. Ignored when 'Credential source' = manual.

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

Your Reddit `token_v2` cookie value (`eyJ...`). Lifetime ~24 h. Encrypted at rest by Apify. Ignored when 'Credential source' = vault.

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

Proxy in `ip:port:user:pass` format. MUST be the same IP that minted the Token V2. Ignored when 'Credential source' = vault.

## Actor input object example

```json
{
  "endpoint": "text",
  "text_subreddit": "test",
  "text_nsfw": false,
  "text_spoiler": false,
  "text_brand_affiliate": false,
  "link_subreddit": "test",
  "link_nsfw": false,
  "link_spoiler": false,
  "link_brand_affiliate": false,
  "image_subreddit": "test",
  "image_nsfw": false,
  "image_spoiler": false,
  "image_brand_affiliate": false,
  "gallery_subreddit": "test",
  "gallery_nsfw": false,
  "gallery_spoiler": false,
  "gallery_brand_affiliate": false,
  "video_subreddit": "test",
  "video_nsfw": false,
  "video_spoiler": false,
  "video_brand_affiliate": false,
  "poll_subreddit": "test",
  "poll_duration": 3,
  "poll_nsfw": false,
  "poll_spoiler": false,
  "poll_brand_affiliate": false,
  "crosspost_subreddit": "test",
  "crosspost_nsfw": false,
  "crosspost_spoiler": false,
  "crosspost_brand_affiliate": false,
  "credentialSource": "vault"
}
```

# 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 = {
    "endpoint": "text",
    "text_subreddit": "test",
    "link_subreddit": "test",
    "image_subreddit": "test",
    "gallery_subreddit": "test",
    "video_subreddit": "test",
    "poll_subreddit": "test",
    "crosspost_subreddit": "test"
};

// Run the Actor and wait for it to finish
const run = await client.actor("red_crawler/reddit-posting-v2").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 = {
    "endpoint": "text",
    "text_subreddit": "test",
    "link_subreddit": "test",
    "image_subreddit": "test",
    "gallery_subreddit": "test",
    "video_subreddit": "test",
    "poll_subreddit": "test",
    "crosspost_subreddit": "test",
}

# Run the Actor and wait for it to finish
run = client.actor("red_crawler/reddit-posting-v2").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 '{
  "endpoint": "text",
  "text_subreddit": "test",
  "link_subreddit": "test",
  "image_subreddit": "test",
  "gallery_subreddit": "test",
  "video_subreddit": "test",
  "poll_subreddit": "test",
  "crosspost_subreddit": "test"
}' |
apify call red_crawler/reddit-posting-v2 --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=red_crawler/reddit-posting-v2",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Reddit Posting V2 — Text/Link/Image/Gallery/Video/Poll/Cross",
        "description": "Create any Reddit post type from your saved account: text, link, image (URL), gallery (2–20 URLs), video, poll, crosspost. 7 endpoints. Reddit account required — use Token V2 + matching proxy or a saved account from the Reddit Vault actor.",
        "version": "0.6",
        "x-build-id": "GaGT94apfrfeWpyEc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/red_crawler~reddit-posting-v2/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-red_crawler-reddit-posting-v2",
                "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/red_crawler~reddit-posting-v2/runs": {
            "post": {
                "operationId": "runs-sync-red_crawler-reddit-posting-v2",
                "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/red_crawler~reddit-posting-v2/run-sync": {
            "post": {
                "operationId": "run-sync-red_crawler-reddit-posting-v2",
                "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": [
                    "endpoint"
                ],
                "properties": {
                    "endpoint": {
                        "title": "What to create",
                        "enum": [
                            "text",
                            "link",
                            "image",
                            "gallery",
                            "video",
                            "poll",
                            "crosspost"
                        ],
                        "type": "string",
                        "description": "Choose which post type to create. All 7 require a Reddit account — fill the **Reddit credentials** section at the bottom of the form.",
                        "default": "text"
                    },
                    "text_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit — name (e.g. test), r/name, or full URL."
                    },
                    "text_title": {
                        "title": "Title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 chars)."
                    },
                    "text_body": {
                        "title": "Body (optional)",
                        "type": "string",
                        "description": "Optional markdown body. Leave blank for a title-only post."
                    },
                    "text_flair_id": {
                        "title": "Flair template ID (optional)",
                        "type": "string",
                        "description": "Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor."
                    },
                    "text_flair_text": {
                        "title": "Flair display text (optional)",
                        "type": "string",
                        "description": "Custom flair text shown beside the post."
                    },
                    "text_nsfw": {
                        "title": "Mark NSFW",
                        "type": "boolean",
                        "description": "Flag the post as NSFW.",
                        "default": false
                    },
                    "text_spoiler": {
                        "title": "Mark spoiler",
                        "type": "boolean",
                        "description": "Flag the post as a spoiler.",
                        "default": false
                    },
                    "text_brand_affiliate": {
                        "title": "Brand affiliate disclosure",
                        "type": "boolean",
                        "description": "Mark the post as commercial / brand-affiliate content.",
                        "default": false
                    },
                    "link_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit — name, r/name, or full URL."
                    },
                    "link_title": {
                        "title": "Title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 chars)."
                    },
                    "link_url": {
                        "title": "URL",
                        "type": "string",
                        "description": "Outbound URL to share."
                    },
                    "link_body": {
                        "title": "Body (optional caption)",
                        "type": "string",
                        "description": "Optional markdown caption. Some subreddits accept body alongside the link, others silently drop it."
                    },
                    "link_flair_id": {
                        "title": "Flair template ID (optional)",
                        "type": "string",
                        "description": "Subreddit flair template ID."
                    },
                    "link_flair_text": {
                        "title": "Flair display text (optional)",
                        "type": "string",
                        "description": "Custom flair text shown beside the post."
                    },
                    "link_nsfw": {
                        "title": "Mark NSFW",
                        "type": "boolean",
                        "description": "Flag the post as NSFW.",
                        "default": false
                    },
                    "link_spoiler": {
                        "title": "Mark spoiler",
                        "type": "boolean",
                        "description": "Flag the post as a spoiler.",
                        "default": false
                    },
                    "link_brand_affiliate": {
                        "title": "Brand affiliate disclosure",
                        "type": "boolean",
                        "description": "Mark the post as commercial / brand-affiliate content.",
                        "default": false
                    },
                    "image_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit — name, r/name, or full URL."
                    },
                    "image_title": {
                        "title": "Title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 chars)."
                    },
                    "image_url": {
                        "title": "Image URL",
                        "type": "string",
                        "description": "Public image URL (jpg / png / gif / webp)."
                    },
                    "image_body": {
                        "title": "Body (optional)",
                        "type": "string",
                        "description": "Optional markdown body / caption."
                    },
                    "image_flair_id": {
                        "title": "Flair template ID (optional)",
                        "type": "string",
                        "description": "Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor."
                    },
                    "image_flair_text": {
                        "title": "Flair display text (optional)",
                        "type": "string",
                        "description": "Custom flair text shown beside the post."
                    },
                    "image_nsfw": {
                        "title": "Mark NSFW",
                        "type": "boolean",
                        "description": "Flag the post as NSFW.",
                        "default": false
                    },
                    "image_spoiler": {
                        "title": "Mark spoiler",
                        "type": "boolean",
                        "description": "Flag the post as a spoiler.",
                        "default": false
                    },
                    "image_brand_affiliate": {
                        "title": "Brand affiliate disclosure",
                        "type": "boolean",
                        "description": "Mark the post as commercial / brand-affiliate content.",
                        "default": false
                    },
                    "gallery_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit — name, r/name, or full URL."
                    },
                    "gallery_title": {
                        "title": "Title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 chars)."
                    },
                    "gallery_image_urls": {
                        "title": "Image URLs",
                        "type": "array",
                        "description": "List of public image URLs. Min 2, max 20. Order matters — first URL is the cover.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "gallery_captions": {
                        "title": "Captions (optional, aligned with URLs)",
                        "type": "array",
                        "description": "Optional captions, aligned with the image URLs. Leave entries blank to skip.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "gallery_body": {
                        "title": "Body (optional)",
                        "type": "string",
                        "description": "Optional markdown body. Leave blank for none."
                    },
                    "gallery_flair_id": {
                        "title": "Flair template ID (optional)",
                        "type": "string",
                        "description": "Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor."
                    },
                    "gallery_flair_text": {
                        "title": "Flair display text (optional)",
                        "type": "string",
                        "description": "Custom flair text shown beside the post."
                    },
                    "gallery_nsfw": {
                        "title": "Mark NSFW",
                        "type": "boolean",
                        "description": "Flag the post as NSFW.",
                        "default": false
                    },
                    "gallery_spoiler": {
                        "title": "Mark spoiler",
                        "type": "boolean",
                        "description": "Flag the post as a spoiler.",
                        "default": false
                    },
                    "gallery_brand_affiliate": {
                        "title": "Brand affiliate disclosure",
                        "type": "boolean",
                        "description": "Mark the post as commercial / brand-affiliate content.",
                        "default": false
                    },
                    "video_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit — name, r/name, or full URL."
                    },
                    "video_title": {
                        "title": "Title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 chars)."
                    },
                    "video_url": {
                        "title": "Video URL",
                        "type": "string",
                        "description": "Public video URL (mp4)."
                    },
                    "video_poster_url": {
                        "title": "Poster URL (optional)",
                        "type": "string",
                        "description": "Optional thumbnail image URL. If blank, the first video frame is auto-extracted."
                    },
                    "video_body": {
                        "title": "Body (optional)",
                        "type": "string",
                        "description": "Optional markdown body. Leave blank for none."
                    },
                    "video_flair_id": {
                        "title": "Flair template ID (optional)",
                        "type": "string",
                        "description": "Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor."
                    },
                    "video_flair_text": {
                        "title": "Flair display text (optional)",
                        "type": "string",
                        "description": "Custom flair text shown beside the post."
                    },
                    "video_nsfw": {
                        "title": "Mark NSFW",
                        "type": "boolean",
                        "description": "Flag the post as NSFW.",
                        "default": false
                    },
                    "video_spoiler": {
                        "title": "Mark spoiler",
                        "type": "boolean",
                        "description": "Flag the post as a spoiler.",
                        "default": false
                    },
                    "video_brand_affiliate": {
                        "title": "Brand affiliate disclosure",
                        "type": "boolean",
                        "description": "Mark the post as commercial / brand-affiliate content.",
                        "default": false
                    },
                    "poll_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit — name, r/name, or full URL. The subreddit must allow poll posts."
                    },
                    "poll_title": {
                        "title": "Title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 chars)."
                    },
                    "poll_options": {
                        "title": "Poll options",
                        "type": "array",
                        "description": "Poll options — 2 minimum. Each entry is a separate option.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "poll_duration": {
                        "title": "Voting duration (days)",
                        "minimum": 1,
                        "maximum": 7,
                        "type": "integer",
                        "description": "How long the poll stays open. 1–7 days.",
                        "default": 3
                    },
                    "poll_body": {
                        "title": "Body (optional)",
                        "type": "string",
                        "description": "Optional markdown body. Leave blank for none."
                    },
                    "poll_flair_id": {
                        "title": "Flair template ID (optional)",
                        "type": "string",
                        "description": "Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor."
                    },
                    "poll_flair_text": {
                        "title": "Flair display text (optional)",
                        "type": "string",
                        "description": "Custom flair text shown beside the post."
                    },
                    "poll_nsfw": {
                        "title": "Mark NSFW",
                        "type": "boolean",
                        "description": "Flag the post as NSFW.",
                        "default": false
                    },
                    "poll_spoiler": {
                        "title": "Mark spoiler",
                        "type": "boolean",
                        "description": "Flag the post as a spoiler.",
                        "default": false
                    },
                    "poll_brand_affiliate": {
                        "title": "Brand affiliate disclosure",
                        "type": "boolean",
                        "description": "Mark the post as commercial / brand-affiliate content.",
                        "default": false
                    },
                    "crosspost_subreddit": {
                        "title": "Destination subreddit",
                        "type": "string",
                        "description": "Where the crosspost will be created — name, r/name, or full URL."
                    },
                    "crosspost_title": {
                        "title": "New title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Title for the crosspost (max 300 chars)."
                    },
                    "crosspost_id": {
                        "title": "Source",
                        "type": "string",
                        "description": "Source post or comment — accepts a post URL, t3_ID, raw post ID, full comment URL, or t1_ comment ID."
                    },
                    "crosspost_body": {
                        "title": "Body (optional)",
                        "type": "string",
                        "description": "Optional markdown body. Leave blank for none."
                    },
                    "crosspost_flair_id": {
                        "title": "Flair template ID (optional)",
                        "type": "string",
                        "description": "Subreddit flair template ID. Get IDs from the Reddit Flairs V2 actor."
                    },
                    "crosspost_flair_text": {
                        "title": "Flair display text (optional)",
                        "type": "string",
                        "description": "Custom flair text shown beside the post."
                    },
                    "crosspost_nsfw": {
                        "title": "Mark NSFW",
                        "type": "boolean",
                        "description": "Flag the post as NSFW.",
                        "default": false
                    },
                    "crosspost_spoiler": {
                        "title": "Mark spoiler",
                        "type": "boolean",
                        "description": "Flag the post as a spoiler.",
                        "default": false
                    },
                    "crosspost_brand_affiliate": {
                        "title": "Brand affiliate disclosure",
                        "type": "boolean",
                        "description": "Mark the post as commercial / brand-affiliate content.",
                        "default": false
                    },
                    "credentialSource": {
                        "title": "Credential source",
                        "enum": [
                            "vault",
                            "manual"
                        ],
                        "type": "string",
                        "description": "Every post type here requires a Reddit account. **Use saved account (vault)** loads your stored Token V2 + proxy from the **reddit-vault** actor — only the 'Saved account name' field is used. **Paste Token V2 + proxy** uses the values you paste below.",
                        "default": "vault"
                    },
                    "accountName": {
                        "title": "Saved account name (used when source = vault)",
                        "pattern": "^[A-Za-z0-9_-]{1,32}$",
                        "maxLength": 32,
                        "type": "string",
                        "description": "The name you used in the **reddit-vault** actor when you stored this account. Token V2 + proxy load automatically from the vault. Ignored when 'Credential source' = manual."
                    },
                    "bearer": {
                        "title": "Token V2 (used when source = manual)",
                        "type": "string",
                        "description": "Your Reddit `token_v2` cookie value (`eyJ...`). Lifetime ~24 h. Encrypted at rest by Apify. Ignored when 'Credential source' = vault."
                    },
                    "proxy": {
                        "title": "Proxy (used when source = manual)",
                        "type": "string",
                        "description": "Proxy in `ip:port:user:pass` format. MUST be the same IP that minted the Token V2. Ignored when 'Credential source' = vault."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
