Reddit Keyword Search — Posts by Topic & Subreddit avatar

Reddit Keyword Search — Posts by Topic & Subreddit

Pricing

from $2.34 / 1,000 result storeds

Go to Apify Store
Reddit Keyword Search — Posts by Topic & Subreddit

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

North Glass Labs

Maintained by Community

Actor 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 by id; 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

FieldTypeRequiredDefaultDescription
searchQuerystringYesKeywords to search for
maxResultsintegerNo25Maximum records to return, from 1 to 100
sortBystringNorelevanceRequested Atom order: relevance, new, top, or hot; archival fallbacks return newest matching posts
timeFilterstringNoallhour, day, week, month, year, or all
subredditstringNoemptySubreddit name, with or without r/
proxyConfigurationobjectNoApify Proxy prefillProxy 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 the t3_ prefix
  • title — post title
  • subreddit — subreddit name
  • author — Reddit author name when available
  • score — score from an archive, or 0 for Atom
  • numComments — comment count from an archive, or 0 for Atom
  • permalink — absolute Reddit post URL
  • url — external destination for link posts, otherwise an empty string
  • createdUtc — Unix creation timestamp
  • isSelf — whether the record is a self post
  • isVideo — video flag when available
  • selftext — text supplied by the selected source
  • linkFlairText — flair text when available
  • upvoteRatio — ratio from an archive, or 0 for Atom
  • nsfw — 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 os
import requests
actor_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:

  1. Method: POST
  2. URL: https://api.apify.com/v2/acts/YOUR_ACTOR_ID/run-sync-get-dataset-items
  3. Query parameters: clean = true, format = json
  4. Send Headers: on
    • Authorization = Bearer YOUR_APIFY_TOKEN
    • Content-Type = application/json
  5. Send Body: on; Body Content Type: JSON
  6. 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. sortBy controls the requested Atom order. Arctic Shift and PullPush fallbacks return newest matching posts; they do not reproduce Reddit's relevance, hot, or top ranking 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.