Reddit Keyword Search — Posts by Topic & Subreddit
Pricing
from $2.34 / 1,000 result storeds
Reddit Keyword Search — Posts by Topic & Subreddit
Search public Reddit posts by keyword across Reddit or one subreddit. Export normalized titles, authors, links, timestamps, text, and available engagement metadata through live and archival sources.
Pricing
from $2.34 / 1,000 result storeds
Rating
0.0
(0)
Developer
North Glass Labs
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Share
Reddit Post Search — Turn Public Reddit Posts into Research Data
Search public Reddit posts by keyword across all of Reddit or within one subreddit. Use the normalized dataset for keyword research, subreddit monitoring, or AI and RAG datasets—without a Reddit API key or login.
The Actor makes one fast request to Reddit's public Atom search feed. If that source is unavailable or has no verified posts, it tries the public Arctic Shift archive and then the independent PullPush archive through the configured proxy. The run fails visibly if every source is blocked, malformed, or empty.
What you can do
- Keyword research: collect the language people use around a problem, product category, competitor, or topic. Compare titles, post text, subreddits, and available engagement metadata.
- Subreddit monitoring: schedule searches for a brand, product, issue, or topic within one community. Use
sortBy: "new"and deduplicate downstream byid; archival fallback data can lag Reddit, so this is not a guaranteed real-time alerting feed. - AI and RAG datasets: send normalized JSON records to a document pipeline, vector store, classifier, or summarizer. Filter sensitive or unsuitable content and confirm that your use complies with source terms and applicable law.
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchQuery | string | Yes | — | Keywords to search for |
maxResults | integer | No | 25 | Maximum records to return, from 1 to 100 |
sortBy | string | No | relevance | Requested Atom order: relevance, new, top, or hot; archival fallbacks return newest matching posts |
timeFilter | string | No | all | hour, day, week, month, year, or all |
subreddit | string | No | empty | Subreddit name, with or without r/ |
proxyConfiguration | object | No | Apify Proxy prefill | Proxy settings used only for the final PullPush fallback |
Example input
{"searchQuery": "python packaging","maxResults": 10,"sortBy": "new","subreddit": "r/python","timeFilter": "month"}
Output
Each default-dataset record has the same normalized fields:
id— Reddit post identifier, normalized with thet3_prefixtitle— post titlesubreddit— subreddit nameauthor— Reddit author name when availablescore— score from an archive, or0for AtomnumComments— comment count from an archive, or0for Atompermalink— absolute Reddit post URLurl— external destination for link posts, otherwise an empty stringcreatedUtc— Unix creation timestampisSelf— whether the record is a self postisVideo— video flag when availableselftext— text supplied by the selected sourcelinkFlairText— flair text when availableupvoteRatio— ratio from an archive, or0for Atomnsfw— NSFW flag when available
Reddit Atom exposes titles, authors, links, timestamps, and feed HTML content, but not scores or comment counts. Atom results use 0 for score, numComments, and upvoteRatio, with empty or false compatibility values for other unavailable fields. Arctic Shift and PullPush may populate engagement, flair, video, and NSFW fields from archived Reddit submissions.
API recipes
Set an Apify API token with permission to run the Actor, then replace YOUR_ACTOR_ID with the Actor ID or username~actor-name. These synchronous recipes wait for the run and return default-dataset items as a JSON array.
cURL
export APIFY_TOKEN='YOUR_APIFY_TOKEN'curl --fail-with-body \--request POST \'https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items?clean=true&format=json' \--header "Authorization: Bearer $APIFY_TOKEN" \--header 'Content-Type: application/json' \--data '{"searchQuery": "python packaging","maxResults": 10,"sortBy": "new","subreddit": "python","timeFilter": "month"}'
Python
Requires Python 3 and requests (python -m pip install requests).
import osimport requestsactor_id = os.environ.get("APIFY_ACTOR_ID", "YOUR_ACTOR_ID")url = f"https://api.apify.com/v2/acts/{actor_id}/run-sync-get-dataset-items"response = requests.post(url,params={"clean": "true", "format": "json"},headers={"Authorization": f"Bearer {os.environ['APIFY_TOKEN']}","Content-Type": "application/json",},json={"searchQuery": "python packaging","maxResults": 10,"sortBy": "new","subreddit": "python","timeFilter": "month",},timeout=300,)response.raise_for_status()posts = response.json()print(f"Received {len(posts)} posts")
JavaScript
Works in Node.js 18+ using the built-in fetch API.
const actorId = process.env.APIFY_ACTOR_ID || 'YOUR_ACTOR_ID';const endpoint = new URL(`https://api.apify.com/v2/acts/${actorId}/run-sync-get-dataset-items`,);endpoint.searchParams.set('clean', 'true');endpoint.searchParams.set('format', 'json');const response = await fetch(endpoint, {method: 'POST',headers: {Authorization: `Bearer ${process.env.APIFY_TOKEN}`,'Content-Type': 'application/json',},body: JSON.stringify({searchQuery: 'python packaging',maxResults: 10,sortBy: 'new',subreddit: 'python',timeFilter: 'month',}),});if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);const posts = await response.json();console.log(`Received ${posts.length} posts`);
n8n / HTTP Request
Create an HTTP Request node with these settings:
- Method:
POST - URL:
https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items - Query parameters:
clean=true,format=json - Send Headers: on
Authorization=Bearer YOUR_APIFY_TOKENContent-Type=application/json
- Send Body: on; Body Content Type: JSON
- JSON body:
{"searchQuery": "python packaging","maxResults": 10,"sortBy": "new","subreddit": "python","timeFilter": "month"}
The node output is the returned array of post records. For monitoring, run the workflow on a Schedule Trigger and deduplicate records by id before sending alerts or storing data.
Live feed and archive limitations
- Reddit Atom is the live source. The Actor makes at most one fast Atom attempt. Reddit can block automated addresses or return no matching feed entries.
- Arctic Shift and PullPush are archival fallbacks. They can lag live Reddit, have incomplete coverage, or include posts that Reddit later removed or deleted.
- Sort semantics differ by source.
sortBycontrols the requested Atom order. Arctic Shift and PullPush fallbacks return newest matching posts; they do not reproduce Reddit'srelevance,hot, ortopranking exactly. - Metrics differ by source. Atom does not provide score, comment count, or upvote ratio, so those compatibility fields are
0. Archive records may contain those values. - Availability is not guaranteed. Upstream services can block, throttle, change, or go offline. Instead of silently returning a successful empty dataset, the Actor raises an error when all three sources produce no verified records.
Pricing
Current pay-per-event pricing is $0.02 per run plus $0.00275 per dataset result.
For example, a run that returns the full default maxResults of 25 has a maximum charge of:
$0.02 + (25 × $0.00275) = $0.08875
In other words, 25 returned posts cost $0.08875 at the current event prices. If fewer than 25 posts are returned, fewer result events are charged. Apify plan discounts or platform usage charges, if applicable to your account, are separate; check the Store listing for the current rates before running at scale.
Responsible use
Search only public posts. Apply appropriate retention and filtering, avoid sensitive-data misuse, and comply with Reddit's terms, archive-provider terms, and applicable law.