Google Business Profile Q&A Scraper
Pricing
$2.50 / 1,000 question and answer items
Google Business Profile Q&A Scraper
Pricing
$2.50 / 1,000 question and answer items
Rating
0.0
(0)
Developer
Khoa Nguyen
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Extract public legacy Questions & Answers from specific Google Maps business listings, then normalize, deduplicate, classify, and score the questions for local SEO and owner-response workflows.
This Actor is designed for agencies, local SEO teams, and franchise operators that need structured Q&A coverage data instead of screenshots or unprocessed page text.
What it produces
Each dataset item represents one unique question and includes:
- place name, address, place identifier, and source URL
- normalized question and answer text
- author/date/helpful metadata when visible
- owner-answer detection and coverage status
- topic classification across 10 local-business topics
- response quality score, priority score, and risk flags
- ISO timestamps and extractor provenance
The key-value store also receives:
OUTPUT: run summary and coverage countsERRORS: per-place failures that are not billed as dataset itemsDIAGNOSTICS: page states and extraction warningsREPORT.html: an owner-response coverage report
Two-minute quick start
The default input runs an offline demo and needs no credentials or network access:
{"sourceMode": "DEMO"}
The demo is fictional and clearly marked as a fixture. Chromium renders the fixture, then the same DOM extractor, normalization, deduplication, classification, scoring, filtering, dataset, and report pipeline used by live runs processes it.
For a live listing:
{"sourceMode": "LIVE_URLS","startUrls": [{ "url": "https://www.google.com/maps/place/REPLACE_WITH_A_SPECIFIC_LISTING" }],"maxQuestionsPerPlace": 100,"outputFilter": "NO_OWNER_RESPONSE","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
Use a specific place/listing URL, not a Google search results page.
Source modes
| Mode | Purpose | Network required |
|---|---|---|
DEMO | Store QA and first-run demonstration using a realistic offline fixture | No |
LIVE_URLS | Open public Google Maps listing URLs in Chromium | Yes |
IMPORTED_HTML | Reprocess saved rendered listing/Q&A HTML | No |
IMPORTED_JSON | Normalize and score previously collected Q&A JSON | No |
Imported data still passes the core normalization, deduplication, topic classification, response scoring, filters, and output schema. Invalid imported records become explicit entries in ERRORS; valid records continue processing.
Main inputs
startUrls: up to 100 Google Maps place URLsmaxPlaces: hard cap on source listingsmaxQuestionsPerPlace: per-place output/scroll capoutputFilter: all, unanswered, no owner response, or owner answeredtopics: optional topic allowlistquestionTextContains: normalized case-insensitive substring filterincludeAnswerDetails: remove answer text while retaining coverage metricsmaxConcurrency: bounded number of Chromium sessionsmaxRequestRetries: exponential-backoff retries with fresh browser sessionsnavigationTimeoutSecsandrequestHandlerTimeoutSecs: hard timeout controlssaveDebugArtifacts: opt-in rendered HTML and screenshot on live failures
See .actor/input_schema.json for the complete validated schema.
Output example
{"itemType": "question","placeName": "Northstar Coffee & Kitchen","sourceUrl": "https://www.google.com/maps/place/Northstar+Coffee+%26+Kitchen/?hl=en","questionId": "q_...","questionText": "Is the entrance wheelchair accessible?","topic": "accessibility","answerCount": 0,"answers": [],"hasAnyAnswer": false,"hasOwnerAnswer": false,"coverageStatus": "unanswered","responseQualityScore": 0,"priorityScore": 100,"riskFlags": ["UNANSWERED", "RECENT_UNANSWERED"],"pageState": "legacy_qa","scrapedAt": "2026-07-25T20:00:00.000Z"}
Complete examples are in sample-output.
Page states
The Actor never treats every empty result as success. Diagnostics distinguish:
legacy_qa: a legacy Q&A label or questions were foundask_maps_only: the interface exposes Ask Maps/Ask about this place but no legacy Q&Ano_qa: no legacy Q&A section was detectedblocked: bot/unusual-traffic challenge detectedconsent_required: consent interstitial remained visiblefailed: navigation or extraction failed after retries
Reliability design
- Chromium is controlled directly through the Chrome DevTools Protocol.
- Live concurrency is bounded; each retry receives a fresh browser profile.
- Retries use exponential backoff and only retry likely transient failures.
- Navigation and total per-place processing have independent hard timeouts.
- Records are deterministically normalized and deduplicated.
- Error records are stored separately from billable question results.
- Logs redact token/password/authorization-like fields and proxy credentials.
- No login, cookie injection, CAPTCHA bypass, or authentication bypass is implemented.
Proxy guidance
Demo and import modes need no proxy. Live Google Maps runs can be rate-limited or challenged, so low concurrency and an appropriate proxy are recommended. The Actor supports Apify Proxy environment variables and user-provided proxy URLs from the standard proxy input. Proxy credentials are not logged.
Pricing recommendation
The roadmap launch price is $2.50 per 1,000 question results and the target price is $3.75 per 1,000 question results. Configure pay-per-event using Apify's synthetic apify-default-dataset-item event. One normalized question equals one default dataset item. Errors and reports are written to the key-value store, so they do not create dataset-item events.
The final Store price should be rechecked against measured browser and proxy costs before publication.
Limitations
- Google can change Maps markup, labels, and feature availability without notice.
- Legacy Q&A may not be present on every listing or locale.
- Owner identification is based on visible owner/business-owner labels; unlabeled answers cannot be reliably inferred as owner responses.
- Relative dates are normalized when recognized; otherwise the original text is retained and the ISO field is
null. - The Actor collects public listing content only. Users remain responsible for applicable terms, privacy obligations, and local law.
Local development
Requirements: Node.js 22 and Chromium at /usr/bin/chromium or CHROMIUM_PATH.
npm cinpm run typechecknpm run lintnpm testnpm run validate:schemasnpm run smoke
The source package vendors only the TypeScript compiler, Node type declarations, and Undici type declarations as local development dependencies so installation and validation do not depend on the npm registry. Runtime production dependencies are zero.
Storage and cost drivers
Primary cost drivers are Chromium runtime, listing count, Q&A panel scroll depth, retries, concurrency, and proxy traffic. Dataset size grows linearly with unique questions. Debug HTML/screenshots are opt-in because they can increase key-value store usage and may include public contributor names visible on the page.