Stack Overflow & Stack Exchange Q&A Scraper, No Login avatar

Stack Overflow & Stack Exchange Q&A Scraper, No Login

Pricing

from $1.89 / 1,000 questions

Go to Apify Store
Stack Overflow & Stack Exchange Q&A Scraper, No Login

Stack Overflow & Stack Exchange Q&A Scraper, No Login

Scrape Stack Overflow and 170+ Stack Exchange sites by tag, search or question URL. No login. Official API. Questions with answers, votes, tags, authors and a CC BY-SA credit line.

Pricing

from $1.89 / 1,000 questions

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Categories

Security

Limited permissions

Share

Stack Overflow & Stack Exchange Q&A Scraper exports questions with their answers from Stack Overflow and the other Stack Exchange sites (Super User, Server Fault, Ask Ubuntu, Mathematics and 170+ more). You pick a site and a tag, a search query or a list of question links, and get one table row per question with the title, body, tags, votes, author and the answers inside the same row.

Use it to follow questions about your product or library, to build a Q&A dataset for search or an LLM, or to save a fixed list of threads. The smallest run is one tag, for example apify, and 10 questions. No login or API key is needed: the Actor reads the official Stack Exchange API, and every row has a ready CC BY-SA attribution line.

Stack Overflow & Stack Exchange Q&A Scraper: choose a site and tags, get questions with their answers in the same row, export to JSON, CSV or Excel with a CC BY-SA credit line. No login or API key, any Stack Exchange site.

Table of contents

What it does

The Actor reads questions from one Stack Exchange site and saves each question as one dataset row with its answers inside. It has three modes:

modeWhat you giveWhat it returns
tagsite and up to 5 tagsQuestions that carry all the tags, in your sort order
searchsite, a query and optional tagsQuestions that match the words in the title or body
questionquestions: IDs or question URLsExactly these questions; a URL sets its own site

With includeAnswers on (the default), the answers are inside the row: the accepted answer first, then by score. You choose the body format: Markdown as written, HTML as shown on the site, or plain text. You can also limit the creation date with fromDate and toDate.

Good fit

  • Watch new questions about your product tag on Stack Overflow.
  • Build a question-and-answer dataset in Markdown for search, RAG or an LLM.
  • Save a list of known threads with all answers and votes.
  • Find the most-voted questions on a topic on any Stack Exchange site.

👉 Try it now: open the input form

How it works

  1. The Actor asks the official Stack Exchange API for the questions of your tag list, search or question links on the site you chose.
  2. For each page of questions it reads the answers, the content licence and the authors, sorts the answers (accepted first, then by votes) and converts the bodies to the format you picked.
  3. It saves one row per question in the dataset, free not_found and error rows for links that do not work, and a RUN_SUMMARY record with counts and the remaining daily API quota.

👉 Try it now: open the input form

Quick start

Input form with the prefill: box 1 is the mode (questions by tag), box 2 the site stackoverflow and the tag apify, box 3 the number of questions, 10

  1. Open the Input tab. Mode stays at the default Questions by tag (box 1).

  2. Keep Site at the prefilled stackoverflow and Tags at the prefilled apify, or type your own site and tag (box 2).

  3. Keep Max questions at the prefilled 10 or set your own number (box 3; the runtime default is 50).

  4. Click Start at the bottom of the page.

  5. Open the Questions view in the Output tab and check title, score, answerCount and link (box 5).

    Output table: box 5 is the Questions view with title, score, answer count and link

Expected result: the 10 newest questions with the apify tag and their answers, in a few seconds.

👉 Try it now: open the input form

Use cases

Buyer jobInputOutputKey fieldsNext step
Follow questions about your producttags: ["your-tag"], sort: newest, scheduledquestion rowstitle, link, createdAt, isAnsweredSend unanswered ones to your support channel
Build an LLM or RAG datasettags, sort: votes, bodyFormat: markdownrows with answersbody, answers[].body, answers[].isAccepted, attributionLoad into a vector store, keep the credit line
Research a topicmode: search, query, fromDatequestion rowsscore, viewCount, tagsCount questions per month or per tag
Save known threadsmode: question, questionsone row per threadanswers, acceptedAnswerId, lastActivityAtArchive or compare over time

👉 Try it now: open the input form

Input

You need a site and at least one of: tags (tag mode), query or tags (search mode), questions (question mode). A wrong input stops the run with INVALID_INPUT before any request.

FieldPlain nameTypeDefaultAllowed valuesWhat it changesRecommendation
modeModeenumtagtag, search, questionWhich list the Actor readstag to follow a topic, question for known threads
siteSitestringstackoverflow (prefill too)API site name or domain: superuser, serverfault, askubuntu, math, math.stackexchange.com …The Stack Exchange siteUse the short name from the site URL
tagsTagsarray of stringsnone (prefill ["apify"])up to 5 tagsQuestions must carry all the tags. Empty in tag mode = all questions of the siteOne or two tags give the clearest list
querySearch querystringnoneup to 500 charactersWords to find in titles and bodies (search mode only)Add sort: relevance
questionsQuestion IDs or URLsarray of stringsnoneup to 1,000 IDs like 11227809 or question URLsExact questions to read (question mode only). Duplicates are read oncePaste links from your browser
sortSortenumnewestnewest, active, votes, hot (tag mode), relevance (search mode)Order of the listvotes for the best-known questions
maxQuestionsMax questionsinteger50 (prefill 10)1–1,000The run stops after this many question rowsStart small, then raise
includeAnswersInclude answersbooleantruetrue, falseAnswers inside each rowTurn off for a list of titles only
maxAnswersPerQuestionMax answers per questioninteger301–500Keep only the best answersanswersComplete shows if all answers fit
bodyFormatBody formatenummarkdownmarkdown, html, textFormat of question and answer bodiesmarkdown for LLMs, text for spreadsheets
fromDate, toDateCreated from / untildatenone2025-01-01 (UTC; toDate includes the whole day)Only questions created in this windowUse for a monthly report
apiKeyStack Exchange API keysecret stringnonefree key from stackapps.comHigher daily quotaNot needed for normal runs

Interacting settings

WhenField AField BEffect
SearchquerytagsBoth must match: the words and all the tags
Ordersort: hotmode: taghot works only in tag mode; relevance only in search mode
Question linksquestions with a URLsiteThe URL's own site wins; bare IDs use site
AnswersincludeAnswers: falsemaxAnswersPerQuestionNo answers, so maxAnswersPerQuestion is ignored and answers is null
DatesfromDate, toDatemode: questionDates work in tag and search modes only

Input examples

Newest questions about a product tag (the prefill)

{
"site": "stackoverflow",
"tags": ["apify"],
"maxQuestions": 10
}

Expected: 10 question rows, newest first, each with its answers. The output example below comes from this input.

{
"mode": "search",
"site": "serverfault",
"query": "nginx reverse proxy",
"sort": "votes",
"maxQuestions": 100,
"bodyFormat": "text"
}

Expected: up to 100 question rows, most votes first, with plain-text bodies and answers.

A fixed list of threads

{
"mode": "question",
"questions": [
"11227809",
"https://serverfault.com/questions/997924"
],
"maxAnswersPerQuestion": 5
}

Expected: one row per question that exists, each with up to 5 answers. A missing question gives a free not_found row.

Coming from another Stack Exchange Actor

Input names here are different. This table helps to move an existing input:

Common input in other ActorsThis Actor
tagged: "a;b"tags: ["a", "b"]
searchQuerymode: "search", query
questionIdsmode: "question", questions
fetchAnswersincludeAnswers (on by default, no extra price)
maxResultsmaxQuestions
sort: activity / creationsort: active / newest

Output fields are camelCase (questionId, answerCount) with ISO dates, not raw API snake_case. The asker is one author object.

👉 Try it now: open the input form

Output

Output example

A real row from the prefill run (body and the answer body are shortened here):

{
"site": "stackoverflow",
"questionId": 77823456,
"title": "Apify: weird costs for using key-value stores",
"link": "https://stackoverflow.com/questions/77823456/apify-weird-costs-for-using-key-value-stores",
"tags": ["node.js", "apify"],
"score": 0,
"upVotes": 1,
"downVotes": 1,
"viewCount": 213,
"answerCount": 1,
"isAnswered": true,
"acceptedAnswerId": null,
"commentCount": null,
"bountyAmount": null,
"isClosed": false,
"closedReason": null,
"closedAt": null,
"createdAt": "2024-01-16T04:20:59.000Z",
"lastActivityAt": "2024-01-16T13:03:25.000Z",
"lastEditedAt": null,
"author": {
"userId": 2486638,
"displayName": "Alvein",
"reputation": 217,
"userType": "registered",
"profileUrl": "https://stackoverflow.com/users/2486638/alvein"
},
"bodyFormat": "markdown",
"body": "I'm working with Node.js but I think my question is language-agnostic.\n\nIn my Apify actor, First I do a few long scrapes…",
"answers": [
{
"answerId": 77825927,
"link": "https://stackoverflow.com/questions/77823456/apify-weird-costs-for-using-key-value-stores/77825927#77825927",
"score": 1,
"upVotes": 1,
"downVotes": 0,
"isAccepted": false,
"commentCount": 1,
"createdAt": "2024-01-16T13:03:25.000Z",
"lastActivityAt": "2024-01-16T13:03:25.000Z",
"lastEditedAt": null,
"author": {
"userId": 9898465,
"displayName": "Lukáš Křivka",
"reputation": 983,
"userType": "registered",
"profileUrl": "https://stackoverflow.com/users/9898465/luk%c3%a1%c5%a1-k%c5%99ivka"
},
"body": "Apify doesn't charge for how big the writes are. Apify charges for number of writes and then for time based storage…",
"license": "CC BY-SA 4.0",
"licenseUrl": "https://creativecommons.org/licenses/by-sa/4.0/"
}
],
"answersIncluded": 1,
"answersComplete": true,
"license": "CC BY-SA 4.0",
"licenseUrl": "https://creativecommons.org/licenses/by-sa/4.0/",
"attribution": "\"Apify: weird costs for using key-value stores\" by Alvein (https://stackoverflow.com/users/2486638/alvein), https://stackoverflow.com/questions/77823456/apify-weird-costs-for-using-key-value-stores, licensed under CC BY-SA 4.0",
"rank": 8,
"input": null,
"inputs": null,
"status": "complete",
"statusReason": null,
"errorCode": null,
"sourceUrl": "https://api.stackexchange.com/2.3/questions?site=stackoverflow&order=desc&sort=creation&pagesize=10&filter=…&tagged=apify&page=1",
"fetchedAt": "2026-10-17T12:18:30.349Z"
}

null means the API gave no value (no accepted answer, no bounty, never edited). 0 is a real zero. commentCount can be null in tag and search lists and filled in question mode: the Actor copies what the API endpoint returns.

Output fields

Question rows (status: complete or partial)

FieldMeaningTypeCan be null?Example
siteSite the row came fromstringno"stackoverflow"
questionIdQuestion ID, stable keyintegerno77823456
title, linkTitle and public question linkstringno
tagsQuestion tagsarrayno["node.js", "apify"]
score, upVotes, downVotesVotesintegeryes0, 1, 1
viewCount, answerCountViews and number of answersintegeryes213, 1
isAnswered, acceptedAnswerIdHas an upvoted or accepted answer; ID of the accepted oneboolean, integeryestrue, null
commentCount, bountyAmountComments on the question; open bountyintegeryesnull
isClosed, closedReason, closedAtClosed questionsboolean, stringyesfalse
createdAt, lastActivityAt, lastEditedAtDates (ISO, UTC)stringyes"2024-01-16T04:20:59.000Z"
authoruserId, displayName, reputation, userType, profileUrlobjectyes (deleted users)
bodyFormat, bodyBody format and question bodystringbody yes"markdown"
answersAnswers: answerId, link, score, isAccepted, author, body, license, datesarraynull when includeAnswers is off
answersIncluded, answersCompleteHow many answers are in the row; false if maxAnswersPerQuestion cut someinteger, booleanyes1, true
license, licenseUrlContent licence of the questionstringyes"CC BY-SA 4.0"
attributionReady credit line: title, author, link, licencestringyes
rankPosition in the tag or search listintegeryes (question mode)8
status, statusReason, errorCodeRow status and whystringstatusReason, errorCode yes"complete"
input, inputsWhat you entered for this row (question mode)string, arrayyes"11227809"
sourceUrl, fetchedAtAPI request and fetch timestringno

partial means the row has no licence from the API, or the API returned fewer answers than expected. It is still a useful row and is charged.

Issue rows (status: not_found or error)

Question mode only. These rows are free.

  • not_found: the IDs do not exist, are deleted or are not question IDs. Missing IDs from one batch share one row, with the list in inputs.
  • error: a bad item (for example an answer link or a non-Stack Exchange URL), or a source error for that batch. Items with the same reason share one row, with the list in inputs.

When a row is about one item, input and questionId are filled; when it is about several, they are null and inputs lists them.

Run report

The key-value store record RUN_SUMMARY has the run status, reason, counts (rows, questions, answers, complete, partial, not found, errors, charged questions), request counts and the remaining daily API quota. It never contains your API key.

Run statusMeaningRun result
COMPLETEAll requested questions were readSUCCEEDED
CAPPEDStopped early with saved rows: your maximum charge (CHARGE_LIMIT), the daily API quota (QUOTA_LIMIT), the time limit (DEADLINE) or the API page limit (PAGE_LIMIT)SUCCEEDED, saved rows are kept
NO_RESULTSNo questions match the filtersSUCCEEDED, empty dataset
NOT_FOUNDNo question from the list existsSUCCEEDED, free not_found rows
PARTIALSome rows are partial (PARTIAL_ROWS), or the source failed after some rows (SOURCE_ERROR)SOURCE_ERROR marks the run FAILED; saved rows are kept
ERRORThe source failed or the run stopped before any question was savedFAILED
INVALID_INPUTThe input cannot work, for example an unknown site, or no item in questions is a valid questionFAILED
CANCELLEDYou aborted the runsaved rows are kept

Licence and attribution

Stack Exchange content is licensed by its authors under CC BY-SA (2.5, 3.0 or 4.0, by post date). Each row has its license and licenseUrl, and attribution gives a ready credit line with the title, author and link. When you reuse the content, show that line and keep the same licence. The Stack Exchange API terms also ask you to name Stack Exchange as the source. The Stack Exchange Acceptable Use Policy limits some uses, for example training AI models without their consent; check that it fits your plan.

Data comes from the Stack Exchange API. See also the Stack Exchange API terms of use, the Acceptable Use Policy and the CC BY-SA 4.0 licence. This Actor is not affiliated with or endorsed by Stack Exchange, Inc.

👉 Try it now: open the input form

Pricing

Pay per event. Apify platform usage is included.

EventWhenPrice (USD)
Actor startonce per run; Apify counts the start per GB of run memory, so it is one start at the default 256 MB and the 512 MB maximum0.002
Questionper saved question row (complete or partial), answers included0.0027 Free · 0.00243 Bronze · 0.00216 Silver · 0.00189 Gold and above

not_found and error rows are free. A run with no results pays only the start.

Example runFreeBronzeSilverGold+
1 question$0.0047$0.0044$0.0042$0.0039
10 questions (the prefill)$0.029$0.026$0.024$0.021
100 questions$0.272$0.245$0.218$0.191
1,000 questions with answers$2.702$2.432$2.162$1.892
Search with no matches$0.002$0.002$0.002$0.002

Set Maximum cost per run in the run options to cap a run. The Actor checks the limit before each row. It stops before a charge would go above it, keeps what it already saved and ends as CAPPED with reason CHARGE_LIMIT.

👉 Try it now: open the input form

Limits

  • Up to 1,000 questions per run. Measured runs of 1,000 questions with answers, all COMPLETE inside the 600-second default timeout: 16 seconds for Super User windows-10 in HTML, 217 seconds for the most-voted Stack Overflow javascript questions in Markdown (about 20 answers per question, 40 MB of text).
  • Without an API key, the Stack Exchange API gives about 300 requests per day per IP address, and Apify runs share IP addresses. One request reads up to 100 questions with answers, so normal runs use a few requests. RUN_SUMMARY shows the remaining quota.
  • If the daily quota runs out, the run stops as CAPPED with reason QUOTA_LIMIT, keeps saved rows and suggests an apiKey. If nothing was saved yet, the run is ERROR.
  • The API asks clients to wait between some requests. The Actor follows this, so big runs take minutes, not seconds.
  • The Actor stops reading 30 seconds before the run timeout, and after 870 seconds at most, so it can save the results (CAPPED, DEADLINE). With a shorter timeout, for example 300 seconds, a run of 1,000 answer-heavy questions can stop early with the rows read so far.
  • No comments, user profiles, badges or chat. Only questions and their answers.
  • No private or deleted content. Deleted questions come back as not_found rows.
  • Answer links (/a/<id>) are not looked up. Use the question link instead.
  • The data is live: votes, views and answers can change between runs.

👉 Try it now: open the input form

API, export and AI agents

  • Export: the dataset downloads as JSON, CSV, Excel, XML or HTML. The Questions view shows a flat table with the main question fields.
  • API: start a run with POST https://api.apify.com/v2/acts/cliqtomedia~stack-exchange-scraper/runs and the input JSON; read rows from the run's default dataset.
  • Scheduling, webhooks, Make, Zapier, n8n: use the standard Apify integrations. The next system can use site + questionId as a stable key.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/stack-exchange-scraper
  • Smallest useful input: {"site": "stackoverflow", "tags": ["apify"], "maxQuestions": 10}
  • Key output fields: title (question title), link (public URL), score (votes), answers[].body with answers[].isAccepted (answer text and accepted flag), attribution (credit line to show with the content).
  • The prefill run takes a few seconds and costs $0.029 on the Free plan (start $0.002 + 10 questions). 1,000 questions with answers took 16 to 217 seconds in our tests, inside the 600-second default timeout. Keep maxQuestions small for quick answers.

👉 Try it now: open the input form

Troubleshooting

The run failed with Unknown Stack Exchange site

Symptom: the run is FAILED with INVALID_INPUT. Likely reason: the site value is not a site name. Check: open the site in a browser; the name is the first part of the address (superuser.com → superuser, math.stackexchange.com → math). Action: fix site or paste the full domain.

The dataset is empty

Symptom: the run SUCCEEDED with NO_RESULTS. Likely reason: no question has all the tags, or the dates or query are too narrow. Check: open the tag page on the site. Action: remove a tag or widen the dates.

I got a not_found row

Likely reason: the question was deleted, or the ID is an answer ID. Check: open the link from inputs in a browser. Action: use the question link. These rows are free.

The run ended with QUOTA_LIMIT

The shared daily API quota of this IP address ran out. Saved rows are kept. Run again later, or add a free Stack Exchange API key in apiKey.

👉 Try it now: open the input form

FAQ

Do I need a Stack Overflow account or API key?

No. The Actor reads public data from the official Stack Exchange API. No login and no cookies. The apiKey field is optional: a free Stack Apps key only raises the daily quota and gives no account access.

Are answers charged separately?

No. Answers are part of the question row. One question row is one charge, with up to 500 answers inside.

Which sites work?

Any public Stack Exchange site: Stack Overflow, Super User, Server Fault, Ask Ubuntu, Mathematics, MathOverflow, Stack Overflow in Russian and others. Use the site name or domain in site.

Are the numbers live?

Yes. Each run reads the API at that moment; fetchedAt shows when. Votes, views and answers change over time.

Is personal data included?

Only public profile data shown on the site: the author's user ID, display name, reputation and profile link. No email, location or other profile details.

👉 Try it now: open the input form

👉 Try it now: open the input form

Support

For a bug, question or feature request, open an issue on the Actor's Issues tab. Add the run ID and your input. Never post API keys or other secrets.

👉 Try it now: open the input form