Dataspryva

Google Maps Top List & Ranked Places Extractor

Pull the ranked places from a Google Maps Top list query like 'Top hotels in Paris', or from a list/search URL, with optional full place-page enrichment.

Input schema

Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.

FieldTypeRequiredDescription
modestringoptionalUse 'topList' for ranked queries like 'Top hotels in Paris'. Use 'listUrl' for a shared Google Maps list link or a Maps search URL.
queriesarrayoptionalRanked list queries. For example: 'Top hotels in Paris', 'Best coffee in Brooklyn', 'Things to do in Tokyo'. Each query is scraped separately.
locationstringoptionalOptional city, neighborhood or region appended to every query when it is not already mentioned.
Show all input fields
FieldTypeRequiredDescription
modestringoptionalUse 'topList' for ranked queries like 'Top hotels in Paris'. Use 'listUrl' for a shared Google Maps list link or a Maps search URL.
queriesarrayoptionalRanked list queries. For example: 'Top hotels in Paris', 'Best coffee in Brooklyn', 'Things to do in Tokyo'. Each query is scraped separately.
locationstringoptionalOptional city, neighborhood or region appended to every query when it is not already mentioned.
listUrlsarrayoptionalPublic Google Maps shared-list links (google.com/maps/placelists/list/...) or Maps search URLs. Short maps.app.goo.gl links are resolved automatically.
maxResultsintegeroptionalMaximum places to return per query or list. The public feed may expose fewer; lists are returned up to the source window.
enrichDetailsbooleanoptionalAdds Plus Code, rating histogram, photos, amenities, price range, booking links, closure state and hotel details. Turn it off for the fastest, smallest runs using list-feed data only.
languagestringoptionalGoogle Maps interface language. Names, categories, addresses and hours are localized.
minRatingnumberoptionalDrop places with a lower rating or no published rating.
maxRatingnumberoptionalDrop places with a higher rating.
minReviewsintegeroptionalDrop places with fewer reviews or no published review count.
maxReviewsintegeroptionalDrop places with more reviews.
openNowbooleanoptionalKeep only places Google currently marks as open.
hasWebsitebooleanoptionalKeep only places with a published website.
hasPhonebooleanoptionalKeep only places with a published phone number.
includeClosedbooleanoptionalWhen disabled, permanently closed places are dropped. This needs full place details.
nameFilterstringoptionalKeep only places whose name contains this text (case-insensitive).
excludeCategoriesarrayoptionalDrop places whose primary or secondary category contains any of these words.
includeCategoriesarrayoptionalKeep places whose primary or secondary category contains any of these words.
countryCodesarrayoptionalKeep places in these two-letter countries, e.g. FR, US, JP. Empty means all countries.

Download the published input schema

View complete JSON
{
  "properties": {
    "countryCodes": {
      "default": [],
      "description": "Keep places in these two-letter countries, e.g. FR, US, JP. Empty means all countries.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "title": "Country codes",
      "type": "array"
    },
    "enrichDetails": {
      "default": true,
      "description": "Adds Plus Code, rating histogram, photos, amenities, price range, booking links, closure state and hotel details. Turn it off for the fastest, smallest runs using list-feed data only.",
      "prefill": false,
      "title": "Fetch full place details",
      "type": "boolean"
    },
    "excludeCategories": {
      "default": [],
      "description": "Drop places whose primary or secondary category contains any of these words.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "title": "Exclude categories",
      "type": "array"
    },
    "hasPhone": {
      "default": false,
      "description": "Keep only places with a published phone number.",
      "prefill": false,
      "title": "Must have a phone number",
      "type": "boolean"
    },
    "hasWebsite": {
      "default": false,
      "description": "Keep only places with a published website.",
      "prefill": false,
      "title": "Must have a website",
      "type": "boolean"
    },
    "includeCategories": {
      "default": [],
      "description": "Keep places whose primary or secondary category contains any of these words.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [],
      "title": "Include categories",
      "type": "array"
    },
    "includeClosed": {
      "default": true,
      "description": "When disabled, permanently closed places are dropped. This needs full place details.",
      "prefill": true,
      "title": "Include permanently closed places",
      "type": "boolean"
    },
    "language": {
      "default": "en",
      "description": "Google Maps interface language. Names, categories, addresses and hours are localized.",
      "editor": "select",
      "enum": [
        "en",
        "af",
        "az",
        "id",
        "ms",
        "bs",
        "ca",
        "cs",
        "da",
        "de",
        "et",
        "es",
        "es-419",
        "eu",
        "fil",
        "fr",
        "gl",
        "hr",
        "zu",
        "is",
        "it",
        "sw",
        "lv",
        "lt",
        "hu",
        "nl",
        "no",
        "uz",
        "pl",
        "pt-BR",
        "pt-PT",
        "ro",
        "sq",
        "sk",
        "sl",
        "fi",
        "sv",
        "vi",
        "tr",
        "el",
        "bg",
        "ky",
        "kk",
        "mk",
        "mn",
        "ru",
        "sr",
        "uk",
        "ka",
        "hy",
        "iw",
        "ur",
        "ar",
        "fa",
        "am",
        "ne",
        "hi",
        "mr",
        "bn",
        "pa",
        "gu",
        "ta",
        "te",
        "kn",
        "ml",
        "si",
        "th",
        "lo",
        "my",
        "km",
        "ko",
        "ja",
        "zh-CN",
        "zh-TW"
      ],
      "enumTitles": [
        "English",
        "Afrikaans",
        "azərbaycan",
        "Bahasa Indonesia",
        "Bahasa Melayu",
        "bosanski",
        "català",
        "Čeština",
        "Dansk",
        "Deutsch",
        "eesti",
        "Español",
        "Español (Latinoamérica)",
        "euskara",
        "Filipino",
        "Français",
        "galego",
        "Hrvatski",
        "isiZulu",
        "íslenska",
        "Italiano",
        "Kiswahili",
        "latviešu",
        "lietuvių",
        "magyar",
        "Nederlands",
        "norsk",
        "oʻzbekcha",
        "polski",
        "Português (Brasil)",
        "Português (Portugal)",
        "română",
        "shqip",
        "Slovenčina",
        "slovenščina",
        "Suomi",
        "Svenska",
        "Tiếng Việt",
        "Türkçe",
        "Ελληνικά",
        "български",
        "кыргызча",
        "қазақ тілі",
        "македонски",
        "монгол",
        "Русский",
        "српски",
        "Українська",
        "ქართული",
        "հայերեն",
        "עברית",
        "اردو",
        "العربية",
        "فارسی",
        "አማርኛ",
        "नेपाली",
        "हिन्दी",
        "मराठी",
        "বাংলা",
        "ਪੰਜਾਬੀ",
        "ગુજરાતી",
        "தமிழ்",
        "తెలుగు",
        "ಕನ್ನಡ",
        "മലയാളം",
        "සිංහල",
        "ไทย",
        "ລາວ",
        "ဗမာ",
        "ខ្មែរ",
        "한국어",
        "日本語",
        "简体中文",
        "繁體中文"
      ],
      "prefill": "en",
      "title": "Language",
      "type": "string"
    },
    "listUrls": {
      "description": "Public Google Maps shared-list links (google.com/maps/placelists/list/...) or Maps search URLs. Short maps.app.goo.gl links are resolved automatically.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "title": "Shared list or Maps URLs",
      "type": "array"
    },
    "location": {
      "default": "",
      "description": "Optional city, neighborhood or region appended to every query when it is not already mentioned.",
      "editor": "textfield",
      "prefill": "",
      "title": "Location",
      "type": "string"
    },
    "maxRating": {
      "default": 5,
      "description": "Drop places with a higher rating.",
      "maximum": 5,
      "minimum": 0,
      "prefill": 5,
      "title": "Maximum rating",
      "type": "number"
    },
    "maxResults": {
      "default": 30,
      "description": "Maximum places to return per query or list. The public feed may expose fewer; lists are returned up to the source window.",
      "maximum": 100000,
      "minimum": 1,
      "prefill": 3,
      "title": "Max results",
      "type": "integer"
    },
    "maxReviews": {
      "default": 0,
      "description": "Drop places with more reviews.",
      "minimum": 0,
      "prefill": 0,
      "title": "Maximum review count",
      "type": "integer"
    },
    "minRating": {
      "default": 0,
      "description": "Drop places with a lower rating or no published rating.",
      "maximum": 5,
      "minimum": 0,
      "prefill": 0,
      "title": "Minimum rating",
      "type": "number"
    },
    "minReviews": {
      "default": 0,
      "description": "Drop places with fewer reviews or no published review count.",
      "minimum": 0,
      "prefill": 0,
      "title": "Minimum review count",
      "type": "integer"
    },
    "mode": {
      "default": "topList",
      "description": "Use 'topList' for ranked queries like 'Top hotels in Paris'. Use 'listUrl' for a shared Google Maps list link or a Maps search URL.",
      "editor": "select",
      "enum": [
        "topList",
        "listUrl"
      ],
      "enumTitles": [
        "Top list query",
        "Shared list or Maps URL"
      ],
      "title": "Mode",
      "type": "string"
    },
    "nameFilter": {
      "default": "",
      "description": "Keep only places whose name contains this text (case-insensitive).",
      "editor": "textfield",
      "prefill": "",
      "title": "Name contains",
      "type": "string"
    },
    "openNow": {
      "default": false,
      "description": "Keep only places Google currently marks as open.",
      "prefill": false,
      "title": "Open now",
      "type": "boolean"
    },
    "queries": {
      "description": "Ranked list queries. For example: 'Top hotels in Paris', 'Best coffee in Brooklyn', 'Things to do in Tokyo'. Each query is scraped separately.",
      "editor": "stringList",
      "items": {
        "type": "string"
      },
      "prefill": [
        "Top hotels in Paris"
      ],
      "title": "Queries",
      "type": "array"
    }
  },
  "schemaVersion": 1,
  "title": "Google Maps Top List & Ranked Places Extractor",
  "type": "object"
}

Output schema

Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.

FieldTypeRequiredDescription
placesstringoptionalEach item contains only fields observed on the public list or place page.

Download the published output schema

View complete JSON
{
  "actorOutputSchemaVersion": 1,
  "description": "Ranked places from a Google Maps Top list or list/search URL, with rank, rating and optional full place details.",
  "properties": {
    "places": {
      "description": "Each item contains only fields observed on the public list or place page.",
      "template": "{{links.apiDefaultDatasetUrl}}/items",
      "title": "Places",
      "type": "string"
    }
  },
  "title": "Google Maps Top List & Ranked Places Extractor Output"
}

Dataset schema

Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.

Download the published dataset schema

View complete JSON
{
  "actorSpecification": 1,
  "views": {
    "detailed": {
      "display": {
        "component": "table"
      },
      "title": "Detailed Place Data",
      "transformation": {
        "fields": [
          "recordType",
          "rank",
          "listSource",
          "listId",
          "listTitle",
          "listUrl",
          "listDescription",
          "listOwner",
          "note",
          "savedAt",
          "name",
          "categoryName",
          "categories",
          "description",
          "totalScore",
          "reviewsCount",
          "ratingHistogram",
          "address",
          "plusCode",
          "location",
          "latitude",
          "longitude",
          "timezone",
          "countryCode",
          "phone",
          "website",
          "menuLink",
          "bookingLinks",
          "hours",
          "hoursStatus",
          "isOpenNow",
          "price",
          "priceRange",
          "priceLevel",
          "priceOfferAmount",
          "priceOfferCurrency",
          "priceOfferDateRange",
          "serviceOptions",
          "amenities",
          "placeAttributes",
          "attributes",
          "highlights",
          "hotelStars",
          "hotelStarRating",
          "hotelAmenities",
          "fuelPrices",
          "photosSample",
          "photoCount",
          "hasStreetView",
          "streetViewCount",
          "claimed",
          "temporarilyClosed",
          "permanentlyClosed",
          "placeId",
          "featureId",
          "kgmid",
          "cid",
          "googleMapsUrl",
          "sourceUrl",
          "scrapedAt"
        ]
      }
    },
    "overview": {
      "display": {
        "component": "table",
        "properties": {
          "address": {
            "label": "Address"
          },
          "categoryName": {
            "label": "Category"
          },
          "googleMapsUrl": {
            "label": "Maps URL"
          },
          "highlights": {
            "label": "Highlights"
          },
          "name": {
            "label": "Name"
          },
          "price": {
            "label": "Price (as shown)"
          },
          "priceLevel": {
            "label": "Price Level"
          },
          "rank": {
            "label": "Rank"
          },
          "reviewsCount": {
            "label": "Reviews"
          },
          "totalScore": {
            "label": "Rating"
          }
        }
      },
      "title": "Ranked Places",
      "transformation": {
        "fields": [
          "recordType",
          "rank",
          "listSource",
          "name",
          "categoryName",
          "totalScore",
          "reviewsCount",
          "address",
          "priceLevel",
          "price",
          "highlights",
          "googleMapsUrl",
          "scrapedAt"
        ]
      }
    }
  }
}

Key-value schema

Published key-value store definitions, when provided by this build.

This definition is not present in the default published build. See the published README for available documentation.

Published README

Read the full published documentation

Google Maps Top List & Ranked Places Extractor

Google Maps ranks the places in a "Top hotels in Paris" search and in every shared list you save. This actor reads that ranked order — directly from Google's public Maps endpoints, without a browser, cookies, an API key, or proxy setup — and writes one row per place.

It handles two kinds of inputs:

  • Top-list queries such as Top hotels in Paris, Best coffee in Brooklyn, or Things to do in Tokyo.
  • Shared list links such as https://www.google.com/maps/placelists/list/... or a short maps.app.goo.gl link. A Maps search URL is accepted too.

What you get

  • The rank Google gives each place, plus the query or list it came from.
  • Shared-list context: list title and description, list ID, owner, the saver's note, and the saved date.
  • Business facts: category, rating, review count, address, phone, website, hours, open/closed status, coordinates, price, and Place IDs.
  • Optional detail enrichment: Plus Code, rating histogram, photos, amenities, service options, booking links, hotel stars and amenities, fuel prices, and closure flags.

No record contains null, empty strings, or empty arrays. A field Google does not publish for a place is omitted.

Example row

{
  "recordType": "business",
  "rank": 1,
  "listSource": "Top hotels in Paris",
  "name": "Four Seasons Hotel George V, Paris",
  "categoryName": "Hotel",
  "categories": ["Hotel", "Spa", "Wedding venue"],
  "totalScore": 4.8,
  "reviewsCount": 7414,
  "address": "31 Av. George V, 75008 Paris, France",
  "phone": "+33 1 49 52 70 00",
  "website": "https://www.fourseasons.com/paris/",
  "price": "PKR 663K",
  "priceLevel": "€€€€",
  "highlights": ["Pool", "Spa", "Hot tub", "Free parking"],
  "placeId": "ChIJAcNYmcJv5kcR7EQ_IeMZp8c",
  "featureId": "0x47e66fc29958c301:0xc7a719e3213f44ec",
  "location": { "lat": 48.8688005, "lng": 2.3008313 },
  "googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJAcNYmcJv5kcR7EQ_IeMZp8c",
  "scrapedAt": "2026-11-06T09:00:00+00:00"
}

Field notes

  • rank is the position Google returned for that query or list, starting at 1. Filtering never renumbers it.
  • placeId is the canonical ChIJ... ID. A legacy 0x...:0x... token is kept separately in featureId.
  • price is the amount Google prints on a hotel card, kept verbatim (currency and K/M shorthand included). priceLevel is Google's standing band such as $$$ or a dining price range.
  • highlights are the short feature pills on a hotel list card. amenities is the fuller badge set from the place page.
  • note and savedAt come from the shared list and are present only for list rows. listTitle and listDescription carry the list's own title and description.

Input

Field Type Default Description
mode Select topList topList for ranked queries, listUrl for shared-list or Maps URLs.
queries String list – (prefill: ["Top hotels in Paris"]) One or more ranked queries.
location String – Appended to every query when the query does not already mention it.
listUrls String list – Public shared-list links or Maps search URLs.
maxResults Integer 30 Maximum places per query or list.
enrichDetails Boolean true Visit each place record for the detail-only fields.
language Select en 70+ Google Maps interface languages.
minRating / maxRating Number – Rating bounds (0–5).
minReviews / maxReviews Integer – Review-count bounds.
openNow Boolean false Keep places Google marks open now.
hasWebsite / hasPhone Boolean false Require a published website or phone.
includeClosed Boolean true When off, permanently closed places are dropped.
nameFilter String – Keep names containing this text.
excludeCategories String list – Drop categories containing any listed word.
includeCategories String list – Keep categories containing any listed word.
countryCodes String list – Keep places in these two-letter countries (FR, US, JP…).

Saved tasks that still send the old single-value query or listUrl keep working: the actor maps those keys in code.

Examples

Ranked hotels

{
  "mode": "topList",
  "queries": ["Top hotels in Paris"],
  "maxResults": 10,
  "enrichDetails": true,
  "language": "en"
}

Fast card-only run

{
  "mode": "topList",
  "queries": ["Best sushi restaurants in Tokyo"],
  "maxResults": 25,
  "enrichDetails": false,
  "language": "ja"
}

A shared list

{
  "mode": "listUrl",
  "listUrls": ["https://www.google.com/maps/placelists/list/oMnWVsXSvFX9Bh2O5-71TApDgffWvg"],
  "maxResults": 5000,
  "enrichDetails": false
}

Use cases

  • Travel research: compile ranked hotels, restaurants and attractions per city.
  • Local SEO: compare how a category ranks across markets.
  • Lead generation: export name, rating, phone, website and address from a shortlist.
  • Content: turn shared "best of" lists into structured tables.
  • Site selection: measure the density and quality of a category in an area.

FAQ

Does it need cookies, a login or an API key? No. Every mode reads public Google Maps data.

Do I need to configure a proxy? No. The actor chooses its connection automatically. There is no proxy field to fill in.

How many places can a query return? It varies by query and city. Broad categories commonly expose 150–450 ranked places; narrow queries expose fewer. The actor follows Google's pages until maxResults, the end of the result window, or the source's own stop signal.

How many places can a shared list have? The public list endpoint returns the whole list in one response. This actor requests up to 5,000 places per list; that is the practical source window for very large lists.

Why did I get fewer rows than maxResults? Google's result window ended, the list was shorter, or filters removed rows. The run status says which case applies and how many rows the filters skipped.

What does enrichDetails add? Plus Code, rating histogram, photos, amenities, service options, booking links, hotel details, fuel prices and closure flags. It costs one extra request per place; turn it off when the list-card fields are enough.

Are sponsored places included? No. Google can print paid hotel cards at the top of a feed. They are excluded, so rank follows the organic list, as in the previous version.

Are popularTimesSummary and menuLink filled? popularTimesSummary is not published by the public Maps feed used here, so it is not emitted. menuLink appears only when a place's detail data exposes a menu URL, which is rare. Use the dedicated popular-times or menu actor when you need those fields.

Does it support non-English Maps? Yes. Pick any language in the dropdown; names, categories, addresses and hours are localized by Google.

What happens when Google blocks a request? The actor retries and escalates its connection automatically. If no result view ever arrives, the run status says it was an upstream block or degraded response — never "no places found".

Is this affiliated with Google? No. It is an independent tool that reads publicly available Google Maps pages. You are responsible for using the data lawfully and consistently with Google's terms.

Python quickstart

Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.

Open the step-by-step Python guide →

Source build LQuqRWbzWdl2Ey9lU. Documentation is regenerated from the default published build; private drafts are not included.