{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Email Enrichment - Local Business Leads",
    "description": "Google Maps enricher for business leads enrichment: feed it Google Maps Scraper results and get local business emails, phones, socials, team-page people and tech stack. Found an email for 81% of 80 real test businesses. $0.005 per lead with contacts; the rest is free.",
    "version": "0.1",
    "x-build-id": "gRMHA7qq4aXADBJuW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lukehunter~lead-enricher/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lukehunter-lead-enricher",
        "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/lukehunter~lead-enricher/runs": {
      "post": {
        "operationId": "runs-sync-lukehunter-lead-enricher",
        "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/lukehunter~lead-enricher/run-sync": {
      "post": {
        "operationId": "run-sync-lukehunter-lead-enricher",
        "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": {
          "datasetId": {
            "title": "Your Google Maps Scraper results (dataset)",
            "type": "string",
            "description": "Optional but the main input. ID of a finished Google Maps Scraper (compass/crawler-google-places) or other dataset whose rows have a website, e.g. \"AbCdEf123456\". Each site is read for emails, phones, socials, people and tech stack; one lead row per business, your columns under `source`. To chain, set it to {{resource.defaultDatasetId}} in the scraper's Integrations tab. No token needed; up to 20,000 rows. No-website rows come back free as `no-website`."
          },
          "datasetWebsiteField": {
            "title": "Dataset: website column (optional)",
            "type": "string",
            "description": "Name of the dataset column holding the website, exactly as spelled, e.g. \"website\". Only used with a dataset. Leave empty to auto-detect (website, websiteUrl, web, url, domain, homepage, companyWebsite, company_website, site; the first non-empty one wins). Google Maps, social network and marketplace links are never read as a company website."
          },
          "datasetPassthroughFields": {
            "title": "Dataset: extra columns to copy into `source` (optional)",
            "type": "array",
            "description": "Only used with a dataset. Extra dataset columns to copy into each lead's `source` object, e.g. [\"plusCode\", \"state\", \"postalCode\"], max 15 columns. These are always copied: title, categoryName, address, city, phone, totalScore, reviewsCount, url, placeId. Text is cut at 2,000 characters. datasetRow, sourceRowCount and otherRows are always added and reserved. For rows sharing a website the first row's columns are kept.",
            "items": {
              "type": "string"
            }
          },
          "websites": {
            "title": "Websites (domains, URLs or emails)",
            "type": "array",
            "description": "Businesses to enrich when you have no dataset, as domains or URLs, e.g. [\"plausible.io\", \"https://www.mailerlite.com/contact\"]. One per line or a pasted column. Home page first, then contact, impressum, about and team pages. De-duplicated by domain; up to 20,000 per run. Unusable entries are listed in INPUT_REPORT. The prefilled sample sites are ignored when a dataset is given.",
            "items": {
              "type": "string"
            }
          },
          "websitesFileUrl": {
            "title": "Website list file URL (optional)",
            "type": "string",
            "description": "Optional https link to a public .csv or .txt file of company websites, e.g. \"https://example.com/companies.csv\" (a Google Sheets \"Publish to web\" CSV link, Dropbox shared link or GitHub Raw link works). Max 5 MB / 20,000 lines; every cell is read like an entry of the list above, and the result is merged and de-duplicated with it. Must open without signing in."
          },
          "onlyWithEmail": {
            "title": "Only leads with an email",
            "type": "boolean",
            "description": "true (default): deliver a business only if an email was found, e.g. a phone-only business is dropped uncharged. Set false to also get phone-only leads (charged) and, free, rows showing why a site gave nothing (no-contacts-found, blocked, unreachable, robots-disallowed). Dataset rows with no website are controlled by \"Return rows with no website\".",
            "default": true
          },
          "requireTech": {
            "title": "Only sites that run (any of these technologies)",
            "type": "array",
            "description": "Optional filter applied before charging: deliver only businesses whose home page runs at least ONE of these technologies, e.g. [\"Shopify\"] for Shopify stores with an email, or [\"WooCommerce\", \"Klaviyo\", \"HubSpot\"]. Names match ignoring case and punctuation; an unknown name is an input error with suggestions. Sites that could not be read are dropped when this is set. Leave empty for no filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeTech": {
            "title": "Skip sites that run (any of these technologies)",
            "type": "array",
            "description": "Optional filter, applied before charging: drop businesses whose website runs ANY of these technologies, for example [\"Wix\"] to skip Wix sites, or [\"Klaviyo\", \"Mailchimp\"] to skip businesses that already run email marketing. Same names as \"Only sites that run\"; a technology cannot be in both lists. Leave empty for no filter.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeNoWebsiteRows": {
            "title": "Return rows with no website",
            "type": "boolean",
            "description": "true (default), only with a dataset: a row with no usable website (empty or only a Google Maps or social link) comes back free with status `no-website` and its `source` fields, e.g. so you can phone those leads instead. These rows never count toward Maximum leads and are never charged. Set false to leave them out.",
            "default": true
          },
          "maxItems": {
            "title": "Maximum leads",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum business rows delivered, integer 1-10,000, default 100. Also your cost cap: $0.005 per row with an email or phone, so at most maxItems x $0.005. For a quick test use 5 (e.g. maxItems 5). Filtered-out rows do not count; free rows with nothing found do. At most 10 x maxItems websites (min 100) are read per run.",
            "default": 100
          },
          "maxPagesPerSite": {
            "title": "Pages per website",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Pages read per website (home page included), integer 1-20, default 6, e.g. 3 for speed. Contact and team pages are read first, in many languages. More pages find more addresses and people on large sites. The tech stack is detected on the home page regardless of this setting.",
            "default": 6
          },
          "includePeople": {
            "title": "Include the people behind the business",
            "type": "boolean",
            "description": "true (default): also return people the site publishes (name, job title, and an email or LinkedIn link only where the page itself links one), e.g. {\"name\": \"Jane Doe\", \"title\": \"CEO\"}. People alone do not make a lead and are not charged. No address is ever guessed. Set false for just emails, phones, socials and tech stack.",
            "default": true
          },
          "outputFormat": {
            "title": "Output size: full or compact",
            "enum": [
              "full",
              "compact"
            ],
            "type": "string",
            "description": "\"full\" (default): every field. \"compact\": a much smaller row for AI agents: companyName, domain, primaryEmail, emails (addresses, max 5), phones (max 3), socials found, people (name, title, max 5), a tech summary (cms, ecommerce, analytics, marketing), leadFlags, status and source.title. Charging is identical in both formats. Example: \"compact\" when results are read into an LLM context.",
            "default": "full"
          },
          "onlyChangedSinceLastRun": {
            "title": "Only new or changed leads (change mode)",
            "type": "boolean",
            "description": "true returns a business only when it is new or its emails, phones, social links, people or technologies changed since the last run (`changeType` new/changed, `changedFields`). Default false: a one-off run returns every lead. Agents making one-off calls should leave it false. Example: run weekly on a Schedule with true; unchanged businesses are not delivered or charged. The first run delivers all.",
            "default": false
          },
          "stateStoreName": {
            "title": "Change mode: state store name",
            "type": "string",
            "description": "Only used when change mode is on. Name of the key-value store that remembers each business's last state between scheduled runs, e.g. \"lead-enricher-state\". Letters, numbers and hyphens only. Leave the default unless several tasks need separate histories.",
            "default": "lead-enricher-state"
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Post results to a Discord channel. In Discord: Server Settings -> Integrations -> Webhooks -> New Webhook -> choose the channel -> Copy Webhook URL. Example: https://discord.com/api/webhooks/<id>/<token>. Leave empty to skip Discord."
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Post results to Telegram. Create a bot by chatting with @BotFather on Telegram (send /newbot) and paste the token it gives you, e.g. 123456789:AA.... Needs \"Telegram chat ID\" below. Leave empty to skip Telegram."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Where the bot should post: a numeric chat id (e.g. 123456789, or -1001234567890 for a group or channel) or a public @channelusername. The bot must be added to that chat or channel first (as an administrator for a channel), and for a private chat you must press Start on the bot. Needs \"Telegram bot token\" above."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Post results to a Slack channel (Block Kit cards, up to 10 per message). Create an incoming webhook at api.slack.com/apps -> Create New App -> Incoming Webhooks -> Add New Webhook to Workspace. Example: https://hooks.slack.com/services/T000/B000/XXXX. Leave empty to skip Slack."
          },
          "slackCompatibleWebhookUrl": {
            "title": "Slack-compatible webhook URL (Mattermost, Rocket.Chat)",
            "type": "string",
            "description": "Post results to a Mattermost or Rocket.Chat incoming webhook, which accept Slack-style webhook payloads. Must be a public https:// address, e.g. https://chat.example.com/hooks/abc123 (no localhost, private IP or .local/.internal hosts). These apps do not render Slack Block Kit, so they get a plain Markdown list. For real Slack use \"Slack webhook URL\" above. Leave empty to skip."
          },
          "teamsWebhookUrl": {
            "title": "Microsoft Teams webhook URL (Workflows)",
            "type": "string",
            "description": "Post results to a Teams channel as an Adaptive Card. In Teams: channel -> ... -> Workflows -> \"Post to a channel when a webhook request is received\" -> copy the URL. The host must end in .logic.azure.com or .powerplatform.com, e.g. https://prod-12.westeurope.logic.azure.com/workflows/... The retired Office 365 connector webhooks are not supported. Leave empty to skip Teams."
          },
          "googleChatWebhookUrl": {
            "title": "Google Chat webhook URL",
            "type": "string",
            "description": "Post results to a Google Chat space. In the space: Apps & integrations -> Webhooks -> Add webhook -> copy the URL. Example: https://chat.googleapis.com/v1/spaces/<space>/messages?key=...&token=.... Leave empty to skip Google Chat."
          },
          "ntfyTopic": {
            "title": "ntfy topic",
            "type": "string",
            "description": "Get a phone push with no account via ntfy (ntfy.sh). Install the ntfy app, subscribe to a topic name, and enter the same name here. Anyone who knows the topic can read it, so pick a long, unguessable name (letters, numbers, - and _), e.g. acme-leads-7k2x9q. At most 10 individual pushes per run, then one \"...and N more\". Leave empty to skip ntfy."
          },
          "ntfyServer": {
            "title": "ntfy server",
            "type": "string",
            "description": "Only used with \"ntfy topic\". Leave as https://ntfy.sh, or enter the public https:// address of your own ntfy server, e.g. https://ntfy.example.com.",
            "default": "https://ntfy.sh"
          },
          "ntfyToken": {
            "title": "ntfy access token (optional)",
            "type": "string",
            "description": "Only used with \"ntfy topic\", for a self-hosted server or a reserved topic that needs a login. An access token from ntfy (starts with tk_, e.g. tk_abc123...). Leave empty for open topics."
          },
          "pushoverUserKey": {
            "title": "Pushover user key",
            "type": "string",
            "description": "Get a phone push via Pushover. Your user key (30 characters, e.g. uQiRzpo4DXghDmr9QzzfQu27cmVRsG) is shown on the Pushover dashboard (pushover.net). Needs \"Pushover app token\" below. At most 10 individual pushes per run, then one \"...and N more\". Leave empty to skip Pushover."
          },
          "pushoverAppToken": {
            "title": "Pushover app token",
            "type": "string",
            "description": "The API token of a Pushover application you create at pushover.net/apps/build (name it after this Actor), e.g. azGDORePK8gMaC0QOYAMyEEuzJnyUi. Needs \"Pushover user key\" above."
          },
          "webhookUrl": {
            "title": "Generic JSON webhook URL (Zapier, Make, n8n, Pipedream, IFTTT, Home Assistant)",
            "type": "string",
            "description": "POST the delivered rows as JSON to any public https:// URL: {source, actor, runId, count, items}. At most 100 rows per POST; every delivered row is sent regardless of the max-notifications cap. For example, route results to email, a spreadsheet or any app. Localhost, private IP and .local/.internal addresses are rejected. Leave empty to skip."
          },
          "maxNotifications": {
            "title": "Max notifications per run",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Caps how many results are sent to chat and phone channels per run (Discord, Telegram, Slack, Teams, Google Chat, ntfy, Pushover), 1-100, default 25 (e.g. 10). Extra results are still in the dataset. The generic webhook is not capped. Only used when a destination above is set.",
            "default": 25
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}