StackOverflow Scraper · Questions, Answers, Tags & Users
Pricing
from $1.30 / 1,000 item returneds
StackOverflow Scraper · Questions, Answers, Tags & Users
Stack Overflow Scraper (StackOverflow Scraper) to scrape questions, answers, tags, user profiles, and developer Q&A datasets across Stack Overflow and Stack Exchange sites. Filter by tag, query, score, date, and accepted answers. No login or API key required.
Pricing
from $1.30 / 1,000 item returneds
Rating
0.0
(0)
Developer
Tarek Etman
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 hours ago
Last modified
Categories
Share

StackOverflow Scraper (Stack Overflow Scraper) · Questions, Answers & Tags
Stack Overflow Scraper and StackOverflow scraper to extract questions, answers, tags and user profiles through the public Stack Exchange API. No login, no cookies, no headless browser, and no API key needed for normal runs. Run it empty and you get the most recently active questions; add a tag, a score floor or a date window and you get exactly the slice you want.
Maintained by reapX. Every row cites the Apify run that produced it — nothing is inferred, modelled or filled in, and a field absent from the source is absent from the row. The extracted archive for this source is browsable at reapx.dev/data/stackoverflow-scraper/ and mirrored as an open dataset on Hugging Face and Kaggle. Questions: reapxdev@proton.me
Stack Overflow Scraper data output
| Dataset | One row per | Keyed by |
|---|---|---|
| Questions | Question, with score, views, answer count, tags and author | questionId |
| Answers | Answer, with score, accepted flag and its question | answerId |
| Tags | Tag, with how many questions carry it | tagName |
| Users | User profile, with reputation and badge counts | userId |
Optionally attach the full body text of each post, and every answer to each question - highest score first, with author, accepted flag and body.
Five named dataset views ship with it: Questions, Answers, Tags, Users and Unanswered & gaps.
How to scrape Stack Overflow questions and answers
- Pick what to scrape. Leave everything else empty for the most recently active questions.
- Filter by tag, title text, full-text search, score, answers, accepted status or a date window.
- Turn on Include the full body text and Include answers with each question if you need the content, not just the metadata.
- Set Max items. You are charged once per item returned, so that is your cost cap.
Filters
- Tagged with all of and Not tagged with - exact Stack Overflow tag names
- Full-text search and Title contains - the latter is far more precise
- Minimum score, minimum answers
- Has an accepted answer, Unanswered only, Closed questions only
- Author user ID - everything one person asked
- Date window - a rolling "last N days" or explicit from/to dates
- Tag name contains, display name contains, minimum reputation
- Stack Exchange site - any site key, not just Stack Overflow
What you can build with it
- Developer pain-point research -
unansweredOnlyon your library's tag shows exactly where docs fail. - Technology trend tracking - scrape tags monthly and diff
questionCountto see what is growing. - Support-content mining - top-voted questions plus answers for a tag is a ready-made FAQ corpus.
- Competitive intelligence - question volume and sentiment across rival tools' tags.
- RAG and fine-tuning corpora - question and answer bodies with a stable id and a CC licence field on every row.
- Expert identification - top users by reputation in a tag, for recruiting or developer relations.
- Answer-quality analysis - accepted vs highest-scoring answers, and how long acceptance took.
Input configuration
Every field is optional. The prefilled values below are what runs if you press Start without changing anything.
What to scrape
Leave every filter below empty and the run returns the most recently active Stack Overflow questions.
| Field | Type | Accepts | What it does |
|---|---|---|---|
dataset | string | questions, answers, tags, users | Which Stack Exchange collection to read. Each returns a different kind of row, keyed by its own Stack Exchange identifier. Prefilled with "questions". |
site | string | free text | Which site to read. Defaults to Stack Overflow; any Stack Exchange site key works, e.g. serverfault, superuser, askubuntu, math, unix, dba. Prefilled with "stackoverflow". |
How much to fetch
Volume and ordering. You pay per item returned, so this decides the price of the run.
| Field | Type | Accepts | What it does |
|---|---|---|---|
maxItems | integer | 1 to 2500 | Hard cap on how many rows the run returns. This is also your cost cap: you are charged once per item returned. The API serves at most 2,500 items for one query. Prefilled with 100. |
sortBy | string | one of 8: activity, votes, creation, relevance, ... | Ordering. Questions accept activity, votes, creation and relevance; answers accept activity, votes and creation; tags accept popular, activity and name; users accept reputation, creation, name and modified. An unsupported value falls back to the dataset's default. Prefilled with "activity". |
order | string | desc, asc | Descending gives the highest or newest first. Prefilled with "desc". |
Question filters
These apply when you are scraping questions.
| Field | Type | Accepts | What it does |
|---|---|---|---|
query | string | free text | Free-text search across question titles and bodies. Pair it with sort "Best match" for relevance ranking. |
titleContains | string | free text | Match text in the question title only, which is far more precise than a body search. |
tagged | list | one value per line | Only questions carrying every one of these tags. Use the exact Stack Overflow tag spelling, e.g. python, pandas, machine-learning. |
notTagged | list | one value per line | Exclude questions carrying any of these tags. |
minScore | integer | free text | Only items at or above this vote score. Requires sort "Votes / score", which is how the API applies a floor. |
minAnswers | integer | 1 to any | Only questions with at least this many answers. |
acceptedOnly | true/false | checkbox | Only questions where the asker accepted an answer - the solved set. |
unansweredOnly | true/false | checkbox | Only questions with no answers and nothing accepted - where the gaps are. |
closedOnly | true/false | checkbox | Only questions the community has closed. |
user | integer | free text | Only questions asked by this Stack Exchange user ID. |
Tag and user filters
These apply when you are scraping tags or users.
| Field | Type | Accepts | What it does |
|---|---|---|---|
tagNameContains | string | free text | Only tags whose name contains this text. Applies when scraping tags. |
userNameContains | string | free text | Only users whose display name contains this text. Applies when scraping users. |
minReputation | integer | free text | Only users at or above this reputation. Requires sort "Reputation". |
Dates
All dates are YYYY-MM-DD. Stack Overflow data runs back to 2008.
| Field | Type | Accepts | What it does |
|---|---|---|---|
lastNDays | integer | 1 to 20000 | Rolling window on the creation date. Ignored if you set an explicit "From date". |
dateFrom | string | free text | Earliest creation date, YYYY-MM-DD. |
dateTo | string | free text | Latest creation date, YYYY-MM-DD. |
Output detail
Extra columns. These change the row size and the runtime, not the price.
| Field | Type | Accepts | What it does |
|---|---|---|---|
includeBody | true/false | checkbox | Add the question or answer body as both plain text and original HTML. Off by default to keep rows small. |
includeAnswers | true/false | checkbox | Attach every answer to each question row, highest score first, with author and accepted flag. Applies when scraping questions. Costs one extra request per 100 questions. |
apiKey | string | free text | Optional and free from stackapps.com/apps/oauth/register. Without one, Stack Exchange allows 300 requests per day per IP; with one, 10,000. Only needed for very large or frequent runs. |
Pricing
Pay per event. The primary event is Item returned (item-returned), charged at $0.002 per event on the free plan, falling to $0.0008 on the highest tier.
Charged once per complete question, answer, tag or user row written to the default dataset. A throttled or unreachable API, a rejected query and a search that matches nothing are never charged.
Minimum charge cap per run: $0.002.
Tiered discounts apply automatically on every paid Apify plan. Platform usage is absorbed by the Actor, so the per-event price is the whole price.
Usage examples
The prefilled run, which is what Start does with nothing changed
{"dataset": "questions","site": "stackoverflow","maxItems": 100,"sortBy": "activity","order": "desc"}
Filter by stack exchange site
{"dataset": "questions","site": "serverfault","maxItems": 100,"sortBy": "activity","order": "desc"}
Filter by sort by
{"dataset": "questions","site": "stackoverflow","maxItems": 100,"sortBy": "votes","order": "desc"}
Filter by full-text search
{"dataset": "questions","site": "stackoverflow","maxItems": 100,"sortBy": "activity","order": "desc","query": "async await deadlock"}
Filter by title contains
{"dataset": "questions","site": "stackoverflow","maxItems": 100,"sortBy": "activity","order": "desc","titleContains": "memory leak"}
Output example
One row, exactly as the actor wrote it to the dataset:
{"itemId": "22343224","itemType": "question","site": "stackoverflow","scrapedAt": "2026-08-03T04:01:45Z","questionId": 22343224,"title": "What's the difference between tilde(~) and caret(^) in package.json?","link": "https://stackoverflow.com/questions/22343224/whats-the-difference-between-tilde-and-caret-in-package-json","score": 5611,"viewCount": 2158729,"answerCount": 23,"isAnswered": true,"hasAcceptedAnswer": true,"acceptedAnswerId": 22345808,"tags": ["node.js","npm","package.json","caret","semantic-versioning"],"createdAt": "2014-03-12T06:02:21Z","lastActivityAt": "2025-05-14T10:28:46Z","ownerUserId": 1154350,"ownerDisplayName": "Fizer Khan"}
That row carries 21 fields in total; 18 are shown.
Fields on every row
| Field | Type | What it is |
|---|---|---|
acceptRate | integer | Percentage of the user’s questions with an accepted answer. Present on: users. |
acceptedAnswerId | integer | Id of the accepted answer, when there is one. Present on: questions. |
answerCount | integer | How many answers the question has. Present on: questions. |
answerId | integer | Numeric Stack Overflow answer id. Present on: answers. |
answers | list | Answers to the question, highest score first, each with id, score, accepted flag and author. Present only when Include answers with each question is on. Present on: questions. |
answersFetched | integer | How many answers were attached to this question row. Present on: questions. |
bodyHtml | string | Post body as the original HTML. Present only when Include the full body text is on. Present on: answers, questions. |
bodyText | string | Post body as plain text, HTML stripped. Present only when Include the full body text is on. Present on: answers, questions. |
bronzeBadges | integer | Bronze badge count. Present on: users. |
contentLicense | string | Creative Commons licence the content is published under. Present on: answers, questions. |
createdAt | string | UTC ISO 8601 timestamp the item was created. Present on: answers, questions, users. |
displayName | string | User display name. Present on: users. |
goldBadges | integer | Gold badge count. Present on: users. |
hasAcceptedAnswer | true/false | Whether the asker accepted an answer. Present on: questions. |
hasSynonyms | true/false | Whether the tag has registered synonyms. Present on: tags. |
isAccepted | true/false | Whether this answer was accepted by the asker. Present on: answers. |
isAnswered | true/false | Whether Stack Overflow considers the question answered. Present on: questions. |
isClosed | true/false | Whether the question has been closed. Present on: questions. |
isModeratorOnly | true/false | Whether only moderators may apply the tag. Present on: tags. |
isRequired | true/false | Whether the tag is required on this site. Present on: tags. |
itemId | string | Stack Exchange identifier for the thing this row describes - question id, answer id, user id or tag name. Stable and how the row is addressed downstream. |
itemType | string | Which kind of Stack Exchange object this row is. |
lastAccessAt | string | UTC ISO 8601 timestamp the user was last active. Present on: users. |
lastActivityAt | string | UTC ISO 8601 timestamp of the most recent activity. Present on: answers, questions. |
link | string | Canonical link to the question, answer, tag or user profile. |
location | string | Self-reported location on the profile. Present on: users. |
ownerDisplayName | string | Display name of the author. Present on: answers, questions. |
ownerReputation | integer | Reputation of the author at scrape time. Present on: answers, questions. |
ownerUserId | integer | Stack Exchange user id of the author. Present on: answers, questions. |
questionCount | integer | How many questions carry the tag. Present on: tags. |
questionId | integer | Numeric Stack Overflow question id. Present on: answers, questions. |
reputation | integer | Total reputation. Present on: users. |
reputationChangeMonth | integer | Reputation gained in the last month. Present on: users. |
reputationChangeYear | integer | Reputation gained in the last year. Present on: users. |
score | integer | Net votes on the post. Present on: answers, questions. |
scrapedAt | string | UTC ISO 8601 timestamp of this run. |
silverBadges | integer | Silver badge count. Present on: users. |
site | string | Stack Exchange site key the row came from. |
tagName | string | The tag itself, as Stack Overflow spells it. Present on: tags. |
tags | list | Tags on the question, reusable as the Tagged with all of input. Present on: questions. |
title | string | Question title, HTML entities decoded. Present on: questions. |
userId | integer | Numeric Stack Exchange user id. Present on: users. |
userType | string | Account type, e.g. registered or moderator. Present on: users. |
viewCount | integer | How many times the question has been viewed. Present on: questions. |
websiteUrl | string | Self-reported website on the profile. Present on: users. |
5 named dataset views ship with it: Questions, Answers, Tags, Users, Unanswered & gaps. They drive the Output tab in Console and the Output block on the Actor's .md page.
FAQ
How do I scrape Stack Overflow questions?
Run this actor with no input and it returns the most recently active questions. Everything comes
from api.stackexchange.com, the official Stack Exchange API.
Do I need an API key or a login?
Not for normal runs. Stack Exchange allows 300 requests per day per IP anonymously, and this actor pulls 100 items per request. For very large or frequent jobs, register a free key at stackapps.com and paste it into the optional Stack Apps API key field to raise the limit to 10,000 requests per day.
How do I get all questions for a tag?
Put the tag into Tagged with all of - for example python - and set Max items. Add more
tags to require all of them at once, which is how Stack Overflow's own tag intersection works.
How do I find unanswered questions?
Turn on Unanswered only. You get questions with no answers and nothing accepted, which is the fastest way to find gaps in a library's documentation or support coverage.
Can I get the answers as well as the questions?
Yes. Turn on Include answers with each question and each row gains an answers array,
highest score first, with author, accepted flag and - if body text is on - the answer text. It
costs one extra API request per 100 questions.
How do I get the highest-voted questions?
Set Sort by to "Votes / score" and optionally a Minimum score. The score floor only works with that sort, which is how the API applies it.
Can I scrape other Stack Exchange sites?
Yes. Change Stack Exchange site to any site key - serverfault, superuser, askubuntu,
math, unix, dba and so on. Every filter works the same way.
How many items can one run return?
Up to 2,500 for a single query, which is the API's own paging ceiling. Split larger jobs into date windows and run each one.
What licence does the content carry?
Every question and answer row includes contentLicense - normally CC BY-SA. Attribution
requirements apply when you republish the text.
Can an AI agent call this actor?
Yes. Every input and output field carries a title, description and example, and every row is
addressed by its Stack Exchange itemId, so an agent can fill the input and chain the output
without extra prompting.
Unofficial - not affiliated with Stack Overflow. Collects public data only. reapx. Contact reapxdev@proton.me.
The full published archive
- stackoverflow scraper archive — every entity this Actor has observed
- All reapx datasets — 20 sources, tens of thousands of pages
- llms.txt · feed.json · feed.xml — the machine-readable index, for agents
Each archive page carries Dataset JSON-LD, a canonical URL and the identifiers used, so an agent can resolve an entity without running anything. Nothing on those pages is estimated or modelled.
🧪 Example input
A real, runnable configuration — this is an actual input this Actor has run with.
{"dataset": "questions","tagged": ["node.js"],"sortBy": "votes","order": "desc","maxItems": 300}
📄 Sample output
One real row from a real run of this Actor, unedited.
{"itemId": "22343224","itemType": "question","site": "stackoverflow","scrapedAt": "2026-08-03T04:01:45Z","questionId": 22343224,"title": "What's the difference between tilde(~) and caret(^) in package.json?","link": "https://stackoverflow.com/questions/22343224/whats-the-difference-between-tilde-and-caret-in-package-json","score": 5611,"viewCount": 2158729,"answerCount": 23,"isAnswered": true,"hasAcceptedAnswer": true,"acceptedAnswerId": 22345808,"tags": ["node.js","npm","package.json","caret","semantic-versioning"],"createdAt": "2014-03-12T06:02:21Z","lastActivityAt": "2025-05-14T10:28:46Z","ownerUserId": 1154350,"ownerDisplayName": "Fizer Khan","ownerReputation": 93957,"isClosed": false,"contentLicense": "CC BY-SA 4.0"}
How it works
- You set the filters below, or none at all.
- The Actor calls the source's own public endpoint and pages through the results.
- Every row is pushed to the dataset as it is built, not buffered to the end — so a run that hits its time limit still returns everything it collected up to that point.
- You are charged per row returned, so the maximum-results field is also your cost cap.
💬 Your feedback
Found a bug, or need a field this does not return yet? Open an issue on the Actor's Issues tab, or write to reapxdev@proton.me. Bugs get fixed and reasonable field requests get added.