{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Email & Contact Details Scraper",
    "description": "Best public contact route for each company website or Google Maps lead: email, phone or contact form, each with its source page. Emails labelled role, person or freemail. Optional socials and booking routes. No guessing.",
    "version": "1.21",
    "x-build-id": "9uLz8lFdN7w1BOo3w"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/olliolli~website-contact-profile/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-olliolli-website-contact-profile",
        "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/olliolli~website-contact-profile/runs": {
      "post": {
        "operationId": "runs-sync-olliolli-website-contact-profile",
        "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/olliolli~website-contact-profile/run-sync": {
      "post": {
        "operationId": "run-sync-olliolli-website-contact-profile",
        "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": {
          "urls": {
            "title": "Company websites",
            "minItems": 1,
            "maxItems": 500,
            "type": "array",
            "description": "One URL per company website, up to 500. Duplicate hosts are scanned once per run.",
            "items": {
              "type": "string",
              "maxLength": 2048
            }
          },
          "datasetId": {
            "title": "Or: business list from a dataset (e.g. your Google Maps scraper results)",
            "type": "string",
            "description": "Select a dataset with business listings, for example the results of a Google Maps scraper run you made yourself. The scan reads only each row's website and, for an identity check, its name, city, postal code and country code (first 5,000 rows, up to 500 unique company websites; listing, social and booking pages are skipped). You can also chain it: add an integration on your listing scraper that runs this Actor with {\"datasetId\": \"{{resource.defaultDatasetId}}\"}. You are responsible for how you obtained the listing data."
          },
          "maxPages": {
            "title": "Maximum pages per website",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Includes the homepage. Robots.txt and bounded redirects are separate requests. Lower limits can miss contacts.",
            "default": 5
          },
          "maxRunSeconds": {
            "title": "Maximum processing time (seconds)",
            "minimum": 30,
            "maximum": 1800,
            "type": "integer",
            "description": "Stops new work at this time budget. Unprocessed URLs are listed in OUTPUT. The platform timeout must leave additional time to save the summary.",
            "default": 600
          },
          "maxConcurrency": {
            "title": "Maximum concurrent websites",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Bounded parallel scans. Higher values use more Actor memory/network capacity and may increase target-site load; 5 is the default.",
            "default": 5
          },
          "contactPurpose": {
            "title": "Contact purpose",
            "enum": [
              "any",
              "sales",
              "general",
              "support"
            ],
            "type": "string",
            "description": "Sales prefers sales, then general, never support; general addresses with nearby customer-service phrases are excluded. This is a conservative heuristic, not a guarantee of commercial suitability. General/support only accept their own mailbox category.",
            "default": "any"
          },
          "emailScope": {
            "title": "Email categories",
            "enum": [
              "role_person",
              "all"
            ],
            "type": "string",
            "description": "role_person returns role and named company-domain addresses. all also includes freemail and department addresses; these categories are less validated.",
            "default": "role_person"
          },
          "channelScope": {
            "title": "Additional contact channels",
            "enum": [
              "core",
              "all"
            ],
            "type": "string",
            "description": "Extra social, booking and WhatsApp links are experimental and are not included by default.",
            "default": "core"
          },
          "countryHint": {
            "title": "Country for phone-code comparison (optional)",
            "enum": [
              "AT",
              "BE",
              "BG",
              "CA",
              "CH",
              "CY",
              "CZ",
              "DE",
              "DK",
              "EE",
              "ES",
              "FI",
              "FR",
              "GB",
              "GR",
              "HR",
              "HU",
              "IE",
              "IS",
              "IT",
              "LI",
              "LT",
              "LU",
              "LV",
              "MT",
              "NL",
              "NO",
              "PL",
              "PT",
              "RO",
              "SE",
              "SI",
              "SK",
              "US"
            ],
            "type": "string",
            "description": "Applied to all URLs in this run. Labels explicit international calling codes as matching, differing, non-geographic or unknown; it never guesses a code for a local-format number and does not prove the phone belongs to a local branch."
          },
          "expectedEntities": {
            "title": "Expected business identity (optional)",
            "maxItems": 500,
            "type": "array",
            "description": "Optional per-website identity from your own list. The output compares it with same-site JSON-LD claims; a match is supporting evidence only, not independent proof of branch ownership.",
            "items": {
              "type": "object",
              "properties": {
                "url": {
                  "title": "Website",
                  "type": "string",
                  "description": "Must match one URL in urls."
                },
                "businessName": {
                  "title": "Business name",
                  "type": "string",
                  "description": "The name you expect for this website."
                },
                "country": {
                  "title": "Country",
                  "type": "string",
                  "description": "ISO country code, for example BE."
                },
                "locality": {
                  "title": "City",
                  "type": "string",
                  "description": "The city or municipality you expect."
                },
                "postalCode": {
                  "title": "Postal code",
                  "type": "string",
                  "description": "The postal code you expect."
                }
              },
              "required": [
                "url"
              ]
            }
          },
          "previousSnapshot": {
            "title": "Previous snapshot (optional)",
            "type": "object",
            "description": "Paste the SNAPSHOT record from the previous run. Purpose, email scope, page limit, policy and input URL must match. Leave empty on the first run. Failed/partial scans preserve the previous confirmed selection."
          },
          "conversionRoutes": {
            "title": "Conversion routes (booking, quote, ordering, prices)",
            "type": "boolean",
            "description": "Also look for online booking/appointment and quote-request routes (proven, with evidence) and online ordering and price routes (candidates, with evidence). Opens the page behind each candidate button once (robots.txt respected) and adds a few seconds per website. Proven routes: in a blind test on 660 new SME websites (BE/NL/FR, October 2026), 48 of 50 booking and quote routes were correct. Candidates are not covered by that figure.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}