{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Listing Monitor: Ratings, Hours, Closures",
    "description": "Monitor a fixed set of Google Maps listings (clients, competitors or a category) and get one row per change: closed, reopened, rating drop, review spike, hours, phone, website or category changed.",
    "version": "0.2",
    "x-build-id": "J9Ci23udEOgkmwlJh"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/transparent_meteorite~maps-listing-change-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-transparent_meteorite-maps-listing-change-monitor",
        "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/transparent_meteorite~maps-listing-change-monitor/runs": {
      "post": {
        "operationId": "runs-sync-transparent_meteorite-maps-listing-change-monitor",
        "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/transparent_meteorite~maps-listing-change-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-transparent_meteorite-maps-listing-change-monitor",
        "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": {
          "searches": {
            "title": "Searches to monitor",
            "type": "array",
            "description": "Google Maps searches to re-check each run, e.g. \"dentist in Royal Oak, MI\". Each search is one monitored set; its places get a baseline row on the first run and change events after that. Leave empty and add place URLs below to monitor only specific listings.",
            "default": [
              "coffee shop in Ferndale, MI"
            ],
            "items": {
              "type": "string"
            }
          },
          "placeUrls": {
            "title": "Place URLs or place IDs",
            "type": "array",
            "description": "Specific listings to track (your clients or named competitors): Google Maps place URLs (https://www.google.com/maps/place/...) or place IDs (ChIJ...). They form the set \"Tracked places\" and are checked on their own place page every run.",
            "items": {
              "type": "string"
            }
          },
          "maxPlacesPerSearch": {
            "title": "Max places per search",
            "minimum": 1,
            "maximum": 120,
            "type": "integer",
            "description": "How many top results of each search make up the monitored set (Google lists at most about 120). The demo search with empty input is capped at 20.",
            "default": 40
          },
          "preset": {
            "title": "Preset",
            "enum": [
              "custom",
              "clientListings",
              "competitorSet",
              "reputationWatch",
              "closureWatch"
            ],
            "type": "string",
            "description": "A preset sets the alert list for you. Choose Custom to use the alert list below.",
            "default": "custom"
          },
          "alertOn": {
            "title": "Alert on (Custom preset)",
            "type": "array",
            "description": "Which change types become rows. Only used when Preset is Custom. Changes you switch off are still recorded in the monitor state, just not delivered or charged.",
            "items": {
              "type": "string",
              "enum": [
                "closed",
                "ratingDrop",
                "reviewSpike",
                "reviewStall",
                "reviewsRemoved",
                "hoursChanged",
                "phoneOrWebsiteChanged",
                "categoryChanged",
                "disappeared",
                "enteredSet"
              ],
              "enumTitles": [
                "Closed or reopened",
                "Rating drop",
                "Review spike",
                "Review stall",
                "Reviews removed",
                "Hours changed",
                "Phone or website changed",
                "Primary category changed",
                "Listing disappeared",
                "Place entered the search (competitor sets)"
              ]
            },
            "default": [
              "closed",
              "ratingDrop",
              "reviewSpike",
              "reviewStall",
              "reviewsRemoved",
              "hoursChanged",
              "phoneOrWebsiteChanged",
              "categoryChanged",
              "disappeared"
            ]
          },
          "ratingDropThreshold": {
            "title": "Rating drop threshold (stars)",
            "minimum": 0.1,
            "maximum": 2,
            "type": "number",
            "description": "Report RATING_DROP when the average rating falls by at least this much from the reference rating (0.1 to 2).",
            "default": 0.2
          },
          "spikeMinReviews": {
            "title": "Review spike minimum",
            "minimum": 1,
            "type": "integer",
            "description": "A REVIEW_SPIKE needs at least this many new reviews since the last check, on top of the velocity test.",
            "default": 5
          },
          "monitorKey": {
            "title": "Monitor key",
            "type": "string",
            "description": "Name for this monitor's stored history (letters, digits, dashes). Runs with the same key compare against each other. Leave empty to derive a key from the searches and places, which changes if you edit them."
          },
          "resetBaseline": {
            "title": "Reset baseline",
            "type": "boolean",
            "description": "Forget the stored history for this monitor key and record a fresh baseline (every place is charged once as a baseline row again).",
            "default": false
          },
          "maxDisappearChecks": {
            "title": "Max dropout checks per run",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "When a known place drops out of a search, it is looked up on its own place page to tell \"moved down the list\" from \"closed or removed\". This caps those lookups per run.",
            "default": 25
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google interface language (hl), e.g. en, de, fr. Keep it the same between runs: hours and category text are compared as strings.",
            "default": "en"
          },
          "countryCode": {
            "title": "Country",
            "type": "string",
            "description": "Google country code (gl), e.g. us, gb, de.",
            "default": "us"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Defaults to Apify Proxy (automatic). A direct connection is tried if the proxy is rate limited. No residential proxy is used unless you choose it here. Leave empty to use Apify Proxy when your plan has it; accounts without proxy access run without one."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}