{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Photos Scraper: Place Photos, Videos, Owner Uploads",
    "description": "Scrape the photos, images and videos of any Google Maps business: original-size links, width and height, upload date, owner or visitor, review pictures, video MP4 links, plus an optional photo summary per place for local SEO. By link, CID, name or search. Export to JSON, CSV or Excel, or via API.",
    "version": "1.0",
    "x-build-id": "7GewLj4nV5Ysvj4Gj"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyscrape~google-maps-photos-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyscrape-google-maps-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/steadyscrape~google-maps-photos-scraper/runs": {
      "post": {
        "operationId": "runs-sync-steadyscrape-google-maps-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/steadyscrape~google-maps-photos-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-steadyscrape-google-maps-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": {
          "places": {
            "title": "Places",
            "maxItems": 500,
            "type": "array",
            "description": "One per line: the place's <b>Google Maps link</b> (the place page, a <code>?cid=</code> link, or a <code>maps.app.goo.gl</code> share link), its <b>place id</b> (<code>ChIJ…</code>), its <b>CID</b>, or its <b>name and city</b> (<code>Swish Dental Downtown, Austin TX</code>). A link or an id is exact; a name is looked up on Google Maps and only accepted when the place found carries that name. Up to 500.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search terms",
            "maxItems": 50,
            "type": "array",
            "description": "Find the places on Google Maps first, one search per line, written as you would in Google Maps: <code>dentist</code>, <code>coffee shop</code>, <code>hotels in Lisbon</code>. The photos of the places Google lists first are read. Up to 50.",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "location": {
            "title": "Location for the search terms (optional)",
            "type": "string",
            "description": "Written after each search term, as in <code>dentist in Austin, TX</code>: a city, a neighborhood, a ZIP code. Leave it empty when the terms already name the place.",
            "default": ""
          },
          "maxPlacesPerSearch": {
            "title": "Places per search",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many of the places Google Maps lists first for each search term have their photos read (1–20).",
            "default": 10
          },
          "output": {
            "title": "What to deliver",
            "enum": [
              "photos",
              "photos_and_summary",
              "summary"
            ],
            "type": "string",
            "description": "A <b>photo row</b> has the photo's link at its original size, its width and height, upload date, owner or visitor and upload channel. A <b>summary row</b> counts the place's photos: Google's own total, by the owner, by visitors, from reviews, videos, the newest owner and visitor uploads, uploads in the last 90 days.",
            "default": "photos"
          },
          "maxPhotosPerPlace": {
            "title": "Photos per place",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The photos delivered for each place, in the order Google Maps' photo panel shows them, up to 1,000. With <b>Only a summary</b>, how many photos are read to count. Google lists 10 photos per page: 50 photos are 5 requests.",
            "default": 50
          },
          "uploadedBy": {
            "title": "Uploaded by",
            "type": "array",
            "description": "Only photos the owner uploaded, or only visitors'. Leave empty for both. Filters choose photo rows; a summary always counts every photo read.",
            "items": {
              "type": "string",
              "enum": [
                "owner",
                "visitor"
              ],
              "enumTitles": [
                "The owner (the business itself)",
                "Visitors (customers, reviewers)"
              ]
            },
            "default": []
          },
          "mediaTypes": {
            "title": "Kinds",
            "type": "array",
            "description": "Only these kinds. Leave empty for all.",
            "items": {
              "type": "string",
              "enum": [
                "photo",
                "video",
                "photo_360"
              ],
              "enumTitles": [
                "Photos",
                "Videos",
                "360° photos"
              ]
            },
            "default": []
          },
          "uploadedWithinDays": {
            "title": "Uploaded in the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Only photos uploaded in the last N days (<code>90</code> for the last quarter); 0 for any date. Google Maps lists photos by relevance, not date, so with a filter the run reads up to 1,000 photos per place to find them (you pay only for those delivered).",
            "default": 0
          },
          "language": {
            "title": "Language",
            "pattern": "^\\s*[a-z]{2}(-[A-Za-z]{2})?\\s*$",
            "type": "string",
            "description": "Language of place names and categories, as a code: <code>en</code>, <code>es</code>, <code>de</code>, <code>pt-BR</code>.",
            "default": "en"
          },
          "country": {
            "title": "Country",
            "pattern": "^\\s*[A-Za-z]{2}\\s*$",
            "type": "string",
            "description": "Two-letter country code Google answers for (<code>us</code>, <code>gb</code>, <code>au</code>). Use the places' country.",
            "default": "us"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}