{
  "openapi": "3.0.1",
  "info": {
    "title": "Decision makers from company domains — verified email or phone",
    "description": "Turn company domains into named decision makers — CEO, founder, VP — with SMTP-verified named-DM or generic-inbox email, phones and LinkedIn. B2B database + AI research. $0.06/domain + $0.14 per verified contact; plan discounts to 20%, 50% off beyond 250 contacts/run. No API keys.",
    "version": "0.7",
    "x-build-id": "zG3VKY8YqqMT7zmJy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/pequod-labs~company-decision-maker-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-pequod-labs-company-decision-maker-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/pequod-labs~company-decision-maker-finder/runs": {
      "post": {
        "operationId": "runs-sync-pequod-labs-company-decision-maker-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/pequod-labs~company-decision-maker-finder/run-sync": {
      "post": {
        "operationId": "run-sync-pequod-labs-company-decision-maker-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": {
          "domainList": {
            "title": "Company domains (simple list)",
            "maxItems": 600,
            "type": "array",
            "description": "Paste a domain list from a CRM export, lookalike run or conference attendee list — one domain per line, no JSON. Mutually exclusive with <code>domains</code>: leave the advanced JSON field empty when you use this. Optional <code>defaultCountry</code> is applied to every domain here (e.g. set <code>IT</code> so Italian domains get <code>contatti@</code> fallback and EU legal-notice phone lookup). Up to 600 domains per run on paid Apify plans; free-plan users are limited to 5 domains per run and 5 domains per UTC calendar day.",
            "items": {
              "type": "string"
            }
          },
          "domains": {
            "title": "Company domains (advanced JSON)",
            "maxItems": 600,
            "type": "array",
            "description": "Advanced domain input when countries differ per row. Plain strings work for most cases: <code>acme.com</code>. To hint the company's country (improves generic-inbox fallback and EU legal-notice phone lookup), use objects: <code>{\"domain\": \"acme.de\", \"country\": \"DE\"}</code>. Mutually exclusive with <code>domainList</code> — leave the simple list empty when you use this. Up to 600 domains per run on paid Apify plans; free-plan users are limited to 5 domains per run and 5 domains per UTC calendar day.",
            "default": []
          },
          "defaultCountry": {
            "title": "Default country",
            "enum": [
              "",
              "IT",
              "DE",
              "FR",
              "NL",
              "ES",
              "GB",
              "US",
              "IE"
            ],
            "type": "string",
            "description": "Optional two-letter ISO country applied to every domain in <code>domainList</code>, and to plain-string entries in <code>domains</code> that do not specify their own. Used to try localized inbox prefixes (e.g. <code>kontakt@</code> for DE, <code>contatti@</code> for IT) in the generic-inbox fallback, and to pick the right EU legal-notice source for phone numbers.",
            "default": ""
          },
          "need": {
            "title": "Contact channel",
            "enum": [
              "both",
              "email",
              "phone"
            ],
            "type": "string",
            "description": "What to find and pay COGS for. <code>email</code> skips the phone waterfall and Twilio/HLR. <code>phone</code> skips SMTP / MillionVerifier and generic-inbox probes. <code>both</code> (default) is today's full run. This is not a new Store price — billing stays $0.06/domain plus $0.14 per verified email.",
            "default": "both"
          },
          "verifyEmails": {
            "title": "Verify email deliverability (SMTP)",
            "type": "boolean",
            "description": "Recommended when Contact channel includes email. Runs SMTP-level verification on every candidate email. Only addresses that pass with top quality are marked <code>email_sendable: true</code> (decision maker) or <code>generic_email_sendable: true</code> (generic inbox). Ignored when Contact channel is Phone only — MillionVerifier is not called. Turning this off on Email / Both returns unverified addresses only.",
            "default": true
          },
          "verifyPhones": {
            "title": "Verify phone line type and reachability",
            "type": "boolean",
            "description": "When Contact channel includes phone: after the waterfall finds candidates, check line type (Twilio) and, for mobiles, HLR. Does not start or stop the waterfall — that is Contact channel. Ignored on Email only. A sendable company line is a working switchboard, not the decision maker's personal mobile.",
            "default": true
          },
          "includeGenericInbox": {
            "title": "Generic inbox fallback",
            "type": "boolean",
            "description": "When Contact channel includes email and no verified decision-maker email is found, try localized generic inboxes (<code>info@</code>, <code>contact@</code>, <code>kontakt@</code>, …). Ignored on Phone only. A sendable generic inbox triggers the same <code>verified-contact</code> event as a verified decision-maker email.",
            "default": true
          },
          "aiDiscovery": {
            "title": "AI web research",
            "type": "boolean",
            "description": "Recommended. When the B2B database has no match for a domain, researches the public web and extracts named decision makers with AI. For large organisations it also checks on the web that the database CEO still holds the seat and, when not, finds the sitting one on the company's leadership page. Every extracted person must be explicitly named with a role in a public source — names are never invented. Turn off for faster, database-only runs with lower coverage and no web calls.",
            "default": true
          },
          "maxCandidates": {
            "title": "Max candidates per domain",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Upper bound on decision-maker candidates evaluated per domain before picking the best one. In buying-committee mode this is the per-persona verify-queue cap before global deduplication. Higher values improve the chance of a verified email at the cost of a slower run.",
            "default": 5
          },
          "targetPersona": {
            "title": "Target decision maker",
            "type": "object",
            "description": "Who to find for your sale. Pick a preset — <code>founder_ceo</code>, <code>sales_leader</code>, <code>marketing_leader</code>, <code>ops_logistics</code>, <code>procurement</code>, <code>finance_cfo</code>, <code>it_security</code>, <code>hr_people</code>, <code>ecommerce_owner</code> — or switch mode to custom and add title keywords. Optional <code>acceptableRoles</code> (e.g. CEO, Sales) prevents penalizing valid executive fallbacks. Turn off <code>executiveFallback</code> to always prefer functional leaders on enterprise accounts.",
            "properties": {
              "mode": {
                "title": "Mode",
                "type": "string",
                "description": "Preset roles, or custom title keywords when none of the nine fit.",
                "editor": "select",
                "default": "preset",
                "enum": [
                  "preset",
                  "custom"
                ],
                "enumTitles": [
                  "Preset",
                  "Custom title keywords"
                ]
              },
              "preset": {
                "title": "Persona",
                "type": "string",
                "description": "Used when mode is Preset. Default is founder / CEO.",
                "editor": "select",
                "default": "founder_ceo",
                "enum": [
                  "founder_ceo",
                  "sales_leader",
                  "marketing_leader",
                  "ops_logistics",
                  "procurement",
                  "finance_cfo",
                  "it_security",
                  "ecommerce_owner",
                  "hr_people"
                ],
                "enumTitles": [
                  "Founder / CEO",
                  "Sales leader",
                  "Marketing leader",
                  "Ops / logistics",
                  "Procurement",
                  "Finance / CFO",
                  "IT / security",
                  "Ecommerce owner",
                  "HR / people"
                ]
              },
              "titleKeywords": {
                "title": "Custom title keywords",
                "type": "array",
                "description": "Used when mode is Custom. One title fragment per line (e.g. VP Sales, Head of Logistics).",
                "editor": "stringList",
                "default": []
              },
              "acceptableRoles": {
                "title": "Acceptable roles (optional)",
                "type": "array",
                "description": "Do not penalize these titles when executive fallback kicks in.",
                "editor": "stringList",
                "default": []
              },
              "executiveFallback": {
                "title": "Executive fallback",
                "type": "boolean",
                "description": "On larger accounts, return a senior functional leader if the exact persona is unreachable. The row keeps that person's real title.",
                "default": true
              }
            },
            "default": {
              "mode": "preset",
              "preset": "founder_ceo",
              "executiveFallback": true
            }
          },
          "targetPersonas": {
            "title": "Buying committee personas",
            "maxItems": 5,
            "type": "array",
            "description": "Optional ordered list of 1–5 personas to find per domain (buying committee). Order is priority: the first filled slot remains the legacy <code>decision_maker</code>. Each slot returns at most one distinct person. When this field is non-empty it takes precedence over <code>targetPersona</code>, <code>maxContactsPerDomain</code> and <code>returnAlternates</code>.",
            "items": {
              "type": "object",
              "properties": {
                "mode": {
                  "title": "Mode",
                  "type": "string",
                  "description": "Preset roles, or custom title keywords when none of the nine fit.",
                  "editor": "select",
                  "default": "preset",
                  "enum": [
                    "preset",
                    "custom"
                  ],
                  "enumTitles": [
                    "Preset",
                    "Custom title keywords"
                  ]
                },
                "preset": {
                  "title": "Persona",
                  "type": "string",
                  "description": "Used when mode is Preset. Default is founder / CEO.",
                  "editor": "select",
                  "default": "founder_ceo",
                  "enum": [
                    "founder_ceo",
                    "sales_leader",
                    "marketing_leader",
                    "ops_logistics",
                    "procurement",
                    "finance_cfo",
                    "it_security",
                    "ecommerce_owner",
                    "hr_people"
                  ],
                  "enumTitles": [
                    "Founder / CEO",
                    "Sales leader",
                    "Marketing leader",
                    "Ops / logistics",
                    "Procurement",
                    "Finance / CFO",
                    "IT / security",
                    "Ecommerce owner",
                    "HR / people"
                  ]
                },
                "titleKeywords": {
                  "title": "Custom title keywords",
                  "type": "array",
                  "description": "Used when mode is Custom. One title fragment per line (e.g. VP Sales, Head of Logistics).",
                  "editor": "stringList",
                  "default": []
                },
                "acceptableRoles": {
                  "title": "Acceptable roles (optional)",
                  "type": "array",
                  "description": "Do not penalize these titles when executive fallback kicks in.",
                  "editor": "stringList",
                  "default": []
                },
                "executiveFallback": {
                  "title": "Executive fallback",
                  "type": "boolean",
                  "description": "On larger accounts, return a senior functional leader if the exact persona is unreachable. The row keeps that person's real title.",
                  "default": true
                }
              }
            },
            "default": []
          },
          "salesContext": {
            "title": "What you sell (optional)",
            "type": "object",
            "description": "Optional shortcut: <code>{\"productCategory\": \"shipping_software\"}</code> maps to the right persona when <code>targetPersona</code> is omitted. <code>companySize</code> (<code>smb</code>, <code>enterprise</code>) adjusts executive vs functional preference.",
            "default": {}
          },
          "maxContactsPerDomain": {
            "title": "Max contacts per domain",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Legacy: return up to this many ranked decision makers per domain (primary + alternates when <code>returnAlternates</code> is on). Ignored when <code>targetPersonas</code> is set.",
            "default": 1
          },
          "returnAlternates": {
            "title": "Include alternate contacts",
            "type": "boolean",
            "description": "Legacy: when enabled with <code>maxContactsPerDomain</code> &gt; 1, include additional ranked contacts in <code>alternates</code>. Ignored when <code>targetPersonas</code> is set.",
            "default": false
          },
          "mustHaveVerifiedEmail": {
            "title": "Require verified email for primary DM",
            "type": "boolean",
            "description": "Rank toward decision makers with SMTP-verified sendable emails. Generic inbox fallback still applies when no DM email verifies.",
            "default": false
          },
          "companyFilters": {
            "title": "Company filters (optional)",
            "type": "object",
            "description": "Quarantine whole companies you never want to contact. <code>{\"excludeCompanyTypes\": [\"recruitment_agency\"]}</code> keeps recruitment and staffing intermediaries out of the results — essential when you sell <em>to</em> employers, because job-ad-sourced lists are full of agencies posting on behalf of clients; it adds one evidence lookup per domain. <code>{\"requireCountryMatch\": true}</code> drops domains whose suffix belongs to another country than the one you gave (a <code>.edu</code> or <code>.de</code> domain in a UK campaign), before any lookup is paid for. Excluded companies are listed with their reason and evidence in the <code>EXCLUDED_COMPANIES</code> record of the key-value store, free of charge, and stay out of the paid dataset unless <code>pushEmptyResults</code> is enabled.",
            "default": {}
          },
          "identityStrictness": {
            "title": "Contact identity checks",
            "enum": [
              "flag",
              "enforce",
              "off"
            ],
            "type": "string",
            "description": "Cross-checks that a contact's name, email local part and LinkedIn slug describe the same person, and that the email sits on the requested company's domain. <code>flag</code> (default) annotates <code>identity_status</code> and lowers <code>confidence</code> when checks fail. <code>enforce</code> also discards contradictory contacts — use it when a wrong-person email costs more than a missing one. <code>off</code> restores the previous behaviour.",
            "default": "flag"
          },
          "pushEmptyResults": {
            "title": "Push empty results to dataset",
            "type": "boolean",
            "description": "Domains with no billable deliverable — no named decision maker, no sendable generic inbox, no phone, and no PEC — are kept out of the dataset by default, so you are not charged for gaps. They are always listed free of charge in the key-value store: unreachable ones under FAILED_DOMAINS, and companies quarantined by <code>companyFilters</code> under EXCLUDED_COMPANIES. Enable this only if you also want both as dataset items — in which case they are billed as domain results like any other row.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}