{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Rank Tracker (Geo-Grid Local SEO Heatmap)",
    "description": "Track where a business ranks on Google Maps across an N×N geo-grid, like Local Falcon. One row per point with organic rank, top competitors and sponsored pins, plus average rank, share of local voice and a heatmap PNG. Pay per grid point.",
    "version": "0.1",
    "x-build-id": "4f6dj0mVlKkeBEaYf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/latentlark~google-maps-rank-tracker/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-latentlark-google-maps-rank-tracker",
        "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/latentlark~google-maps-rank-tracker/runs": {
      "post": {
        "operationId": "runs-sync-latentlark-google-maps-rank-tracker",
        "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/latentlark~google-maps-rank-tracker/run-sync": {
      "post": {
        "operationId": "run-sync-latentlark-google-maps-rank-tracker",
        "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",
        "required": [
          "keyword"
        ],
        "properties": {
          "businessName": {
            "title": "Business name",
            "type": "string",
            "description": "The business to track, as it appears on Google Maps (e.g. 'Swish Dental Downtown'). Used to find it near the center. For an exact match, paste the Maps URL or Place ID instead."
          },
          "mapsUrl": {
            "title": "Google Maps URL (optional)",
            "type": "string",
            "description": "The business's Google Maps place link. Most precise way to identify it."
          },
          "placeId": {
            "title": "Place ID (optional)",
            "type": "string",
            "description": "Google Place ID (starts with ChIJ…)."
          },
          "keyword": {
            "title": "Keyword",
            "type": "string",
            "description": "What customers search on Google Maps, e.g. 'dentist', 'plumber near me', 'coffee shop'."
          },
          "center": {
            "title": "Grid center",
            "type": "string",
            "description": "An address, city or 'lat,lng'. Empty = the business's own location."
          },
          "gridSize": {
            "title": "Grid size",
            "minimum": 1,
            "maximum": 9,
            "type": "integer",
            "description": "Points per side, odd number: 3 = 9 points, 5 = 25, 7 = 49, 9 = 81.",
            "default": 3
          },
          "gridSpacingKm": {
            "title": "Distance between points (km)",
            "minimum": 0.1,
            "maximum": 50,
            "type": "number",
            "description": "Spacing between neighbouring grid points. 1 km suits a city center, 2-5 km a metro area. Ignored if 'Radius' is set.",
            "default": 1
          },
          "radiusKm": {
            "title": "Radius (km, optional)",
            "minimum": 0.1,
            "maximum": 100,
            "type": "number",
            "description": "Alternative to spacing: distance from the center to the grid edge. Spacing = 2 × radius / (grid size − 1)."
          },
          "maxRank": {
            "title": "Check up to rank",
            "minimum": 20,
            "maximum": 60,
            "type": "integer",
            "description": "How deep to look at each point. 20 = first page of Maps results (1 request per point); 40 or 60 = 2-3 requests per point.",
            "default": 20
          },
          "maxCompetitorsPerPoint": {
            "title": "Competitors per point",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "Top-ranked businesses to list at each point.",
            "default": 3
          },
          "country": {
            "title": "Country (gl)",
            "type": "string",
            "description": "2-letter Google country code, e.g. us, gb, de.",
            "default": "us"
          },
          "language": {
            "title": "Language (hl)",
            "type": "string",
            "description": "Google interface language, e.g. en, de, fr.",
            "default": "en"
          },
          "pinLocation": {
            "title": "Search from each grid point",
            "type": "boolean",
            "description": "Tell Google the searcher is standing at each grid point (like a phone with GPS), so results don't depend on the server's location. Recommended.",
            "default": true
          },
          "zoom": {
            "title": "Map zoom",
            "minimum": 10,
            "maximum": 17,
            "type": "number",
            "description": "Map zoom used at each point. Maps ranks places inside the visible map, so zoom decides how local each check is. 15 (about 4 km across) mirrors a phone search in a neighbourhood and is the default. 13 = whole-city view (ranks barely change between nearby points); 16-17 = very tight.",
            "default": 15
          },
          "maxConcurrency": {
            "title": "Parallel points",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Grid points checked at the same time.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. Default (no proxy) works and costs nothing extra; results are location-pinned per grid point so the server IP doesn't matter. Use RESIDENTIAL (country US) if you hit blocks at large grids or frequent schedules (~$0.0003 per point). GOOGLE_SERP proxy is not supported (it can't fetch Maps results).",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}