{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Photos Scraper | Videos, Menu, Food & Vibe",
    "description": "Download Google Maps photos, videos, and Street View by category: Menu, Food, Vibe, Rooms, Amenities, Inside, Exterior, From visitors, By owner, and Latest.",
    "version": "0.0",
    "x-build-id": "hmG5JbaR8Qemv0fDK"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lurkapi~google-maps-photos-and-videos-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lurkapi-google-maps-photos-and-videos-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/lurkapi~google-maps-photos-and-videos-scraper/runs": {
      "post": {
        "operationId": "runs-sync-lurkapi-google-maps-photos-and-videos-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/lurkapi~google-maps-photos-and-videos-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-lurkapi-google-maps-photos-and-videos-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "searchTerms": {
            "title": "Search terms",
            "maxItems": 10,
            "type": "array",
            "description": "Keywords to search on Google Maps. One per line. Each is paired with the Location field below. Every matching place gets photos scraped.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search queries (compatibility alias)",
            "maxItems": 10,
            "type": "array",
            "description": "Compatibility alias for searchTerms. Used only when searchTerms is empty.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "City, region, or country to search in. A city name alone works (e.g. 'Paris'); add a country for precision (e.g. 'Paris, France'). Ignored when a Search circle or Search polygon is set."
          },
          "searchLocations": {
            "title": "Search locations (compatibility alias)",
            "maxItems": 10,
            "type": "array",
            "description": "Compatibility alias for multiple locations. Used only when location is empty. Each search term runs in every location, capped at 10 locations. Ignored when Search circle or Search polygon is set.",
            "items": {
              "type": "string"
            }
          },
          "maxPlacesPerSearch": {
            "title": "Max places per search term",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "Cap on how many places one search keyword surfaces before photo scraping begins. Google's hard cap is ~120 per query.",
            "default": 5
          },
          "googleMapsUrls": {
            "title": "Google Maps URLs",
            "maxItems": 1000,
            "type": "array",
            "description": "Paste Google Maps URLs. The run processes up to 1,000 combined Google Maps URLs and place IDs; any extras are skipped with a log message. These combine with Place IDs and keyword searches in the same run. Supported shapes:\n• Full Google Maps URL (paste from the address bar or 'Copy link')\n• Share link (maps.app.goo.gl / goo.gl/maps)",
            "items": {
              "type": "string"
            }
          },
          "placeUrls": {
            "title": "Place URLs (compatibility alias)",
            "maxItems": 1000,
            "type": "array",
            "description": "Compatibility alias for googleMapsUrls. Used only when googleMapsUrls and startUrls are empty.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs (legacy alias)",
            "maxItems": 1000,
            "type": "array",
            "description": "Legacy alias for googleMapsUrls. Used only when googleMapsUrls is empty.",
            "items": {
              "type": "string"
            }
          },
          "placeIds": {
            "title": "Place IDs or CIDs",
            "maxItems": 1000,
            "type": "array",
            "description": "Paste one identifier per line. Accepted formats:\n• Google Place ID (e.g. ChIJD7fiBh9u5kcRYJSMaMOCCwQ)\n• place_id:ChIJ... prefix\n• Hex CID (0x47e66e2964e34e2d:0x8ddca9ee380ef7e0)\n\nCombines with Google Maps URLs above; either or both work. The combined total is capped at 1,000; extras are skipped with a log message.",
            "items": {
              "type": "string"
            }
          },
          "business_ids": {
            "title": "Business IDs (compatibility alias)",
            "maxItems": 1000,
            "type": "array",
            "description": "Compatibility alias for placeIds. Used only when placeIds is empty.",
            "items": {
              "type": "string"
            }
          },
          "business_id": {
            "title": "Business ID (compatibility alias)",
            "type": "string",
            "description": "Compatibility alias for a single place ID. Used only when placeIds and business_ids are empty."
          },
          "searchCircle": {
            "title": "Search circle (lat / lng / radius miles)",
            "type": "object",
            "description": "Limit search to a circular area. Provide { \"lat\": <number>, \"lng\": <number>, \"radiusMiles\": <number> }. Centers the Maps viewport here and drops places outside the radius. Combine with Search terms; Location is ignored when this is set."
          },
          "searchPolygon": {
            "title": "Search polygon (GeoJSON ring)",
            "type": "array",
            "description": "Limit search to an arbitrary polygon. Provide an array of [lng, lat] pairs (GeoJSON convention; first and last point can match; ≥3 vertices). Takes precedence over Search circle when both are set.",
            "items": {
              "type": "array",
              "items": {
                "type": "number"
              }
            }
          },
          "categories": {
            "title": "Categories to scrape",
            "uniqueItems": true,
            "type": "array",
            "description": "Which photo tabs to include. All tabs are selected by default; pick only the tabs you need to narrow the run. Tabs not present on a given place are skipped automatically. Use Media types below to filter the returned rows.",
            "items": {
              "type": "string",
              "enum": [
                "all",
                "menu",
                "food",
                "vibe",
                "rooms",
                "amenities",
                "inside",
                "exterior",
                "from_visitors",
                "by_owner",
                "latest",
                "videos",
                "street_view"
              ],
              "enumTitles": [
                "All photos",
                "Menu",
                "Food & drink",
                "Vibe",
                "Rooms",
                "Amenities",
                "Inside",
                "Exterior",
                "From visitors",
                "By owner",
                "Latest",
                "Videos",
                "Street View & 360°"
              ]
            },
            "default": [
              "all",
              "menu",
              "food",
              "vibe",
              "rooms",
              "amenities",
              "inside",
              "exterior",
              "from_visitors",
              "by_owner",
              "latest",
              "videos",
              "street_view"
            ]
          },
          "mediaTypes": {
            "title": "Media types to include",
            "uniqueItems": true,
            "type": "array",
            "description": "Choose which media rows to keep. Leave all selected to return photos, videos, and Street View. Selecting only photos still lets you scrape every category while filtering out videos and Street View rows.",
            "items": {
              "type": "string",
              "enum": [
                "photo",
                "video",
                "street_view"
              ],
              "enumTitles": [
                "Photos",
                "Videos",
                "Street View & 360°"
              ]
            },
            "default": [
              "photo",
              "video",
              "street_view"
            ]
          },
          "photoCategories": {
            "title": "Photo categories (compatibility alias)",
            "uniqueItems": true,
            "type": "array",
            "description": "Compatibility alias for categories. Used only when categories is empty.",
            "items": {
              "type": "string"
            }
          },
          "maxPhotosPerPlace": {
            "title": "Max photos per place (total)",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Cap on how many photos are returned per place, summed across every selected category. Tabs are drained in order — the cap stops the whole place once reached. Lower it for cheap previews; raise it for full collection.",
            "default": 200
          },
          "imageSize": {
            "title": "Image resolution",
            "enum": [
              "thumbnail",
              "medium",
              "large",
              "original"
            ],
            "type": "string",
            "description": "Requested image resolution. Standard photos use Google's CDN resizing; Street View images are rendered and saved to this run's storage. Original uses the largest supported Street View render.",
            "default": "large"
          },
          "downloadMedia": {
            "title": "Download media files",
            "type": "boolean",
            "description": "Store the actual photo and video files in this run's key-value store. Original image and video URLs stay in the dataset. Street View images are already stored.",
            "default": false
          },
          "outputThumbnailUrl": {
            "title": "Thumbnail URL",
            "type": "boolean",
            "description": "Preview URL alongside the full-size image URL. Street View rows use their stored-image URL for both fields.",
            "default": true
          },
          "outputDimensions": {
            "title": "Dimensions (width × height)",
            "type": "boolean",
            "description": "Original dimensions for standard photos and videos; stored-image dimensions for Street View rows.",
            "default": true
          },
          "outputGps": {
            "title": "GPS coordinates (latitude / longitude)",
            "type": "boolean",
            "description": "GPS EXIF data when present. Stripped from ~70% of user uploads.",
            "default": true
          },
          "outputUploadDate": {
            "title": "Upload date (ISO 8601)",
            "type": "boolean",
            "description": "Date the photo was posted to Google Maps.",
            "default": true
          },
          "outputUploadedByOwner": {
            "title": "Uploaded-by-owner flag",
            "type": "boolean",
            "description": "True when the place owner posted the photo via Google My Business.",
            "default": true
          },
          "outputContributorName": {
            "title": "Contributor name",
            "type": "boolean",
            "description": "Public display name of the photo contributor. Enabled by default; disable for maximum speed.",
            "default": true
          },
          "outputSource": {
            "title": "Upload source",
            "type": "boolean",
            "description": "Normalized source: android, ios, web, owner, or street_view.",
            "default": true
          },
          "outputVideoDuration": {
            "title": "Video duration (ms)",
            "type": "boolean",
            "description": "Video length in milliseconds. Appears only on video rows; omitted from photo, Street View, and status rows.",
            "default": true
          },
          "outputStoredMediaUrl": {
            "title": "Stored media URL",
            "type": "boolean",
            "description": "Link to the downloaded photo or video file in this run's key-value store. Appears only when Download media files is enabled and the file was stored.",
            "default": true
          },
          "outputPlaceName": {
            "title": "Place name",
            "type": "boolean",
            "description": "Human-readable place name resolved from Google Maps.",
            "default": true
          },
          "outputPlaceUrl": {
            "title": "Place URL (input)",
            "type": "boolean",
            "description": "The original URL the user provided for this place.",
            "default": true
          },
          "outputPlaceIds": {
            "title": "Place identifiers (FID + KG entity + place_id)",
            "type": "boolean",
            "description": "Stable Google identifiers for the place. Useful when feeding rows into other Maps tools.",
            "default": true
          },
          "outputSearchKeyword": {
            "title": "Source search keyword",
            "type": "boolean",
            "description": "When the place was surfaced from a search keyword (not a direct URL), include which keyword produced it.",
            "default": true
          },
          "outputInternalCategoryCode": {
            "title": "Internal category code (advanced)",
            "type": "boolean",
            "description": "Google's numeric per-photo category tag. Mostly useful for debugging.",
            "default": false
          },
          "outputScrapedAt": {
            "title": "Scrape timestamp",
            "type": "boolean",
            "description": "ISO 8601 timestamp of when the row was extracted.",
            "default": true
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}