Nimbryxo Studio

Google Maps Photo Gallery Extractor by Category

Collect public photos and videos from Google Maps places by URL, Place ID, feature ID, CID or search query. Each row carries the image and video links, dimensions, contributor, upload date, owner/visitor flag and place context.

Input schema

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

FieldTypeRequiredDescription
modestringrequiredChoose whether to read photos for specific places or to search for places first.
placeUrlsarrayoptionalGoogle Maps place links, share links, Place IDs (ChIJ...), feature IDs (0x...:0x...), numeric CIDs, or business names. Used when mode is place.
searchQueriesarrayoptionalPlaces to find, for example "coffee shops in New York". Include a city or area for precise matches. Used when mode is search.
Show all input fields
FieldTypeRequiredDescription
modestringrequiredChoose whether to read photos for specific places or to search for places first.
placeUrlsarrayoptionalGoogle Maps place links, share links, Place IDs (ChIJ...), feature IDs (0x...:0x...), numeric CIDs, or business names. Used when mode is place.
searchQueriesarrayoptionalPlaces to find, for example "coffee shops in New York". Include a city or area for precise matches. Used when mode is search.
maxPlacesPerQueryintegeroptionalMaximum number of places to take from each search query (1-100).
maxPhotosintegeroptionalMaximum number of photos and videos to return for each place (1-10000). The actor stops earlier when Google's public sample ends.
photoCategorystringoptionalChoose which media to return. Owner and visitor filters read each photo's public contributor and only return media whose owner/visitor status is known.
enrichDetailsbooleanoptionalRead the contributor name and profile, exact upload date, caption, video download link and video length when Google publishes them.
languagestringoptionalLanguage for place names, categories and dates.
imageSizestringoptionalResolution for the main photo URL. Thumbnail is about 200 px, medium about 800 px, large about 1600 px, original is the largest Google serves.
minWidthintegeroptionalDrop media narrower than this. Set to 0 to keep every width.
minHeightintegeroptionalDrop media shorter than this. Set to 0 to keep every height.

Download the published input schema

View complete JSON
{
  "description": "Collect public Google Maps photos and videos for places or search results.",
  "properties": {
    "enrichDetails": {
      "default": true,
      "description": "Read the contributor name and profile, exact upload date, caption, video download link and video length when Google publishes them.",
      "prefill": false,
      "title": "Include photo details",
      "type": "boolean"
    },
    "imageSize": {
      "default": "original",
      "description": "Resolution for the main photo URL. Thumbnail is about 200 px, medium about 800 px, large about 1600 px, original is the largest Google serves.",
      "editor": "select",
      "enum": [
        "original",
        "large",
        "medium",
        "thumbnail"
      ],
      "enumTitles": [
        "Original (largest)",
        "Large (~1600 px)",
        "Medium (~800 px)",
        "Thumbnail (~200 px)"
      ],
      "prefill": "original",
      "title": "Image size",
      "type": "string"
    },
    "language": {
      "default": "en",
      "description": "Language for place names, categories and dates.",
      "editor": "select",
      "enum": [
        "en",
        "es",
        "fr",
        "de",
        "it",
        "pt",
        "pt-BR",
        "ja",
        "ko",
        "zh-CN",
        "zh-TW",
        "ar",
        "ru",
        "hi",
        "tr",
        "nl",
        "pl",
        "id",
        "th",
        "vi",
        "he",
        "sv",
        "uk"
      ],
      "enumTitles": [
        "English",
        "Spanish",
        "French",
        "German",
        "Italian",
        "Portuguese",
        "Portuguese (Brazil)",
        "Japanese",
        "Korean",
        "Chinese (Simplified)",
        "Chinese (Traditional)",
        "Arabic",
        "Russian",
        "Hindi",
        "Turkish",
        "Dutch",
        "Polish",
        "Indonesian",
        "Thai",
        "Vietnamese",
        "Hebrew",
        "Swedish",
        "Ukrainian"
      ],
      "prefill": "en",
      "title": "Language",
      "type": "string"
    },
    "maxPhotos": {
      "default": 100,
      "description": "Maximum number of photos and videos to return for each place (1-10000). The actor stops earlier when Google's public sample ends.",
      "maximum": 10000,
      "minimum": 1,
      "prefill": 1,
      "title": "Max media per place",
      "type": "integer"
    },
    "maxPlacesPerQuery": {
      "default": 20,
      "description": "Maximum number of places to take from each search query (1-100).",
      "maximum": 100,
      "minimum": 1,
      "prefill": 3,
      "title": "Max places per query",
      "type": "integer"
    },
    "minHeight": {
      "default": 0,
      "description": "Drop media shorter than this. Set to 0 to keep every height.",
      "maximum": 100000,
      "minimum": 0,
      "prefill": 0,
      "title": "Minimum height (px)",
      "type": "integer"
    },
    "minWidth": {
      "default": 0,
      "description": "Drop media narrower than this. Set to 0 to keep every width.",
      "maximum": 100000,
      "minimum": 0,
      "prefill": 0,
      "title": "Minimum width (px)",
      "type": "integer"
    },
    "mode": {
      "default": "place",
      "description": "Choose whether to read photos for specific places or to search for places first.",
      "editor": "select",
      "enum": [
        "place",
        "search"
      ],
      "enumTitles": [
        "Places (URLs or IDs)",
        "Search for places"
      ],
      "prefill": "place",
      "title": "Mode",
      "type": "string"
    },
    "photoCategory": {
      "default": "all",
      "description": "Choose which media to return. Owner and visitor filters read each photo's public contributor and only return media whose owner/visitor status is known.",
      "editor": "select",
      "enum": [
        "all",
        "photos",
        "videos",
        "by_owner",
        "by_visitors",
        "street_view"
      ],
      "enumTitles": [
        "All photos and videos",
        "Photos only",
        "Videos only",
        "By the business owner",
        "By visitors",
        "Nearby Street View panoramas"
      ],
      "prefill": "all",
      "title": "Media filter",
      "type": "string"
    },
    "placeUrls": {
      "default": [],
      "description": "Google Maps place links, share links, Place IDs (ChIJ...), feature IDs (0x...:0x...), numeric CIDs, or business names. Used when mode is place.",
      "editor": "stringList",
      "prefill": [
        "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9878584,17z/data=!3m1!4b1!4m6!3m5!1s0x89c259a9b3117469:0xd134e199a405a163!8m2!3d40.7484405!4d-73.9878584!16zL20vMDJfMjg2"
      ],
      "title": "Place URLs or IDs",
      "type": "array"
    },
    "searchQueries": {
      "default": [],
      "description": "Places to find, for example \"coffee shops in New York\". Include a city or area for precise matches. Used when mode is search.",
      "editor": "stringList",
      "prefill": [],
      "title": "Search queries",
      "type": "array"
    }
  },
  "required": [
    "mode"
  ],
  "schemaVersion": 1,
  "title": "Google Maps Photo Gallery Extractor Input",
  "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
photosstringoptionalEach item contains one photo, video or Street View panorama observed in Google Maps' public gallery.

Download the published output schema

View complete JSON
{
  "actorOutputSchemaVersion": 1,
  "description": "Dataset of public Google Maps media. Each row has recordType set to photo, video or streetView, plus contributor, upload date, dimensions, owner flags, place context and per-place completeness metadata.",
  "properties": {
    "photos": {
      "description": "Each item contains one photo, video or Street View panorama observed in Google Maps' public gallery.",
      "template": "{{links.apiDefaultDatasetUrl}}/items",
      "title": "Photos and videos",
      "type": "string"
    }
  },
  "title": "Google Maps Photo Gallery 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": {
    "overview": {
      "display": {
        "component": "table",
        "properties": {
          "advertisedCount": {
            "format": "number",
            "label": "Advertised count"
          },
          "businessName": {
            "format": "text",
            "label": "Place"
          },
          "collectedCount": {
            "format": "number",
            "label": "Collected"
          },
          "contributorId": {
            "format": "text",
            "label": "Contributor ID"
          },
          "contributorName": {
            "format": "text",
            "label": "Contributor"
          },
          "contributorUrl": {
            "format": "link",
            "label": "Contributor URL"
          },
          "featureId": {
            "format": "text",
            "label": "Feature ID"
          },
          "height": {
            "format": "number",
            "label": "Height"
          },
          "isOwnerPhoto": {
            "format": "boolean",
            "label": "Owner photo"
          },
          "isStreetView": {
            "format": "boolean",
            "label": "Street View"
          },
          "isVideo": {
            "format": "boolean",
            "label": "Video"
          },
          "mediaType": {
            "format": "text",
            "label": "Media"
          },
          "photoId": {
            "format": "text",
            "label": "Photo ID"
          },
          "photoIndex": {
            "format": "number",
            "label": "Position"
          },
          "photoUrl": {
            "format": "link",
            "label": "Photo URL"
          },
          "photosComplete": {
            "format": "boolean",
            "label": "Complete"
          },
          "placeCategory": {
            "format": "text",
            "label": "Place category"
          },
          "placeId": {
            "format": "text",
            "label": "Place ID"
          },
          "placePhotoIndex": {
            "format": "number",
            "label": "Source position"
          },
          "scrapedAt": {
            "format": "datetime",
            "label": "Scraped at"
          },
          "searchQuery": {
            "format": "text",
            "label": "Search query"
          },
          "stopReason": {
            "format": "text",
            "label": "Stop reason"
          },
          "thumbnailUrl": {
            "format": "link",
            "label": "Thumbnail"
          },
          "uploadDate": {
            "format": "datetime",
            "label": "Uploaded"
          },
          "uploadDateOriginal": {
            "format": "text",
            "label": "Uploaded (display)"
          },
          "videoDuration": {
            "format": "text",
            "label": "Video length"
          },
          "videoUrl": {
            "format": "link",
            "label": "Video URL"
          },
          "width": {
            "format": "number",
            "label": "Width"
          }
        }
      },
      "title": "Photos and videos",
      "transformation": {
        "fields": [
          "recordType",
          "photoId",
          "photoIndex",
          "photoUrl",
          "thumbnailUrl",
          "businessName",
          "placeId",
          "featureId",
          "placeUrl",
          "category",
          "mediaType",
          "isVideo",
          "isStreetView",
          "photosComplete",
          "stopReason",
          "advertisedCount",
          "placePhotoIndex",
          "collectedCount",
          "contributorName",
          "contributorUrl",
          "contributorId",
          "contributorAvatarUrl",
          "isOwnerPhoto",
          "uploadDate",
          "uploadDateOriginal",
          "width",
          "height",
          "aspectRatio",
          "orientation",
          "latitude",
          "longitude",
          "videoUrl",
          "videoDuration",
          "videoDurationSeconds",
          "caption",
          "tags",
          "placeCategory",
          "placeCategories",
          "placeAddress",
          "searchQuery",
          "sourceUrl",
          "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

Collect the public photo and video gallery of Google Maps places without a login, cookie or API key. Paste place links, Place IDs, feature IDs, CIDs or business names, or search for places by keyword, then receive one dataset row per photo, video or nearby Street View panorama with its image link, dimensions, contributor, upload date, owner/visitor flag and place context.

Google's public gallery exposes a finite sample of each place, not the full signed-in gallery. The actor collects media from that sample until it reaches your maxPhotos cap or the sample ends. Google sometimes advertises a larger total than the public response actually serves, so treat maxPhotos, advertisedCount and photosComplete as guidance, not a promise of the complete gallery. Every URL in the dataset is a direct Google-hosted image or video link that can be fetched without a Referer or cookie.

What this actor does

  • Reads photos and videos for one or many places using URLs, share links, ChIJ... Place IDs, 0x...:0x... feature IDs, numeric CIDs or business names
  • Searches Google Maps by keyword and reads the gallery of each matching place
  • Filters by photos, videos, business-owner photos, visitor photos or nearby Street View panoramas
  • Adds contributor name, profile link and ID, exact upload date, image dimensions, video download link and video length when Google publishes them
  • Marks owner-uploaded media when Google publishes enough contributor metadata to make that call
  • Exposes the place identity, categories, address and coordinates on every row so the data joins cleanly to other Google Maps datasets
  • Reports whether each place's result set is complete (photosComplete) and why collection stopped (stopReason)
  • Omits a field when Google does not publish it for that item instead of returning null or a guess

Output per media item

Field Description
recordType Media type: photo, video or streetView; matches mediaType
photoId Google's media identifier, unique within a place. The same media can legitimately appear for different places, so deduplicate on place identity plus photoId
photoIndex 0-based position in the returned rows for that place
placePhotoIndex 0-based position in the public sample before filters and caps
collectedCount Number of rows returned for that place
photoUrl Highest-resolution image URL (the poster frame for videos)
thumbnailUrl Small preview image URL
businessName Name of the place
placeId Canonical ChIJ... Place ID when Google exposes it
featureId Legacy 0x...:0x... feature ID
placeUrl Google Maps URL of the place
category The selected filter when it is not all
mediaType photo, video or streetView
isVideo true for a video
isStreetView true for a nearby Street View panorama
photosComplete true only when the whole public sample was read for that place under the selected filter and no cap, safety bound or fetch error cut it short
stopReason Why collection stopped: requested_cap, source_exhausted, safety_bound, filtered, fetch_error or street_view_cap
advertisedCount Total that Google advertises for the place when it returns a plausible number; it can overstate the public sample and is omitted otherwise
contributorName Public contributor name
contributorUrl Contributor profile link
contributorId Contributor profile identifier
contributorAvatarUrl Contributor avatar link
isOwnerPhoto true when the contributor matches the business owner, false for visitor media; omitted when owner attribution is unavailable
uploadDate ISO 8601 upload timestamp
uploadDateOriginal Upload date as Google displays it, such as Oct 2026
width, height Original pixel dimensions
aspectRatio, orientation Derived aspect ratio and landscape / portrait / square
latitude, longitude Media coordinates when Google publishes them
videoUrl Direct MP4 link for videos
videoDuration Video length as m:ss or h:mm:ss
videoDurationSeconds Video length in seconds
caption Caption when the contributor published one
tags Retained for backward compatibility; Google's public photo data does not expose tags
placeCategory, placeCategories Primary and full place category list
placeAddress Place address
searchQuery The query that found the place, in search mode
sourceUrl Place URL used as the record's source (legacy meaning)
scrapedAt UTC timestamp when the record was scraped

Input

Field Type Default Description
mode string place place for specific places, search to discover places by keyword
placeUrls array [] Place URLs, share links, ChIJ... IDs, 0x...:0x... feature IDs, numeric CIDs or business names (mode=place)
searchQueries array [] Keyword queries such as coffee shops in New York (mode=search)
maxPlacesPerQuery integer 20 Places to take from each query (1-100)
maxPhotos integer 100 Upper bound on media items per place (1-10000). The actor stops earlier when Google's public sample ends; photosComplete and stopReason say which happened
photoCategory string all all, photos, videos, by_owner, by_visitors or street_view
enrichDetails boolean true Read contributor, exact date, caption, video link and video length
language string en Language for place names, categories and dates
imageSize string original Main photo URL size: original, large (~1600 px), medium (~800 px) or thumbnail (~200 px)
minWidth integer 0 Drop media narrower than this; 0 keeps every width. Media with unknown dimensions are kept
minHeight integer 0 Drop media shorter than this; 0 keeps every height. Media with unknown dimensions are kept
{
  "mode": "place",
  "placeUrls": [
    "https://www.google.com/maps/place/Empire+State+Building/@40.7484405,-73.9878584,17z/data=!3m1!4b1!4m6!3m5!1s0x89c259a9b3117469:0xd134e199a405a163!8m2!3d40.7484405!4d-73.9878584",
    "https://maps.app.goo.gl/KZLn9FA3aokoiVaP8"
  ],
  "maxPhotos": 100,
  "photoCategory": "all"
}

Example: search for places, then read their galleries

{
  "mode": "search",
  "searchQueries": ["coffee shops in New York", "bakeries in Toronto"],
  "maxPlacesPerQuery": 10,
  "maxPhotos": 50,
  "photoCategory": "photos"
}

Example: owner photos only, high resolution

{
  "mode": "place",
  "placeUrls": ["ChIJhxCTWhJZwokRIAYkdUUdRz0"],
  "photoCategory": "by_owner",
  "maxPhotos": 100,
  "minWidth": 1200
}

Example: videos and nearby Street View

{
  "mode": "place",
  "placeUrls": ["0x89c259125a931087:0x3d471d4575240620"],
  "photoCategory": "videos",
  "maxPhotos": 50
}

Use cases

  • Menu and storefront monitoring — collect photos for a restaurant, café or retail chain and compare owner media with customer uploads
  • Hospitality and real-estate galleries — build visual datasets for hotels, venues and apartment listings from public place photos
  • Brand consistency audits — track the owner/visitor photo mix and freshness across every branch of a business
  • Computer-vision datasets — full-resolution image URLs with dimensions and place/category context for training and evaluation
  • Local SEO research — compare how competing places present themselves visually, and how recently their galleries changed
  • Travel and directory enrichment — add authentic location imagery to city guides, maps and booking products

FAQ

Do I need a Google account, cookies or an API key? No. The actor reads Google Maps' public place and gallery pages. No login, cookie, API key or proxy configuration is needed.

Why do I get fewer items than maxPhotos? Google's public gallery exposes a finite sample of each place, and some places have very few public photos. The actor collects media from the sample until it reaches your cap or the sample ends. maxPhotos is an upper bound, not a promise. Advertised totals are not reliable: the response sometimes advertises a number that is larger than what it actually serves, so advertisedCount is informational only. Check photosComplete and stopReason on each row to see whether the sample was read completely.

Why are the category tabs from the Google Maps website not all available? The Menu, Food & drink, Vibe, Rooms, Amenities, Exterior, Inside and By owner category identifiers are not exposed by the public photo response this actor reads. Anonymous live probes returned only the All category for landmark, restaurant and hotel test places, while the same places exposed more categories only in a cookie-reference session. The current gallery request ignores those category identifiers, the public per-photo metadata response has no photo-category label, and the retired listentityphotos route is not reachable anonymously. These tabs are a confirmed limit of the cookieless path, not a missing feature. The actor offers photos, videos, by_owner, by_visitors and street_view filters instead and does not claim the other tabs.

How are owner photos identified? Owner classification depends on Google publishing both the business owner's profile and the contributor profile for an item. When both are present, isOwnerPhoto is true or false; when either is missing, the status is unknown, the flag is omitted and the item is not returned by the owner or visitor filter. The classification is only as reliable as that public contributor metadata.

Why can the owner or video filter return fewer rows than requested? These filters search the whole public sample, up to a safety bound, instead of stopping after a small fixed window. Even so, the public sample may contain few owner-uploaded or video items, and a place can simply run out of matches. In that case photosComplete is true when the sample and the required contributor metadata were fully read, while collectedCount stays below your cap. If metadata is missing, the rows are reported as incomplete instead.

Are videos included? Yes. Video rows have recordType: "video", isVideo: true, a direct videoUrl MP4 link when Google provides one, and a video length when it can be read from the file.

What is the street_view filter? It returns Street View panoramas near the place's coordinates. These are nearby 360° imagery rather than photos from the place's own gallery; recordType and isStreetView mark them, and they do not carry the place's placeId or featureId. The filter returns at most maxPhotos panoramas and reports street_view_cap when that cap is reached.

Why is caption or tags missing on many rows? Most Google Maps photos have no caption or tags. The field appears only when the contributor or Google published it.

Are the image and video links permanent? They are public Google-hosted URLs that work without a Referer or cookie. Google can change or remove a photo at any time, so re-run the actor when you need a fresh copy.

Is this affiliated with Google? No. This actor reads publicly visible Google Maps data and is not affiliated with, endorsed by or sponsored by Google.

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 cYQlSn4t4DflRaSm3. Documentation is regenerated from the default published build; private drafts are not included.