Paste a Reddit thread and get the post with its top 25 comments in one request, billed as one page. No Reddit API key, no approval, and a page that fails to load costs nothing.
1,000 free requests · Pay only on success · 195+ countries · Claude ready
Ready for your own threads? Get an API key or book a demo.
Tell us a little about your team and get:
A Reddit thread page holds the post and its top 25 comments, and Web Unlocker bills it as one page. Reddit comment scrapers on Apify bill the post and every comment as rows of their own.
One page, 25 comments.
Four pages, 100 comments.
Open the same thread sorted by best, new, top and old: each order is one more page with 25 other comments. A comment's own page brings its replies.
What 1,000 threads with 25 comments each cost
1,000 posts and 25,000 comments, at published prices
The three most used Reddit scrapers on Apify bill each post and each comment as a row, 26,000 rows on the Free plan.
Reddit's public API closes by March 2027, and Reddit scrapers bill every comment. Here is what each route of Reddit scraping takes for the same 1,000 threads.
| What it takes | Reddit Data API | Apify | Bright Data | |
|---|---|---|---|---|
| Start without Reddit's approval | Yes | No | Yes | Yes |
| You pay for | A page | An API call | Each post and comment | Each record |
| 1,000 threads with 25 comments | $0.98 | By contract only | $15.53 to $104 | $1.50 per 1,000 records |
| The whole page in HTML or Markdown | Yes | No | No | No |
| Free to start for business | Yes | No | Yes | Yes |
Scraping more than Reddit? Web Unlocker returns any page the same way, at the same price.
Web Unlocker has no alerts of its own. Your script asks for a subreddit's newest posts as often as you like, and each check is one page: 96 checks a day come to $2.82 a month.
Syften alerts start at $29.95 a month.
Your own check costs $0.001.
A plain request to a subreddit comes back empty, because Reddit draws its posts in the browser. Web Unlocker loads the page in a real browser and returns it with all 27 posts.
Fill in the form above. The key arrives by email within one business day.
A thread for comments, a subreddit sorted by new for fresh posts, or a search for your keyword.
Every post and comment on the page carries its author, score, time and text.
pip install requestsGOLOGIN_SCRAPING_API_KEY=your_key python reddit_thread.pyhttps://parsing.webunlocker.gologin.com/v1/scrapeimport html as entities
import json
import os
import re
import time
import requests
thread = "https://www.reddit.com/r/marketing/comments/1x6ko90/why_the_marketing_department_is_about_to_disappear/"
def scrape(url):
for attempt in range(3):
response = requests.get(
"https://parsing.webunlocker.gologin.com/v1/scrape",
params={"url": url, "geo": "us", "format": "json"},
headers={"apikey": os.environ["GOLOGIN_SCRAPING_API_KEY"]},
timeout=90,
)
page = response.json().get("data", {}).get("html", "") if response.ok else ""
if "<shreddit-comment" in page:
return page
time.sleep(5)
raise RuntimeError("No comments came back, try again later")
def attr(tag, name):
match = re.search(rf'\s{name}="([^"]*)"', tag)
return entities.unescape(match.group(1)) if match else None
def text(page, element_id):
start = page.find(f'id="{element_id}"')
end = page.find("</div>", start)
paragraphs = re.findall(r"<p>(.*?)</p>", page[start:end], re.S)
return "\n".join(entities.unescape(re.sub(r"<[^>]+>|\s+", " ", p)).strip() for p in paragraphs)
page = scrape(thread)
post = re.search(r"<shreddit-post\b[^>]*>", page).group(0)
comments = {}
for tag in re.findall(r'<shreddit-comment\b[^>]*thingid="t1_[^>]*>', page):
comment_id = attr(tag, "thingid")
comments[comment_id] = {
"author": attr(tag, "author"),
"score": attr(tag, "score"),
"depth": attr(tag, "depth"),
"text": text(page, f"{comment_id}-comment-rtjson-content"),
}
print(json.dumps({
"title": attr(post, "post-title"),
"score": attr(post, "score"),
"upvote_ratio": attr(post, "upvote-ratio"),
"comments_on_reddit": attr(post, "comment-count"),
"comments": list(comments.values()),
}, indent=2, ensure_ascii=False))GOLOGIN_SCRAPING_API_KEY=your_key node reddit-watch.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeconst subreddit = 'SaaS';
const keywords = ['marketing', 'pricing', 'launch'];
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const params = new URLSearchParams({ url, render_js: 'true', wait: '5000', geo: 'us', format: 'json' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const page = response.ok ? (await response.json()).data?.html : '';
if (page?.includes('<shreddit-post')) return page;
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error('No posts came back, try again later');
}
const page = await scrape(`https://www.reddit.com/r/${subreddit}/new/`);
const attr = (tag, name) => tag.match(new RegExp(`\\s${name}="([^"]*)"`))?.[1]?.replaceAll('&', '&').replaceAll(''', "'").replaceAll('"', '"');
const posts = new Map();
for (const [tag] of page.matchAll(/<shreddit-post\b[^>]*post-title=[^>]*>/g)) {
posts.set(attr(tag, 'permalink'), {
title: attr(tag, 'post-title'),
posted: attr(tag, 'created-timestamp'),
comments: attr(tag, 'comment-count'),
url: `https://www.reddit.com${attr(tag, 'permalink')}`,
});
}
const mentions = [...posts.values()].filter((post) => keywords.some((word) => post.title.toLowerCase().includes(word)));
console.log(`${posts.size} new posts in r/${subreddit}, ${mentions.length} mention your keywords`);
console.table(mentions);GOLOGIN_SCRAPING_API_KEY=your_key node reddit-markdown.mjshttps://parsing.webunlocker.gologin.com/v1/scrapeimport { writeFileSync } from 'node:fs';
const thread = 'https://www.reddit.com/r/marketing/comments/1x6ko90/why_the_marketing_department_is_about_to_disappear/';
async function scrape(url) {
for (let attempt = 1; attempt <= 3; attempt++) {
const params = new URLSearchParams({ url, geo: 'us', format: 'markdown' });
const response = await fetch(`https://parsing.webunlocker.gologin.com/v1/scrape?${params}`, {
headers: { apikey: process.env.GOLOGIN_SCRAPING_API_KEY },
});
const markdown = response.ok ? await response.text() : '';
if (markdown.includes('# Comments Section')) return markdown;
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error('No comments came back, try again later');
}
const markdown = await scrape(thread);
const comments = markdown.slice(markdown.indexOf('# Comments Section'));
writeFileSync('thread.md', comments);
console.log(`thread.md: ${Math.round(comments.length / 1024)} KB of comments, ready for your model`);
console.log(comments.slice(0, 600));Ready to run it on your own threads? Get your API key and free requests.
Web Unlocker brings the top 25 comments of a page. Cloud Browser opens Reddit in a real browser and keeps clicking: 286 comments, five levels deep, in 95 seconds.
It clicks every "more replies" for you: 286 comments in 95 seconds, on a thread where one page holds 25.
It scrolls a subreddit the way a person does: 576 posts in 90 seconds, back to February.
The profile keeps its session, so Reddit opens straight away on every next run. Residential IPs included.
Run it from Playwright, Puppeteer or Claude. See Cloud Browser.
One account, one proxy network, one ecosystem. Pick the product the job needs.
Scraping stores too? See the Amazon, eBay and Walmart scrapers, or every web scraping tool.
Send the Reddit page address to Web Unlocker: a thread, a subreddit or a search. It opens the page in a real browser and returns it, with the author, score, time and text of every post and comment on it. The code above does exactly that.
Scrape the thread page: it holds the post and its top 25 comments, billed as one page. Sort the thread by new, top or old for 25 more each time, or open any comment's own page for its replies.
Send the thread address to Web Unlocker with the requests library and read the comments from the page. The Python tab above is a complete script, tested on the live API.
Yes. Threads, subreddits and search are public pages that load without a login. Web Unlocker returns them the way a visitor's browser sees them, with no Reddit API key and no approval. The old .json addresses and old Reddit now ask you to sign in, the regular reddit.com pages do not.
Free only for registered non-commercial apps. Commercial use needs Reddit's approval and a contract. Reddit does not publish its price: the last rate made public, in 2023, was $12,000 for 50 million calls.
Apps without a Reddit registration lose API access from January 12, 2027, and public API access ends by March 2027. Reddit pages stay public, and Web Unlocker reads the pages.
Nothing official. Archives that copy Reddit catch posts later and miss the latest votes. Web Unlocker reads Reddit itself, so a post shows its score at the moment you scrape it.
Yes, page by page: each page lists about 25 posts, and the next page is one more request at the same price. Reddit stops any listing at about 1,000 posts, so for more, slice by search terms or time.
Yes. Send the reddit.com/search address with your keyword, sorted by new or top, for posts or for comments, and page through the results.
Web Unlocker returns the page, not a table, so nothing is cut before you see it. Turning it into a CSV takes a few lines of code, or one prompt: hand the page to Claude with the Gologin scraping skill and ask for a CSV.
Under $1 per 1,000 pages, and the same for every page. A thread with its top 25 comments is one page, so 1,000 threads cost about $1. A page that fails to load costs nothing. Plans start at $49 a month for 50,000 requests.
Yes, to start: Web Unlocker comes with 1,000 free requests, enough for 1,000 threads with their top comments.
It depends on what you need. Apify and Bright Data sell ready rows and bill every post and every comment. Web Unlocker returns the whole Reddit page at one price, so the comments come with the thread and you parse them your way.
Threads, subreddits and search are public pages that load without a login. Web Unlocker loads them the way a visitor's browser does and returns the page. What you collect and how you use it is your call, so check it against the rules that apply to your project.
Tell us a little about your team and get: