{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Place Photos Scraper - Images, Dates & Captions",
    "description": "Google Maps place photos scraper: the photos on a Google Maps place, one row per picture with an image link at the width you pick, the pixel size, upload date, caption and where the picture is pinned. Paste a Maps link, a Share link or a place id. No Google account. $0.23 per 1,000 photos.",
    "version": "0.1",
    "x-build-id": "gvn18CePsOYSsZuDF"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dami_studio~google-maps-place-photos-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dami_studio-google-maps-place-photos-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/dami_studio~google-maps-place-photos-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dami_studio-google-maps-place-photos-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/dami_studio~google-maps-place-photos-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dami_studio-google-maps-place-photos-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": {
          "placeUrls": {
            "title": "Google Maps places",
            "minItems": 0,
            "maxItems": 100,
            "type": "array",
            "description": "The places whose pictures you want. A full Google Maps link works, so does the short link from the Share button, a ?cid= link, or the raw 0x...:0x... place id if you already have one. Up to 100 places a run, counting the names and searches below.",
            "items": {
              "type": "string"
            }
          },
          "placeIds": {
            "title": "Google Place IDs",
            "minItems": 0,
            "maxItems": 100,
            "type": "array",
            "description": "Place IDs in the ChIJ... form, one per line, the way Google's own tools and many exports write them. An id that belongs to an area or an address rather than one place may not resolve; you then get a free row saying so.",
            "items": {
              "type": "string"
            }
          },
          "placeNames": {
            "title": "Place names",
            "minItems": 0,
            "maxItems": 100,
            "type": "array",
            "description": "Business or landmark names, one per line, like \"Pike Place Market Seattle\". The run takes Google's top match only when its name is the one you typed. Otherwise you get a free row and nothing is charged. Adding the city helps.",
            "items": {
              "type": "string"
            }
          },
          "maxPhotosPerPlace": {
            "title": "Maximum photos per place",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Ceiling on how many rows a single place may produce, up to 10,000. A place stops at 150 unless \"Keep reading past the first page\" is on."
          },
          "maxPhotos": {
            "title": "Maximum photos for the run",
            "minimum": 1,
            "maximum": 20000,
            "type": "integer",
            "description": "Total rows for the whole run, up to 20,000, shared evenly between your places. Keep it low while you are testing - you pay per row."
          },
          "mediaType": {
            "title": "What to keep",
            "enum": [
              "all",
              "photos",
              "videos",
              "street_view"
            ],
            "type": "string",
            "description": "Keep everything, drop the videos and Street View panoramas, keep only video clips, or keep only Street View. Google's gallery lists two or so clips a place and, since 29 October 2026, no Street View shots."
          },
          "imageWidth": {
            "title": "Image width in pixels",
            "minimum": 100,
            "maximum": 4096,
            "type": "integer",
            "description": "Width for the photoUrl link on each row. The height follows the picture's own aspect ratio. Each row also reports the native size, so you can tell when you asked for more pixels than exist."
          },
          "fullGallery": {
            "title": "Keep reading past the first page",
            "type": "boolean",
            "description": "Off: each place gives up to 150 pictures. On: the run keeps reading the place's later pages until it reaches your per-place limit or the end of Google's list for the place, which came after 3,093 photos on the Seattle roastery (Google reports 67,469 there). Clips sit at the top of the gallery, so this is not used for \"Videos only\" or \"Street View only\". Each row is charged, so set the limits first.",
            "default": false
          },
          "newestFirst": {
            "title": "Newest first",
            "type": "boolean",
            "description": "Sort each place's rows by upload date, newest first. It sorts what the run read for that place: up to 150, or more when \"Keep reading past the first page\" is on. A busy place's newest picture can sit deeper than that.",
            "default": false
          },
          "originalSize": {
            "title": "Original-size image links",
            "type": "boolean",
            "description": "Point photoUrl at each picture at its own full size instead of the width above. Some pictures are over 8,000 pixels wide and several megabytes each.",
            "default": false
          },
          "photographerName": {
            "title": "Photographer's name",
            "type": "boolean",
            "description": "Add each photo's photographer, as the name they show on Google Maps, in a photographerName column. Only that public display name: never their profile link, id or picture. It takes one more request per photo, so the run takes longer. A photo that comes back with a name is billed once more for it, at the price on the Pricing tab; a photo without a name is not. Street View shots have no name.",
            "default": false
          },
          "searchTerms": {
            "title": "Search terms",
            "minItems": 0,
            "maxItems": 100,
            "type": "array",
            "description": "What to search Google Maps for, like \"coffee\" or \"dentist\", one per line. The places found are read like the links above. The search itself costs nothing; you pay for the photos as usual. Needs a location, a circle or a polygon below.",
            "items": {
              "type": "string"
            }
          },
          "searchLocation": {
            "title": "Search location",
            "type": "string",
            "description": "Where to search, like \"Seattle, WA\" or \"Lyon, France\". If Google cannot place it, the search stops with a free row instead of reading places from somewhere else."
          },
          "searchCircle": {
            "title": "Search circle",
            "type": "string",
            "description": "Search a circle instead: \"latitude, longitude, radius in km\", like \"47.6097, -122.3422, 2\", up to 100 km. Only places inside it are kept. It takes the place of the search location."
          },
          "searchPolygon": {
            "title": "Search polygon",
            "minItems": 0,
            "maxItems": 50,
            "type": "array",
            "description": "Or an area of any shape: three or more corners, one \"latitude, longitude\" per line. Only places inside it are kept. It takes the place of the location and the circle.",
            "items": {
              "type": "string"
            }
          },
          "maxPlacesPerSearch": {
            "title": "Places per search term",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "The most places to read for each search term, 1 to 100.",
            "default": 20
          },
          "placeDetails": {
            "title": "Add place details",
            "type": "boolean",
            "description": "Add the place's rating, review count, categories, address, phone, website, opening hours, and whether Google shows it as closed, to every row. The phone and website are the ones the business publishes on Google. Nothing extra is charged.",
            "default": false
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 1,
            "maximum": 5,
            "type": "number",
            "description": "Only read places rated at least this on Google, 1 to 5. A place with no rating is left out. A left-out place gets a free row and costs nothing."
          },
          "skipClosed": {
            "title": "Skip closed places",
            "type": "boolean",
            "description": "Leave out places Google shows as closed. Each gets a free row and costs nothing.",
            "default": false
          },
          "placeCategories": {
            "title": "Only these categories",
            "minItems": 0,
            "maxItems": 50,
            "type": "array",
            "description": "Only read places whose Google categories contain one of these words, like \"cafe\" or \"museum\". A word can match part of a category: \"coffee\" matches \"Coffee shop\" and \"Coffee roastery\".",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Two-letter interface language. It changes captions Google has translated, not the pictures themselves."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country code used for the request."
          },
          "proxyUrls": {
            "title": "Your own proxy servers (optional)",
            "minItems": 0,
            "maxItems": 50,
            "type": "array",
            "description": "Leave this empty for a normal run. Fill it in only if you want the requests to go out through proxy servers of your own, one per line, as http://user:pass@host:port.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}