{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Scraper — fill-rate before you pay",
    "description": "Search a term and a city to get clean local-business records: verified name, full address, exact coordinates and a direct link on essentially every row. The real fill-rate of phone, website and rating is measured and published for every run, before you pay.",
    "version": "0.1",
    "x-build-id": "Vc00PKjoMqybCNGod"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rankfabrik~local-business-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rankfabrik-local-business-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/rankfabrik~local-business-scraper/runs": {
      "post": {
        "operationId": "runs-sync-rankfabrik-local-business-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/rankfabrik~local-business-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-rankfabrik-local-business-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",
        "required": [
          "searchTerm"
        ],
        "properties": {
          "searchTerm": {
            "title": "What you're looking for",
            "type": "string",
            "description": "The kind of business, written the way you'd say it: \"dental office\", \"italian restaurant\", \"auto repair shop\"."
          },
          "city": {
            "title": "City",
            "enum": [
              "paris",
              "lyon",
              "marseille",
              "toulouse",
              "bordeaux",
              "lille",
              "bruxelles",
              "geneve",
              "montreal",
              "londres",
              "new york",
              "berlin",
              "madrid",
              "tokyo",
              "marrakech",
              "casablanca"
            ],
            "type": "string",
            "description": "Sixteen cities are preloaded. For anywhere else, leave this empty and provide latitude and longitude instead.",
            "default": "paris"
          },
          "latitude": {
            "title": "Latitude (if your city isn't in the list)",
            "type": "string",
            "description": "Center of the sweep. Example: 40.7128"
          },
          "longitude": {
            "title": "Longitude (if your city isn't in the list)",
            "type": "string",
            "description": "Center of the sweep. Example: -74.0060"
          },
          "radiusKm": {
            "title": "Radius in kilometers",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Half-width of the area swept around the center point.",
            "default": 4
          },
          "gridSize": {
            "title": "Grid fineness",
            "minimum": 1,
            "maximum": 6,
            "type": "integer",
            "description": "The area is swept by a grid of size × size points. 1 = a single point (20 results at most), 3 = nine points, 6 = thirty-six. Finer = more complete and more expensive. Deduplication is on the place identifier, never on the name.",
            "default": 3
          },
          "listDepth": {
            "title": "List depth per point",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "The source returns twenty results per call, but its list holds far more — you page through it. 1 = first page only (fastest), 20 = to the bottom of the list. Measured on one area: 152 businesses at 1 page, 887 at 20 pages, in sixteen seconds. Grid and depth multiply — they don't replace each other.",
            "default": 20
          },
          "maxResults": {
            "title": "Maximum number of businesses",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Hard ceiling on the number of rows delivered — and therefore billed.",
            "default": 500
          },
          "onlyWithoutWebsite": {
            "title": "Only businesses without a website",
            "type": "boolean",
            "description": "Keep only businesses that have no website listed — the prospects to pitch \"we'll build you one\". Applied before the maximum, so you still get up to your cap. Note: a business with no site has no site to read, so leave email extraction off when you use this.",
            "default": false
          },
          "enrichEmails": {
            "title": "Extract contact emails from each business site",
            "type": "boolean",
            "description": "For every business that lists a website, open it and extract the contact email addresses it publishes (mailto:, contact pages, Cloudflare-obfuscated addresses are decoded). Public data, read as shown — NOT verified for deliverability (no MX/SMTP check). Rows carrying an email are billed at the higher \"business row with email\" rate. Slower, and only businesses with a website can yield an address.",
            "default": false
          },
          "enrichPhotos": {
            "title": "Include Google Maps photos",
            "type": "boolean",
            "description": "Adds public Google Maps photo URLs to each business. Slower because it reads one place-detail response per business.",
            "default": false
          },
          "photosLimit": {
            "title": "Maximum photos per business",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Number of distinct place photos returned when photo enrichment is enabled.",
            "default": 10
          },
          "verifyEmails": {
            "title": "Verify extracted emails are real (SMTP bounce-check)",
            "type": "boolean",
            "description": "For every unique email extracted by \"Extract contact emails\", run a real deliverability probe (DNS MX + SMTP RCPT TO — no email is ever sent) before you pay for it as a verified lead. Requires enrichEmails to be on; otherwise there is nothing to probe. Because the probe is paced at roughly 5 seconds per mail server, only up to \"Maximum emails to verify\" unique addresses are checked per run — the rest keep their unverified \"business row with contact email\" billing. Only a strict \"valid\" verdict (never risky/unknown/invalid) is billed at the verified-lead rate.",
            "default": false
          },
          "verifyMax": {
            "title": "Maximum emails to verify",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Hard ceiling on the number of UNIQUE email addresses probed for deliverability in one run (addresses repeated across several businesses count once). Keeps runs on large batches from being dominated by the ~5-second-per-mail-server pacing of the SMTP probe.",
            "default": 50
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}