# Quora Scraper (Questions & Answers) (`neuro-scraper/quora-scraper`) Actor

Quora Scraper (Questions & Answers) SD - Quora Scraper (Questions & Answers) is a Q\&A data tool that extracts questions with all answers, upvotes, views, authors and comments, plus profiles, topics, spaces and posts from public Quora pages. No login.

- **URL**: https://apify.com/neuro-scraper/quora-scraper.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (community)
- **Categories:** Social media, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

./README.md

# Actor input Schema

## `startUrls` (type: `array`):

Public Quora pages, one per line: a question (https://www.quora.com/How-should-I-start-learning-Python-1), an answer (https://www.quora.com/<question>/answer/<User>), a profile (https://www.quora.com/profile/Adam-DAngelo), a topic (https://www.quora.com/topic/Machine-Learning), a space (https://quorablog.quora.com) or a space post (https://quorablog.quora.com/Update). Language sites (es.quora.com ...) work too.

## `usernames` (type: `array`):

Quora profile names, one per line - the part after /profile/ in the profile URL, e.g. Adam-DAngelo. Each gives a profile row and (with "Include profile activity") the person's answers, questions and posts.

## `searchQueries` (type: `array`):

Keywords, one per line, e.g. "python web scraping". Quora does not run its own search for logged-out visitors (measured), so the Actor finds matching Quora pages through Google ("site:quora.com <keyword>") and then scrapes them like start URLs. Needs the Apify GOOGLE_SERP proxy (included in Apify plans).

## `searchType` (type: `string`):

Which kind of Quora page a keyword search keeps (decided from the result URL).

## `timeFilter` (type: `string`):

Google's date filter on the keyword search (when Google saw the page).

## `language` (type: `string`):

For keyword search: which Quora language site to search (auto / en = www.quora.com; es = es.quora.com ...). URLs you give are scraped on their own site.

## `scrapeDepth` (type: `string`):

overview = one row per search result (Google title, snippet, URL, type) without opening Quora; detail = open every result and scrape it like a start URL.

## `maxItemsPerQuery` (type: `integer`):

Quora pages to take per keyword. The Actor follows Google's result pages until this number, "Max search pages" or the end of the results.

## `maxSourcePages` (type: `integer`):

Google result pages (10 results each) read per keyword at most.

## `maxItems` (type: `integer`):

Total rows the run returns (questions, answers, comments ... together). 0 = no limit.

## `maxAnswersPerQuestion` (type: `integer`):

Answers per question. The first ones come with the page, the rest from Quora's own "more answers" requests (cursor pages of 10) until this number or the last answer.

## `maxItemsPerSource` (type: `integer`):

Answers taken from a topic's feed (cursor pages of 10 bundles).

## `maxTopicQuestions` (type: `integer`):

Distinct questions taken from a topic's feed.

## `maxPostsPerSource` (type: `integer`):

Posts (and answers shared in the space) taken from a space's feed, following its cursor.

## `maxProfileActivityItems` (type: `integer`):

Answers, questions and posts taken from a profile's feed (cursor pages).

## `maxCommentsPerAnswer` (type: `integer`):

Top-level comments per answer when comments are on (cursor pages of 10); their replies come along.

## `maxCommentsPerPost` (type: `integer`):

Top-level comments per space post when post comments are on.

## `maxCommentDepth` (type: `integer`):

1 = top-level comments only; 2 = also the replies Quora sends with each comment.

## `includeAnswers` (type: `boolean`):

Answer rows for questions and topics.

## `includeQuestionDetails` (type: `boolean`):

One row per question (title, answer and follower counts, topics, related questions).

## `includeComments` (type: `boolean`):

Comment rows (with replies) for each answer that has comments - one extra request per 10 comments.

## `includePostComments` (type: `boolean`):

Comment rows for space posts.

## `topCommentsOnly` (type: `boolean`):

Leave out replies to comments.

## `includeQuestionTopics` (type: `boolean`):

Topic names and URLs on question rows.

## `maxQuestionTopics` (type: `integer`):

0 = all topics Quora lists.

## `includeRelatedQuestions` (type: `boolean`):

Related questions (title, URL, id) on question rows.

## `maxRelatedQuestions` (type: `integer`):

0 = all that the page lists (about 15).

## `includeRelatedTopics` (type: `boolean`):

Related topics on topic rows (when Quora lists them).

## `maxRelatedTopics` (type: `integer`):

0 = all.

## `includeTopicQuestions` (type: `boolean`):

Question rows for the questions in a topic's feed.

## `includeAnswerPreview` (type: `boolean`):

The first answer's text, author and counts as columns on the question row, plus a short list of previews.

## `maxAnswerPreviews` (type: `integer`):

Previews listed in answerPreviews.

## `minAnswerPreviewUpvotes` (type: `integer`):

Answers below this upvote count are not used as previews.

## `includeAnswerHtml` (type: `boolean`):

answerHtml: the answer as HTML (headings, lists, links, images).

## `maxAnswerHtmlBytes` (type: `integer`):

Cut answerHtml to this size (answerHtmlTruncated says so). 0 = no cut.

## `includeQuestionHtml` (type: `boolean`):

questionHtml: the question title as HTML.

## `maxQuestionHtmlBytes` (type: `integer`):

0 = no cut.

## `includePostHtml` (type: `boolean`):

postHtml: the post as HTML.

## `maxPostHtmlBytes` (type: `integer`):

0 = no cut.

## `includeMedia` (type: `boolean`):

imageUrls / videoUrls / mediaUrls found in the text (images Quora flags sensitive are left out).

## `includeOutboundLinks` (type: `boolean`):

outboundLinks: links to other sites found in the text.

## `includeSpaceSettings` (type: `boolean`):

The space's rules text and contributor-request state on space rows.

## `includeProfileActivity` (type: `boolean`):

For profiles: the person's answers, questions and posts from the profile feed.

## `activityTab` (type: `string`):

Which part of the profile feed to keep (filters the combined feed by item kind).

## `profileActivityTypes` (type: `array`):

Item kinds to keep from profile feeds (empty = all).

## `includeProfileSensitiveFields` (type: `boolean`):

The public credentials a person shows on the profile.

## `includePostAuthorContext` (type: `boolean`):

Opens the author's profile once per author: about text, education, join date and active spaces on post rows.

## `maxPostAuthorContextItems` (type: `integer`):

Spaces listed in postAuthorActiveSpaces.

## `includeEntityGraph` (type: `boolean`):

entity_edge rows: answer -> question, answer/post/comment -> author, question -> topic, post -> space, comment -> answer/post.

## `maxGraphEdges` (type: `integer`):

Cap on entity_edge rows.

## `resultTypes` (type: `array`):

Only these record types go to the dataset (empty = everything the options above produce). "author" adds one row per answer author seen in the run (with evidence links).

## `maxAuthors` (type: `integer`):

Cap on "author" rows.

## `maxEvidencePerAuthor` (type: `integer`):

Answer / question links kept on each author row.

## `includeProfileSnapshot` (type: `boolean`):

Opens each author's profile once and adds followers, views, bio and credentials to the author row.

## `filterAiAnswers` (type: `string`):

Quora marks AI-generated answers (isMachineAnswer).

## `minAnswerUpvotes` (type: `integer`):

Answers with fewer upvotes are skipped (applied by the Actor).

## `onlyUnanswered` (type: `boolean`):

Skip questions that already have answers.

## `dateFrom` (type: `string`):

Only answers, posts and comments created on or after this date (YYYY-MM-DD; applied by the Actor).

## `dateTo` (type: `string`):

Only answers, posts and comments created on or before this date (YYYY-MM-DD).

## `topicFilter` (type: `array`):

Keep only questions tagged with a topic containing one of these words, e.g. "Python" (applied by the Actor).

## `answerSortOrder` (type: `string`):

observed = Quora's own ranking; the others sort the answers collected for each question.

## `commentSortOrder` (type: `string`):

observed = Quora's order; the others sort the comments collected per answer / post.

## `globalOrder` (type: `string`):

observed = rows stream as found; any other value collects up to "Max rows" and sorts them before saving.

## `dedupeMode` (type: `string`):

canonical = each question / answer / comment ... once per run; none = keep repeats.

## `outputFields` (type: `array`):

Keep only these columns (e.g. url, title, content, numUpvotes). Empty = all columns.

## `onlyNewItems` (type: `boolean`):

Remember what earlier runs returned (in the named key-value store below) and skip unchanged rows.

## `includeUnchanged` (type: `boolean`):

With "Only new or changed rows": return unchanged rows too, marked changeType "unchanged".

## `stateStoreId` (type: `string`):

Named key-value store that keeps the content hashes between runs (default quora-scraper-state).

## `requestDelay` (type: `number`):

Pause between two requests of one worker.

## `maxConcurrency` (type: `integer`):

Targets scraped in parallel, each worker with its own proxy session.

## `maxNavigationRetries` (type: `integer`):

New proxy session and retry when a page fails (403 / 429 / network).

## `proxyConfiguration` (type: `object`):

Proxy for the Quora requests. Default: Apify RESIDENTIAL. Keyword discovery always uses GOOGLE_SERP.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.quora.com/How-should-I-start-learning-Python-1"
  ],
  "usernames": [],
  "searchQueries": [],
  "searchType": "all",
  "timeFilter": "all_time",
  "language": "auto",
  "scrapeDepth": "detail",
  "maxItemsPerQuery": 10,
  "maxSourcePages": 5,
  "maxItems": 50,
  "maxAnswersPerQuestion": 20,
  "maxItemsPerSource": 20,
  "maxTopicQuestions": 20,
  "maxPostsPerSource": 20,
  "maxProfileActivityItems": 20,
  "maxCommentsPerAnswer": 20,
  "maxCommentsPerPost": 20,
  "maxCommentDepth": 2,
  "includeAnswers": true,
  "includeQuestionDetails": true,
  "includeComments": false,
  "includePostComments": false,
  "topCommentsOnly": false,
  "includeQuestionTopics": true,
  "maxQuestionTopics": 0,
  "includeRelatedQuestions": true,
  "maxRelatedQuestions": 0,
  "includeRelatedTopics": true,
  "maxRelatedTopics": 0,
  "includeTopicQuestions": true,
  "includeAnswerPreview": false,
  "maxAnswerPreviews": 3,
  "minAnswerPreviewUpvotes": 0,
  "includeAnswerHtml": true,
  "maxAnswerHtmlBytes": 0,
  "includeQuestionHtml": false,
  "maxQuestionHtmlBytes": 0,
  "includePostHtml": true,
  "maxPostHtmlBytes": 0,
  "includeMedia": true,
  "includeOutboundLinks": true,
  "includeSpaceSettings": false,
  "includeProfileActivity": true,
  "activityTab": "all",
  "profileActivityTypes": [],
  "includeProfileSensitiveFields": true,
  "includePostAuthorContext": false,
  "maxPostAuthorContextItems": 10,
  "includeEntityGraph": false,
  "maxGraphEdges": 5000,
  "resultTypes": [],
  "maxAuthors": 1000,
  "maxEvidencePerAuthor": 10,
  "includeProfileSnapshot": false,
  "filterAiAnswers": "include",
  "minAnswerUpvotes": 0,
  "onlyUnanswered": false,
  "dateFrom": "",
  "dateTo": "",
  "topicFilter": [],
  "answerSortOrder": "observed",
  "commentSortOrder": "observed",
  "globalOrder": "observed",
  "dedupeMode": "canonical",
  "outputFields": [],
  "onlyNewItems": false,
  "includeUnchanged": false,
  "stateStoreId": "",
  "requestDelay": 1.5,
  "maxConcurrency": 1,
  "maxNavigationRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.quora.com/How-should-I-start-learning-Python-1"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/quora-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": ["https://www.quora.com/How-should-I-start-learning-Python-1"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/quora-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.quora.com/How-should-I-start-learning-Python-1"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call neuro-scraper/quora-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/quora-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gZwWkw20a5JZ9a2Wy/builds/9N7S4eeO7btRmdhjb/openapi.json
