Quora Keyword Search & Author Discovery Scraper
Search Quora by keyword or scrape visibly accessible question, answer, profile, topic, Space, and Post URLs directly, with filters for promoted cards, AI-labeled answers, unanswered questions, and author discovery across your results.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | What to scrape. `urls` follows pasted Quora links. `search` discovers indexed question links for your keywords and expands related questions. `authors` builds author profiles from pasted profile or question URLs. |
directUrls | array | optional | Paste question, answer, profile, or topic URLs. Language subdomains such as es.quora.com are accepted. Invalid links are reported as status rows. |
searchQueries | array | optional | Best-effort keyword discovery. Quora's own search page is gated for anonymous visitors, so results depend on the public web index; a run with no indexed matches returns a clear status row instead of invented results. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | optional | What to scrape. `urls` follows pasted Quora links. `search` discovers indexed question links for your keywords and expands related questions. `authors` builds author profiles from pasted profile or question URLs. |
directUrls | array | optional | Paste question, answer, profile, or topic URLs. Language subdomains such as es.quora.com are accepted. Invalid links are reported as status rows. |
searchQueries | array | optional | Best-effort keyword discovery. Quora's own search page is gated for anonymous visitors, so results depend on the public web index; a run with no indexed matches returns a clear status row instead of invented results. |
usernames | array | optional | Quora profile slugs, with or without a leading @ or trailing slash. Converted to profile URLs and merged with Quora URLs. |
resultTypes | array | optional | Which entity rows to emit. Status and run-manifest rows are always written when relevant. |
includeAnswers | boolean | optional | Emit answer rows and fetch answers beyond the first visible cards on question pages. |
maxAnswersPerQuestion | integer | optional | Answer cap for each question URL. Zero emits no answers from question pages. |
includeRelatedQuestions | boolean | optional | Follow the related-question links on each question page and scrape those questions too. This is the reliable discovery path when keyword search is gated. |
maxRelatedQuestions | integer | optional | Related questions retained per question page and used as discovery seeds. Zero keeps all observed related questions. |
includeAuthorProfiles | boolean | optional | Open each discovered author's profile to add followers, following, answer/question counts, views, join date, and credential. |
maxAuthors | integer | optional | Maximum unique author rows emitted from answer evidence. |
minAnswerUpvotes | integer | optional | Drop answers below this upvote count. Answers with no explicit upvote count are excluded when this is above zero. |
filterAiAnswers | string | optional | Include all answers, exclude answers explicitly labelled as AI, or keep only those AI-labelled answers. |
answerSortOrder | string | optional | Keep Quora's observed order, or sort by explicit upvotes or creation time. |
includeMedia | boolean | optional | Retain image and video links embedded in answer content. |
includeOutboundLinks | boolean | optional | Retain external links embedded in answer content. |
includeAnswerHtml | boolean | optional | Retain a simple HTML rendering of each answer alongside its plain text. |
includeProfileSensitiveFields | boolean | optional | Include location, employment, education, and join date on profile and author rows. |
includeSocialLinks | boolean | optional | Include website and social links found on a profile. |
maxItems | integer | optional | Hard cap on real data rows across the run. Status and manifest rows do not consume the cap. |
maxItemsPerSource | integer | optional | Cap real rows emitted from each URL or keyword. Zero means no per-source cap. |
includeFieldEvidence | boolean | optional | Add field_sources and fields_present metadata so each value can be traced to the page payload. |
onlyUnanswered | boolean | optional | Keep only questions whose explicit answer count is exactly zero. Unknown counts are excluded. |
Download the published input schema
View complete JSON
{
"description": "Collect Quora questions, full answers, authors, and topics from URLs or best-effort keyword discovery.",
"properties": {
"answerSortOrder": {
"default": "observed",
"description": "Keep Quora's observed order, or sort by explicit upvotes or creation time.",
"editor": "select",
"enum": [
"observed",
"upvotes_desc",
"newest"
],
"enumTitles": [
"Observed order",
"Most upvotes",
"Newest"
],
"prefill": "observed",
"title": "Answer Sort Order",
"type": "string"
},
"directUrls": {
"description": "Paste question, answer, profile, or topic URLs. Language subdomains such as es.quora.com are accepted. Invalid links are reported as status rows.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [
"https://www.quora.com/What-is-Python-primarily-used-for"
],
"title": "Quora URLs",
"type": "array"
},
"filterAiAnswers": {
"default": "include",
"description": "Include all answers, exclude answers explicitly labelled as AI, or keep only those AI-labelled answers.",
"editor": "select",
"enum": [
"include",
"exclude",
"only"
],
"enumTitles": [
"Include all",
"Exclude AI answers",
"Only AI answers"
],
"prefill": "include",
"title": "AI Answers",
"type": "string"
},
"includeAnswerHtml": {
"default": true,
"description": "Retain a simple HTML rendering of each answer alongside its plain text.",
"prefill": false,
"title": "Include Answer HTML",
"type": "boolean"
},
"includeAnswers": {
"default": true,
"description": "Emit answer rows and fetch answers beyond the first visible cards on question pages.",
"prefill": true,
"title": "Include Answers",
"type": "boolean"
},
"includeAuthorProfiles": {
"default": true,
"description": "Open each discovered author's profile to add followers, following, answer/question counts, views, join date, and credential.",
"prefill": false,
"title": "Enrich Authors with Profile Stats",
"type": "boolean"
},
"includeFieldEvidence": {
"default": true,
"description": "Add field_sources and fields_present metadata so each value can be traced to the page payload.",
"prefill": true,
"title": "Include Field Evidence",
"type": "boolean"
},
"includeMedia": {
"default": false,
"description": "Retain image and video links embedded in answer content.",
"prefill": false,
"title": "Include Answer Media",
"type": "boolean"
},
"includeOutboundLinks": {
"default": false,
"description": "Retain external links embedded in answer content.",
"prefill": false,
"title": "Include Outbound Links",
"type": "boolean"
},
"includeProfileSensitiveFields": {
"default": true,
"description": "Include location, employment, education, and join date on profile and author rows.",
"prefill": true,
"title": "Include Profile Location and Work History",
"type": "boolean"
},
"includeRelatedQuestions": {
"default": false,
"description": "Follow the related-question links on each question page and scrape those questions too. This is the reliable discovery path when keyword search is gated.",
"prefill": false,
"title": "Discover Related Questions",
"type": "boolean"
},
"includeSocialLinks": {
"default": true,
"description": "Include website and social links found on a profile.",
"prefill": true,
"title": "Include Social Links",
"type": "boolean"
},
"maxAnswersPerQuestion": {
"default": 20,
"description": "Answer cap for each question URL. Zero emits no answers from question pages.",
"maximum": 500,
"minimum": 0,
"prefill": 2,
"title": "Maximum Answers per Question",
"type": "integer"
},
"maxAuthors": {
"default": 100,
"description": "Maximum unique author rows emitted from answer evidence.",
"maximum": 5000,
"minimum": 1,
"prefill": 20,
"title": "Maximum Authors",
"type": "integer"
},
"maxItems": {
"default": 200,
"description": "Hard cap on real data rows across the run. Status and manifest rows do not consume the cap.",
"maximum": 50000,
"minimum": 1,
"prefill": 3,
"title": "Maximum Total Rows",
"type": "integer"
},
"maxItemsPerSource": {
"default": 0,
"description": "Cap real rows emitted from each URL or keyword. Zero means no per-source cap.",
"maximum": 5000,
"minimum": 0,
"prefill": 0,
"title": "Maximum Rows per Source",
"type": "integer"
},
"maxRelatedQuestions": {
"default": 15,
"description": "Related questions retained per question page and used as discovery seeds. Zero keeps all observed related questions.",
"maximum": 100,
"minimum": 0,
"prefill": 0,
"title": "Maximum Related Questions",
"type": "integer"
},
"minAnswerUpvotes": {
"default": 0,
"description": "Drop answers below this upvote count. Answers with no explicit upvote count are excluded when this is above zero.",
"maximum": 2000000000,
"minimum": 0,
"title": "Minimum Answer Upvotes",
"type": "integer"
},
"mode": {
"default": "urls",
"description": "What to scrape. `urls` follows pasted Quora links. `search` discovers indexed question links for your keywords and expands related questions. `authors` builds author profiles from pasted profile or question URLs.",
"editor": "select",
"enum": [
"urls",
"search",
"authors"
],
"enumTitles": [
"Questions, answers and topics from URLs",
"Best-effort keyword discovery + related questions",
"Author profiles"
],
"prefill": "urls",
"title": "Mode",
"type": "string"
},
"onlyUnanswered": {
"default": false,
"description": "Keep only questions whose explicit answer count is exactly zero. Unknown counts are excluded.",
"prefill": false,
"title": "Only Unanswered Questions",
"type": "boolean"
},
"resultTypes": {
"default": [
"question",
"answer"
],
"description": "Which entity rows to emit. Status and run-manifest rows are always written when relevant.",
"editor": "select",
"items": {
"enum": [
"question",
"answer",
"profile",
"author",
"topic"
],
"type": "string"
},
"prefill": [
"question",
"answer"
],
"title": "Result Types",
"type": "array"
},
"searchQueries": {
"default": [],
"description": "Best-effort keyword discovery. Quora's own search page is gated for anonymous visitors, so results depend on the public web index; a run with no indexed matches returns a clear status row instead of invented results.",
"editor": "stringList",
"items": {
"type": "string"
},
"prefill": [],
"title": "Keywords or Question Titles",
"type": "array"
},
"usernames": {
"default": [],
"description": "Quora profile slugs, with or without a leading @ or trailing slash. Converted to profile URLs and merged with Quora URLs.",
"editor": "stringList",
"items": {
"type": "string"
},
"title": "Profile Usernames",
"type": "array"
}
},
"required": [],
"schemaVersion": 1,
"title": "Quora Question & Author Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
results | string | optional | Dataset containing question, answer, profile, author, topic, status, and manifest rows. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "Quora questions, full answers, author profiles, topics, and access-status rows.",
"properties": {
"results": {
"description": "Dataset containing question, answer, profile, author, topic, status, and manifest rows.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Quora rows",
"type": "string"
}
},
"title": "Quora Keyword Search & Author Discovery Scraper Output",
"type": "object"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"title": "Quora data",
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Quora rows",
"transformation": {
"fields": [
"content_type",
"title",
"url",
"question_id",
"answer_id",
"author_name",
"upvotes",
"view_count",
"comments_count",
"created_at",
"follower_count",
"answer_count",
"discovery_source",
"access_state",
"source_url"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Quora Keyword Search & Author Discovery Scraper
Collect public Quora questions, full answers, author profiles, and topics without cookies or logins. Paste question, answer, profile, or topic URLs, or use best-effort keyword discovery with related-question expansion. The default path is HTTP; a residential browser fallback is automatic only after Quora challenges the direct, datacenter, and residential HTTP paths.
What this actor does
- Three modes:
urlsfollows pasted Quora links,searchdiscovers indexed question links and expands related questions,authorsbuilds author profiles from profile or question URLs. - Full question context: title, URL, topics, follower count, answer count, related questions, and the explicit unanswered state.
- Full answers: answer text, permalink, author name and profile link, credential, verified badge, upvotes, views, comment count, share count, exact creation date, AI label, and related-answer provenance.
- Author profiles: followers, following, answers, questions, posts, content views, join date, credential, location, employment, education, and expertise topics.
- Honest discovery: Quora's native search page is gated for anonymous visitors, so keyword mode uses a public web index and reports a clear status row when no indexed matches exist. Related-question expansion is the reliable discovery path.
- HTTP first, browser last resort: every page is fetched over HTTP first. Only if Quora challenges the direct, datacenter, and residential HTTP paths does the actor render that page in a real Chromium session through a residential connection. The same parser is used, so the output shape does not change.
- Leaves empty fields out of each row instead of writing guesses or nulls.
Output per question
question_id,title,question_title,url,question_url,canonical_urltopics[],topic_urls[]answer_count,answer_count_text,answer_count_scraped,last_answered_atfollow_count,follow_count_text,follower_countrelated_questions[],related_questions_countquestion_language,answer_pagination_statediscovery_source,source_query,parent_question_urlaccess_state,scrape_timestamp,record_id
Output per answer
answer_id,answer_url,answer_text,word_countupvotes/upvotes_text,view_count/view_count_textcomments_count/comments_count_text,shares_count/shares_count_textcreated_at,answer_created_at,answer_timestamp,answer_updated_atauthor_name,author_url,author_id,author_image_url,author_credentials,author_is_verified,author_is_anonymousis_ai_answer,ai_label_text,answer_visibility,answer_is_collapsedanswer_is_related,source_question_url,source_question_titlequestion_id,question_title,question_urlmedia_urls,image_urls,video_urls,outbound_links(optional)answer_html(optional),discovery_source,source_url,access_state
Output per author
author_id,name,profile_url,avatar_url,credential,is_verifiedfollower_count,following_count,answer_count,question_count,post_count,content_viewsjoined_at,location,employment,educationtopics[],bio,website_url,social_links[]evidence_urls[],evidence_question_urls[],evidence_answer_urls[],evidence_answer_previews[]
A direct profile URL in urls mode emits a profile row with the same profile fields. In authors mode it emits an author row.
Output per topic
topic_id,name,url,follower_countdiscovery_source,source_url,access_state
Output per status / manifest
Status rows explain a page that could not be read: access_state is one of not_found, removed, login_required, cloudflare_challenge, rate_limited, unavailable, unsupported_url, or discovery_unavailable. A run-manifest row is written at the end of every run that starts.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | urls |
urls, search, or authors |
directUrls |
array | – (prefilled with one Python question) | Question, answer, profile, or topic URLs |
searchQueries |
array | – | Keywords or question titles for best-effort discovery (mode=search) |
usernames |
array | – | Profile slugs converted to profile URLs |
resultTypes |
array | ["question","answer"] |
question, answer, profile, author, topic |
includeAnswers |
boolean | true |
Emit answers from question pages |
maxAnswersPerQuestion |
integer | 20 |
Answer cap per question (0–500) |
includeRelatedQuestions |
boolean | false |
Follow related-question links |
maxRelatedQuestions |
integer | 15 |
Cap per question; 0 keeps all observed |
includeAuthorProfiles |
boolean | true |
Enrich discovered authors with profile stats |
maxAuthors |
integer | 100 |
Author-row cap |
minAnswerUpvotes |
integer | 0 |
Drop answers below this explicit upvote count |
filterAiAnswers |
string | include |
include, exclude, or only |
answerSortOrder |
string | observed |
observed, upvotes_desc, or newest |
onlyUnanswered |
boolean | false |
Keep only questions with an explicit zero answer count |
includeMedia |
boolean | false |
Retain answer image/video links |
includeOutboundLinks |
boolean | false |
Retain external links in answers |
includeAnswerHtml |
boolean | true |
Retain a simple HTML rendering of answers |
includeProfileSensitiveFields |
boolean | true |
Include location, employment, education, join date |
includeSocialLinks |
boolean | true |
Include profile website/social links |
maxItems |
integer | 200 |
Total real-row cap |
maxItemsPerSource |
integer | 0 |
Per-URL/keyword cap (0 = no cap) |
includeFieldEvidence |
boolean | true |
Add field_sources and fields_present |
The saved prefill is one question with maxAnswersPerQuestion: 2 and maxItems: 3, so the first run returns three real rows.
Examples
A question with many answers
{
"mode": "urls",
"directUrls": ["https://www.quora.com/What-is-Python-primarily-used-for"],
"resultTypes": ["question", "answer"],
"maxAnswersPerQuestion": 50
}
A profile and its stats
{
"mode": "authors",
"directUrls": ["https://www.quora.com/profile/Adam-DAngelo"],
"resultTypes": ["author"]
}
Expand related questions from one seed
{
"mode": "search",
"directUrls": ["https://www.quora.com/What-is-machine-learning"],
"includeRelatedQuestions": true,
"maxRelatedQuestions": 10,
"maxItems": 100
}
Best-effort keyword discovery
{
"mode": "search",
"searchQueries": ["remote work productivity"],
"includeRelatedQuestions": true,
"maxItems": 50
}
Use cases
- Market and product research — collect complete answer threads with engagement metrics.
- Expert sourcing — turn answer authors into a profile list with follower and answer counts.
- Content gap analysis — find questions with zero answers in a niche.
- AI-answer auditing — separate explicitly AI-labelled answers from human answers.
- Knowledge-base building — export clean question/answer pairs with source URLs and dates.
FAQ
Does this actor need cookies or a login?
No. It reads public question, answer, profile, and topic pages without an account. There is no cookie or proxy field to configure.
Why can't I search Quora by keyword reliably?
Quora's own search page is gated for anonymous visitors, and the actor never calls Quora's /search?q= endpoint. It uses a public web index for keyword discovery and expands related questions from any question it reaches. When no indexed matches exist, it writes a discovery_unavailable status row and does not invent results.
How many answers can I get?
All answers that Quora exposes through its answer feed, up to maxAnswersPerQuestion. The actor follows the answer cursor until your cap or the end of the feed. Popular questions can contain thousands of answers; set a cap for the first run.
Why is an answer marked as related?
Quora sometimes shows answers written for a merged or equivalent question. Those rows carry answer_is_related: true and source_question_url / source_question_title, so the answer is not misattributed to the page you opened.
Why are some fields missing on some rows?
Quora only publishes a credential, location, employment, education, or bio for some users. Missing values are omitted, never guessed. Question creation dates and question view counts are not published on the public question page and are not emitted.
Can I get comment text?
No. Quora publishes the comment count with each answer, but not the comment bodies on the public page. The actor returns the count only.
What does "best-effort" mean for keyword discovery?
It means the actor tries a public index first and tells you when that index has no matches. It never re-labels related questions or unrelated pages as keyword search results.
What happens if Quora challenges the page?
The actor first tries its fast HTTP path, then datacenter and residential HTTP. If all three are challenged, it renders that page in a real browser through its residential connection and parses the same data. If even that is blocked, the page is reported as a cloudflare_challenge status row. The browser fallback is slower, uses more memory, and incurs residential data transfer for the pages that need it; it only runs after direct, datacenter, and residential HTTP are challenged.
Is this affiliated with Quora?
No. This is an independent, third-party actor that reads public Quora pages. It is not affiliated with or endorsed by Quora.
Limitations
- Native Quora keyword search is unavailable anonymously; keyword discovery depends on a public web index.
- Comment bodies, question creation dates, question view counts, topic question feeds, and full profile answer lists are not available from the public page.
- Topic pages expose the topic name and follower count; descriptions and question counts are omitted when Quora does not publish them.
- Very large answer threads are bounded by
maxAnswersPerQuestionandmaxItems. - A page that is removed, private, or behind a login wall is reported as a status row, not fabricated data.
- Challenge recovery uses a real browser as a last resort, so it is slower, uses more memory, and incurs residential data transfer for the pages that need it.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build JWoVhbBdDSTo9DNhE. Documentation is regenerated from the default published build; private drafts are not included.