FAQ Question Answer Extractor
Pricing
from $6.50 / 1,000 faq source page scanneds
FAQ Question Answer Extractor
Extract FAQ question-answer pairs from visible HTML and FAQPage schema, reconcile duplicates, and flag schema/visible mismatches
Extract question-and-answer pairs from visible page content and FAQPage JSON-LD, reconcile matching questions, classify question intent, and identify empty or inconsistent answers.
The Actor is useful for FAQ inventories, structured-data audits, content research, support-content migrations, and duplicate-question cleanup. Every answer comes from accepted page evidence. Missing answers stay null; they are never completed from general knowledge.
Supported evidence
Visible extraction recognizes:
<details>and<summary>pairs;- FAQ item blocks with question and answer classes;
- definition lists using
<dt>and<dd>; - question headings followed by a paragraph.
Structured extraction recognizes valid JSON-LD objects with @type: FAQPage and mainEntity questions containing accepted answers. When a normalized question exists in both sources, the Actor compares the cleaned answer text and records whether it matches exactly.
The Actor also classifies common intent patterns such as cost, process, reason, location, timing, eligibility/confirmation, and general definition questions.
Input
Supply public FAQ pages in pageUrls, additional public pages in startUrls, bounded XML sitemaps in sitemapUrls, or captured records in htmlInputs.
| Field | Purpose | Default / cap |
|---|---|---|
pageUrls | Public pages containing FAQs | empty |
startUrls | Additional public FAQ pages | empty |
sitemapUrls | Public XML sitemaps | empty |
htmlInputs | Captured records with sourceUrl and HTML | empty |
includeFaqSchema | Extract FAQPage JSON-LD | true |
compareVisibleAndSchema | Compare answers for matching questions | true |
dedupeQuestions | Collapse repeated questions across pages | true |
questionFilters | Optional case-insensitive phrases a question must contain | empty array |
maxFaqPairsPerPage | Maximum retained question pairs per page | 50, maximum 500 |
maxPages | Maximum fetched pages | 1 by default, maximum 25 |
allowedDomains | Optional hostname allowlist | empty |
includeEvidence | Keep evidence excerpts in rows | true |
includeRawSnapshots | Store accepted raw HTML | false |
maxChargeUsd | Stop before the next event exceeds this amount | 15 USD maximum |
Example:
{"pageUrls": ["https://product.example/pricing-faq","https://product.example/account-faq"],"includeFaqSchema": true,"compareVisibleAndSchema": true,"dedupeQuestions": true,"questionFilters": ["billing", "cancel", "trial"],"maxFaqPairsPerPage": 100,"maxPages": 2,"allowedDomains": ["product.example"],"maxChargeUsd": 3}
Question filters are applied after normalization. A question is retained when it contains at least one configured phrase. The Store default has no page source and returns a nonempty source_required diagnostic.
Dataset output
Each dataset item includes:
questionTextandanswerTextfrom the accepted page;answerLength, with zero used for an observed question whose answer is empty;faqSource, such asvisible_details,visible_definition_list,faq_schema, orvisible_and_schema;schemaVisibleMatch, which is true or false when comparison is enabled and null when it is not applicable;duplicateQuestionGroup, a stable bounded identifier for repeated normalized questions;questionIntent, such ascost,process, oreligibility_or_confirmation;issueCode,severity,evidenceSnippet, andrecommendationfor normal, mismatch, empty-answer, blocked, and missing-source rows;sourceUrl,canonicalUrl,httpStatus, andscannedAtfor provenance.
When the same question appears visibly and in structured data, the visible answer is retained as the primary dataset answer while the match flag reports the comparison. An empty visible answer is preserved as null and marked high severity. A nonempty disagreement is marked medium severity.
With cross-page deduplication enabled, the first row is kept and receives a duplicate group identifier when the question appears again. Disable dedupeQuestions if every occurrence must remain in the dataset.
Reports
With includeReport: true, the Actor stores:
- a Markdown summary;
- a complete CSV export;
- JSON issue rows;
- bounded evidence excerpts;
- run metadata with source counts, issue codes, pricing mode, and consumed fields.
Raw accepted HTML is written only when includeRawSnapshots is explicitly enabled.
Pay-per-event pricing
| Event | Price (USD) | When charged |
|---|---|---|
actor-start | 0.0100 | after successful startup |
faq-source-page-scanned | 0.0065 | once for each accepted FAQ source unit |
faq-pair-extracted | 0.00295 | before each paid question-answer row |
faq-mismatch-emitted | 0.00295 | before each paid mismatch, empty-answer, or diagnostic row |
audit-report-generated | 0.0800 | before report artifacts are stored |
Apify platform usage pass-through is off. The Actor checks maxChargeUsd and the complete charge result before every output. It exits before writing a row or report when the charge cannot be accepted.
Safety and interpretation
Only public HTTP and HTTPS URLs are fetched. Loopback and private IPv4 targets are rejected, an optional hostname allowlist can narrow access, and page counts and request timeouts are bounded. Discovered links are not crawled. The Actor does not bypass authentication or human-verification controls.
Structured-data equality is a cleaned-text comparison, not a semantic fact check. Two differently worded answers may be equivalent, while two identical answers may still be inaccurate. Validate policy, legal, medical, financial, or account-support content with the appropriate owner before publishing changes.