Google Business Profile Q&A Scraper avatar

Google Business Profile Q&A Scraper

Pricing

$2.50 / 1,000 question and answer items

Go to Apify Store
Google Business Profile Q&A Scraper

Google Business Profile Q&A Scraper

Pricing

$2.50 / 1,000 question and answer items

Rating

0.0

(0)

Developer

Khoa Nguyen

Khoa Nguyen

Maintained by Community

Actor 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 counts
  • ERRORS: per-place failures that are not billed as dataset items
  • DIAGNOSTICS: page states and extraction warnings
  • REPORT.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

ModePurposeNetwork required
DEMOStore QA and first-run demonstration using a realistic offline fixtureNo
LIVE_URLSOpen public Google Maps listing URLs in ChromiumYes
IMPORTED_HTMLReprocess saved rendered listing/Q&A HTMLNo
IMPORTED_JSONNormalize and score previously collected Q&A JSONNo

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 URLs
  • maxPlaces: hard cap on source listings
  • maxQuestionsPerPlace: per-place output/scroll cap
  • outputFilter: all, unanswered, no owner response, or owner answered
  • topics: optional topic allowlist
  • questionTextContains: normalized case-insensitive substring filter
  • includeAnswerDetails: remove answer text while retaining coverage metrics
  • maxConcurrency: bounded number of Chromium sessions
  • maxRequestRetries: exponential-backoff retries with fresh browser sessions
  • navigationTimeoutSecs and requestHandlerTimeoutSecs: hard timeout controls
  • saveDebugArtifacts: 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 found
  • ask_maps_only: the interface exposes Ask Maps/Ask about this place but no legacy Q&A
  • no_qa: no legacy Q&A section was detected
  • blocked: bot/unusual-traffic challenge detected
  • consent_required: consent interstitial remained visible
  • failed: 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 ci
npm run typecheck
npm run lint
npm test
npm run validate:schemas
npm 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.