# Quora Answers Scraper (`sz022/quora-answers-scraper`) Actor

Scrape Quora answers from question URLs, profiles, topics and Spaces: full text, views, upvotes, shares, comment counts, dates, AI-written flag and author credentials. Follow related questions to find more. No login needed. Export to CSV, Excel or JSON.

- **URL**: https://apify.com/sz022/quora-answers-scraper.md
- **Developed by:** [CHEN-SHU-CHEN](https://apify.com/sz022) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 answer scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What is Quora Answers Scraper?

You want to know what people actually say about a topic, a product or a competitor, and Quora has years of long-form answers on it. Reading them in a browser means opening each question, scrolling past the ads, expanding answers one by one and copying numbers into a sheet.

Paste **Quora question, answer, profile, topic or Space URLs**, mixed together, and get **one row per answer** with its **full text** (plain, Markdown and HTML), **views, upvotes, shares and comment count**, when it was **written and last edited**, whether Quora marks it as **AI-written**, and **who wrote it**: name, credential, verified badge, and how many answers and views they have across Quora. Questions, Space posts and profiles get rows of their own. No login is needed.

Built for reading pages you can point at. Quora shows no search results to logged-out visitors, so this Actor does not take keywords. To discover questions, give it a few questions on your subject and turn on **Follow related questions**: it reads the related questions Quora lists on each one, as many hops out as you set.

Because it runs on Apify, you can **schedule** a weekly re-read, call it through the **API**, connect it to Make, Zapier or Google Sheets, and export the table as **CSV, Excel or JSON**.

### How to scrape Quora answers

1. Open the **Input** tab and paste URLs into **Quora URLs**, one per line. All of these work:
   - a question: `https://www.quora.com/What-is-X`
   - one answer: `https://www.quora.com/What-is-X/answer/Jane-Doe`
   - a profile: `https://www.quora.com/profile/Jane-Doe`
   - a topic: `https://www.quora.com/topic/Economics`
   - a Space: `https://humanity.quora.com/`
   - other languages: `https://es.quora.com/...`, `https://de.quora.com/...`
2. Set **Answers per question** (20 by default) and, for profiles, **Answers per profile**.
3. Optional: pick an **Answer order** (recommended, most recent, most upvoted), or turn on **Follow related questions**.
4. Click **Start**. A question with 20 answers takes a few seconds.
5. Open the **Output** tab. The **Answers only** view shows the answer columns; question, post and profile rows appear in it with those columns empty, so filter on `type` to keep answers only. Inputs that could not be read are in the table too, with a `status` and a reason.

### What data does it return?

Every row has a `type`: `answer`, `question`, `post` (a Space post) or `profile`.

#### Answer rows

| Field | Notes |
|---|---|
| `answerId`, `url` | |
| `questionId`, `questionTitle`, `questionUrl`, `questionAnswerCount` | |
| `text`, `markdown`, `html` | The full answer. Logged-out pages carry the whole text, not a preview |
| `wordCount`, `images`, `links`, `embeds` | Images with width, height, caption and full-size URL; every outbound link and citation |
| `createdAt`, `updatedAt` | ISO 8601, UTC. `updatedAt` is null for an answer never edited |
| `views`, `upvotes`, `shares`, `comments` | Exact numbers from Quora, not rounded |
| `author` | `name`, `profileUrl`, `profileImageUrl`, `credential` (as shown next to the answer), `isVerified`, `isAnonymous`, `isAiAccount`, `followerCount`, `answerCount` and `contentViews` (the author's totals) |
| `isAiGenerated` | Quora's own flag for machine-written answers |
| `answerKind` | `answer`, `ai`, `equivalent` (written for a question Quora treats as the same one) or `promoted` |
| `originalQuestion` | For `equivalent` answers: the question it was written for |
| `isPromoted`, `promotedAdId` | Paid answers, only when **Include promoted answers** is on |
| `isPinned`, `isCollapsed`, `collapseReason`, `commentsDisabled`, `isTranslated`, `accessOption` | |
| `space`, `topic` | The Space or topic it was read from, with follower counts |
| `language`, `source`, `inputUrl`, `scrapedAt` | `source` is `input`, or `related` for a question found by crawling |

#### Question rows

`questionId`, `url`, `title`, `answerCount`, `answerCountWithRelated`, `followerCount`, `comments`, `topics`, `spacesCount`, `askerUserId`, `isLocked`, `isGeneratedQuestion` (Quora wrote the question itself), `isTrendyQuestion`, `isPartnerQuestion`, `mergedFrom` (the URL you gave, when Quora merged it into this question), `mergedInto`, `linkedQuestion`, `relatedQuestions` (id, title and URL of every related question the page lists, often 50 or more), `language`.

#### Space post rows

`postId`, `url`, `title`, the same body, count, date and author fields as an answer, and `space` with its name, URL and follower count.

#### Profile rows

`userId`, `name`, `url`, `profileImageUrl`, `credential`, `bio`, `workCredentials`, `schoolCredentials`, `locationCredentials`, `languageCredentials`, `followerCount`, `followingCount`, `answerCount`, `questionCount`, `postCount`, `contentViews` (all time), `answerViews`, `contentViewsLastMonth`, `topWriterYears`, `prizeWinningAnswers`, `publishedIn`, `knowsAbout` (topics with the number of answers in each), `spaces` (with the number of items the user posted in each), `isVerified`, `isAiAccount`, `isDeactivated`, `joinedAt`.

**Unknown is `null`, never `0`.** Quora does not show a question's creation date or view count, so those fields are not in the table at all, and a count Quora left out of a response is `null`.

### How much does it cost to scrape Quora?

You pay per row delivered, not per minute or per request.

| Event | What it is | Price | Per 1,000 |
|---|---|---|---|
| `answer-scraped` | One answer with its text, counts and author | $0.001 | $1 |
| `question-scraped` | One question row | $0.001 | $1 |
| `post-scraped` | One Space post | $0.001 | $1 |
| `profile-scraped` | One profile row | $0.001 | $1 |

A question with 20 answers costs $0.021: 20 answers and the question row. Turn off **Include a row for each question** to pay for the answers only. Rows with a `status` other than `ok` (not found, blocked, not processed) are free, and an answer that turns up twice in one run, say on a question and on its author's profile, is delivered and charged once.

The proxy is included. The Actor reads through Apify's **US residential proxy** by default, because Quora's Cloudflare answers Apify's datacenter IPs with HTTP 403 on question pages; residential IPs read them normally. That traffic, about 20 MB per 1,000 answers, is paid by the Actor, not by you, so the price per row is the same whichever proxy is used.

#### Is it free to try?

Apify's free plan includes $5 of usage a month, which covers about 5,000 answers.

#### How do I cap what a run can spend?

Set a maximum charge for the run when you start it. Each row is written and charged in one step by Apify's own SDK, which writes a row only when the remaining budget covers it, so you are never charged for a row you did not get. When the budget runs out, the inputs the Actor never reached come back as `not_processed` rows, free, and an input it stopped in the middle of gets a free `partial` row saying how far it got. If a row cannot be written or charged, the run stops the same way rather than keep working unbilled. The run also stops cleanly, with the same free rows, shortly before its timeout.

### Input example

```json
{
  "urls": [
    "https://www.quora.com/Whats-a-counterintuitive-result-of-economics-logic-that-nonetheless-rings-true",
    "https://www.quora.com/profile/Adam-DAngelo"
  ],
  "maxAnswersPerQuestion": 20,
  "answerSort": "upvotes",
  "maxAnswersPerProfile": 20,
  "crawlRelatedQuestions": true,
  "maxRelatedQuestions": 10
}
```

### Output example

One answer row from a real run on 2026-10-18, with the long text fields shortened:

```json
{
  "type": "answer",
  "status": "ok",
  "answerId": 1477743807792023,
  "url": "https://www.quora.com/Whats-a-counterintuitive-result-of-economics-logic-that-nonetheless-rings-true/answer/Victor-Xing",
  "questionTitle": "What's a counterintuitive result of economics logic that nonetheless rings true?",
  "text": "Unemployment rate may rise for the “right” reasons\nThe public generally considers the U.S.…",
  "markdown": "**Unemployment rate may rise for the “right” reasons**\n\nThe public generally considers the…",
  "wordCount": 617,
  "links": ["https://data.bls.gov/dataViewer/view/timeseries/LNS14000000", "https://www.bls.gov/cps/cps_htgm.htm"],
  "createdAt": "2024-08-18T07:54:40.729Z",
  "updatedAt": "2024-08-19T08:04:44.555Z",
  "views": 2128,
  "upvotes": 14,
  "shares": 25,
  "comments": 1,
  "author": {
    "name": "Victor Xing",
    "profileUrl": "https://www.quora.com/profile/Victor-Xing",
    "credential": "Portfolio Manager, Rates and FX",
    "isVerified": false,
    "answerCount": 1105,
    "contentViews": 7320562
  },
  "isAiGenerated": false,
  "answerKind": "answer",
  "language": "en"
}
```

### What it cannot return

- **Keyword search results.** Quora answers search with nothing for logged-out visitors. Use related-question crawling, topics or Spaces to discover content.
- **Comment text, upvoter lists, answer requests.** The counts are there; the lists behind them are not.
- **A question's creation date or view count.** Quora does not show them on the page.
- **Private or deleted content**, and anything shown only to logged-in members.

### FAQ

#### Why does the "most upvoted" order not start with the most upvoted answer?

Quora puts its own top answer first whatever order you pick, and sorts the rest. The Actor returns answers in the order Quora gives them.

#### What are `equivalent` answers?

When Quora decides two questions mean the same thing, it shows answers written for one on the other. Those answers have `answerKind: "equivalent"` and `originalQuestion` set to the question they were written for.

#### Why did an input come back `blocked`?

Quora sits behind Cloudflare, which blocks Apify's datacenter IPs on question pages, so the default proxy is Apify's US residential proxy. A blocked request is retried on a fresh IP with fresh cookies. If you choose a datacenter proxy yourself, three blocks in a row switch the rest of the run to the US residential proxy (unless you turn that off), starting a new session there and retrying the page that was blocked. If inputs still come back `blocked`, run again later. After 5 failed inputs in a row the run stops and marks the rest `not_processed`, free; change that with **Stop after this many failed inputs in a row**.

#### What happens when Quora changes its site?

The Actor reads the same data Quora's own pages load, which is undocumented and can change. The query IDs it calls are looked up again in Quora's code when Quora retires one, so routine deploys do not break it. If a page can no longer be read, that input comes back as `parse_error` instead of a row of wrong numbers, and a single answer or post whose text cannot be read comes back as its own free `parse_error` row while the rest of the page is delivered.

#### What happens if Apify restarts a run?

Apify sometimes moves a running Actor to another server. The Actor saves which inputs are finished, and after a restart it reads back the rows already delivered from the dataset, so it carries on without charging any of them again. The input or related question that was in progress is read again from the start, and only its new rows are charged.

#### Is it legal to scrape Quora?

The Actor reads only what any logged-out visitor can see and uses no account. Whether you may use the data depends on what you do with it and where you are, and Quora's terms limit automated collection. This is not legal advice; check the rules that apply to you.

#### Something broke or a number looks wrong

Open an issue on the **Issues** tab with the URL and the run link.

# Actor input Schema

## `urls` (type: `array`):

Question, answer, profile, topic and Space URLs, mixed freely, one per line: https://www.quora.com/What-is-X, https://www.quora.com/What-is-X/answer/Jane-Doe, https://www.quora.com/profile/Jane-Doe, https://www.quora.com/topic/Economics, https://humanity.quora.com/. Keywords are not accepted: Quora returns no search results to logged-out visitors. To discover questions, turn on related-question crawling below.

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

How many answers to read from each question. 0 gives the question row only. Quora returns about 8 answers per request.

## `answerSort` (type: `string`):

The order Quora lists a question's answers in. Quora always puts its top answer first, whatever the order.

## `includeQuestionRows` (type: `boolean`):

Title, answer and follower counts, topics and related questions. Charged as question-scraped. Turn off to get answers only.

## `includePromotedAnswers` (type: `boolean`):

Quora mixes paid answers to other questions into answer lists and feeds. Off by default; when on they come back with isPromoted: true.

## `crawlRelatedQuestions` (type: `boolean`):

Read the questions Quora lists as related to each question you give, with the same answer settings. This is how to discover questions without keyword search.

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

Across the whole run. Each one is charged like a question you gave, plus its answers.

## `relatedDepth` (type: `integer`):

1 reads the questions related to yours. 2 also reads the questions related to those, and so on.

## `maxAnswersPerProfile` (type: `integer`):

How many of a profile's answers to read. 0 gives the profile row only. Quora returns 20 per request.

## `profileAnswerSort` (type: `string`):

Newest first, as the profile's Answers tab shows them, or most viewed first.

## `maxItemsPerFeed` (type: `integer`):

A topic gives its answer feed; a Space gives its posts and the answers shared into it, in Quora's own order.

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

Apify's US residential proxy by default: Quora blocks Apify's datacenter IPs on question pages. Residential traffic is included in the price.

## `residentialFallback` (type: `boolean`):

Only matters if you pick a non-residential proxy above. After 3 blocked requests in a row, the rest of the run uses Apify's US residential proxy, on a fresh session, and the blocked page is retried there. Its traffic is paid by the Actor, not by you.

## `abortAfterConsecutiveFailures` (type: `integer`):

Ends the run early when Quora stops answering. Pages that do not exist do not count. 0 never stops early.

## Actor input object example

```json
{
  "urls": [
    "https://www.quora.com/Whats-a-counterintuitive-result-of-economics-logic-that-nonetheless-rings-true",
    "https://www.quora.com/profile/Adam-DAngelo"
  ],
  "maxAnswersPerQuestion": 5,
  "answerSort": "recommended",
  "includeQuestionRows": true,
  "includePromotedAnswers": false,
  "crawlRelatedQuestions": false,
  "maxRelatedQuestions": 20,
  "relatedDepth": 1,
  "maxAnswersPerProfile": 5,
  "profileAnswerSort": "recent",
  "maxItemsPerFeed": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "residentialFallback": true,
  "abortAfterConsecutiveFailures": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Full text as plain text, Markdown and HTML, views, upvotes, shares, comment counts, dates, AI-written flag and author details. Unknown values are null, never 0.

## `summary` (type: `string`):

Rows delivered per type, requests made, why the run stopped early (if it did) and every input with a problem.

# 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 = {
    "urls": [
        "https://www.quora.com/Whats-a-counterintuitive-result-of-economics-logic-that-nonetheless-rings-true",
        "https://www.quora.com/profile/Adam-DAngelo"
    ],
    "maxAnswersPerQuestion": 5,
    "maxAnswersPerProfile": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("sz022/quora-answers-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 = {
    "urls": [
        "https://www.quora.com/Whats-a-counterintuitive-result-of-economics-logic-that-nonetheless-rings-true",
        "https://www.quora.com/profile/Adam-DAngelo",
    ],
    "maxAnswersPerQuestion": 5,
    "maxAnswersPerProfile": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("sz022/quora-answers-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 '{
  "urls": [
    "https://www.quora.com/Whats-a-counterintuitive-result-of-economics-logic-that-nonetheless-rings-true",
    "https://www.quora.com/profile/Adam-DAngelo"
  ],
  "maxAnswersPerQuestion": 5,
  "maxAnswersPerProfile": 5
}' |
apify call sz022/quora-answers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sz022/quora-answers-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/b12844gHThdyXHFse/builds/DubqhKYXoJX9f2qkD/openapi.json
