Google Maps Extractor with Ownership & Accessibility Attributes avatar

Google Maps Extractor with Ownership & Accessibility Attributes

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Google Maps Extractor with Ownership & Accessibility Attributes

Google Maps Extractor with Ownership & Accessibility Attributes

Google Maps Extractor: Collect business names, addresses, phone numbers, websites, ratings, reviews, ownership details, and accessibility attributes. Build structured local business datasets for lead generation, market research, competitor analysis, and location-based intelligence.

Pricing

from $4.99 / 1,000 results

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

9 hours ago

Last modified

Share

Google Maps Scraper — Extract Places, Ownership & Accessibility Data

This Actor scrapes business places from Google Maps by keyword and location, then adds two data families most Google Maps scrapers skip: self-declared ownership badges (women-owned, Black-owned, Latino-owned, Asian-owned, Indigenous-owned, veteran-owned, LGBTQ+ owned, LGBTQ+ friendly) and published accessibility attributes (wheelchair entrance, restroom, seating, parking, assistive hearing loop). Every response returns typed, normalized JSON — no HTML, no selectors, no parsing. Tick the badges or accessibility features you need and the run returns a pre-filtered shortlist instead of a raw dump. Read on for every field, and every real limit.


🗺️ What is Google Maps Extractor with Ownership & Accessibility Attributes?

It's a Google Maps places scraper that reads two extra attribute families — ownership/identity badges and accessibility attributes — out of the same Google response it already fetches for the name and address, then lets you filter the sweep down to only places that carry the ones you need. No Google account, API key or billing is required: it calls Google's own public map-search endpoint directly, the same one your browser loads when you search Google Maps while logged out.

  • Scrape places by business-type keyword, by area, or from a pasted Google Maps link
  • Read Google's self-published ownership/identity badges off every place, no extra request
  • Read Google's published accessibility attributes off every place, no extra request
  • Filter the whole sweep to only qualifying places with requiredOwnershipBadges / requiredAccessibilityFeatures
  • Export as JSON, or any format Apify's dataset view supports (CSV, Excel, and more)

📊 What data does Google Maps Extractor with Ownership & Accessibility Attributes collect?

Every run returns one JSON record per place, built from three data families that live inside the same Google Maps response — the standard place record, its ownership/identity badges, and its accessibility attributes.

Data TypeKey FieldsJSON Field Names
PlacesName, Google's own formatted address, phone, website, rating, category tags, coordinates, today's opening hoursname, full_address, phone, website, avg_rating, tags, lat, long, hours
Ownership badgesSelf-declared identity badges plus 8 per-badge true/false fieldsownership_badges, is_women_owned, is_black_owned, is_latino_owned, is_asian_owned, is_indigenous_owned, is_veteran_owned, is_lgbtq_owned, is_lgbtq_friendly, is_diversity_owned
Accessibility attributesPublished physical-access features plus 5 per-feature true/false fieldsaccessibility_features, accessibility_feature_keys, wheelchair_accessible_entrance, wheelchair_accessible_restroom, wheelchair_accessible_seating, wheelchair_accessible_parking, assistive_hearing_loop

🔌 How does this Actor differ from the official Google Places API?

Google's own Places API (New) returns place data too, but ownership and accessibility coverage — and the setup — work differently.

FeatureGoogle Places API (New)This Actor
Access requirementGoogle Cloud project, enabled billing and an API key on every requestAn Apify account — no separate Google signup
Ownership / identity badgesNot present in the published Place Data Fields listReturned as ownership_badges plus 8 boolean fields
Accessibility attributesAvailable via accessibilityOptions, gated behind the paid Text Search Pro SKUIncluded on every row, no field mask to configure
Default response fieldsNone — a field mask is mandatory or the call errorsEvery documented field below is returned on every row
Pricing modelPer-field SKU tiers — e.g. Text Search Pro bills at $32.00 per 1,000 calls in the first 100,000 calls/monthApify pay-per-result — one row_result event per saved place
Area sweep by city/region nameNot built in — you geocode and page requests yourselfBuilt in: a location name resolves to a bounding box and is swept tile by tile
Supplier / accessibility pre-filteringNot available — filter the raw response yourselfrequiredOwnershipBadges / requiredAccessibilityFeatures filter the run itself

(Google's field list, field-mask requirement and SKU pricing checked on developers.google.com/maps/documentation/places and developers.google.com/maps/billing-and-pricing/sku-details, 2026-08-04.)

The official API is the right call if you're already inside the Google Cloud billing ecosystem and only need a handful of fields per place. This Actor is faster when you want a ready-made area sweep with ownership and accessibility data already attached and pre-filterable, without building field-mask logic or a geocoder yourself.


🎯 Why do developers and teams scrape Google Maps for this data?

🏢 For supplier-diversity and procurement teams

Corporate Tier-2 supplier-diversity programs and public-sector procurement teams need a shortlist of women-, Black-, Latino-, Asian-, Indigenous- or veteran-owned vendors in a metro area — not a manual search through hundreds of listings. Set keywords to the trade you need (general contractors, print shop, staffing agency), set locations to the metro, tick the relevant boxes in requiredOwnershipBadges, and the run returns only places carrying them, with ownership_badges, is_diversity_owned and each individual boolean ready to drop into a spend-tracking spreadsheet or supplier database.

♿ For accessibility auditors and inclusive-venue directories

ADA compliance auditors, disability-inclusion consultants and accessible-travel apps need per-venue accessibility data, not the Maps app's own rendering of it. Set requiredAccessibilityFeatures to the attributes that matter — wheelchair entrance, restroom, seating, parking, or an assistive hearing loop — and badgeMatchMode to all for a strict, fully-accessible shortlist or any for a wider one. Every saved row carries accessibility_features, accessibility_feature_keys (Google's stable, language-independent identifiers) and five boolean columns, turning a district-wide sweep into a ready-made accessible-venue list.

🤖 For AI engineers and agent builders

An agent that answers "find me a wheelchair-accessible, women-owned coffee shop in Austin" needs structured facts, not a scraped page to summarize. Every row is typed JSON — name, full_address, wheelchair_accessible_entrance, is_women_owned and the rest — ready to index into a vector store, drop into an LLM's context window, or call as a tool inside an agent loop, with zero HTML parsing between Google's response and the model.

🔬 For researchers and DEI reporting teams

Academic researchers studying the geography of business ownership, and internal DEI or ESG reporting teams building an evidence base for community-investment claims, both need publicly available counts, not a private data source. Sweep a city, county or state by business category, and ownership_badge_count, accessibility_feature_count and the per-badge booleans turn a raw place list into a source-cited count of how many listed businesses in the area publish which attributes.


🛠️ How to scrape Google Maps for ownership and accessibility data (step by step)

  1. Open this Actor's page on the Apify Store or in your own Apify Console.
  2. Provide the required input: at least one entry in keywords — the business types to search for.
  3. Set locations (cities, counties, states, or countries) and/or paste urls; optionally tick requiredOwnershipBadges and/or requiredAccessibilityFeatures and set badgeMatchMode to turn the sweep into a filtered shortlist.
  4. Start the run. Apify Proxy is enabled by default, and the Actor steps up to a residential proxy on its own if Google starts refusing the current exit.
  5. Download the results from the run's dataset — JSON by default, or any export format the Apify dataset view supports (CSV, Excel, and more).

What to do when Google Maps changes its structure

Google's map-search response is unofficial and can change without notice — this Actor's parser reads specific numbered offsets out of that response (place[196] for badges, place[100] for accessibility), and it is maintained against drift. Field names and types stay the same on your end even when the underlying parsing has to change. No fixed turnaround time is promised for any given breakage.


⬇️ Input

Eight parameters, one required. Read directly from .actor/actor.json.

ParameterRequiredTypeDescriptionExample Value
keywordsYesarray of stringsBusiness types to look for — for example coffee shops, general contractors, dentists, staffing agency, print shop. Default: ["coffee shops"]["coffee shops"]
locationsNoarray of stringsCity, borough, county, state or country names. Each one is resolved to a real bounding box (via OpenStreetMap) and swept cell by cell; every result is checked against that box before it's saved. Default: ["New York"]["New York"]
urlsNoarray of stringsOr paste Google Maps links instead. Supports /maps/search/<terms>/@lat,lng,zoom and /maps/place/<Name>/@lat,lng,zoom. Links that identify a place only by place_id/ftid/cid are not supported. Default: []["https://www.google.com/maps/search/coffee+shops/@40.7128,-74.0060,13z"]
requiredOwnershipBadgesNoarray (select; enum)Only keep places carrying these self-identification badges. Enum: women_owned, black_owned, latino_owned, asian_owned, indigenous_owned, veteran_owned, lgbtq_owned, lgbtq_friendly. Empty = no ownership requirement. Default: []["women_owned", "veteran_owned"]
requiredAccessibilityFeaturesNoarray (select; enum)Only keep places offering these accessibility features. Enum: wheelchair_entrance, wheelchair_restroom, wheelchair_seating, wheelchair_parking, hearing_loop. Empty = no accessibility requirement. Default: []["wheelchair_entrance"]
badgeMatchModeNostring (select; enum)How strictly to apply the ticks above. any = at least one ticked item (wider list); all = every ticked item (strict shortlist). Ignored while both boxes above are empty. Default: "any""all"
maxResultsNointeger (1–10000)Total unique qualifying places to save, across all business types, areas and links. Default: 50200
proxyConfigurationNoobject (proxy editor)Your proxy groups and country, passed through unchanged. Default: {"useApifyProxy": true}{"useApifyProxy": true}

Leaving both requiredOwnershipBadges and requiredAccessibilityFeatures empty returns every place in the area, with the badge and accessibility columns still filled in — use it as a plain extractor with two extra data families.

Common pitfall: providing keywords but leaving both locations and urls empty. The run fails immediately with "Nothing to search in" — a keyword needs an area, or a Maps link carrying its own coordinates, to search within.

Example input

{
"keywords": ["general contractors", "print shop"],
"locations": ["Austin, Texas"],
"urls": [],
"requiredOwnershipBadges": ["women_owned", "veteran_owned"],
"requiredAccessibilityFeatures": ["wheelchair_entrance"],
"badgeMatchMode": "all",
"maxResults": 200,
"proxyConfiguration": { "useApifyProxy": true }
}

⬆️ Output

One typed JSON row per unique place, deduplicated on Google's own place_id. Every pushed row is a row_result charged event — rows dropped by de-duplication, the area-boundary check, or the ownership/accessibility filters are never pushed, so you are only ever billed for a place that actually ends up in your dataset.

Scraped place record

Standard place fields

FieldTypeDescription
rowTypestringRow type discriminator, always "place"
namestring / nullBusiness name
street_addressstring / nullStreet portion of the address
citystring / nullCity
statestring / nullState / region
zipstring / nullPostal code
country_codestring / nullCountry code as Google returns it
full_addressstring / nullGoogle's own one-line formatted address (not a concatenation of the parts)
phonestring / nullPhone number as published
websitestring / nullWebsite URL
avg_ratingnumber / nullAverage rating, 0–5
tagsarray of strings / nullCategory tags
place_idstring / nullGoogle's place ID — used for de-duplication
latnumber / nullLatitude
longnumber / nullLongitude
hoursarray of objectsToday's opening hours only — Google's map-search response carries one weekday, not the week. Each entry: day, hours (Google's own text), opens_at, closes_at ("HH:MM")

Ownership & identity

FieldTypeDescription
ownership_badgesarray of stringsBadge labels exactly as Google publishes them, e.g. ["LGBTQ+ friendly", "Identifies as women-owned"]
ownership_badge_countintegerLength of the array above
is_women_owned, is_black_owned, is_latino_owned, is_asian_owned, is_indigenous_owned, is_veteran_owned, is_lgbtq_owned, is_lgbtq_friendlybooleanNever null — ⚠️ false means "not published," not "no." Ownership badges are voluntary self-identification
is_diversity_ownedbooleanTrue when any ownership badge is present; is_lgbtq_friendly is excluded since it's a welcome statement, not an ownership claim
hotel_checkin_timestring / nullLodging listings publish a check-in time inside this same badge block, so it's split out here; null on every non-lodging place

Accessibility

FieldTypeDescription
accessibility_featuresarray of stringsAttribute labels as Google publishes them, e.g. ["Wheelchair accessible entrance", "Wheelchair accessible restroom"]
accessibility_feature_keysarray of stringsGoogle's language-independent attribute keys, e.g. /geo/type/establishment_poi/has_wheelchair_accessible_entrance — stable across languages
accessibility_feature_countintegerLength of accessibility_features
wheelchair_accessible_entrance, wheelchair_accessible_restroom, wheelchair_accessible_seating, wheelchair_accessible_parking, assistive_hearing_loopbooleanNever null. Only Google's accessibility attribute group is read — the other groups it publishes (amenities, parking, service_options, crowd, planning, payments, offerings, from_the_business) are real but far sparser and are a different product

Example row

{
"rowType": "place",
"name": "Coffee Project New York | East Village",
"street_address": "239 E 5th St",
"city": "New York",
"state": "New York",
"zip": "10003",
"country_code": "US",
"full_address": "239 E 5th St, New York, NY 10003",
"phone": "(212) 228-7888",
"website": "https://coffeeprojectny.com/",
"avg_rating": 4.6,
"tags": ["Coffee shop", "Breakfast restaurant", "Cafe"],
"place_id": "ChIJ_dckWptZwokR_LkU9WxPNZ4",
"lat": 40.7270884,
"long": -73.9893819,
"hours": [
{ "day": "Sunday", "hours": "8 AM-5:30 PM", "opens_at": "08:00", "closes_at": "17:30" }
],
"ownership_badges": [
"LGBTQ+ friendly",
"Identifies as women-owned",
"Identifies as Asian-owned",
"Identifies as LGBTQ+ owned"
],
"ownership_badge_count": 4,
"is_women_owned": true,
"is_black_owned": false,
"is_latino_owned": false,
"is_asian_owned": true,
"is_indigenous_owned": false,
"is_veteran_owned": false,
"is_lgbtq_owned": true,
"is_lgbtq_friendly": true,
"is_diversity_owned": true,
"hotel_checkin_time": null,
"accessibility_features": [
"Wheelchair accessible entrance",
"Wheelchair accessible seating",
"Wheelchair accessible parking lot"
],
"accessibility_feature_keys": [
"/geo/type/establishment_poi/has_wheelchair_accessible_entrance",
"/geo/type/establishment_poi/has_wheelchair_accessible_seating",
"/geo/type/establishment_poi/has_wheelchair_accessible_parking"
],
"accessibility_feature_count": 3,
"wheelchair_accessible_entrance": true,
"wheelchair_accessible_restroom": false,
"wheelchair_accessible_seating": true,
"wheelchair_accessible_parking": true,
"assistive_hearing_loop": false
}

Four dataset views ship with this Actor: Places + ownership & accessibility (default), Ownership badges, Accessibility audit, and Opening hours (today only).


🔍 How does this Actor compare to other Google Maps scrapers?

FeatureThis ActorGeneric Google Maps scraper
Ownership / identity badges✅ 8 boolean fields plus the raw label list❌ Not documented on typical listing-only scrapers
Accessibility attributes✅ 5 boolean fields plus raw labels and Google's stable attribute keys❌ Not typically extracted
Supplier / accessibility pre-filteringrequiredOwnershipBadges / requiredAccessibilityFeatures filter the run itself❌ Usually keyword/location filtering only
Output format✅ Typed, normalized JSON on every run⚠️ Varies by vendor
Schema stability✅ Same field names whether or not filters are active⚠️ Varies by vendor

If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature.


📈 How many results can you scrape with this Actor?

maxResults caps a run at 10,000 saved places — the schema's maximum and the code's MAX_RESULTS_CAP agree on that number; there is no way to request more in a single run. maxResults counts saved, qualifying, deduplicated places, not raw candidates, so turning on a badge or accessibility filter means the sweep keeps expanding until it finds enough qualifying places or the searched area runs out.

Pagination works per grid tile: each location is geocoded into a bounding box, split into up to 400 tiles, and each tile is paged up to 3 times at up to 300 results per page — Google's map-search endpoint measurably returns nothing on a 4th page and caps out around 300 per page, so those are the surface's own limits, not an arbitrary choice. For very large regions, tile size grows automatically to stay within the 400-tile cap, which lowers sweep resolution for whole-country runs. A single tile intentionally keeps only a capped share of its own results, so one dense neighbourhood can't fill your entire maxResults budget on its own.

No throughput benchmark is published — actual place counts per run depend on the query, the area size, and how densely Google has indexed that area.


🔗 Integrate this Actor and automate your workflow

This Actor works with any language or tool that can send an HTTP request — it runs on Apify, so every run is reachable through the Apify API.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run = client.actor("<username>/google-maps-extractor-with-ownership-accessibility-attributes").call(
run_input={
"keywords": ["coffee shops"],
"locations": ["New York"],
"requiredAccessibilityFeatures": ["wheelchair_entrance"],
"maxResults": 100,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["name"], item["wheelchair_accessible_entrance"])

Works in Python, Node.js, Go, Ruby, cURL — any client that can call the Apify API.

Scheduling and webhooks

Use an Apify schedule in the Console to re-run a sweep on a recurring basis, or attach a webhook to fire when a run finishes so a downstream workflow picks up the new rows automatically.


Yes. This Actor only reads what Google already serves on its public, logged-out Google Maps search page — the same place names, addresses, ratings, ownership badges and accessibility attributes any visitor sees without signing in. No login, paywall or private dataset is accessed.

The data returned describes businesses and their self-published attributes, not identified private individuals, so this falls under Google's own Terms of Service and under database-rights law where it applies — not GDPR or CCPA, which govern personal data about natural persons. Ownership badges are a business's own voluntary declaration on its Google Business Profile, not personal data pulled from a private source.

Scraping public data is broadly permitted in most jurisdictions, but reuse remains bound by Google's Terms of Service. Consult legal counsel for commercial use cases involving bulk data collection.


❓ Frequently asked questions

Does this Actor work without a Google account?

Yes. It calls Google's public map-search endpoint directly with a browser-style request; no Google account, API key or billing is required. An Apify account is required to run the Actor itself.

How often is the scraped data updated?

Every run fetches live from Google's map-search endpoint — there is no cache. Two runs minutes apart on the same query can return different results if Google's own index changed in between.

What happens when a place has no coordinates or can't be matched to the requested area?

It's dropped before it's saved and never charged. Places without a resolvable place_id, without coordinates, or outside the geocoded bounding box for the requested location are counted internally and skipped — they never reach the dataset.

Can I scrape private or login-gated Google Maps content?

No. Only what Google serves on its public, logged-out map-search surface is returned. Links that identify a place solely by place_id, ftid or cid aren't supported either — that lookup path doesn't exist on this response surface, so the run logs and skips them rather than guessing.

Is there a limit on how many keywords or locations I can combine in one run?

No schema limit on the size of the keywords or locations arrays themselves. Every keyword is searched in every location (3 keywords × 2 locations = 6 sweeps), and the maxResults budget is split evenly across all of them plus any urls.

Does this Actor work for AI agent workflows and LLM pipelines?

Yes. It's callable as an HTTP endpoint via the Apify API from any agent framework. Every response is typed JSON — no parsing step is needed before passing a row to an LLM.

How does this Actor handle Google Maps' anti-bot system?

With retries and proxy escalation, not evasion tricks. Each request retries up to 3 times; a blocked or unreadable response (HTTP 403/429/503, or a payload Google's anti-hijacking envelope won't decode) escalates the connection to the next proxy tier, moving from datacenter to residential after repeated failures on the same tier.

How does this Actor compare to other Google Maps scrapers?

The main observable difference is scope: this Actor extracts ownership/identity badges and accessibility attributes as structured, filterable fields on every row, which listing-only Google Maps scrapers typically don't document. See the comparison table above for the specific fields.

Does this Actor return data in a format LLMs can use directly?

Yes. Typed, normalized JSON with stable field names — no HTML, no selectors. Pass a row directly into an LLM's context window, index it into a vector store, or route it through an agent tool.

Can I use this Actor without managing proxies?

Yes. Apify Proxy is on by default, and a datacenter exit is normally enough — Google's map endpoint honors the coordinates this Actor sends regardless of where the exit is located. If Google starts refusing the current exit mid-run, the Actor steps up to residential on its own.

What happens when Google changes its Maps structure or blocks the scraper?

This Actor is maintained, and the output schema stays stable — field names and types don't change on your end even when the internal parsing has to be updated to follow a change on Google's side. No numeric turnaround time is promised for any specific breakage.


💬 Your feedback

Found a bug, or missing a field you need? We want to know. Use the Issues tab on this Actor's Apify Console page, or reach out through Apify's normal support channel — active maintenance is how this Actor's output schema stays stable for you.