The Mine Works
Browse on Apify
How to Scrape Reddit Without an API Key in 2025
← All posts
tutorial May 12, 2025 · 5 min read

How to Scrape Reddit Without an API Key in 2025

Reddit locked down its API in 2023. Here is every method that still works — OAuth, public client IDs, and scraper services — with code you can use today.

Try the scraper

The actor referenced in this article is live on Apify. Pay only for results delivered.

Open on Apify →

Reddit’s API shutdown in June 2023 ended the era of free, unauthenticated JSON endpoints. The old trick of appending .json to any Reddit URL still technically works for public pages, but rate limits are aggressive and the data is incomplete. For any serious data collection — thousands of posts, full comment trees, historical backfills — you need a different approach.

TL;DR: Reddit’s Android app uses a public OAuth client ID (ohXpoqrZYub1kg) that any developer can use with the installed_client grant — no account registration, same 100 req/min rate limit as registered apps, full API access. For volume above that, a managed pay-per-result scraper is the practical choice.

Here is every method that still works in 2025, from lightest to most robust.

Why the Old .json Trick No Longer Cuts It

Before 2023, https://www.reddit.com/r/python.json returned clean paginated data with no auth. Reddit started rate-limiting these endpoints heavily after the API pricing controversy. You will hit 429s within minutes on any volume above casual browsing. The unofficial API also returns truncated comment trees and misses crossposted content.

Method 1: OAuth with a Reddit Developer App

The official path. You register an app at reddit.com/prefs/apps, get a client_id and client_secret, and exchange them for a bearer token via the password flow or authorization code flow.

import requests

CLIENT_ID = 'your_client_id'
CLIENT_SECRET = 'your_client_secret'

auth = requests.auth.HTTPBasicAuth(CLIENT_ID, CLIENT_SECRET)
data = {'grant_type': 'password', 'username': 'u', 'password': 'p'}
headers = {'User-Agent': 'MyApp/0.1'}

token = requests.post(
    'https://www.reddit.com/api/v1/access_token',
    auth=auth, data=data, headers=headers
).json()['access_token']

posts = requests.get(
    'https://oauth.reddit.com/r/python/hot',
    headers={**headers, 'Authorization': f'Bearer {token}'}
).json()

Limits: 100 requests per minute per OAuth token. Enough for moderate volumes. The app registration page uses reCAPTCHA, which is annoying to get through.

Method 2: The Public Reddit Android Client ID

This is the technique used in production by most Reddit scrapers. Reddit’s official Android app has a public client_id that anyone can use with the installed_client grant type — no developer account required.

const CLIENT_ID = 'ohXpoqrZYub1kg'; // Reddit Android public client_id
const USER_AGENT = 'android:com.reddit.frontpage:v2024.45.0 (by /u/yourusername)';

async function getToken() {
  const deviceId = crypto.randomUUID();
  const res = await fetch('https://www.reddit.com/api/v1/access_token', {
    method: 'POST',
    headers: {
      'Authorization': 'Basic ' + btoa(`${CLIENT_ID}:`),
      'Content-Type': 'application/x-www-form-urlencoded',
      'User-Agent': USER_AGENT,
    },
    body: `grant_type=https://oauth.reddit.com/grants/installed_client&device_id=${deviceId}`,
  });
  return (await res.json()).access_token;
}

async function getPosts(subreddit, token) {
  const res = await fetch(`https://oauth.reddit.com/r/${subreddit}/hot?limit=100`, {
    headers: {
      'Authorization': `Bearer ${token}`,
      'User-Agent': USER_AGENT,
    }
  });
  return (await res.json()).data.children.map(c => c.data);
}

This approach gives you the same rate limits as an authenticated user — 100 req/min — without account registration. All calls go to oauth.reddit.com, not www.reddit.com.

Important: Always set a descriptive User-Agent. Reddit blocks generic or missing user agents.

Method 3: Pushshift (Partially Restored)

Pushshift.io was the go-to for historical Reddit data until it was shut down in 2023. It has since been partially restored with limited API access. For historical post data going back years, check the current Pushshift status. As of mid-2025, the API is available but throttled for anonymous access.

Method 4: Use a Managed Scraper

If you need volume (millions of posts), historical backfills, or comment trees without managing session rotation, a managed solution is the practical choice. Our Reddit Scraper on Apify handles auth rotation, proxies, and rate limit backoff automatically. You pay per post scraped — zero charge on failed runs.

from apify_client import ApifyClient

client = ApifyClient('YOUR_API_TOKEN')
run = client.actor('themineworks/reddit-scraper').call(run_input={
    'mode': 'subreddit',
    'subreddits': ['machinelearning', 'LocalLLaMA'],
    'sortBy': 'hot',
    'maxPosts': 500,
    'includeComments': True,
    'maxComments': 50,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item['title'], item['score'])

Handling Rate Limits and Bans

Regardless of method, follow these rules:

  • One request every 0.6 seconds minimum — Reddit’s ToS requires this
  • Rotate tokens if running parallel workers — don’t share a single token across threads
  • Respect Retry-After headers — Reddit will 429 you on bursts and tell you how long to wait
  • Use descriptive user agents — include your username as Reddit recommends

What Data You Can Get

The Reddit OAuth API provides:

  • Posts: title, body, score, upvote ratio, awards, flair, author, created timestamp
  • Comments: full nested tree, author, score, gilded status
  • Subreddit metadata: subscriber count, active users, description
  • User profiles: post history, comment karma, account age

What it does not provide: deleted content, shadow-banned users, private subreddits.

Summary

MethodRegistration RequiredRate LimitBest For
.json trickNoVery lowTesting only
Developer OAuth appYes (reCAPTCHA)100 req/minSmall projects
Android client IDNo100 req/minProduction scraping
Managed scraperNoEffectively unlimitedHigh volume

For most production use cases, the Android client ID approach is the sweet spot: no account required, full API access, same rate limits as registered apps.

Frequently Asked Questions

Can you still scrape Reddit without an API key in 2025?

Yes. Reddit’s official Android app uses a public client ID (ohXpoqrZYub1kg) that works with the installed_client grant type — no developer account registration required. This gives you the same 100 requests per minute as a registered app and full access to the OAuth API endpoints.

What happened to the Reddit .json trick after the 2023 API change?

The .json URL trick still works for individual public pages but Reddit now aggressively rate-limits unauthenticated requests. You will hit 429 errors within minutes at any meaningful volume. It is only suitable for single-page, casual lookups — not production data collection.

How much does the Reddit API cost at scale?

Reddit charges $0.24 per 1,000 API calls via the official developer OAuth path. At moderate volume (10,000 posts/month) that is $2.40. At scale — 1 million posts per month with comment trees averaging 3 API calls each — costs reach approximately $720/month before infrastructure.

What is Reddit’s API rate limit?

The Reddit OAuth API enforces 100 requests per minute per token, regardless of whether you use a registered developer app or the Android public client ID. For parallel scraping, you must rotate across multiple tokens and never share a single token across threads.

Is scraping Reddit legal?

The 2022 hiQ Labs v. LinkedIn ruling established that scraping publicly visible data does not constitute unauthorized access under the CFAA. Reddit’s terms of service prohibit automated access, but ToS violations are civil contract matters, not criminal offenses. For commercial operations at scale, review the applicable laws in your jurisdiction.

Related Actor

Try the scraper referenced in this article — live on Apify, pay only for results.

Open reddit-scraper on Apify →