{
  "openapi": "3.0.1",
  "info": {
    "title": "B2B Email Finder & Verifier — Find Emails, LinkedIn & Phones",
    "description": "Find emails for any company or LinkedIn profile in bulk. Pick the decision-makers you want (founder, CEO, VP) and get names, titles, LinkedIn URLs, phones and MX-verified B2B emails, ranked by confidence. Search and preview free — pay only for verified, deliverable contacts. No API keys.",
    "version": "0.0",
    "x-build-id": "derXg7GjFLS7vLgSv"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/memo23~email-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-memo23-email-finder",
        "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/memo23~email-finder/runs": {
      "post": {
        "operationId": "runs-sync-memo23-email-finder",
        "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/memo23~email-finder/run-sync": {
      "post": {
        "operationId": "run-sync-memo23-email-finder",
        "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": {
          "people": {
            "title": "🧑 People (name + company domain → their email)",
            "type": "array",
            "description": "Person-level lookups. Each item is {\"fullName\": \"Patrick Collison\", \"companyDomain\": \"stripe.com\"} (plain strings like \"Patrick Collison, stripe.com\" also work). For each person you get the most-likely business email with a ranked candidate list, live MX verification, the company's mail provider, and a confidence score. The company site is also scanned so a published address or the org's real naming pattern beats a blind guess. Billed per person with a mail-capable result."
          },
          "emailList": {
            "title": "✅ Verify a list of emails (verify-only mode)",
            "type": "array",
            "description": "Paste emails to validate — one per line. When this is filled the actor runs in <b>verify-only</b> mode: it validates each email and exits (no finding/discovery). Each email returns syntax, MX, disposable, role-based, free-provider flags and a <b>valid / risky / invalid</b> verdict. Billed per email via the <code>emails-verified</code> event.",
            "items": {
              "type": "string"
            }
          },
          "discoverPeople": {
            "title": "🔎 Discover people (find WHO works there → their emails)",
            "type": "array",
            "description": "Discovery mode — don't know the people yet? Each query finds them AND resolves their emails in one run. Example: {\"website\": \"stripe.com\", \"jobTitles\": [\"engineering\", \"marketing\"]} scans the company's team/about/leadership pages, extracts every person matching your title filter, then runs each through the same verification pipeline as the People input (pattern inference, MX check, cross-checked against the site). Add a RocketReach API key below to also search the open web by job title + location WITHOUT naming a company, e.g. {\"jobTitles\": [\"CTO\"], \"locations\": [\"Austin\"]}. Fields per query: company, website, personName, jobTitles, locations, maxPeople. Plain strings work too (\"CTO @ stripe.com\"). Billed per person with a mail-capable result — discovery itself is free."
          },
          "domains": {
            "title": "Websites / domains",
            "type": "array",
            "description": "Company websites or domains to find emails for (most accurate — the site is scraped directly). One per entry, e.g. stripe.com or https://stripe.com.",
            "items": {
              "type": "string"
            }
          },
          "companyNames": {
            "title": "Company names",
            "type": "array",
            "description": "Company / brand names to discover a website for, then find emails. Use when you don't have the domain. One per entry.",
            "items": {
              "type": "string"
            }
          },
          "targetPersona": {
            "title": "🎯 Target decision-maker roles",
            "type": "array",
            "description": "Pick the decision-maker roles to find at every domain / company you supply above — the actor auto-builds the people search for each, so a plain domain list becomes a decision-maker search. Combine several. Leave empty to use the Discover people queries instead.",
            "items": {
              "type": "string",
              "enum": [
                "founder_ceo",
                "c_suite",
                "sales_leader",
                "marketing_leader",
                "engineering_leader",
                "finance_leader",
                "hr_leader",
                "operations_leader"
              ],
              "enumTitles": [
                "Founder / CEO / Owner",
                "Full C-suite",
                "Sales leader (VP/Head/CRO)",
                "Marketing leader (VP/Head/CMO)",
                "Engineering leader (CTO/VP Eng)",
                "Finance leader (CFO/Controller)",
                "HR / People leader",
                "Operations leader (COO)"
              ]
            }
          },
          "defaultCountry": {
            "title": "🌍 Country hint (optional)",
            "type": "string",
            "description": "Bias the persona people-search toward one country/region (e.g. \"United States\", \"United Kingdom\"). Applied to every auto-built persona query. Leave empty for no location filter."
          },
          "inputText": {
            "title": "Paste a list",
            "type": "string",
            "description": "Alternative — paste a blob of domains OR company names separated by new lines, commas, or semicolons. Domains (containing a dot) are treated as websites; everything else as a company name."
          },
          "companies": {
            "title": "Structured queries (advanced)",
            "type": "array",
            "description": "Advanced: mix name + website + city/state per row for best disambiguation. Merged with the fields above."
          },
          "guardMode": {
            "title": "Match precision",
            "enum": [
              "business",
              "off",
              "residential"
            ],
            "type": "string",
            "description": "How strictly a discovered domain must match the company name. 'business' = name match (default, recommended). 'off' = accept any Clearbit match. 'residential' = property/real-estate mode.",
            "default": "business"
          },
          "onlyWithEmails": {
            "title": "Only output companies with emails",
            "type": "boolean",
            "description": "On by default: emit (and bill) only company rows where at least one email was found — so you pay only for successful hits, never for a no-email company. Set to false to also emit no-email rows (useful for auditing coverage); those company rows are billed when emitted.",
            "default": true
          },
          "verifyEmails": {
            "title": "✅ Verify emails (find + validate in one pass, billed per email)",
            "type": "boolean",
            "description": "Validate every email found: checks syntax, looks up the domain's MX record (does it accept mail?), and flags disposable, role-based (info@, sales@) and free-provider (gmail, etc.) addresses. Adds an `emailVerifications` array plus `validEmails`, `validEmailCount` and `bestValidEmail` — so you get deliverable addresses, not just candidates. Reliable DNS/list-based validation by default; add SMTP mailbox probing with the toggle below. Billed per email verified.",
            "default": false
          },
          "smtpCheck": {
            "title": "📮 Also probe the mailbox over SMTP (best-effort, opt-in)",
            "type": "boolean",
            "description": "On top of DNS/MX verification, open a real SMTP conversation with the domain's mail server (EHLO → MAIL FROM → RCPT TO) to ask whether the specific mailbox is accepted, and detect catch-all domains. Adds an `smtp` object per checked email (reachable, accepted, catchAll, code). <b>Best-effort and honest:</b> port 25 is blocked on many networks (including much of Apify's infrastructure), so this often reports <code>reachable:false</code> and falls back to the DNS/MX verdict — it never marks a valid-looking address invalid on a failed connection; only a clean mailbox rejection (550) does. No extra charge — billed under the same per-email verification event.",
            "default": false
          },
          "maxVerifiedEmailsPerCompany": {
            "title": "Max verified emails per company",
            "minimum": 1,
            "type": "integer",
            "description": "Optional ceiling on how many emails are verified per company. Verification is billed per email, and one company can legitimately expose dozens of addresses, so this is how you bound that spend. Any emails beyond the ceiling are still returned — just unverified and unbilled. Leave empty to verify everything found (the default behaviour)."
          },
          "qualifyByPayment": {
            "title": "💳 Qualify by payment (flag businesses that take money online)",
            "type": "boolean",
            "description": "Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds `takesPayments` (is this a real paying business?), `paymentProcessors` (which stack), `stripeLiveKey` (the public key if exposed) and `paymentConfidence`. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company (billed under the existing Company enriched event).",
            "default": false
          },
          "hunterApiKey": {
            "title": "Hunter.io API key (optional)",
            "type": "string",
            "description": "Optional — supply your own Hunter.io key to enable a paid domain-search fallback when the site scrape finds no emails. Leave empty to use the free site-scrape path only."
          },
          "rocketreachApiKey": {
            "title": "RocketReach API key (optional, unlocks open-web discovery)",
            "type": "string",
            "description": "Optional — an OFFICIAL RocketReach API key (rocketreach.co → Settings → API) upgrades Discovery mode to open-web people search: filter by job title, location, industry and employer without naming a company. The actor only calls the SEARCH endpoint and resolves emails with its own verification pipeline — it never triggers RocketReach per-contact lookups, so your unlock credits are not spent. Leave empty to use the built-in team-page discovery engine."
          },
          "maxDiscoveredPeople": {
            "title": "Max discovered people",
            "minimum": 1,
            "type": "integer",
            "description": "Global cap on people processed by Discovery mode this run (across all discovery queries). Per-query caps can be set with each query's maxPeople field (default 25).",
            "default": 200
          },
          "maxItems": {
            "title": "Max items (companies + people combined)",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on how many items this run processes. The budget is SHARED: companies are taken first, and person lookups get whatever is left over, so a long company list can leave no room for the `people` you also submitted (the run log warns when that happens). Free plans are capped at 25.",
            "default": 100000
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many companies to enrich in parallel.",
            "default": 10
          },
          "proxy": {
            "title": "Proxy configuration (optional override)",
            "type": "object",
            "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}