Vexaloom Labs

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.

FieldTypeRequiredDescription
modestringoptionalWhat 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.
directUrlsarrayoptionalPaste question, answer, profile, or topic URLs. Language subdomains such as es.quora.com are accepted. Invalid links are reported as status rows.
searchQueriesarrayoptionalBest-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
FieldTypeRequiredDescription
modestringoptionalWhat 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.
directUrlsarrayoptionalPaste question, answer, profile, or topic URLs. Language subdomains such as es.quora.com are accepted. Invalid links are reported as status rows.
searchQueriesarrayoptionalBest-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.
usernamesarrayoptionalQuora profile slugs, with or without a leading @ or trailing slash. Converted to profile URLs and merged with Quora URLs.
resultTypesarrayoptionalWhich entity rows to emit. Status and run-manifest rows are always written when relevant.
includeAnswersbooleanoptionalEmit answer rows and fetch answers beyond the first visible cards on question pages.
maxAnswersPerQuestionintegeroptionalAnswer cap for each question URL. Zero emits no answers from question pages.
includeRelatedQuestionsbooleanoptionalFollow the related-question links on each question page and scrape those questions too. This is the reliable discovery path when keyword search is gated.
maxRelatedQuestionsintegeroptionalRelated questions retained per question page and used as discovery seeds. Zero keeps all observed related questions.
includeAuthorProfilesbooleanoptionalOpen each discovered author's profile to add followers, following, answer/question counts, views, join date, and credential.
maxAuthorsintegeroptionalMaximum unique author rows emitted from answer evidence.
minAnswerUpvotesintegeroptionalDrop answers below this upvote count. Answers with no explicit upvote count are excluded when this is above zero.
filterAiAnswersstringoptionalInclude all answers, exclude answers explicitly labelled as AI, or keep only those AI-labelled answers.
answerSortOrderstringoptionalKeep Quora's observed order, or sort by explicit upvotes or creation time.
includeMediabooleanoptionalRetain image and video links embedded in answer content.
includeOutboundLinksbooleanoptionalRetain external links embedded in answer content.
includeAnswerHtmlbooleanoptionalRetain a simple HTML rendering of each answer alongside its plain text.
includeProfileSensitiveFieldsbooleanoptionalInclude location, employment, education, and join date on profile and author rows.
includeSocialLinksbooleanoptionalInclude website and social links found on a profile.
maxItemsintegeroptionalHard cap on real data rows across the run. Status and manifest rows do not consume the cap.
maxItemsPerSourceintegeroptionalCap real rows emitted from each URL or keyword. Zero means no per-source cap.
includeFieldEvidencebooleanoptionalAdd field_sources and fields_present metadata so each value can be traced to the page payload.
onlyUnansweredbooleanoptionalKeep 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.

FieldTypeRequiredDescription
resultsstringoptionalDataset 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: urls follows pasted Quora links, search discovers indexed question links and expands related questions, authors builds 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_url
  • topics[], topic_urls[]
  • answer_count, answer_count_text, answer_count_scraped, last_answered_at
  • follow_count, follow_count_text, follower_count
  • related_questions[], related_questions_count
  • question_language, answer_pagination_state
  • discovery_source, source_query, parent_question_url
  • access_state, scrape_timestamp, record_id

Output per answer

  • answer_id, answer_url, answer_text, word_count
  • upvotes / upvotes_text, view_count / view_count_text
  • comments_count / comments_count_text, shares_count / shares_count_text
  • created_at, answer_created_at, answer_timestamp, answer_updated_at
  • author_name, author_url, author_id, author_image_url, author_credentials, author_is_verified, author_is_anonymous
  • is_ai_answer, ai_label_text, answer_visibility, answer_is_collapsed
  • answer_is_related, source_question_url, source_question_title
  • question_id, question_title, question_url
  • media_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_verified
  • follower_count, following_count, answer_count, question_count, post_count, content_views
  • joined_at, location, employment, education
  • topics[], 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_count
  • discovery_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"]
}
{
  "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.

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 maxAnswersPerQuestion and maxItems.
  • 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.

Open the step-by-step Python guide →

Source build JWoVhbBdDSTo9DNhE. Documentation is regenerated from the default published build; private drafts are not included.