# Reddit Posting V1 — Create Post (8 types) (`red_crawler/reddit-posting-v1`) Actor

By using this Reddit poster, you can create any Reddit post  — text, link, image, gallery, video, GIF, crosspost, or poll — in any subreddit. Pick a post type, fill the matching fields. Bring your Reddit OAuth bearer + matching proxy.

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

## Pricing

from $0.01 / 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 V1 — Create Post (8 types)

![Endpoints](https://img.shields.io/badge/endpoints-8-blue) ![Auth](https://img.shields.io/badge/auth-required-red) ![Vault](https://img.shields.io/badge/vault-supported-green) ![Pricing](https://img.shields.io/badge/pricing-pay_per_result-orange)

**Create any kind of Reddit post — text, link, image, gallery, video, GIF, crosspost, or poll — in any subreddit.** One actor, one input form, eight 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.

---

### What this actor does

Pick a post type from the dropdown, fill the matching section, supply credentials, run. The actor publishes the post on the chosen subreddit on your account's behalf.

You can post:

- **Text** — markdown self-post
- **Link** — share an external URL (with an optional body)
- **Image** — single image from a public URL
- **Gallery** — 2–20 images from public URLs
- **Video** — video from a public URL (with optional thumbnail)
- **GIF** — animated `.gif` from a public URL
- **Crosspost** — republish an existing Reddit post to another subreddit
- **Poll** — 2–6 options, 1–7 day duration

For each type you control flair, NSFW / spoiler flags, reply notifications, and (for link posts) resubmit behavior — everything Reddit's own UI exposes.

> **Heads-up:** this actor only handles **post creation**. For voting, editing, deleting, reporting, or replying, see the other actors in the RedCrawler family.

---

### Quick start — your first post

#### 1. Save an account in **Reddit Vault** (one-time setup, recommended)

Run the [Reddit Vault](https://apify.com/red_crawler/reddit-vault) actor with:
- Mode = `STORE`
- Account name = `motor_tip8865`
- **Token V2** (the `token_v2` cookie, ~24 h) **or** **Reddit Session** (the `reddit_session` cookie, ~180 days) + Proxy = `ip:port:user:pass`

You only do this once per Reddit account, then reuse the name across every Reddit actor. See [Reddit Vault](https://apify.com/red_crawler/reddit-vault) for screenshots showing how to extract `token_v2` / `reddit_session` from your browser.

> **In a hurry / one-off post?** You can skip the vault: in the credentials section pick **Paste Token V2 + proxy** and supply both inline. Saving in the vault is recommended for repeat use because it spares you from re-pasting on every run and (with a Reddit Session) auto-refreshes the Token V2 for you.

#### 2. Create a text post

In this actor:

1. **Post type** → `Text post`
2. Scroll to the **Text post** section:
   - **Subreddit** → `test` (or your own user-profile sub like `u_yourname`)
   - **Post title** → `Hello from Apify!`
   - **Post body** → `Markdown supported. **Bold**, *italic*, > quote, [link](https://example.com)`
3. Scroll to **Reddit credentials** and pick one of:
   - **Use saved account (vault)** + **Saved account name** = `motor_tip8865` *(recommended)*
   - **Paste Token V2 + proxy** + paste your `eyJ…` Token V2 (the `token_v2` cookie) and `ip:port:user:pass` proxy *(quick, no save)*
4. Run.

#### 3. Read the result

The dataset row gives you the live post URL plus rate-limit metadata:

```json
{
  "success": true,
  "post_type": "text",
  "post_id": "1abc23",
  "post_fullname": "t3_1abc23",
  "permalink": "https://reddit.com/r/test/comments/1abc23/hello_from_apify/",
  "url": "https://reddit.com/r/test/comments/1abc23/hello_from_apify/",
  "subreddit": "test",
  "title": "Hello from Apify!",
  "selftext": "Markdown supported...",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "rate_limit": 100,
  "rate_used": 1,
  "rate_remaining": 99,
  "rate_reset_in_seconds": 599,
  "bearer_expires_at": "2026-05-08T11:42:18+00:00"
}
````

***

### The 8 post types

Each post type has its own dedicated section in the input form. The fields are namespaced (e.g. `text_subreddit`, `link_url`, `gallery_items`, `poll_options`) so you only fill the section that matches your chosen Post type — the others are ignored.

#### 1. Text post

A self-post with markdown body. Most subs allow text posts.

| Field | Required | Notes |
|-------|----------|-------|
| Subreddit | yes | Just the name, with or without `r/` |
| Post title | yes | Max 300 chars |
| Post body | optional | Markdown — `**bold**`, `*italic*`, `> quote`, `[link](url)`, `- bullet` |
| Flair ID | optional | Reddit's internal flair template ID |
| Flair text | optional | Display text override |
| Mark as NSFW / Spoiler | optional | Booleans |
| Send reply notifications | optional (default: true) | Inbox notifications when someone replies |

**Example**

**Input**

```json
{
  "post_type": "text",
  "text_subreddit": "test",
  "text_title": "Hello from RedCrawler Posting V1 — text post",
  "text_body": "**Markdown supported.** *italic*, > quote, [link](https://redcrawler.com), `code`.\n\nThis is a sample text post created by the actor on r/test for the README capture.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

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

```json
{
  "success": true,
  "post_type": "text",
  "post_id": "1tbwj7w",
  "post_fullname": "t3_1tbwj7w",
  "permalink": "https://www.reddit.com/r/test/comments/1tbwj7w/hello_from_redcrawler_posting_v1_text_post/",
  "url": "https://www.reddit.com/r/test/comments/1tbwj7w/hello_from_redcrawler_posting_v1_text_post/",
  "subreddit": "test",
  "title": "Hello from RedCrawler Posting V1 — text post",
  "selftext": "**Markdown supported.** *italic*, > quote, [link](https://redcrawler.com), `code`. ...",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T10:20:54Z"
}
```

#### 2. Link post

Share an outbound URL with an optional caption.

| Field | Required | Notes |
|-------|----------|-------|
| Subreddit | yes | Just the name, with or without `r/` |
| Post title | yes | Max 300 chars |
| Link URL | yes | The URL you want to share |
| Post body | optional | Caption shown below the link. Subs configured for rich/media link posts keep it; classic link-only subs silently drop it |
| Allow resubmit | optional (default: true) | Permit re-submitting a URL already posted to this sub |
| Flair / NSFW / Spoiler / Send replies | optional | Same as text |

**Example**

**Input**

```json
{
  "post_type": "link",
  "link_subreddit": "test",
  "link_title": "RedCrawler Posting V1 — link post sample",
  "link_url": "https://redcrawler.com",
  "link_body": "Caption shown below the link — markdown OK.",
  "link_resubmit": true,
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

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

```json
{
  "success": true,
  "post_type": "link",
  "post_id": "1tbwje9",
  "post_fullname": "t3_1tbwje9",
  "permalink": "https://www.reddit.com/r/test/comments/1tbwje9/redcrawler_posting_v1_link_post_sample/",
  "url": "https://www.reddit.com/r/test/comments/1tbwje9/redcrawler_posting_v1_link_post_sample/",
  "subreddit": "test",
  "title": "RedCrawler Posting V1 — link post sample",
  "selftext": "Caption shown below the link — markdown OK.",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T10:20:54Z"
}
```

#### 3. Image post

Upload a JPG / PNG / GIF from a public URL.

| Field | Required | Notes |
|-------|----------|-------|
| Subreddit | yes | Just the name, with or without `r/` |
| Post title | yes | Max 300 chars |
| Image URL | yes | Publicly reachable image URL (`.jpg`, `.png`, `.gif`) |
| Post body | optional | Caption shown below the image |
| Flair / NSFW / Spoiler / Send replies | optional | Same as text |

> **Media posts return a websocket URL, not a `post_id`.** Reddit uploads images / video / GIFs asynchronously — the synchronous response carries a `websocket_url` your client connects to for the final `post_id` once Reddit finishes processing the upload. The post itself still lands; just poll your account's submitted page if you don't want to handle the websocket.

**Example**

**Input**

```json
{
  "post_type": "image",
  "image_subreddit": "test",
  "image_title": "Sunset over the lake — image post sample",
  "image_url": "https://i.imgur.com/KAeuBNn.jpeg",
  "image_body": "Single-image post created via RedCrawler Posting V1.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record — note media posts ship a `websocket_url` instead of a `post_id`)*

```json
{
  "success": true,
  "post_type": "image",
  "subreddit": "test",
  "title": "Sunset over the lake — image post sample",
  "selftext": "Single-image post created via RedCrawler Posting V1.",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T10:20:54Z",
  "websocket_url": "wss://k8s-lb.wss.redditmedia.com/lwhwk61w1w0h1?m=AQAAr18Eaouz..."
}
```

The post actually landed at `https://www.reddit.com/r/test/comments/1tbwjlt/`.

#### 4. Gallery post

2–20 images, one URL per row. The whole gallery shares the **Post body**.

| Field | Required | Notes |
|-------|----------|-------|
| Subreddit | yes | Just the name, with or without `r/` |
| Post title | yes | Max 300 chars |
| Gallery images | yes | 2–20 publicly reachable image URLs, one per row |
| Post body | optional | Caption shown above the gallery |
| Flair / NSFW / Spoiler / Send replies | optional | Same as text |

**Example**

**Input**

```json
{
  "post_type": "gallery",
  "gallery_subreddit": "test",
  "gallery_title": "Three-shot gallery sample",
  "gallery_items": [
    "https://i.imgur.com/B9omOe6.jpeg",
    "https://i.imgur.com/GGhH70K.jpeg",
    "https://i.imgur.com/TPMezMZ.jpeg"
  ],
  "gallery_body": "Gallery post created via RedCrawler Posting V1.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

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

```json
{
  "success": true,
  "post_type": "gallery",
  "post_id": "t3_1tbwjv3",
  "permalink": "https://www.reddit.com/r/test/comments/1tbwjv3/threeshot_gallery_sample/",
  "url": "https://www.reddit.com/r/test/comments/1tbwjv3/threeshot_gallery_sample/",
  "subreddit": "test",
  "title": "Three-shot gallery sample",
  "selftext": "Gallery post created via RedCrawler Posting V1.",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T10:20:54Z"
}
```

#### 5. Video post

Upload an MP4 / MOV from a public URL.

| Field | Required | Notes |
|-------|----------|-------|
| Subreddit | yes | Just the name, with or without `r/` |
| Post title | yes | Max 300 chars |
| Video URL | yes | Publicly reachable `.mp4` / `.mov` URL |
| Thumbnail URL | optional | If omitted, a frame is auto-extracted from the video |
| Post body | optional | Caption shown below the video |
| Flair / NSFW / Spoiler / Send replies | optional | Same as text |

> Video uploads are slower than images — Reddit transcodes the file before the post becomes visible. Expect 30–90 s end-to-end. Like image posts, the record carries a `websocket_url` for the final `post_id`.

**Example**

**Input**

```json
{
  "post_type": "video",
  "video_subreddit": "test",
  "video_title": "30-second clip — video post sample",
  "video_url": "https://i.imgur.com/BuzoHUZ.mp4",
  "video_body": "Video post created via RedCrawler Posting V1.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record — `post_id` arrives via the websocket once Reddit finishes transcoding)*

```json
{
  "success": true,
  "post_type": "video",
  "subreddit": "test",
  "title": "30-second clip — video post sample",
  "selftext": "Video post created via RedCrawler Posting V1.",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T10:20:54Z",
  "websocket_url": "wss://k8s-lb.wss.redditmedia.com/qbn8ql502w0h1?m=AQAA1l8Eag2v..."
}
```

The post actually landed at `https://www.reddit.com/r/test/comments/1tbwk4e/`.

#### 6. GIF post

Upload a `.gif` from a public URL. Reddit converts it to native MP4 for playback.

| Field | Required | Notes |
|-------|----------|-------|
| Subreddit | yes | Just the name, with or without `r/` |
| Post title | yes | Max 300 chars |
| GIF URL | yes | Publicly reachable `.gif` URL |
| Post body | optional | Caption shown below the GIF |
| NSFW / Spoiler / Send replies | optional | Same as text. GIF posts skip the flair field |

**Example**

**Input**

```json
{
  "post_type": "gif",
  "gif_subreddit": "test",
  "gif_title": "When the build passes on the first try — GIF sample",
  "gif_url": "https://media3.giphy.com/media/v1.../11fot0YzpQMA0g/giphy.gif",
  "gif_body": "Animated GIF posted via RedCrawler Posting V1.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

**Output** *(one dataset record — same async pattern as image / video)*

```json
{
  "success": true,
  "post_type": "gif",
  "subreddit": "test",
  "title": "When the build passes on the first try — GIF sample",
  "selftext": "Animated GIF posted via RedCrawler Posting V1.",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T10:20:54Z",
  "websocket_url": "wss://k8s-lb.wss.redditmedia.com/vwb245w12w0h1?m=AQAA5l8Eaq..."
}
```

The post actually landed at `https://www.reddit.com/r/test/comments/1tbwkby/`.

#### 7. Crosspost

Republish an existing post to another subreddit.

| Field | Required | Notes |
|-------|----------|-------|
| Subreddit | yes | The destination subreddit |
| Post title | yes | The crosspost title (independent of the source post) |
| Source post URL | yes | A full `reddit.com/r/.../comments/...` URL |
| Post body | optional | Comment shown above the crossposted source post |
| NSFW / Spoiler / Send replies | optional | Same as text. Crossposts inherit the source post's flair |

> The source post's subreddit must allow crossposting (it's a per-sub setting). Some subs lock it down.

**Example**

**Input**

```json
{
  "post_type": "crosspost",
  "crosspost_subreddit": "test",
  "crosspost_title": "Crosspost sample — AITAH chair story",
  "crosspost_source_post_url": "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 V1.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

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

```json
{
  "success": true,
  "post_type": "crosspost",
  "post_id": "1tbwkhp",
  "post_fullname": "t3_1tbwkhp",
  "permalink": "https://www.reddit.com/r/test/comments/1tbwkhp/crosspost_sample_aitah_chair_story/",
  "url": "https://www.reddit.com/r/test/comments/1tbwkhp/crosspost_sample_aitah_chair_story/",
  "subreddit": "test",
  "title": "Crosspost sample — AITAH chair story",
  "selftext": "Crosspost created via RedCrawler Posting V1.",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T10:20:54Z"
}
```

#### 8. Poll post

2–6 options, 1–7 day duration.

| Field | Required | Notes |
|-------|----------|-------|
| Subreddit | yes | Sub must allow polls |
| Post title | yes | The poll question |
| Poll options | yes | 2–6 options, one per row |
| Poll duration (days) | yes (default: 3) | 1–7 days |
| Post body | optional | Description shown above the poll |
| Flair / NSFW / Spoiler / Send replies | optional | Same as text |

**Example**

**Input**

```json
{
  "post_type": "poll",
  "poll_subreddit": "test",
  "poll_title": "Which language should I learn next?",
  "poll_options": ["Rust", "Go", "Zig", "TypeScript"],
  "poll_duration_days": 3,
  "poll_body": "Quick poll for the README capture.",
  "credentialSource": "vault",
  "accountName": "motor_tip8865"
}
```

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

```json
{
  "success": true,
  "post_type": "poll",
  "post_id": "t3_1tbwvgs",
  "permalink": "https://www.reddit.com/r/test/comments/1tbwvgs/which_language_should_i_learn_next/",
  "url": "https://www.reddit.com/r/test/comments/1tbwvgs/which_language_should_i_learn_next/",
  "subreddit": "test",
  "title": "Which language should I learn next?",
  "selftext": "Quick poll for the README capture.",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T11:29:01Z"
}
```

**What a Reddit-throttled failure looks like** — when the same account posts too many times in a short window, Reddit returns its anti-spam cooldown, and the actor pushes a failure record with the message in the `error` field:

```json
{
  "success": false,
  "post_type": "poll",
  "subreddit": "test",
  "title": "Which language should I learn next?",
  "selftext": "Quick poll for the README capture.",
  "is_nsfw": false,
  "is_spoiler": false,
  "sendreplies": true,
  "bearer_expires_at": "2026-05-14T10:20:54Z",
  "error": "Looks like you've been doing that a lot. Take a break for 1 minute before trying again."
}
```

***

### Reddit credentials (shared across all types)

The bottom section of the input form is the same for every post type.

#### 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` (the Token V2) or `reddit_session` (the 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)

#### Credential source

- **Use saved account (vault)** — pull Token V2 + proxy from the [Reddit Vault](https://apify.com/red_crawler/reddit-vault) by name. Only the **Saved account name** field below matters.
- **Paste Token V2 + proxy** — fill the Token V2 + proxy fields directly. The saved-account-name field is ignored.

#### Saved account name (vault path)

The label you used when running Reddit Vault → STORE. Lowercase, 1–32 chars, letters/digits/`-`/`_`.

#### Token V2 (manual path)

Your `token_v2` cookie value (`eyJ…`). Encrypted by Apify at rest (`isSecret: true`). Lifetime: ~24 h.

#### Proxy (manual path)

`ip:port:user:pass`. Must be the IP that minted the Token V2 — Reddit IP-binds these cookies.

***

### Output schema

Every run pushes exactly **one record** to the run's default dataset. The shape is the same across post types, with type-specific fields filled where relevant. Per-type captured examples live under each section above — this section is the **field reference**.

#### Field reference

| Field | Type | Present when | Notes |
|---|---|---|---|
| `success` | bool | always | `true` if the post landed (or, for media, the upload was accepted and a websocket URL was issued); `false` if Reddit or the actor rejected it |
| `post_type` | string | always | One of `text`, `link`, `image`, `gallery`, `video`, `gif`, `crosspost`, `poll` |
| `post_id` | string | success, **non-media** | Reddit's post ID (e.g. `1tbwj7w`). Media posts (image / video / GIF) ship `websocket_url` instead |
| `post_fullname` | string | success, **non-media** | `t3_` + `post_id` |
| `permalink`, `url` | string | success, **non-media** | Full reddit.com URL of the landed post |
| `subreddit` | string | always | Echo of the input subreddit (normalized — no `r/` prefix) |
| `title`, `selftext` | string | always | Echo of input (`selftext` = the body text you provided) |
| `is_nsfw`, `is_spoiler`, `sendreplies` | bool | always | Echo of input booleans |
| `flair_id`, `flair_text` | string | null | always (non-GIF / non-crosspost) | Echo of flair input (these post types skip flair) |
| `websocket_url` | string | success, **media only** | `wss://...redditmedia.com/...` — your client connects to receive the final `post_id` once Reddit finishes processing the upload |
| `error` | string | null | failure | Human-readable Reddit error or actor validation message |
| `error_kind` | string | null | failure | Reddit's structured error code (`RATELIMIT`, `SUBREDDIT_NOTALLOWED`, `BAD_FLAIR_TEMPLATE_ID`, `ALREADY_SUB`, etc.) |
| `bearer_expires_at` | ISO 8601 string | always | When your Token V2 cookie expires — refresh before this if you didn't save a Reddit Session |
| `bearer_expired_at` | ISO 8601 string | null | failure (auth) | Set if the bearer was already expired when this run started |
| `rate_limit`, `rate_used`, `rate_remaining` | int | when Reddit returns headers | Your account's live per-window post-create counter — pace your runs to stay above zero |
| `rate_reset_in_seconds` | int | when Reddit returns headers | Seconds until the window resets |

#### Failure record (example)

```json
{
  "success": false,
  "post_type": "link",
  "subreddit": "AskReddit",
  "title": "A delightful little site",
  "error": "URL has already been submitted",
  "error_kind": "ALREADY_SUB",
  "bearer_expires_at": "2026-05-14T10:20:54Z"
}
```

`error_kind` echoes Reddit's structured error code when available. The plain `error` string is always set.

***

### 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. One dataset row per post. | Open the dataset — check `success` and `permalink`. |
| <img src="https://redcrawler.com/s/apify_pill_failed_v11.png" alt="Failed" height="40" style="max-width:none" /> | "The Actor process failed…" | Hard process error. Rare; Reddit faults finish SUCCEEDED. | Check the run log. You are NOT charged on 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. Usually a slow video upload. | Re-run with a longer timeout — bump to 5+ min for big videos. |
| <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 posts. |

**Common in-run errors** *(`success: false` in the dataset row — visible in run log)*

| Error / `error_kind` | What it means | Fix |
|---|---|---|
| `URL has already been submitted` / `ALREADY_SUB` (link post) | Someone already posted that URL to that subreddit | Set `link_resubmit: true`, or 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 1–15 minutes between posts on new accounts, escalating with each retry while throttled) | Wait the full quoted cooldown before retrying. The `rate_remaining` field shows how many calls you have left in the current window |
| `BAD_FLAIR_TEMPLATE_ID` | Flair ID doesn't exist on this sub | Drop the flair fields, or fetch the right ID via Reddit Flairs V2 actor |
| `Bearer token invalid / expired` | Your saved Token V2 expired and you don't have a Reddit Session for auto-refresh | Run Reddit Vault → UPDATE with a fresh Token V2, or save a Reddit Session next time |
| `Proxy connection failed` | Proxy IP unreachable from Reddit | Check the proxy is alive — Reddit must return `200 OK` when reached through it |
| `failed to resolve image_url` | Image / video / GIF URL not publicly reachable | Use a CDN URL the actor can `GET` without auth |
| `Bearer minted on a different IP` | Saved Token V2's IP doesn't match your saved proxy | Re-mint the Token V2 on the proxy you'll use, then `STORE` / `UPDATE` both together |
| `crossposting is not enabled in this community` | The source post's subreddit disabled 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 (shared with voting). The `rate_*` fields in the response show your live counter.
- **New-account throttle:** Brand-new accounts (low age or low karma) get extra cooldowns between posts (sometimes minutes 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. The error returned by Reddit is `crossposting is not enabled in this community`.

***

### 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 (AskReddit, news, etc.). Build account reputation first by commenting in small communities.
3. **Stagger posts.** Reddit's anti-spam looks at velocity — 5 posts in 5 minutes from the same account is suspicious. Schedule with the Apify Scheduler instead.
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.

***

### Need a different shape of data?

- **[Reddit Vault](https://apify.com/red_crawler/reddit-vault)** — save Reddit accounts once, call them by name from this actor (free)
- **[Reddit Wiki & Emojis & Widgets](https://apify.com/red_crawler/reddit-wiki-emojis-widgets)** — read wiki pages, list emojis/widgets per subreddit
- **[Reddit Flairs V2](https://apify.com/red_crawler/reddit-flairs-v2)** — list, set, or remove user/link flair
- **[Reddit Content Fetcher](https://apify.com/red_crawler/reddit-content-fetcher)** — pull saved posts / comments / inbox for a saved account

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

***

### Why this actor is fast

- **Speed — 1–3 seconds per call, end-to-end.** 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. No surprise mid-run failures from a browser quirk.
- **Footprint — under 100 MB RAM per run.** Most browser-based scrapers need 1–4 GB. Built for reliability behind the scenes — just paste your inputs and run.

***

### Pricing

Pay-per-event — you only pay for **successful** post creations. Failed runs (auth errors, validation errors, subreddit-rule rejections, network timeouts) are not charged.

| Event | Trigger | Price (per 1,000) |
|-------|---------|--------------------|
| `post-created-text` | Successful text post | **$30** |
| `post-created-link` | Successful link post | **$30** |
| `post-created-crosspost` | Successful crosspost | **$30** |
| `post-created-poll` | Successful poll post | **$30** |
| `post-created-image` | Successful single-image post | **$40** |
| `post-created-gif` | Successful GIF post | **$40** |
| `post-created-gallery` | Successful gallery post (any number of images) | **$50** |
| `post-created-video` | Successful video post | **$60** |
| `result` | Each row pushed to the dataset (success or failure) | **$0.01** |

Heavier media types cost more because they involve a longer end-to-end pipeline — upload, processing, and asset readiness checks against Reddit. Light text/link posts complete in seconds and are priced accordingly.

You'll see each line item on your Apify usage statement under its event name (e.g. `post-created-image`).

***

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

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

Pick the kind of post to create. Each post type has its own dedicated section below — only fill the one matching your choice. The 'Reddit credentials' section at the bottom is shared by all types.

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

Target subreddit (name only, with or without 'r/').

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

Post title (max 300 characters).

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

Body text — **Reddit markdown supported** (`**bold**`, `*italic*`, `> quote`, `[link](url)`, `- bullet`). Leave blank for a title-only post.

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

Flair template ID. Leave blank for no flair.

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

Flair display text. Leave blank for no flair.

## `text_is_nsfw` (type: `boolean`):

Mark post as Not Safe For Work.

## `text_is_spoiler` (type: `boolean`):

Mark post as containing spoilers.

## `text_sendreplies` (type: `boolean`):

Send inbox notifications when someone replies to this post.

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

Target subreddit (name only, with or without 'r/').

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

Post title (max 300 characters).

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

Outbound URL to post.

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

Optional post body text shown below the link — Reddit markdown supported. Stored only on link posts that the subreddit accepts as rich/media posts; classic link-only subreddits will silently ignore it.

## `link_resubmit` (type: `boolean`):

Allow re-submitting a URL already posted to this subreddit.

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

Flair template ID. Leave blank for no flair.

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

Flair display text. Leave blank for no flair.

## `link_is_nsfw` (type: `boolean`):

Mark post as Not Safe For Work.

## `link_is_spoiler` (type: `boolean`):

Mark post as containing spoilers.

## `link_sendreplies` (type: `boolean`):

Send inbox notifications when someone replies to this post.

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

Target subreddit (name only, with or without 'r/').

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

Post title (max 300 characters).

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

URL of the image (jpg/png/gif). RedCrawler will download it from your URL and upload it to Reddit.

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

Optional post body text shown below the image — Reddit markdown supported.

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

Flair template ID. Leave blank for no flair.

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

Flair display text. Leave blank for no flair.

## `image_is_nsfw` (type: `boolean`):

Mark post as Not Safe For Work.

## `image_is_spoiler` (type: `boolean`):

Mark post as containing spoilers.

## `image_sendreplies` (type: `boolean`):

Send inbox notifications when someone replies to this post.

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

Target subreddit (name only, with or without 'r/').

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

Post title (max 300 characters).

## `gallery_items` (type: `array`):

List of 2–20 publicly reachable image URLs (.jpg / .png / .gif). One URL per row. RedCrawler downloads each image and uploads it to Reddit on your behalf.

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

Optional post body text shown above the gallery — Reddit markdown supported.

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

Flair template ID. Leave blank for no flair.

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

Flair display text. Leave blank for no flair.

## `gallery_is_nsfw` (type: `boolean`):

Mark post as Not Safe For Work.

## `gallery_is_spoiler` (type: `boolean`):

Mark post as containing spoilers.

## `gallery_sendreplies` (type: `boolean`):

Send inbox notifications when someone replies to this post.

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

Target subreddit (name only, with or without 'r/').

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

Post title (max 300 characters).

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

URL of the video file (.mp4, .mov, etc).

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

Optional thumbnail image URL. If omitted, RedCrawler auto-extracts a frame.

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

Optional post body text shown below the video — Reddit markdown supported.

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

Flair template ID. Leave blank for no flair.

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

Flair display text. Leave blank for no flair.

## `video_is_nsfw` (type: `boolean`):

Mark post as Not Safe For Work.

## `video_is_spoiler` (type: `boolean`):

Mark post as containing spoilers.

## `video_sendreplies` (type: `boolean`):

Send inbox notifications when someone replies to this post.

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

Target subreddit (name only, with or without 'r/').

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

Post title (max 300 characters).

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

URL of the .gif file.

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

Optional post body text shown below the GIF — Reddit markdown supported.

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

Flair template ID. Leave blank for no flair.

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

Flair display text. Leave blank for no flair.

## `gif_is_nsfw` (type: `boolean`):

Mark post as Not Safe For Work.

## `gif_is_spoiler` (type: `boolean`):

Mark post as containing spoilers.

## `gif_sendreplies` (type: `boolean`):

Send inbox notifications when someone replies to this post.

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

Target subreddit (name only, with or without 'r/').

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

Post title (max 300 characters).

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

URL of the post you want to crosspost.

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

Optional comment text shown above the crossposted source post — Reddit markdown supported.

## `crosspost_is_nsfw` (type: `boolean`):

Mark post as Not Safe For Work.

## `crosspost_is_spoiler` (type: `boolean`):

Mark post as containing spoilers.

## `crosspost_sendreplies` (type: `boolean`):

Send inbox notifications when someone replies to this post.

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

Target subreddit (name only, with or without 'r/').

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

Post title (max 300 characters).

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

2–6 poll options, one per entry.

## `poll_duration_days` (type: `integer`):

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

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

Optional post body text shown above the poll — Reddit markdown supported.

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

Flair template ID. Leave blank for no flair.

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

Flair display text. Leave blank for no flair.

## `poll_is_nsfw` (type: `boolean`):

Mark post as Not Safe For Work.

## `poll_is_spoiler` (type: `boolean`):

Mark post as containing spoilers.

## `poll_sendreplies` (type: `boolean`):

Send inbox notifications when someone replies to this post.

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

Pick which authentication path this run uses. **Use saved account (vault)** loads your stored Token V2 + proxy from the **reddit-vault** actor (auto-refreshed if you saved a Reddit Session) — only the 'Saved account name' field below is used; Token V2 + proxy are ignored. **Paste Token V2 + proxy** uses the values you paste below — the 'Saved account name' field is ignored.

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

The name you used in the **reddit-vault** actor when you stored this account. Your 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 originally minted the Token V2. Ignored when 'Credential source' = vault.

## Actor input object example

```json
{
  "post_type": "text",
  "text_subreddit": "test",
  "text_is_nsfw": false,
  "text_is_spoiler": false,
  "text_sendreplies": true,
  "link_resubmit": true,
  "link_is_nsfw": false,
  "link_is_spoiler": false,
  "link_sendreplies": true,
  "image_is_nsfw": false,
  "image_is_spoiler": false,
  "image_sendreplies": true,
  "gallery_items": [
    "https://example.com/photo-1.jpg",
    "https://example.com/photo-2.jpg"
  ],
  "gallery_is_nsfw": false,
  "gallery_is_spoiler": false,
  "gallery_sendreplies": true,
  "video_is_nsfw": false,
  "video_is_spoiler": false,
  "video_sendreplies": true,
  "gif_is_nsfw": false,
  "gif_is_spoiler": false,
  "gif_sendreplies": true,
  "crosspost_is_nsfw": false,
  "crosspost_is_spoiler": false,
  "crosspost_sendreplies": true,
  "poll_options": [
    "Option A",
    "Option B"
  ],
  "poll_duration_days": 3,
  "poll_is_nsfw": false,
  "poll_is_spoiler": false,
  "poll_sendreplies": true,
  "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 = {
    "text_subreddit": "test",
    "gallery_items": [
        "https://example.com/photo-1.jpg",
        "https://example.com/photo-2.jpg"
    ],
    "poll_options": [
        "Option A",
        "Option B"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("red_crawler/reddit-posting-v1").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 = {
    "text_subreddit": "test",
    "gallery_items": [
        "https://example.com/photo-1.jpg",
        "https://example.com/photo-2.jpg",
    ],
    "poll_options": [
        "Option A",
        "Option B",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("red_crawler/reddit-posting-v1").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 '{
  "text_subreddit": "test",
  "gallery_items": [
    "https://example.com/photo-1.jpg",
    "https://example.com/photo-2.jpg"
  ],
  "poll_options": [
    "Option A",
    "Option B"
  ]
}' |
apify call red_crawler/reddit-posting-v1 --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Reddit Posting V1 — Create Post (8 types)",
        "description": "By using this Reddit poster, you can create any Reddit post  — text, link, image, gallery, video, GIF, crosspost, or poll — in any subreddit. Pick a post type, fill the matching fields. Bring your Reddit OAuth bearer + matching proxy.",
        "version": "0.21",
        "x-build-id": "bmoepKfKEfP646ix6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/red_crawler~reddit-posting-v1/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-red_crawler-reddit-posting-v1",
                "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-v1/runs": {
            "post": {
                "operationId": "runs-sync-red_crawler-reddit-posting-v1",
                "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-v1/run-sync": {
            "post": {
                "operationId": "run-sync-red_crawler-reddit-posting-v1",
                "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": [
                    "post_type",
                    "credentialSource"
                ],
                "properties": {
                    "post_type": {
                        "title": "Post type",
                        "enum": [
                            "text",
                            "link",
                            "image",
                            "gallery",
                            "video",
                            "gif",
                            "crosspost",
                            "poll"
                        ],
                        "type": "string",
                        "description": "Pick the kind of post to create. Each post type has its own dedicated section below — only fill the one matching your choice. The 'Reddit credentials' section at the bottom is shared by all types.",
                        "default": "text"
                    },
                    "text_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit (name only, with or without 'r/')."
                    },
                    "text_title": {
                        "title": "Post title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 characters)."
                    },
                    "text_body": {
                        "title": "Post body",
                        "type": "string",
                        "description": "Body text — **Reddit markdown supported** (`**bold**`, `*italic*`, `> quote`, `[link](url)`, `- bullet`). Leave blank for a title-only post."
                    },
                    "text_flair_id": {
                        "title": "Flair ID",
                        "type": "string",
                        "description": "Flair template ID. Leave blank for no flair."
                    },
                    "text_flair_text": {
                        "title": "Flair text",
                        "type": "string",
                        "description": "Flair display text. Leave blank for no flair."
                    },
                    "text_is_nsfw": {
                        "title": "Mark as NSFW",
                        "type": "boolean",
                        "description": "Mark post as Not Safe For Work.",
                        "default": false
                    },
                    "text_is_spoiler": {
                        "title": "Mark as spoiler",
                        "type": "boolean",
                        "description": "Mark post as containing spoilers.",
                        "default": false
                    },
                    "text_sendreplies": {
                        "title": "Send reply notifications",
                        "type": "boolean",
                        "description": "Send inbox notifications when someone replies to this post.",
                        "default": true
                    },
                    "link_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit (name only, with or without 'r/')."
                    },
                    "link_title": {
                        "title": "Post title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 characters)."
                    },
                    "link_url": {
                        "title": "Link URL",
                        "type": "string",
                        "description": "Outbound URL to post."
                    },
                    "link_body": {
                        "title": "Post body",
                        "type": "string",
                        "description": "Optional post body text shown below the link — Reddit markdown supported. Stored only on link posts that the subreddit accepts as rich/media posts; classic link-only subreddits will silently ignore it."
                    },
                    "link_resubmit": {
                        "title": "Allow resubmit",
                        "type": "boolean",
                        "description": "Allow re-submitting a URL already posted to this subreddit.",
                        "default": true
                    },
                    "link_flair_id": {
                        "title": "Flair ID",
                        "type": "string",
                        "description": "Flair template ID. Leave blank for no flair."
                    },
                    "link_flair_text": {
                        "title": "Flair text",
                        "type": "string",
                        "description": "Flair display text. Leave blank for no flair."
                    },
                    "link_is_nsfw": {
                        "title": "Mark as NSFW",
                        "type": "boolean",
                        "description": "Mark post as Not Safe For Work.",
                        "default": false
                    },
                    "link_is_spoiler": {
                        "title": "Mark as spoiler",
                        "type": "boolean",
                        "description": "Mark post as containing spoilers.",
                        "default": false
                    },
                    "link_sendreplies": {
                        "title": "Send reply notifications",
                        "type": "boolean",
                        "description": "Send inbox notifications when someone replies to this post.",
                        "default": true
                    },
                    "image_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit (name only, with or without 'r/')."
                    },
                    "image_title": {
                        "title": "Post title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 characters)."
                    },
                    "image_url": {
                        "title": "Image URL",
                        "type": "string",
                        "description": "URL of the image (jpg/png/gif). RedCrawler will download it from your URL and upload it to Reddit."
                    },
                    "image_body": {
                        "title": "Post body",
                        "type": "string",
                        "description": "Optional post body text shown below the image — Reddit markdown supported."
                    },
                    "image_flair_id": {
                        "title": "Flair ID",
                        "type": "string",
                        "description": "Flair template ID. Leave blank for no flair."
                    },
                    "image_flair_text": {
                        "title": "Flair text",
                        "type": "string",
                        "description": "Flair display text. Leave blank for no flair."
                    },
                    "image_is_nsfw": {
                        "title": "Mark as NSFW",
                        "type": "boolean",
                        "description": "Mark post as Not Safe For Work.",
                        "default": false
                    },
                    "image_is_spoiler": {
                        "title": "Mark as spoiler",
                        "type": "boolean",
                        "description": "Mark post as containing spoilers.",
                        "default": false
                    },
                    "image_sendreplies": {
                        "title": "Send reply notifications",
                        "type": "boolean",
                        "description": "Send inbox notifications when someone replies to this post.",
                        "default": true
                    },
                    "gallery_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit (name only, with or without 'r/')."
                    },
                    "gallery_title": {
                        "title": "Post title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 characters)."
                    },
                    "gallery_items": {
                        "title": "Gallery images (2–20)",
                        "type": "array",
                        "description": "List of 2–20 publicly reachable image URLs (.jpg / .png / .gif). One URL per row. RedCrawler downloads each image and uploads it to Reddit on your behalf.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "gallery_body": {
                        "title": "Post body",
                        "type": "string",
                        "description": "Optional post body text shown above the gallery — Reddit markdown supported."
                    },
                    "gallery_flair_id": {
                        "title": "Flair ID",
                        "type": "string",
                        "description": "Flair template ID. Leave blank for no flair."
                    },
                    "gallery_flair_text": {
                        "title": "Flair text",
                        "type": "string",
                        "description": "Flair display text. Leave blank for no flair."
                    },
                    "gallery_is_nsfw": {
                        "title": "Mark as NSFW",
                        "type": "boolean",
                        "description": "Mark post as Not Safe For Work.",
                        "default": false
                    },
                    "gallery_is_spoiler": {
                        "title": "Mark as spoiler",
                        "type": "boolean",
                        "description": "Mark post as containing spoilers.",
                        "default": false
                    },
                    "gallery_sendreplies": {
                        "title": "Send reply notifications",
                        "type": "boolean",
                        "description": "Send inbox notifications when someone replies to this post.",
                        "default": true
                    },
                    "video_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit (name only, with or without 'r/')."
                    },
                    "video_title": {
                        "title": "Post title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 characters)."
                    },
                    "video_url": {
                        "title": "Video URL",
                        "type": "string",
                        "description": "URL of the video file (.mp4, .mov, etc)."
                    },
                    "video_thumbnail_url": {
                        "title": "Thumbnail URL (optional)",
                        "type": "string",
                        "description": "Optional thumbnail image URL. If omitted, RedCrawler auto-extracts a frame."
                    },
                    "video_body": {
                        "title": "Post body",
                        "type": "string",
                        "description": "Optional post body text shown below the video — Reddit markdown supported."
                    },
                    "video_flair_id": {
                        "title": "Flair ID",
                        "type": "string",
                        "description": "Flair template ID. Leave blank for no flair."
                    },
                    "video_flair_text": {
                        "title": "Flair text",
                        "type": "string",
                        "description": "Flair display text. Leave blank for no flair."
                    },
                    "video_is_nsfw": {
                        "title": "Mark as NSFW",
                        "type": "boolean",
                        "description": "Mark post as Not Safe For Work.",
                        "default": false
                    },
                    "video_is_spoiler": {
                        "title": "Mark as spoiler",
                        "type": "boolean",
                        "description": "Mark post as containing spoilers.",
                        "default": false
                    },
                    "video_sendreplies": {
                        "title": "Send reply notifications",
                        "type": "boolean",
                        "description": "Send inbox notifications when someone replies to this post.",
                        "default": true
                    },
                    "gif_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit (name only, with or without 'r/')."
                    },
                    "gif_title": {
                        "title": "Post title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 characters)."
                    },
                    "gif_url": {
                        "title": "GIF URL",
                        "type": "string",
                        "description": "URL of the .gif file."
                    },
                    "gif_body": {
                        "title": "Post body",
                        "type": "string",
                        "description": "Optional post body text shown below the GIF — Reddit markdown supported."
                    },
                    "gif_flair_id": {
                        "title": "Flair ID",
                        "type": "string",
                        "description": "Flair template ID. Leave blank for no flair."
                    },
                    "gif_flair_text": {
                        "title": "Flair text",
                        "type": "string",
                        "description": "Flair display text. Leave blank for no flair."
                    },
                    "gif_is_nsfw": {
                        "title": "Mark as NSFW",
                        "type": "boolean",
                        "description": "Mark post as Not Safe For Work.",
                        "default": false
                    },
                    "gif_is_spoiler": {
                        "title": "Mark as spoiler",
                        "type": "boolean",
                        "description": "Mark post as containing spoilers.",
                        "default": false
                    },
                    "gif_sendreplies": {
                        "title": "Send reply notifications",
                        "type": "boolean",
                        "description": "Send inbox notifications when someone replies to this post.",
                        "default": true
                    },
                    "crosspost_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit (name only, with or without 'r/')."
                    },
                    "crosspost_title": {
                        "title": "Post title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 characters)."
                    },
                    "crosspost_source_post_url": {
                        "title": "Source post URL",
                        "type": "string",
                        "description": "URL of the post you want to crosspost."
                    },
                    "crosspost_body": {
                        "title": "Post body",
                        "type": "string",
                        "description": "Optional comment text shown above the crossposted source post — Reddit markdown supported."
                    },
                    "crosspost_is_nsfw": {
                        "title": "Mark as NSFW",
                        "type": "boolean",
                        "description": "Mark post as Not Safe For Work.",
                        "default": false
                    },
                    "crosspost_is_spoiler": {
                        "title": "Mark as spoiler",
                        "type": "boolean",
                        "description": "Mark post as containing spoilers.",
                        "default": false
                    },
                    "crosspost_sendreplies": {
                        "title": "Send reply notifications",
                        "type": "boolean",
                        "description": "Send inbox notifications when someone replies to this post.",
                        "default": true
                    },
                    "poll_subreddit": {
                        "title": "Subreddit",
                        "type": "string",
                        "description": "Target subreddit (name only, with or without 'r/')."
                    },
                    "poll_title": {
                        "title": "Post title",
                        "maxLength": 300,
                        "type": "string",
                        "description": "Post title (max 300 characters)."
                    },
                    "poll_options": {
                        "title": "Poll options (2–6)",
                        "type": "array",
                        "description": "2–6 poll options, one per entry.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "poll_duration_days": {
                        "title": "Poll duration (days)",
                        "minimum": 1,
                        "maximum": 7,
                        "type": "integer",
                        "description": "How long the poll stays open (1–7 days).",
                        "default": 3
                    },
                    "poll_body": {
                        "title": "Post body",
                        "type": "string",
                        "description": "Optional post body text shown above the poll — Reddit markdown supported."
                    },
                    "poll_flair_id": {
                        "title": "Flair ID",
                        "type": "string",
                        "description": "Flair template ID. Leave blank for no flair."
                    },
                    "poll_flair_text": {
                        "title": "Flair text",
                        "type": "string",
                        "description": "Flair display text. Leave blank for no flair."
                    },
                    "poll_is_nsfw": {
                        "title": "Mark as NSFW",
                        "type": "boolean",
                        "description": "Mark post as Not Safe For Work.",
                        "default": false
                    },
                    "poll_is_spoiler": {
                        "title": "Mark as spoiler",
                        "type": "boolean",
                        "description": "Mark post as containing spoilers.",
                        "default": false
                    },
                    "poll_sendreplies": {
                        "title": "Send reply notifications",
                        "type": "boolean",
                        "description": "Send inbox notifications when someone replies to this post.",
                        "default": true
                    },
                    "credentialSource": {
                        "title": "Credential source",
                        "enum": [
                            "vault",
                            "manual"
                        ],
                        "type": "string",
                        "description": "Pick which authentication path this run uses. **Use saved account (vault)** loads your stored Token V2 + proxy from the **reddit-vault** actor (auto-refreshed if you saved a Reddit Session) — only the 'Saved account name' field below is used; Token V2 + proxy are ignored. **Paste Token V2 + proxy** uses the values you paste below — the 'Saved account name' field is ignored.",
                        "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. Your 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 originally 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
