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.
The actor referenced in this article is live on Apify. Pay only for results delivered.
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 theinstalled_clientgrant — 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-Afterheaders — 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
| Method | Registration Required | Rate Limit | Best For |
|---|---|---|---|
.json trick | No | Very low | Testing only |
| Developer OAuth app | Yes (reCAPTCHA) | 100 req/min | Small projects |
| Android client ID | No | 100 req/min | Production scraping |
| Managed scraper | No | Effectively unlimited | High 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.
Try the scraper referenced in this article — live on Apify, pay only for results.
Open reddit-scraper on Apify →How to Scrape AmbitionBox Company Reviews and Ratings
AmbitionBox is India largest employer review platform with 300,000 companies. Learn how to pull ratings, review counts, salary data, and dimension scores as structured JSON without any official API.
AliExpress Product Data API: Prices, Ratings, and Orders in Python
AliExpress affiliate API has restricted coverage. Learn how to scrape AliExpress product listings for prices, ratings, order counts, and seller data as structured JSON — no affiliate approval needed.
ClinicalTrials.gov API v2: How to Search 500,000 Studies and Track Trial Status
ClinicalTrials.gov upgraded to a v2 REST API in 2024. Here is how to use it, what changed from v1, and how to build automated trial monitoring pipelines in Python.