STRUCTURED DATA API

Reddit Scraper API

A Reddit scraper you call over HTTP: send a post, subreddit or user URL to /data and get the post with its nested comment tree, a subreddit's front page, or a user's karma and activity back as JSON. No Reddit API key or OAuth app. Flat 50 credits per page.

2,000 free API credits · No credit card required

Scrape Reddit posts, comments, subreddits and users

Send the page's normal URL to /data. The page type is detected from the URL, and the response tells you which one it was in request_parameters.type.

Post

type: "post"

Title, body, author, score, upvote ratio, comment count, flair, media and flags, plus the comment tree with replies nested (up to 200 comments).

reddit.com/r/sub/comments/POST_ID/slug redd.it/POST_ID old.reddit.com/r/sub/comments/POST_ID

Subreddit

type: "subreddit"

Name, title, descriptions, subscribers, creation date, type and artwork, plus the first 25 posts of its feed (Reddit's default Hot order) and a cursor for the next page.

reddit.com/r/sub old.reddit.com/r/sub

User

type: "user"

Link, comment and total karma, account age, flags, avatar, followers and profile description, plus the user's latest 25 posts and comments.

reddit.com/user/name reddit.com/u/name
These URLs return a 400 that isn't charged, with a message listing what is supported: share links (reddit.com/r/sub/s/…), search, and r/all, r/popular and the home feed. More page types and sites are added over time, so don't validate URLs on your side — send the URL and handle the 400.

How to scrape Reddit with one API call

No selectors, proxies, or headless browser to run. The page-scraping options (js, proxy, headers…) don't apply; country picks the proxy country (default us).

curl -G "https://api.webscraping.ai/data" \
  --data-urlencode "api_key=YOUR_API_KEY" \
  --data-urlencode "url=https://www.reddit.com/r/webscraping/"
# Response (excerpt):
# {
#   "request_parameters": {"url": "https://www.reddit.com/r/webscraping/",
#                          "provider": "reddit", "type": "subreddit"},
#   "parse_status": "ok",
#   "data": {
#     "subreddit": {"name": "webscraping", "title": "...", "subscribers": 80000,
#                   "subreddit_type": "public", "url": "https://www.reddit.com/r/webscraping/", ...},
#     "posts": [
#       {"id": "...", "title": "...", "author": "...", "score": 42,
#        "upvote_ratio": 0.95, "num_comments": 17, "link_flair_text": "...",
#        "permalink": "https://www.reddit.com/r/webscraping/comments/.../",
#        "created_at": "2026-09-25T14:03:11.000Z", ...},
#       ...
#     ],
#     "next_cursor": "t3_..."
#   }
# }
# pip install webscraping_ai
# https://pypi.org/project/webscraping-ai/
from webscraping_ai import Client

client = Client(api_key="YOUR_API_KEY")
result = client.data("https://www.reddit.com/r/webscraping/")
print(result["request_parameters"]["provider"], result["parse_status"])
print(result["data"])
# Response (excerpt):
# {
#   "request_parameters": {"url": "https://www.reddit.com/r/webscraping/",
#                          "provider": "reddit", "type": "subreddit"},
#   "parse_status": "ok",
#   "data": {
#     "subreddit": {"name": "webscraping", "title": "...", "subscribers": 80000,
#                   "subreddit_type": "public", "url": "https://www.reddit.com/r/webscraping/", ...},
#     "posts": [
#       {"id": "...", "title": "...", "author": "...", "score": 42,
#        "upvote_ratio": 0.95, "num_comments": 17, "link_flair_text": "...",
#        "permalink": "https://www.reddit.com/r/webscraping/comments/.../",
#        "created_at": "2026-09-25T14:03:11.000Z", ...},
#       ...
#     ],
#     "next_cursor": "t3_..."
#   }
# }
// npm install webscraping-ai
// https://www.npmjs.com/package/webscraping-ai
import { WebScrapingAI } from 'webscraping-ai';

const client = new WebScrapingAI({ apiKey: 'YOUR_API_KEY' });
const result = await client.data({ url: 'https://www.reddit.com/r/webscraping/' });
console.log(result.request_parameters.provider, result.parse_status);
console.log(result.data);
// Response (excerpt):
// {
//   "request_parameters": {"url": "https://www.reddit.com/r/webscraping/",
//                          "provider": "reddit", "type": "subreddit"},
//   "parse_status": "ok",
//   "data": {
//     "subreddit": {"name": "webscraping", "title": "...", "subscribers": 80000,
//                   "subreddit_type": "public", "url": "https://www.reddit.com/r/webscraping/", ...},
//     "posts": [
//       {"id": "...", "title": "...", "author": "...", "score": 42,
//        "upvote_ratio": 0.95, "num_comments": 17, "link_flair_text": "...",
//        "permalink": "https://www.reddit.com/r/webscraping/comments/.../",
//        "created_at": "2026-09-25T14:03:11.000Z", ...},
//       ...
//     ],
//     "next_cursor": "t3_..."
//   }
// }
<?php
// composer require webscraping-ai/webscraping-ai-php
// https://packagist.org/packages/webscraping-ai/webscraping-ai-php
require 'vendor/autoload.php';

use WebScrapingAI\Client;

$client = new Client('YOUR_API_KEY');
$result = $client->data(url: 'https://www.reddit.com/r/webscraping/');
echo $result['request_parameters']['provider'], ' ', $result['parse_status'], "\n";
print_r($result['data']);
// Response (excerpt):
// {
//   "request_parameters": {"url": "https://www.reddit.com/r/webscraping/",
//                          "provider": "reddit", "type": "subreddit"},
//   "parse_status": "ok",
//   "data": {
//     "subreddit": {"name": "webscraping", "title": "...", "subscribers": 80000,
//                   "subreddit_type": "public", "url": "https://www.reddit.com/r/webscraping/", ...},
//     "posts": [
//       {"id": "...", "title": "...", "author": "...", "score": 42,
//        "upvote_ratio": 0.95, "num_comments": 17, "link_flair_text": "...",
//        "permalink": "https://www.reddit.com/r/webscraping/comments/.../",
//        "created_at": "2026-09-25T14:03:11.000Z", ...},
//       ...
//     ],
//     "next_cursor": "t3_..."
//   }
// }
# gem install webscraping_ai
# https://rubygems.org/gems/webscraping_ai
require 'webscraping_ai'

client = WebScrapingAI::Client.new(api_key: 'YOUR_API_KEY')
result = client.data('https://www.reddit.com/r/webscraping/')
puts "#{result['request_parameters']['provider']} #{result['parse_status']}"
puts result['data'].inspect
# Response (excerpt):
# {
#   "request_parameters": {"url": "https://www.reddit.com/r/webscraping/",
#                          "provider": "reddit", "type": "subreddit"},
#   "parse_status": "ok",
#   "data": {
#     "subreddit": {"name": "webscraping", "title": "...", "subscribers": 80000,
#                   "subreddit_type": "public", "url": "https://www.reddit.com/r/webscraping/", ...},
#     "posts": [
#       {"id": "...", "title": "...", "author": "...", "score": 42,
#        "upvote_ratio": 0.95, "num_comments": 17, "link_flair_text": "...",
#        "permalink": "https://www.reddit.com/r/webscraping/comments/.../",
#        "created_at": "2026-09-25T14:03:11.000Z", ...},
#       ...
#     ],
#     "next_cursor": "t3_..."
#   }
# }
// go get github.com/webscraping-ai/webscraping-ai-go/v4
// https://pkg.go.dev/github.com/webscraping-ai/webscraping-ai-go/v4
package main

import (
    "context"
    "fmt"

    webscrapingai "github.com/webscraping-ai/webscraping-ai-go/v4"
)

func main() {
    client, _ := webscrapingai.NewClient(&webscrapingai.Config{APIKey: "YOUR_API_KEY"})
    res, _ := client.Data(context.Background(), &webscrapingai.DataOptions{
        URL: "https://www.reddit.com/r/webscraping/",
    })
    fmt.Println(res.RequestParameters.Provider, res.ParseStatus)
    fmt.Println(string(res.Data)) // raw JSON; its shape depends on the provider and page type
}
// Response (excerpt):
// {
//   "request_parameters": {"url": "https://www.reddit.com/r/webscraping/",
//                          "provider": "reddit", "type": "subreddit"},
//   "parse_status": "ok",
//   "data": {
//     "subreddit": {"name": "webscraping", "title": "...", "subscribers": 80000,
//                   "subreddit_type": "public", "url": "https://www.reddit.com/r/webscraping/", ...},
//     "posts": [
//       {"id": "...", "title": "...", "author": "...", "score": 42,
//        "upvote_ratio": 0.95, "num_comments": 17, "link_flair_text": "...",
//        "permalink": "https://www.reddit.com/r/webscraping/comments/.../",
//        "created_at": "2026-09-25T14:03:11.000Z", ...},
//       ...
//     ],
//     "next_cursor": "t3_..."
//   }
// }
// Maven: ai.webscraping:webscraping-ai:4.2.0
// https://central.sonatype.com/artifact/ai.webscraping/webscraping-ai
import ai.webscraping.Client;
import ai.webscraping.Config;
import ai.webscraping.option.DataOptions;
import ai.webscraping.result.DataResult;

Client client = new Client(Config.builder().apiKey("YOUR_API_KEY").build());
DataResult result = client.data(DataOptions.builder()
    .url("https://www.reddit.com/r/webscraping/")
    .build());
System.out.println(result.getRequestParameters().getProvider() + " " + result.getParseStatus());
System.out.println(result.getData());
// Response (excerpt):
// {
//   "request_parameters": {"url": "https://www.reddit.com/r/webscraping/",
//                          "provider": "reddit", "type": "subreddit"},
//   "parse_status": "ok",
//   "data": {
//     "subreddit": {"name": "webscraping", "title": "...", "subscribers": 80000,
//                   "subreddit_type": "public", "url": "https://www.reddit.com/r/webscraping/", ...},
//     "posts": [
//       {"id": "...", "title": "...", "author": "...", "score": 42,
//        "upvote_ratio": 0.95, "num_comments": 17, "link_flair_text": "...",
//        "permalink": "https://www.reddit.com/r/webscraping/comments/.../",
//        "created_at": "2026-09-25T14:03:11.000Z", ...},
//       ...
//     ],
//     "next_cursor": "t3_..."
//   }
// }
// dotnet add package WebScrapingAI
// https://www.nuget.org/packages/WebScrapingAI
using WebScrapingAI;

var client = new WebScrapingAIClient(new WebScrapingAIClientOptions { ApiKey = "YOUR_API_KEY" });
var result = await client.DataAsync(new DataRequest {
    Url = "https://www.reddit.com/r/webscraping/",
});
Console.WriteLine($"{result.RequestParameters.Provider} {result.ParseStatus}");
Console.WriteLine(result.Data);
// Response (excerpt):
// {
//   "request_parameters": {"url": "https://www.reddit.com/r/webscraping/",
//                          "provider": "reddit", "type": "subreddit"},
//   "parse_status": "ok",
//   "data": {
//     "subreddit": {"name": "webscraping", "title": "...", "subscribers": 80000,
//                   "subreddit_type": "public", "url": "https://www.reddit.com/r/webscraping/", ...},
//     "posts": [
//       {"id": "...", "title": "...", "author": "...", "score": 42,
//        "upvote_ratio": 0.95, "num_comments": 17, "link_flair_text": "...",
//        "permalink": "https://www.reddit.com/r/webscraping/comments/.../",
//        "created_at": "2026-09-25T14:03:11.000Z", ...},
//       ...
//     ],
//     "next_cursor": "t3_..."
//   }
// }

Trimmed, and the counts are illustrative — they change constantly. Fields a page doesn't expose come back as null, though some flags come back false and lists come back empty. data can be null when parse_status is parse_failed or not_found, so check it before reading fields.

What the Reddit scraper returns

The key fields per page type. Names are snake_case across every site; the full contract is in the API reference.

type: "post"

FieldWhat it holds
id, fullname, url, permalink, title, selftextThe post; selftext is the body (selftext_html too).
author, subreddit, subreddit_subscribersWhere and who.
score, ups, upvote_ratio, num_comments, num_crosspostsEngagement.
created_utc, created_at, edited, edited_atEpoch seconds, ISO time, and when it was edited.
link_flair_text, over_18, spoiler, stickied, locked, archivedFlair and flags.
domain, post_hint, thumbnail, images, media_url, hls_url, durationLink and media details; hls_url carries video with audio.
commentsThe tree in Reddit's order: each comment has author, body, score, created_at, depth, is_submitter, more_count and its replies.
comments_returned, comments_truncated, more_comments_countHow many comments came back, whether anything was left out, and how many top-level comments were left out. Replies left out under a comment are counted in that comment's own more_count.

type: "subreddit"

FieldWhat it holds
subredditname, title, public_description, description, subscribers, created_at, over_18, subreddit_type, icon_img, banner_img.
postsThe first 25 posts of the feed in Reddit's default Hot order, with the same fields as a post (without comments).
next_cursorReddit's cursor for the next page of the feed.

type: "user"

FieldWhat it holds
id, name, url, created_atThe account.
link_karma, comment_karma, total_karmaKarma, plus awardee_karma and awarder_karma.
is_gold, is_mod, is_employee, is_suspended, verifiedAccount flags.
icon_img, snoovatar_img, followers_count, descriptionAvatar and profile.
posts, comments, next_cursorThe latest 25 items of the user's activity, split into posts and comments (with the thread title and link).

What's not included

Everything comes from what Reddit shows a logged-out visitor. That sets these limits.

Comment trees are capped at 200 comments. comments_truncated tells you something was left out; more_comments_count counts the missing top-level comments and each comment's more_count its missing replies. The rest of a large thread isn't fetched.
One page of feeds. A subreddit returns the first 25 posts in Hot order (a sort in the URL, like /top, is accepted but not applied); a user returns their latest 25 posts and comments. next_cursor is in the response, but there's no request parameter to fetch the next page with it yet.
Slower than other sites. Each Reddit request loads the page in a real browser, so expect usually 12–20 seconds, occasionally up to about 35, rather than the few seconds other sites take.
Share links aren't resolved. /r/sub/s/… links from the Reddit app return the free 400; open them once to get the full post URL.
Need a page type or site that isn't supported? /ai/fields extracts the fields you describe in plain language from any public page, and /html returns the rendered HTML for your own parser.

Flat pricing: 50 credits per page

Every supported Reddit page type costs the same, with no extra charge for proxies or retries. That's about $5.80 per 1,000 pages on the $29 plan.

Reddit costs more than the other /data sites (15 credits a page) because every Reddit page is loaded in a real browser.

PlanPriceCreditsPages
Free $0 2,000 up to 40
Personal $29/mo 250,000 up to 5,000
Plus $99/mo 1,000,000 up to 20,000
Startup $249/mo 3,000,000 up to 60,000

The free plan's 2,000 credits renew monthly. All plans, including pay-as-you-go credits.

What's charged

Unsupported URL or page type: a 400, not charged.
Page couldn't be fetched: a 500, not charged.
Charged even without data: parse_status parse_failed (the page was fetched but couldn't be parsed) and not_found (the page doesn't exist) are successful requests and cost 50 credits, like ok.

Also from the terminal, AI agents, and n8n

CLI

webscraping-ai has a data command; pass - to read URLs from stdin, one per line.

webscraping-ai data 'https://www.reddit.com/r/webscraping/'

MCP server

Claude, Cursor and other MCP clients get a webscraping_ai_data tool from the hosted MCP server (OAuth login, no API key to paste). Ask for a Reddit page's data in plain language and the agent calls it.

n8n

The WebScraping.AI n8n node has a Get Structured Data operation: feed it URLs from a sheet or a trigger and route the JSON onward, no code.

Frequently asked questions

Do I need a Reddit API key?

No. You send the normal reddit.com URL and /data returns Reddit's own post, comment and listing data as JSON. There's no Reddit developer app, OAuth token or per-request Reddit API fee involved; you pay 50 credits per page.

Can I scrape Reddit comments?

Yes. A post URL returns up to 200 comments, with replies nested under their parents in Reddit's order. When a thread is bigger, comments_truncated is true, more_comments_count says how many top-level comments were left out, and each comment's more_count says how many of its replies were.

Can I page through a subreddit?

A subreddit URL returns the first 25 posts of its feed in Reddit's default Hot order, plus next_cursor. Paging with that cursor, or picking another sort, isn't available as a request parameter yet.

Is there a free Reddit scraper API?

Yes, for trying it out: the free plan includes 2,000 API credits every month, which covers 40 Reddit pages at 50 credits each. No credit card is needed. Paid plans start at $29/mo for 250,000 credits, or buy pay-as-you-go credits with no subscription from a $20 top-up (100,000 credits, about 2,000 pages).

How much does the Reddit Scraper API cost?

A flat 50 credits per page, for every supported Reddit page type. On the $29/mo plan (250,000 credits) that is up to 5,000 pages, or about $5.80 per 1,000. Unsupported URLs return a 400 and fetch failures a 500; neither is charged. parse_failed and not_found results are successful requests and are charged.

What happens if I send a URL you don't support?

You get a 400 that isn't charged, and its message lists what is supported. For pages /data doesn't cover, /ai/fields extracts the fields you describe from any public URL, and /html returns the rendered page for your own parser.

Other sites on the same endpoint

One API key, one request format, the same response envelope.

YouTube Scraper API TikTok Scraper API Twitter (X) Scraper API LinkedIn Scraper API Instagram Scraper API Google SERP API

Get Reddit data as JSON today

Get started with 2,000 free API credits. No credit card required.

Icon