Reddit Posting V2 — Text/Link/Image/Gallery/Video/Poll/Cross avatar

Reddit Posting V2 — Text/Link/Image/Gallery/Video/Poll/Cross

Pricing

$1.99 / 1,000 results

Go to Apify Store
Reddit Posting V2 — Text/Link/Image/Gallery/Video/Poll/Cross

Reddit Posting V2 — Text/Link/Image/Gallery/Video/Poll/Cross

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.

Pricing

$1.99 / 1,000 results

Rating

0.0

(0)

Developer

Red Crawler

Red Crawler

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Reddit Posting V2

Endpoints Auth Proxy Pricing

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

{
"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)

{
"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

{
"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)

{
"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

{
"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)

{
"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)

{
"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)

{
"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

{
"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)

{
"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)

{
"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)

{
"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)

{
"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)

{
"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

CredentialLifetimeWhen to refresh
Token V2 (token_v2 cookie)~24 hoursDaily — or save a Reddit Session in the vault and let it auto-refresh
Reddit Session (reddit_session cookie)~180 daysRoughly 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

Reddit Session cookie in DevTools

You have two options:

  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

{
"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

{
"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_kindWhat it meansFix
URL has already been submitted (link post)Someone already posted that URL to that subredditPick a different URL or sub
SUBREDDIT_NOTALLOWEDSub doesn't allow this post type, or your account has too little karma / agePick a different sub, or read r/{sub}'s posting rules
RATELIMIT / you are doing that too muchReddit's per-account post throttle (often 9 minutes between posts on new accounts)Wait, then re-run
BAD_FLAIR_TEMPLATE_IDFlair ID doesn't exist on this subDrop the flair fields, or fetch the right ID via the Reddit Flairs V2 actor
bearer_expiredYour Token V2 expired (24-hour lifetime)Refresh the vault entry, or paste a fresh Token V2 in manual mode
Bearer minted on a different IPThe Token V2's binding IP doesn't match the supplied proxyRe-mint the Token V2 on the proxy you'll use, save both together
failed to resolve image_url / failed to resolve video_urlMedia URL not publicly reachableUse a CDN URL the actor can GET without auth
crossposting is not enabled in this communitySource sub disables crosspostingPick 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.

EventTriggerPrice (per 1,000)
resultEach 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)

StatusApify messageMeaningWhat to do
Succeeded"Actor succeeded with N results in the dataset"Run finished. Some or zero records pushed.Open the dataset to view results.
Failed"The Actor process failed…"Validation error or upstream Reddit fault.Check the run log. You are NOT charged for failed runs.
Timed out"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.
Aborted"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)

ConditionCauseResult
RATELIMIT from RedditPer-account write throttle hit.Run SUCCEEDED, failure row with error_kind: RATELIMIT.
Bearer expired / invalidSaved Token V2 past 24 h, no vault Reddit Session for refresh.Run SUCCEEDED, failure row, no Reddit call made.
Bearer minted on a different IPSaved Token V2's IP doesn't match the saved proxy.Run SUCCEEDED, failure row.
SUBREDDIT_NOTALLOWEDAccount is banned, muted, or restricted in the subreddit.Run SUCCEEDED, failure row.
NO_TEXT / MISSING_TITLERequired post body or title missing.Run SUCCEEDED, failure row with error_kind.
Media upload failedImage / video upload rejected by Reddit.Run SUCCEEDED, failure row.
Validation error: missing required fieldRequired input not provided.Run FAILED immediately, no charge.

Companion actors

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.