Pay-per-call lead intelligence tools with free MCP discovery and x402 payments.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Resolve company domains to public Greenhouse, Lever, Ashby, Workable, Rippling, or Workday boards. Get attributed jobs, function and seniority, source evidence, confirmed zero, partial, and unresolved states. — $0.02/call, x402 (USDC on base).
Plain company domains — no ATS token needed, this Actor figures out the applicant-tracking system itself (Greenhouse, Lever, Ashby, Workable, Rippling or Workday). Accepts bare domains or full URLs ("https://www.figma.com/careers" is normalized to "figma.com"). Takes priority over 'datasetId' when both are set (by presence, even if every domain in it turns out invalid). Up to 100 domains per run.
Pick another Actor's dataset of companies to resolve instead of typing domains directly (e.g. a company-list scraper's run). Ignored when 'domains' is set. Picking it here — not just pasting the ID — is what grants this run's token READ access to that dataset. When this Actor is added as an Integration on another Actor, this field is filled in automatically from the triggering run. Domains are read from whichever field in each row looks like one (companyDomain, domain, website, url, ...).
How many domains to resolve in parallel, 1-20.
Depth limit for paginated sources (Workday, Rippling) — how many open roles to read per company before stopping. Non-paginated sources (Greenhouse, Lever, Ashby, Workable) already return their whole board in one call and are never capped by this. Raise it if a company's board is deeper than the default and you need the rest (e.g. a large Workday tenant) — every extra page costs real run time (Workday averages ~1.1s/page). When the cap is reached, or the source's own total is untrustworthy (a proven Workday quirk), a free 'resolved-truncated' row says so explicitly on the dataset — this Actor never silently drops jobs without disclosing it.
Resolve company domains to public Greenhouse, Lever, Ashby, Workable, Rippling, or Workday boards. Get attributed jobs, function and seniority, source evidence, confirmed zero, partial, and unresolved states. — $0.02/call, x402 (USDC on base).
| Argument | Type | Description |
|---|---|---|
| domains | array | Plain company domains — no ATS token needed, this Actor figures out the applicant-tracking system itself (Greenhouse, Lever, Ashby, Workable, Rippling or Workday). Accepts bare domains or full URLs ("https://www.figma.com/careers" is normalized to "figma.com"). Takes priority over 'datasetId' when both are set (by presence, even if every domain in it turns out invalid). Up to 100 domains per run. |
| datasetId | string | Pick another Actor's dataset of companies to resolve instead of typing domains directly (e.g. a company-list scraper's run). Ignored when 'domains' is set. Picking it here — not just pasting the ID — is what grants this run's token READ access to that dataset. When this Actor is added as an Integration on another Actor, this field is filled in automatically from the triggering run. Domains are read from whichever field in each row looks like one (companyDomain, domain, website, url, ...). |
| maxConcurrency | integer | How many domains to resolve in parallel, 1-20. |
| maxJobsPerCompany | integer | Depth limit for paginated sources (Workday, Rippling) — how many open roles to read per company before stopping. Non-paginated sources (Greenhouse, Lever, Ashby, Workable) already return their whole board in one call and are never capped by this. Raise it if a company's board is deeper than the default and you need the rest (e.g. a large Workday tenant) — every extra page costs real run time (Workday averages ~1.1s/page). When the cap is reached, or the source's own total is untrustworthy (a proven Workday quirk), a free 'resolved-truncated' row says so explicitly on the dataset — this Actor never silently drops jobs without disclosing it. |
{
"type": "object",
"title": "Careers Page Jobs Scraper input",
"properties": {
"domains": {
"type": "array",
"title": "Company domains",
"editor": "stringList",
"example": [
"apify.com",
"figma.com"
],
"prefill": [
"apify.com"
],
"maxItems": 100,
"description": "Plain company domains — no ATS token needed, this Actor figures out the applicant-tracking system itself (Greenhouse, Lever, Ashby, Workable, Rippling or Workday). Accepts bare domains or full URLs (\"https://www.figma.com/careers\" is normalized to \"figma.com\"). Takes priority over 'datasetId' when both are set (by presence, even if every domain in it turns out invalid). Up to 100 domains per run.",
"sectionCaption": "Companies to resolve",
"sectionDescription": "Enter company domains directly or select a source Dataset. Direct domains take priority and the Actor keeps ATS attribution explicit."
},
"datasetId": {
"type": "string",
"title": "Dataset ID",
"editor": "resourcePicker",
"example": "your_dataset_id",
"description": "Pick another Actor's dataset of companies to resolve instead of typing domains directly (e.g. a company-list scraper's run). Ignored when 'domains' is set. Picking it here — not just pasting the ID — is what grants this run's token READ access to that dataset. When this Actor is added as an Integration on another Actor, this field is filled in automatically from the triggering run. Domains are read from whichever field in each row looks like one (companyDomain, domain, website, url, ...).",
"resourceType": "dataset",
"resourcePermissions": [
"READ"
]
},
"maxConcurrency": {
"type": "integer",
"title": "Max concurrency",
"default": 5,
"example": 3,
"maximum": 20,
"minimum": 1,
"description": "How many domains to resolve in parallel, 1-20.",
"sectionCaption": "Resolution depth and performance",
"sectionDescription": "Control parallel company resolution and the disclosed depth cap for paginated Workday and Rippling boards."
},
"maxJobsPerCompany": {
"type": "integer",
"title": "Max jobs per company",
"default": 500,
"example": 100,
"maximum": 5000,
"minimum": 1,
"description": "Depth limit for paginated sources (Workday, Rippling) — how many open roles to read per company before stopping. Non-paginated sources (Greenhouse, Lever, Ashby, Workable) already return their whole board in one call and are never capped by this. Raise it if a company's board is deeper than the default and you need the rest (e.g. a large Workday tenant) — every extra page costs real run time (Workday averages ~1.1s/page). When the cap is reached, or the source's own total is untrustworthy (a proven Workday quirk), a free 'resolved-truncated' row says so explicitly on the dataset — this Actor never silently drops jobs without disclosing it."
}
},
"description": "Job postings by company domain: give it a bare domain and it finds that company's ATS itself across six platforms — Greenhouse, Lever, Ashby, Workable, Rippling, Workday — then returns the open roles. Says so honestly when it cannot identify one, instead of reporting a false \"no jobs\".",
"schemaVersion": 1
}Analyze submitted clinic websites for reception-channel gaps with exact BYOD crawling and no discovery. — $0.05/call, x402 (USDC on base).
| Argument | Type | Description |
|---|---|---|
| clinics* | array | Buyer-submitted clinic websites to analyze. |
| requestId* | string | Correlation key for this run. |
| maxResults | integer | Maximum useful rows to bill and return. |
| detailLevel | string | Compact or evidence-rich output. |
| minGapScore | integer | Minimum score for a useful clinic lead. |
| schemaVersion* | string | Input schema version. |
| freshnessMinutes | integer | Cache freshness window in minutes. |
{
"type": "object",
"title": "Clinic Reception Gap Lead Finder input",
"required": [
"schemaVersion",
"requestId",
"clinics"
],
"properties": {
"clinics": {
"type": "array",
"items": {
"type": "object",
"required": [
"recordId",
"name",
"websiteUrl"
],
"properties": {
"name": {
"type": "string",
"title": "Clinic name",
"maxLength": 200,
"minLength": 1,
"description": "Public clinic name."
},
"address": {
"type": "string",
"title": "Address",
"nullable": true,
"description": "Optional clinic address."
},
"recordId": {
"type": "string",
"title": "Record ID",
"maxLength": 128,
"minLength": 1,
"description": "Buyer-supplied record ID."
},
"websiteUrl": {
"type": "string",
"title": "Website URL",
"pattern": "^(?:http://(?:[A-Za-z0-9.-]+(?::80)?|\\[[0-9A-Fa-f:]+\\](?::80)?)(?:[/?][^#\\s]*)?|https://(?:[A-Za-z0-9.-]+(?::443)?|\\[[0-9A-Fa-f:]+\\](?::443)?)(?:[/?][^#\\s]*)?)$",
"description": "Absolute clinic website URL without credentials, fragments, or nonstandard ports."
}
},
"additionalProperties": false
},
"title": "Submitted clinics",
"editor": "json",
"prefill": [
{
"name": "Mayo Clinic",
"address": null,
"recordId": "clinic-prefill-001",
"websiteUrl": "https://www.mayoclinic.org/"
}
],
"maxItems": 100,
"minItems": 1,
"description": "Buyer-submitted clinic websites to analyze."
},
"requestId": {
"type": "string",
"title": "Request ID",
"editor": "textfield",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"prefill": "clinic-daily-prefill-001",
"description": "Correlation key for this run."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"default": 10,
"maximum": 100,
"minimum": 1,
"description": "Maximum useful rows to bill and return."
},
"detailLevel": {
"enum": [
"compact",
"evidence"
],
"type": "string",
"title": "Detail level",
"default": "compact",
"description": "Compact or evidence-rich output."
},
"minGapScore": {
"type": "integer",
"title": "Minimum gap score",
"default": 40,
"maximum": 100,
"minimum": 0,
"description": "Minimum score for a useful clinic lead."
},
"schemaVersion": {
"enum": [
"1.0"
],
"type": "string",
"title": "Schema version",
"default": "1.0",
"description": "Input schema version."
},
"freshnessMinutes": {
"type": "integer",
"title": "Freshness minutes",
"default": 60,
"maximum": 1440,
"minimum": 0,
"description": "Cache freshness window in minutes."
}
},
"schemaVersion": 1,
"additionalProperties": false
}Find the work email a named person publishes on their own company website, confirmed by a same-document schema.org Person assertion. No pattern guessing, no SMTP probing. $0.01 only when a published match is found; no-match, role mailbox, ambiguous and partial outcomes are free. — $0.02/call, x402 (USDC on base).
| Argument | Type | Description |
|---|---|---|
| people* | array | One to 50 people. Each domain must be a bare public company hostname, not a URL. |
| maxConcurrency | integer | People processed concurrently only in local non-monetized runs. On-platform source work and paid delivery are sequential. |
| maxPagesPerPerson | integer | Number of pages selected from the Actor-owned fixed order: /team, /about, /contact, then /. |
{
"type": "object",
"title": "Domain to Verified Work Email input",
"required": [
"people"
],
"properties": {
"people": {
"type": "array",
"items": {
"type": "object",
"required": [
"fullName",
"domain"
],
"properties": {
"domain": {
"type": "string",
"title": "Company domain",
"pattern": "^(?=.{4,253}$)(?:[a-zA-Z0-9¡-](?:[a-zA-Z0-9¡--]{0,61}[a-zA-Z0-9¡-])?\\.)+[a-zA-Z¡-](?:[a-zA-Z0-9¡--]{0,61}[a-zA-Z0-9¡-])?$",
"maxLength": 253,
"minLength": 4,
"description": "Bare public company hostname such as example.com; schemes, paths, credentials and IP literals are rejected."
},
"fullName": {
"type": "string",
"title": "Full name",
"pattern": "^\\s*\\S+(?:\\s+\\S+)+\\s*$",
"maxLength": 160,
"minLength": 3,
"description": "The person's real first and last name as it should appear on the company website."
},
"inputRef": {
"type": "string",
"title": "Caller reference",
"maxLength": 200,
"description": "Optional opaque CRM or workflow reference copied to the result row exactly, including leading, trailing, repeated, and tab whitespace."
},
"companyName": {
"type": "string",
"title": "Company name",
"maxLength": 200,
"description": "Optional company name used as an additional page-evidence signal, never to invent an address."
}
},
"additionalProperties": false
},
"title": "People and company domains",
"editor": "json",
"prefill": [
{
"domain": "visionwide.co",
"fullName": "King Lee",
"companyName": "Visionwide"
}
],
"maxItems": 50,
"minItems": 1,
"description": "One to 50 people. Each domain must be a bare public company hostname, not a URL."
},
"maxConcurrency": {
"type": "integer",
"title": "Maximum concurrency",
"default": 1,
"maximum": 5,
"minimum": 1,
"description": "People processed concurrently only in local non-monetized runs. On-platform source work and paid delivery are sequential."
},
"maxPagesPerPerson": {
"type": "integer",
"title": "Maximum pages per person",
"default": 3,
"maximum": 4,
"minimum": 1,
"description": "Number of pages selected from the Actor-owned fixed order: /team, /about, /contact, then /."
}
},
"description": "People to match against literal emails on company websites that also publish an exact schema.org Person name-email assertion. The Actor never guesses patterns or tests a mailbox.",
"schemaVersion": 1,
"additionalProperties": false
}Turn a Greenhouse or Lever vacancy into the named hiring owner behind it, with a provider-verified work address from your own BYOK enrichment key. You pay $0.02 only for a verified hiring contact; ambiguous company matches, unsupported boards and empty results are free. — $0.02/call, x402 (USDC on base).
| Argument | Type | Description |
|---|---|---|
| jobs* | array | One to 100 vacancies. Give either a direct ATS posting URL, or a company domain plus the exact job title. |
| providerName | string | Which provider your key belongs to. Only meaningful together with a provider API key. |
| maxConcurrency | integer | Vacancies processed concurrently only in local non-monetized runs. On-platform source work and paid delivery are sequential, and Lever pacing stays at one request per second regardless of this value. |
| providerApiKey | string | Your own key, used on your own quota. It is never stored, never logged, never reused across runs and never redistributed. Without it, no owner lookup is attempted and the vacancy returns free. |
{
"type": "object",
"title": "Job Posting to Hiring Manager Email input",
"required": [
"jobs"
],
"properties": {
"jobs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"jobUrl": {
"type": "string",
"title": "ATS posting URL",
"pattern": "^https://[a-zA-Z0-9¡-][a-zA-Z0-9¡-.-]{0,252}/\\S*$",
"maxLength": 2048,
"minLength": 12,
"description": "Direct posting link on a supported board, such as boards.greenhouse.io or jobs.lever.co. Board token and job identifier are parsed from the URL, never guessed."
},
"inputRef": {
"type": "string",
"title": "Caller reference",
"maxLength": 200,
"description": "Optional opaque CRM or workflow reference copied to the result row exactly, including leading, trailing, repeated, and tab whitespace."
},
"jobTitle": {
"type": "string",
"title": "Exact job title",
"maxLength": 200,
"minLength": 2,
"description": "The vacancy title as the board publishes it. Required together with a company domain; matching is exact after whitespace and case normalization, never fuzzy."
},
"location": {
"type": "string",
"title": "Location",
"maxLength": 200,
"description": "Optional location used only to disambiguate two vacancies sharing one title, never to invent a match."
},
"department": {
"type": "string",
"title": "Department",
"maxLength": 200,
"description": "Optional department used only to disambiguate and to rank role relevance, never to invent a match."
},
"companyDomain": {
"type": "string",
"title": "Company domain",
"pattern": "^(?=.{4,253}$)(?:[a-zA-Z0-9¡-](?:[a-zA-Z0-9¡--]{0,61}[a-zA-Z0-9¡-])?\\.)+[a-zA-Z¡-](?:[a-zA-Z0-9¡--]{0,61}[a-zA-Z0-9¡-])?$",
"maxLength": 253,
"minLength": 4,
"description": "Bare public company hostname such as example.com. Used to probe supported boards for that company; schemes, paths, credentials and IP literals are rejected."
}
},
"additionalProperties": false
},
"title": "Vacancies",
"editor": "json",
"prefill": [
{
"jobTitle": "Account Executive, Bridge",
"companyDomain": "stripe.com"
}
],
"maxItems": 100,
"minItems": 1,
"description": "One to 100 vacancies. Give either a direct ATS posting URL, or a company domain plus the exact job title."
},
"providerName": {
"enum": [
"hunter",
"apollo",
"prospeo",
"snov",
"rocketreach"
],
"type": "string",
"title": "Contact-data provider",
"enumTitles": [
"Hunter",
"Apollo",
"Prospeo",
"Snov.io",
"RocketReach"
],
"description": "Which provider your key belongs to. Only meaningful together with a provider API key."
},
"maxConcurrency": {
"type": "integer",
"title": "Maximum concurrency",
"default": 1,
"maximum": 5,
"minimum": 1,
"description": "Vacancies processed concurrently only in local non-monetized runs. On-platform source work and paid delivery are sequential, and Lever pacing stays at one request per second regardless of this value."
},
"providerApiKey": {
"type": "string",
"title": "Your provider API key",
"editor": "textfield",
"isSecret": true,
"description": "Your own key, used on your own quota. It is never stored, never logged, never reused across runs and never redistributed. Without it, no owner lookup is attempted and the vacancy returns free."
}
},
"description": "Vacancies to resolve to the person who owns hiring for them. The Actor reads public ATS boards without a key, and returns an address only when your own contact-data provider confirms it. It never guesses a pattern and never tests a mailbox.",
"schemaVersion": 1,
"additionalProperties": false
}Normalize mixed lead rows, deduplicate domains and emails, check DNS/MX evidence, score retained leads, and return every rejection, confidence gap, safe action, and run summary for auditable CRM staging. — $0.02/call, x402 (USDC on base).
| Argument | Type | Description |
|---|---|---|
| items | array | Raw lead rows to clean directly, one object per lead — any shape works (Google Maps scraper export, CSV turned into JSON, anything with an email/website/phone somewhere in it). Takes priority over 'datasetId' and 'datasetUrl'. |
| checks | array | Pipeline stages to run, in order. 'dedupe' collapses rows sharing the same domain/email. 'email' verifies syntax + MX. 'domain' verifies the domain is alive. 'score' computes the hotness score used for the 'minScore' cutoff. |
| maxRows | integer | Safety cap on how many input rows this run will process, regardless of source. |
| minScore | integer | Drop leads scoring below this threshold (0-100) from the clean, billed output. They still show up as free rejected rows with a reason. |
| datasetId | string | Pick another Actor's dataset to clean (e.g. a Google Maps or lead-scraper run). Ignored when 'items' is set. Picking it here — not just pasting the ID — is what grants this run's token READ access to that dataset. When this Actor is added as an Integration on another Actor, this field is filled in automatically from the triggering run. |
Detect commercial permit and license openings from five fixed Socrata datasets and return evidence-backed signals. — $0.03/call, x402 (USDC on base).
| Argument | Type | Description |
|---|---|---|
| requestId* | string | Correlation key for this run. |
| maxResults | integer | Maximum useful rows to bill and return. |
| detailLevel | string | Compact or evidence-rich output. |
| lookbackDays | integer | Maximum permit age in days. |
| schemaVersion* | string | Input schema version. |
| freshnessMinutes | integer | Cache freshness window in minutes. |
{
"type": "object",
"title": "New Opening Permit Lead Radar input",
"required": [
"schemaVersion",
"requestId"
],
"properties": {
"requestId": {
"type": "string",
"title": "Request ID",
"editor": "textfield",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"prefill": "permit-daily-prefill-001",
"description": "Correlation key for this run."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"default": 10,
"maximum": 100,
"minimum": 1,
"description": "Maximum useful rows to bill and return."
},
"detailLevel": {
"enum": [
"compact",
"evidence"
],
"type": "string",
"title": "Detail level",
"default": "compact",
"description": "Compact or evidence-rich output."
},
"lookbackDays": {
"type": "integer",
"title": "Lookback days",
"default": 30,
"maximum": 90,
"minimum": 1,
"description": "Maximum permit age in days."
},
"schemaVersion": {
"enum": [
"1.0"
],
"type": "string",
"title": "Schema version",
"default": "1.0",
"description": "Input schema version."
},
"freshnessMinutes": {
"type": "integer",
"title": "Freshness minutes",
"default": 60,
"maximum": 1440,
"minimum": 0,
"description": "Cache freshness window in minutes."
}
},
"schemaVersion": 1,
"additionalProperties": false
}Free — list every paid tool in the 'lead-intelligence' bundle with its price, payTo address and network. Call this first if you don't have a wallet ready yet.
No arguments.
{
"type": "object",
"properties": {}
}Analyze submitted restaurant websites for booking-channel gaps with exact BYOD crawling and no discovery. — $0.05/call, x402 (USDC on base).
| Argument | Type | Description |
|---|---|---|
| requestId* | string | Correlation key for this run. |
| maxResults | integer | Maximum useful rows to bill and return. |
| detailLevel | string | Compact or evidence-rich output. |
| minGapScore | integer | Minimum score for a useful restaurant lead. |
| restaurants* | array | Buyer-submitted restaurant websites to analyze. |
| schemaVersion* | string | Input schema version. |
| freshnessMinutes | integer | Cache freshness window in minutes. |
{
"type": "object",
"title": "Restaurant Booking Gap Lead Finder input",
"required": [
"schemaVersion",
"requestId",
"restaurants"
],
"properties": {
"requestId": {
"type": "string",
"title": "Request ID",
"editor": "textfield",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$",
"prefill": "restaurant-daily-prefill-001",
"description": "Correlation key for this run."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"default": 10,
"maximum": 100,
"minimum": 1,
"description": "Maximum useful rows to bill and return."
},
"detailLevel": {
"enum": [
"compact",
"evidence"
],
"type": "string",
"title": "Detail level",
"default": "compact",
"description": "Compact or evidence-rich output."
},
"minGapScore": {
"type": "integer",
"title": "Minimum gap score",
"default": 45,
"maximum": 100,
"minimum": 0,
"description": "Minimum score for a useful restaurant lead."
},
"restaurants": {
"type": "array",
"items": {
"type": "object",
"required": [
"recordId",
"name",
"websiteUrl"
],
"properties": {
"name": {
"type": "string",
"title": "Restaurant name",
"maxLength": 200,
"minLength": 1,
"description": "Public restaurant name."
},
"address": {
"type": "string",
"title": "Address",
"nullable": true,
"description": "Optional restaurant address."
},
"recordId": {
"type": "string",
"title": "Record ID",
"maxLength": 128,
"minLength": 1,
"description": "Buyer-supplied record ID."
},
"websiteUrl": {
"type": "string",
"title": "Website URL",
"pattern": "^(?:http://(?:[A-Za-z0-9.-]+(?::80)?|\\[[0-9A-Fa-f:]+\\](?::80)?)(?:[/?][^#\\s]*)?|https://(?:[A-Za-z0-9.-]+(?::443)?|\\[[0-9A-Fa-f:]+\\](?::443)?)(?:[/?][^#\\s]*)?)$",
"description": "Absolute restaurant website URL without credentials, fragments, or nonstandard ports."
}
},
"additionalProperties": false
},
"title": "Submitted restaurants",
"editor": "json",
"prefill": [
{
"name": "Dishoom",
"address": null,
"recordId": "restaurant-prefill-001",
"websiteUrl": "https://www.dishoom.com/"
}
],
"maxItems": 100,
"minItems": 1,
"description": "Buyer-submitted restaurant websites to analyze."
},
"schemaVersion": {
"enum": [
"1.0"
],
"type": "string",
"title": "Schema version",
"default": "1.0",
"description": "Input schema version."
},
"freshnessMinutes": {
"type": "integer",
"title": "Freshness minutes",
"default": 60,
"maximum": 1440,
"minimum": 0,
"description": "Cache freshness window in minutes."
}
},
"schemaVersion": 1,
"additionalProperties": false
}| datasetUrl |
| string |
| Public URL returning a JSON array of lead rows. Used only when both 'items' and 'datasetId' are empty. |
{
"type": "object",
"title": "Lead List Cleaner input",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object"
},
"title": "Items",
"editor": "json",
"example": [
{
"name": "Example Co",
"email": "[email protected]",
"website": "https://example.com"
}
],
"prefill": [
{
"url": "https://www.google.com/maps/place/Shopify",
"phone": "+1 888-746-7439",
"title": "Shopify",
"website": "https://www.shopify.com",
"categoryName": "Software company"
},
{
"link": "https://www.hubspot.com",
"name": "HubSpot",
"email": "[email protected]",
"phoneNumber": "+1 888-482-7768"
},
{
"domain": "zoom.us",
"companyName": "Zoom Video Communications",
"description": "Video conferencing platform. Contact us at [email protected] for enterprise sales."
},
{
"phone": "+1 888-746-7439",
"title": "Shopify Inc",
"website": "https://shopify.com"
},
{
"phone": "+1 888-926-2289",
"title": "Stripe",
"emails": [
"[email protected]"
],
"website": "https://stripe.com",
"categoryName": "Payment processor"
}
],
"description": "Raw lead rows to clean directly, one object per lead — any shape works (Google Maps scraper export, CSV turned into JSON, anything with an email/website/phone somewhere in it). Takes priority over 'datasetId' and 'datasetUrl'."
},
"checks": {
"type": "array",
"items": {
"enum": [
"dedupe",
"email",
"domain",
"score"
],
"type": "string",
"enumTitles": [
"Dedupe",
"Email verify (syntax + MX)",
"Domain alive check",
"Hotness score"
]
},
"title": "Checks to run",
"editor": "select",
"default": [
"dedupe",
"email",
"domain",
"score"
],
"example": [
"dedupe",
"email",
"domain",
"score"
],
"prefill": [
"dedupe",
"email",
"domain",
"score"
],
"description": "Pipeline stages to run, in order. 'dedupe' collapses rows sharing the same domain/email. 'email' verifies syntax + MX. 'domain' verifies the domain is alive. 'score' computes the hotness score used for the 'minScore' cutoff.",
"sectionCaption": "Cleaning and scoring policy",
"sectionDescription": "Choose deterministic pipeline stages, the buyer-owned score threshold, and a hard row cap. Disabled checks remain visible evidence gaps."
},
"maxRows": {
"type": "integer",
"title": "Max rows",
"default": 1000,
"example": 100,
"maximum": 100000,
"minimum": 1,
"description": "Safety cap on how many input rows this run will process, regardless of source."
},
"minScore": {
"type": "integer",
"title": "Minimum score",
"default": 0,
"example": 40,
"maximum": 100,
"minimum": 0,
"description": "Drop leads scoring below this threshold (0-100) from the clean, billed output. They still show up as free rejected rows with a reason."
},
"datasetId": {
"type": "string",
"title": "Dataset ID",
"editor": "resourcePicker",
"example": "your_dataset_id",
"description": "Pick another Actor's dataset to clean (e.g. a Google Maps or lead-scraper run). Ignored when 'items' is set. Picking it here — not just pasting the ID — is what grants this run's token READ access to that dataset. When this Actor is added as an Integration on another Actor, this field is filled in automatically from the triggering run.",
"resourceType": "dataset",
"sectionCaption": "Choose one lead source",
"sectionDescription": "Use direct Items, a Dataset selected with READ permission, or a public JSON URL. Direct Items take priority; leave unused source fields empty.",
"resourcePermissions": [
"READ"
]
},
"datasetUrl": {
"type": "string",
"title": "Dataset URL",
"editor": "textfield",
"example": "https://api.apify.com/v2/datasets/YOUR_PUBLIC_DATASET_ID/items?clean=true",
"description": "Public URL returning a JSON array of lead rows. Used only when both 'items' and 'datasetId' are empty."
}
},
"description": "Turn any scraper's raw dataset into a clean, scored lead list — dedupe rows, kill dead emails and dead domains, rank the rest by hotness. Runs standalone or as an Integration bolted onto Google Maps / lead scrapers.",
"schemaVersion": 1
}