{
  "data": {
    "id": "JWoVhbBdDSTo9DNhE",
    "actId": "kBf4VDxTBbjxk50DV",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-10-24T15:33:47.584Z",
    "finishedAt": "2026-10-24T15:34:25.271Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 37528,
      "runTimeSecs": 37.528,
      "computeUnits": 0.04169777777777778,
      "imageSizeBytes": 3139753472
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "zifX0mkAFMHe8CatY",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Quora Question & Author Scraper Input\",\n  \"description\": \"Collect Quora questions, full answers, authors, and topics from URLs or best-effort keyword discovery.\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"Mode\",\n      \"type\": \"string\",\n      \"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.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"urls\",\n        \"search\",\n        \"authors\"\n      ],\n      \"enumTitles\": [\n        \"Questions, answers and topics from URLs\",\n        \"Best-effort keyword discovery + related questions\",\n        \"Author profiles\"\n      ],\n      \"default\": \"urls\",\n      \"prefill\": \"urls\"\n    },\n    \"directUrls\": {\n      \"title\": \"Quora URLs\",\n      \"type\": \"array\",\n      \"description\": \"Paste question, answer, profile, or topic URLs. Language subdomains such as es.quora.com are accepted. Invalid links are reported as status rows.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"prefill\": [\n        \"https://www.quora.com/What-is-Python-primarily-used-for\"\n      ]\n    },\n    \"searchQueries\": {\n      \"title\": \"Keywords or Question Titles\",\n      \"type\": \"array\",\n      \"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.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": [],\n      \"prefill\": []\n    },\n    \"usernames\": {\n      \"title\": \"Profile Usernames\",\n      \"type\": \"array\",\n      \"description\": \"Quora profile slugs, with or without a leading @ or trailing slash. Converted to profile URLs and merged with Quora URLs.\",\n      \"editor\": \"stringList\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": []\n    },\n    \"resultTypes\": {\n      \"title\": \"Result Types\",\n      \"type\": \"array\",\n      \"editor\": \"select\",\n      \"description\": \"Which entity rows to emit. Status and run-manifest rows are always written when relevant.\",\n      \"items\": {\n        \"type\": \"string\",\n        \"enum\": [\n          \"question\",\n          \"answer\",\n          \"profile\",\n          \"author\",\n          \"topic\"\n        ]\n      },\n      \"default\": [\n        \"question\",\n        \"answer\"\n      ],\n      \"prefill\": [\n        \"question\",\n        \"answer\"\n      ]\n    },\n    \"includeAnswers\": {\n      \"title\": \"Include Answers\",\n      \"type\": \"boolean\",\n      \"description\": \"Emit answer rows and fetch answers beyond the first visible cards on question pages.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"maxAnswersPerQuestion\": {\n      \"title\": \"Maximum Answers per Question\",\n      \"type\": \"integer\",\n      \"description\": \"Answer cap for each question URL. Zero emits no answers from question pages.\",\n      \"minimum\": 0,\n      \"maximum\": 500,\n      \"default\": 20,\n      \"prefill\": 2\n    },\n    \"includeRelatedQuestions\": {\n      \"title\": \"Discover Related Questions\",\n      \"type\": \"boolean\",\n      \"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.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"maxRelatedQuestions\": {\n      \"title\": \"Maximum Related Questions\",\n      \"type\": \"integer\",\n      \"description\": \"Related questions retained per question page and used as discovery seeds. Zero keeps all observed related questions.\",\n      \"minimum\": 0,\n      \"maximum\": 100,\n      \"default\": 15,\n      \"prefill\": 0\n    },\n    \"includeAuthorProfiles\": {\n      \"title\": \"Enrich Authors with Profile Stats\",\n      \"type\": \"boolean\",\n      \"description\": \"Open each discovered author's profile to add followers, following, answer/question counts, views, join date, and credential.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxAuthors\": {\n      \"title\": \"Maximum Authors\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum unique author rows emitted from answer evidence.\",\n      \"minimum\": 1,\n      \"maximum\": 5000,\n      \"default\": 100,\n      \"prefill\": 20\n    },\n    \"minAnswerUpvotes\": {\n      \"title\": \"Minimum Answer Upvotes\",\n      \"type\": \"integer\",\n      \"description\": \"Drop answers below this upvote count. Answers with no explicit upvote count are excluded when this is above zero.\",\n      \"minimum\": 0,\n      \"maximum\": 2000000000,\n      \"default\": 0\n    },\n    \"filterAiAnswers\": {\n      \"title\": \"AI Answers\",\n      \"type\": \"string\",\n      \"description\": \"Include all answers, exclude answers explicitly labelled as AI, or keep only those AI-labelled answers.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"include\",\n        \"exclude\",\n        \"only\"\n      ],\n      \"enumTitles\": [\n        \"Include all\",\n        \"Exclude AI answers\",\n        \"Only AI answers\"\n      ],\n      \"default\": \"include\",\n      \"prefill\": \"include\"\n    },\n    \"answerSortOrder\": {\n      \"title\": \"Answer Sort Order\",\n      \"type\": \"string\",\n      \"description\": \"Keep Quora's observed order, or sort by explicit upvotes or creation time.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"observed\",\n        \"upvotes_desc\",\n        \"newest\"\n      ],\n      \"enumTitles\": [\n        \"Observed order\",\n        \"Most upvotes\",\n        \"Newest\"\n      ],\n      \"default\": \"observed\",\n      \"prefill\": \"observed\"\n    },\n    \"includeMedia\": {\n      \"title\": \"Include Answer Media\",\n      \"type\": \"boolean\",\n      \"description\": \"Retain image and video links embedded in answer content.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeOutboundLinks\": {\n      \"title\": \"Include Outbound Links\",\n      \"type\": \"boolean\",\n      \"description\": \"Retain external links embedded in answer content.\",\n      \"default\": false,\n      \"prefill\": false\n    },\n    \"includeAnswerHtml\": {\n      \"title\": \"Include Answer HTML\",\n      \"type\": \"boolean\",\n      \"description\": \"Retain a simple HTML rendering of each answer alongside its plain text.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"includeProfileSensitiveFields\": {\n      \"title\": \"Include Profile Location and Work History\",\n      \"type\": \"boolean\",\n      \"description\": \"Include location, employment, education, and join date on profile and author rows.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"includeSocialLinks\": {\n      \"title\": \"Include Social Links\",\n      \"type\": \"boolean\",\n      \"description\": \"Include website and social links found on a profile.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"maxItems\": {\n      \"title\": \"Maximum Total Rows\",\n      \"type\": \"integer\",\n      \"description\": \"Hard cap on real data rows across the run. Status and manifest rows do not consume the cap.\",\n      \"minimum\": 1,\n      \"maximum\": 50000,\n      \"default\": 200,\n      \"prefill\": 3\n    },\n    \"maxItemsPerSource\": {\n      \"title\": \"Maximum Rows per Source\",\n      \"type\": \"integer\",\n      \"description\": \"Cap real rows emitted from each URL or keyword. Zero means no per-source cap.\",\n      \"minimum\": 0,\n      \"maximum\": 5000,\n      \"default\": 0,\n      \"prefill\": 0\n    },\n    \"includeFieldEvidence\": {\n      \"title\": \"Include Field Evidence\",\n      \"type\": \"boolean\",\n      \"description\": \"Add field_sources and fields_present metadata so each value can be traced to the page payload.\",\n      \"default\": true,\n      \"prefill\": true\n    },\n    \"onlyUnanswered\": {\n      \"title\": \"Only Unanswered Questions\",\n      \"type\": \"boolean\",\n      \"description\": \"Keep only questions whose explicit answer count is exactly zero. Unknown counts are excluded.\",\n      \"default\": false,\n      \"prefill\": false\n    }\n  },\n  \"required\": []\n}",
    "readme": "# Quora Keyword Search & Author Discovery Scraper\n\nCollect 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.\n\n## What this actor does\n\n- **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.\n- **Full question context:** title, URL, topics, follower count, answer count, related questions, and the explicit unanswered state.\n- **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.\n- **Author profiles:** followers, following, answers, questions, posts, content views, join date, credential, location, employment, education, and expertise topics.\n- **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.\n- **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.\n- Leaves empty fields out of each row instead of writing guesses or nulls.\n\n## Output per question\n\n- `question_id`, `title`, `question_title`, `url`, `question_url`, `canonical_url`\n- `topics[]`, `topic_urls[]`\n- `answer_count`, `answer_count_text`, `answer_count_scraped`, `last_answered_at`\n- `follow_count`, `follow_count_text`, `follower_count`\n- `related_questions[]`, `related_questions_count`\n- `question_language`, `answer_pagination_state`\n- `discovery_source`, `source_query`, `parent_question_url`\n- `access_state`, `scrape_timestamp`, `record_id`\n\n## Output per answer\n\n- `answer_id`, `answer_url`, `answer_text`, `word_count`\n- `upvotes` / `upvotes_text`, `view_count` / `view_count_text`\n- `comments_count` / `comments_count_text`, `shares_count` / `shares_count_text`\n- `created_at`, `answer_created_at`, `answer_timestamp`, `answer_updated_at`\n- `author_name`, `author_url`, `author_id`, `author_image_url`, `author_credentials`, `author_is_verified`, `author_is_anonymous`\n- `is_ai_answer`, `ai_label_text`, `answer_visibility`, `answer_is_collapsed`\n- `answer_is_related`, `source_question_url`, `source_question_title`\n- `question_id`, `question_title`, `question_url`\n- `media_urls`, `image_urls`, `video_urls`, `outbound_links` (optional)\n- `answer_html` (optional), `discovery_source`, `source_url`, `access_state`\n\n## Output per author\n\n- `author_id`, `name`, `profile_url`, `avatar_url`, `credential`, `is_verified`\n- `follower_count`, `following_count`, `answer_count`, `question_count`, `post_count`, `content_views`\n- `joined_at`, `location`, `employment`, `education`\n- `topics[]`, `bio`, `website_url`, `social_links[]`\n- `evidence_urls[]`, `evidence_question_urls[]`, `evidence_answer_urls[]`, `evidence_answer_previews[]`\n\nA direct profile URL in `urls` mode emits a `profile` row with the same profile fields. In `authors` mode it emits an `author` row.\n\n## Output per topic\n\n- `topic_id`, `name`, `url`, `follower_count`\n- `discovery_source`, `source_url`, `access_state`\n\n## Output per status / manifest\n\nStatus 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.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `urls` | `urls`, `search`, or `authors` |\n| `directUrls` | array | – (prefilled with one Python question) | Question, answer, profile, or topic URLs |\n| `searchQueries` | array | – | Keywords or question titles for best-effort discovery (mode=search) |\n| `usernames` | array | – | Profile slugs converted to profile URLs |\n| `resultTypes` | array | `[\"question\",\"answer\"]` | `question`, `answer`, `profile`, `author`, `topic` |\n| `includeAnswers` | boolean | `true` | Emit answers from question pages |\n| `maxAnswersPerQuestion` | integer | `20` | Answer cap per question (0–500) |\n| `includeRelatedQuestions` | boolean | `false` | Follow related-question links |\n| `maxRelatedQuestions` | integer | `15` | Cap per question; 0 keeps all observed |\n| `includeAuthorProfiles` | boolean | `true` | Enrich discovered authors with profile stats |\n| `maxAuthors` | integer | `100` | Author-row cap |\n| `minAnswerUpvotes` | integer | `0` | Drop answers below this explicit upvote count |\n| `filterAiAnswers` | string | `include` | `include`, `exclude`, or `only` |\n| `answerSortOrder` | string | `observed` | `observed`, `upvotes_desc`, or `newest` |\n| `onlyUnanswered` | boolean | `false` | Keep only questions with an explicit zero answer count |\n| `includeMedia` | boolean | `false` | Retain answer image/video links |\n| `includeOutboundLinks` | boolean | `false` | Retain external links in answers |\n| `includeAnswerHtml` | boolean | `true` | Retain a simple HTML rendering of answers |\n| `includeProfileSensitiveFields` | boolean | `true` | Include location, employment, education, join date |\n| `includeSocialLinks` | boolean | `true` | Include profile website/social links |\n| `maxItems` | integer | `200` | Total real-row cap |\n| `maxItemsPerSource` | integer | `0` | Per-URL/keyword cap (0 = no cap) |\n| `includeFieldEvidence` | boolean | `true` | Add `field_sources` and `fields_present` |\n\nThe saved prefill is one question with `maxAnswersPerQuestion: 2` and `maxItems: 3`, so the first run returns three real rows.\n\n## Examples\n\n### A question with many answers\n\n```json\n{\n  \"mode\": \"urls\",\n  \"directUrls\": [\"https://www.quora.com/What-is-Python-primarily-used-for\"],\n  \"resultTypes\": [\"question\", \"answer\"],\n  \"maxAnswersPerQuestion\": 50\n}\n```\n\n### A profile and its stats\n\n```json\n{\n  \"mode\": \"authors\",\n  \"directUrls\": [\"https://www.quora.com/profile/Adam-DAngelo\"],\n  \"resultTypes\": [\"author\"]\n}\n```\n\n### Expand related questions from one seed\n\n```json\n{\n  \"mode\": \"search\",\n  \"directUrls\": [\"https://www.quora.com/What-is-machine-learning\"],\n  \"includeRelatedQuestions\": true,\n  \"maxRelatedQuestions\": 10,\n  \"maxItems\": 100\n}\n```\n\n### Best-effort keyword discovery\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"remote work productivity\"],\n  \"includeRelatedQuestions\": true,\n  \"maxItems\": 50\n}\n```\n\n## Use cases\n\n- **Market and product research** — collect complete answer threads with engagement metrics.\n- **Expert sourcing** — turn answer authors into a profile list with follower and answer counts.\n- **Content gap analysis** — find questions with zero answers in a niche.\n- **AI-answer auditing** — separate explicitly AI-labelled answers from human answers.\n- **Knowledge-base building** — export clean question/answer pairs with source URLs and dates.\n\n## FAQ\n\n### Does this actor need cookies or a login?\n\nNo. It reads public question, answer, profile, and topic pages without an account. There is no cookie or proxy field to configure.\n\n### Why can't I search Quora by keyword reliably?\n\nQuora'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.\n\n### How many answers can I get?\n\nAll 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.\n\n### Why is an answer marked as related?\n\nQuora 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.\n\n### Why are some fields missing on some rows?\n\nQuora 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.\n\n### Can I get comment text?\n\nNo. Quora publishes the comment count with each answer, but not the comment bodies on the public page. The actor returns the count only.\n\n### What does \"best-effort\" mean for keyword discovery?\n\nIt 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.\n\n### What happens if Quora challenges the page?\n\nThe 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.\n\n### Is this affiliated with Quora?\n\nNo. This is an independent, third-party actor that reads public Quora pages. It is not affiliated with or endorsed by Quora.\n\n## Limitations\n\n- Native Quora keyword search is unavailable anonymously; keyword discovery depends on a public web index.\n- Comment bodies, question creation dates, question view counts, topic question feeds, and full profile answer lists are not available from the public page.\n- Topic pages expose the topic name and follower count; descriptions and question counts are omitted when Quora does not publish them.\n- Very large answer threads are bounded by `maxAnswersPerQuestion` and `maxItems`.\n- A page that is removed, private, or behind a login wall is reported as a status row, not fabricated data.\n- 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.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "quora-keyword-search-and-author-discovery-scraper",
      "title": "Quora Keyword Search & Author Discovery Scraper",
      "description": "Collect Quora questions, full answers, authors, and topics from pasted URLs. Best-effort keyword discovery, related-question expansion, answer metrics, author profile stats, and AI/upvote filters. No cookies or proxy setup.",
      "version": "1.0",
      "buildTag": "latest",
      "meta": {
        "templateId": "python"
      },
      "input": {
        "title": "Quora Question & Author Scraper Input",
        "description": "Collect Quora questions, full answers, authors, and topics from URLs or best-effort keyword discovery.",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "Mode",
            "type": "string",
            "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"
            ],
            "default": "urls",
            "prefill": "urls"
          },
          "directUrls": {
            "title": "Quora URLs",
            "type": "array",
            "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"
            ]
          },
          "searchQueries": {
            "title": "Keywords or Question Titles",
            "type": "array",
            "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"
            },
            "default": [],
            "prefill": []
          },
          "usernames": {
            "title": "Profile Usernames",
            "type": "array",
            "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"
            },
            "default": []
          },
          "resultTypes": {
            "title": "Result Types",
            "type": "array",
            "editor": "select",
            "description": "Which entity rows to emit. Status and run-manifest rows are always written when relevant.",
            "items": {
              "type": "string",
              "enum": [
                "question",
                "answer",
                "profile",
                "author",
                "topic"
              ]
            },
            "default": [
              "question",
              "answer"
            ],
            "prefill": [
              "question",
              "answer"
            ]
          },
          "includeAnswers": {
            "title": "Include Answers",
            "type": "boolean",
            "description": "Emit answer rows and fetch answers beyond the first visible cards on question pages.",
            "default": true,
            "prefill": true
          },
          "maxAnswersPerQuestion": {
            "title": "Maximum Answers per Question",
            "type": "integer",
            "description": "Answer cap for each question URL. Zero emits no answers from question pages.",
            "minimum": 0,
            "maximum": 500,
            "default": 20,
            "prefill": 2
          },
          "includeRelatedQuestions": {
            "title": "Discover Related Questions",
            "type": "boolean",
            "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.",
            "default": false,
            "prefill": false
          },
          "maxRelatedQuestions": {
            "title": "Maximum Related Questions",
            "type": "integer",
            "description": "Related questions retained per question page and used as discovery seeds. Zero keeps all observed related questions.",
            "minimum": 0,
            "maximum": 100,
            "default": 15,
            "prefill": 0
          },
          "includeAuthorProfiles": {
            "title": "Enrich Authors with Profile Stats",
            "type": "boolean",
            "description": "Open each discovered author's profile to add followers, following, answer/question counts, views, join date, and credential.",
            "default": true,
            "prefill": false
          },
          "maxAuthors": {
            "title": "Maximum Authors",
            "type": "integer",
            "description": "Maximum unique author rows emitted from answer evidence.",
            "minimum": 1,
            "maximum": 5000,
            "default": 100,
            "prefill": 20
          },
          "minAnswerUpvotes": {
            "title": "Minimum Answer Upvotes",
            "type": "integer",
            "description": "Drop answers below this upvote count. Answers with no explicit upvote count are excluded when this is above zero.",
            "minimum": 0,
            "maximum": 2000000000,
            "default": 0
          },
          "filterAiAnswers": {
            "title": "AI Answers",
            "type": "string",
            "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"
            ],
            "default": "include",
            "prefill": "include"
          },
          "answerSortOrder": {
            "title": "Answer Sort Order",
            "type": "string",
            "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"
            ],
            "default": "observed",
            "prefill": "observed"
          },
          "includeMedia": {
            "title": "Include Answer Media",
            "type": "boolean",
            "description": "Retain image and video links embedded in answer content.",
            "default": false,
            "prefill": false
          },
          "includeOutboundLinks": {
            "title": "Include Outbound Links",
            "type": "boolean",
            "description": "Retain external links embedded in answer content.",
            "default": false,
            "prefill": false
          },
          "includeAnswerHtml": {
            "title": "Include Answer HTML",
            "type": "boolean",
            "description": "Retain a simple HTML rendering of each answer alongside its plain text.",
            "default": true,
            "prefill": false
          },
          "includeProfileSensitiveFields": {
            "title": "Include Profile Location and Work History",
            "type": "boolean",
            "description": "Include location, employment, education, and join date on profile and author rows.",
            "default": true,
            "prefill": true
          },
          "includeSocialLinks": {
            "title": "Include Social Links",
            "type": "boolean",
            "description": "Include website and social links found on a profile.",
            "default": true,
            "prefill": true
          },
          "maxItems": {
            "title": "Maximum Total Rows",
            "type": "integer",
            "description": "Hard cap on real data rows across the run. Status and manifest rows do not consume the cap.",
            "minimum": 1,
            "maximum": 50000,
            "default": 200,
            "prefill": 3
          },
          "maxItemsPerSource": {
            "title": "Maximum Rows per Source",
            "type": "integer",
            "description": "Cap real rows emitted from each URL or keyword. Zero means no per-source cap.",
            "minimum": 0,
            "maximum": 5000,
            "default": 0,
            "prefill": 0
          },
          "includeFieldEvidence": {
            "title": "Include Field Evidence",
            "type": "boolean",
            "description": "Add field_sources and fields_present metadata so each value can be traced to the page payload.",
            "default": true,
            "prefill": true
          },
          "onlyUnanswered": {
            "title": "Only Unanswered Questions",
            "type": "boolean",
            "description": "Keep only questions whose explicit answer count is exactly zero. Unknown counts are excluded.",
            "default": false,
            "prefill": false
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Quora Keyword Search & Author Discovery Scraper Output",
        "description": "Quora questions, full answers, author profiles, topics, and access-status rows.",
        "type": "object",
        "properties": {
          "results": {
            "type": "string",
            "title": "Quora rows",
            "description": "Dataset containing question, answer, profile, author, topic, status, and manifest rows.",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "readme": "# Quora Keyword Search & Author Discovery Scraper\n\nCollect 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.\n\n## What this actor does\n\n- **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.\n- **Full question context:** title, URL, topics, follower count, answer count, related questions, and the explicit unanswered state.\n- **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.\n- **Author profiles:** followers, following, answers, questions, posts, content views, join date, credential, location, employment, education, and expertise topics.\n- **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.\n- **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.\n- Leaves empty fields out of each row instead of writing guesses or nulls.\n\n## Output per question\n\n- `question_id`, `title`, `question_title`, `url`, `question_url`, `canonical_url`\n- `topics[]`, `topic_urls[]`\n- `answer_count`, `answer_count_text`, `answer_count_scraped`, `last_answered_at`\n- `follow_count`, `follow_count_text`, `follower_count`\n- `related_questions[]`, `related_questions_count`\n- `question_language`, `answer_pagination_state`\n- `discovery_source`, `source_query`, `parent_question_url`\n- `access_state`, `scrape_timestamp`, `record_id`\n\n## Output per answer\n\n- `answer_id`, `answer_url`, `answer_text`, `word_count`\n- `upvotes` / `upvotes_text`, `view_count` / `view_count_text`\n- `comments_count` / `comments_count_text`, `shares_count` / `shares_count_text`\n- `created_at`, `answer_created_at`, `answer_timestamp`, `answer_updated_at`\n- `author_name`, `author_url`, `author_id`, `author_image_url`, `author_credentials`, `author_is_verified`, `author_is_anonymous`\n- `is_ai_answer`, `ai_label_text`, `answer_visibility`, `answer_is_collapsed`\n- `answer_is_related`, `source_question_url`, `source_question_title`\n- `question_id`, `question_title`, `question_url`\n- `media_urls`, `image_urls`, `video_urls`, `outbound_links` (optional)\n- `answer_html` (optional), `discovery_source`, `source_url`, `access_state`\n\n## Output per author\n\n- `author_id`, `name`, `profile_url`, `avatar_url`, `credential`, `is_verified`\n- `follower_count`, `following_count`, `answer_count`, `question_count`, `post_count`, `content_views`\n- `joined_at`, `location`, `employment`, `education`\n- `topics[]`, `bio`, `website_url`, `social_links[]`\n- `evidence_urls[]`, `evidence_question_urls[]`, `evidence_answer_urls[]`, `evidence_answer_previews[]`\n\nA direct profile URL in `urls` mode emits a `profile` row with the same profile fields. In `authors` mode it emits an `author` row.\n\n## Output per topic\n\n- `topic_id`, `name`, `url`, `follower_count`\n- `discovery_source`, `source_url`, `access_state`\n\n## Output per status / manifest\n\nStatus 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.\n\n## Input\n\n| Field | Type | Default | Description |\n|---|---|---|---|\n| `mode` | string | `urls` | `urls`, `search`, or `authors` |\n| `directUrls` | array | – (prefilled with one Python question) | Question, answer, profile, or topic URLs |\n| `searchQueries` | array | – | Keywords or question titles for best-effort discovery (mode=search) |\n| `usernames` | array | – | Profile slugs converted to profile URLs |\n| `resultTypes` | array | `[\"question\",\"answer\"]` | `question`, `answer`, `profile`, `author`, `topic` |\n| `includeAnswers` | boolean | `true` | Emit answers from question pages |\n| `maxAnswersPerQuestion` | integer | `20` | Answer cap per question (0–500) |\n| `includeRelatedQuestions` | boolean | `false` | Follow related-question links |\n| `maxRelatedQuestions` | integer | `15` | Cap per question; 0 keeps all observed |\n| `includeAuthorProfiles` | boolean | `true` | Enrich discovered authors with profile stats |\n| `maxAuthors` | integer | `100` | Author-row cap |\n| `minAnswerUpvotes` | integer | `0` | Drop answers below this explicit upvote count |\n| `filterAiAnswers` | string | `include` | `include`, `exclude`, or `only` |\n| `answerSortOrder` | string | `observed` | `observed`, `upvotes_desc`, or `newest` |\n| `onlyUnanswered` | boolean | `false` | Keep only questions with an explicit zero answer count |\n| `includeMedia` | boolean | `false` | Retain answer image/video links |\n| `includeOutboundLinks` | boolean | `false` | Retain external links in answers |\n| `includeAnswerHtml` | boolean | `true` | Retain a simple HTML rendering of answers |\n| `includeProfileSensitiveFields` | boolean | `true` | Include location, employment, education, join date |\n| `includeSocialLinks` | boolean | `true` | Include profile website/social links |\n| `maxItems` | integer | `200` | Total real-row cap |\n| `maxItemsPerSource` | integer | `0` | Per-URL/keyword cap (0 = no cap) |\n| `includeFieldEvidence` | boolean | `true` | Add `field_sources` and `fields_present` |\n\nThe saved prefill is one question with `maxAnswersPerQuestion: 2` and `maxItems: 3`, so the first run returns three real rows.\n\n## Examples\n\n### A question with many answers\n\n```json\n{\n  \"mode\": \"urls\",\n  \"directUrls\": [\"https://www.quora.com/What-is-Python-primarily-used-for\"],\n  \"resultTypes\": [\"question\", \"answer\"],\n  \"maxAnswersPerQuestion\": 50\n}\n```\n\n### A profile and its stats\n\n```json\n{\n  \"mode\": \"authors\",\n  \"directUrls\": [\"https://www.quora.com/profile/Adam-DAngelo\"],\n  \"resultTypes\": [\"author\"]\n}\n```\n\n### Expand related questions from one seed\n\n```json\n{\n  \"mode\": \"search\",\n  \"directUrls\": [\"https://www.quora.com/What-is-machine-learning\"],\n  \"includeRelatedQuestions\": true,\n  \"maxRelatedQuestions\": 10,\n  \"maxItems\": 100\n}\n```\n\n### Best-effort keyword discovery\n\n```json\n{\n  \"mode\": \"search\",\n  \"searchQueries\": [\"remote work productivity\"],\n  \"includeRelatedQuestions\": true,\n  \"maxItems\": 50\n}\n```\n\n## Use cases\n\n- **Market and product research** — collect complete answer threads with engagement metrics.\n- **Expert sourcing** — turn answer authors into a profile list with follower and answer counts.\n- **Content gap analysis** — find questions with zero answers in a niche.\n- **AI-answer auditing** — separate explicitly AI-labelled answers from human answers.\n- **Knowledge-base building** — export clean question/answer pairs with source URLs and dates.\n\n## FAQ\n\n### Does this actor need cookies or a login?\n\nNo. It reads public question, answer, profile, and topic pages without an account. There is no cookie or proxy field to configure.\n\n### Why can't I search Quora by keyword reliably?\n\nQuora'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.\n\n### How many answers can I get?\n\nAll 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.\n\n### Why is an answer marked as related?\n\nQuora 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.\n\n### Why are some fields missing on some rows?\n\nQuora 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.\n\n### Can I get comment text?\n\nNo. Quora publishes the comment count with each answer, but not the comment bodies on the public page. The actor returns the count only.\n\n### What does \"best-effort\" mean for keyword discovery?\n\nIt 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.\n\n### What happens if Quora challenges the page?\n\nThe 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.\n\n### Is this affiliated with Quora?\n\nNo. This is an independent, third-party actor that reads public Quora pages. It is not affiliated with or endorsed by Quora.\n\n## Limitations\n\n- Native Quora keyword search is unavailable anonymously; keyword discovery depends on a public web index.\n- Comment bodies, question creation dates, question view counts, topic question feeds, and full profile answer lists are not available from the public page.\n- Topic pages expose the topic name and follower count; descriptions and question counts are omitted when Quora does not publish them.\n- Very large answer threads are bounded by `maxAnswersPerQuestion` and `maxItems`.\n- A page that is removed, private, or behind a login wall is reported as a status row, not fabricated data.\n- 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.\n",
      "dockerfile": "../Dockerfile",
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 1800,
        "memoryMbytes": 2048
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "Quora data",
          "views": {
            "overview": {
              "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"
                ]
              },
              "display": {
                "component": "table",
                "properties": {}
              }
            }
          }
        }
      },
      "environmentVariables": {}
    },
    "buildNumber": "1.0.2",
    "imageDigest": "919db66caff1e57a2dfc9fdaad2e46bd2a380f7b48cf640cd38c5d6948ab3b52",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.04169777777777778
    }
  }
}