{
  "openapi": "3.0.1",
  "info": {
    "title": "Website Email Extractor, Phone & Contact Finder (CSV, Sheet)",
    "description": "Email extractor and contact finder for every website in an Apify dataset, CSV file or Google Sheet. Returns each row plus role inbox emails, phones in E.164, social profiles and the contact page. Inputs: datasetId or fileUrl, websiteField. Charged per site with a contact. Agent-ready: x402, MCP.",
    "version": "0.1",
    "x-build-id": "FPfbMocC8fIb1FwHC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nerolabs~website-contact-finder/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nerolabs-website-contact-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/nerolabs~website-contact-finder/runs": {
      "post": {
        "operationId": "runs-sync-nerolabs-website-contact-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/nerolabs~website-contact-finder/run-sync": {
      "post": {
        "operationId": "run-sync-nerolabs-website-contact-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": {
          "datasetId": {
            "title": "Dataset",
            "type": "string",
            "description": "Pick an existing Apify dataset. Use this OR 'File URL' OR 'Data (inline)'. Declaring it this way is what lets this Actor run with limited permissions: it may read the dataset you point at, and nothing else on your account."
          },
          "fileUrl": {
            "title": "File URL (CSV, Excel, JSON or Google Sheet)",
            "type": "string",
            "description": "A public link to a CSV or TSV file, an Excel .xlsx file, a JSON array or JSON Lines file, or a Google Sheet (paste the normal sheet link with sharing set to 'Anyone with the link can view'). Format is detected automatically. Up to 100 MB."
          },
          "data": {
            "title": "Data (inline)",
            "type": "array",
            "description": "Paste rows directly instead, for a quick one-off check."
          },
          "fileFormat": {
            "title": "File format",
            "enum": [
              "auto",
              "csv",
              "tsv",
              "json",
              "jsonl",
              "xlsx"
            ],
            "type": "string",
            "description": "Only needed if automatic detection gets the file URL's format wrong.",
            "default": "auto"
          },
          "websiteField": {
            "title": "Website field",
            "type": "string",
            "description": "Which column holds the website or domain, for example 'website' or 'url'. Leave empty and it is detected automatically, first by column name and then by looking at which column actually contains domains. A bare domain like 'acme.co.uk' works as well as a full URL."
          },
          "includePersonalEmails": {
            "title": "Also return personal-looking addresses",
            "type": "boolean",
            "description": "OFF by default, deliberately. When off you get role inboxes only (info@, sales@, enquiries@ and similar), which identify a function rather than a person. Turning this on also returns addresses like firstname.lastname@, which are personal data under UK and EU rules and bring obligations with them: you become responsible for telling those people you hold their data, and for honouring objections. Leave it off unless you have a reason and a basis.",
            "default": false
          },
          "includeNoReply": {
            "title": "Also return no-reply inboxes",
            "type": "boolean",
            "description": "OFF by default. noreply@ and do-not-reply@ are real addresses that nobody reads, so they are withheld unless you actually want them.",
            "default": false
          },
          "onlyOwnDomain": {
            "title": "Only addresses at the site's own domain",
            "type": "boolean",
            "description": "ON by default, and it is the single biggest quality filter. A business website is full of other people's addresses: the website builder's support inbox, an analytics vendor, a partner. Keeping only addresses at the site's own registrable domain removes almost all of that. Turn it off to also see off-domain addresses, which are always reported separately either way.",
            "default": true
          },
          "extractPhones": {
            "title": "Extract phone numbers",
            "type": "boolean",
            "description": "Reads published tel: links and normalises them to E.164 using Google's libphonenumber, so they are ready for a dialler. A number that cannot be parsed is returned exactly as published rather than guessed at.",
            "default": true
          },
          "extractSocials": {
            "title": "Extract social profiles",
            "type": "boolean",
            "description": "Collects the company's own LinkedIn, X, Facebook, Instagram, YouTube and TikTok profile links. Share buttons are ignored.",
            "default": true
          },
          "phoneRegion": {
            "title": "Default phone region (two-letter country code)",
            "type": "string",
            "description": "The country to assume for phone numbers published without a country code, such as GB or US. Numbers that already start with + are unaffected."
          },
          "followContactPages": {
            "title": "Follow contact and about pages",
            "type": "boolean",
            "description": "After the homepage, follow same-site links that look like a contact, about or imprint page, most contact-like first.",
            "default": true
          },
          "maxPagesPerSite": {
            "title": "Maximum pages per website",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Including the homepage. Four is enough for almost every business site and keeps the run polite and quick.",
            "default": 4
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "ON by default. Skips any page the site's own robots.txt asks automated clients not to fetch. Most contact pages are allowed, so this rarely costs you a result, and it means the run does what site owners have asked for.",
            "default": true
          },
          "useProxy": {
            "title": "Retry blocked sites through a residential proxy",
            "type": "boolean",
            "description": "OFF by default. Most small and mid-sized business websites answer an ordinary request. When on, a site that refuses it (an HTTP 401, 403, 429 or 451, or a bot-challenge page) is retried once through Apify's residential proxy, and if that works the rest of that site's pages are read the same way. This helps against sites that block cloud-server addresses; sites with advanced bot protection, which is most of the biggest brands, will usually still refuse. No extra charge.",
            "default": false
          },
          "concurrency": {
            "title": "Websites at once",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many sites to work through in parallel. Each site is still fetched one page at a time.",
            "default": 5
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for a single page before giving up on it.",
            "default": 20
          },
          "keep": {
            "title": "Rows to keep",
            "enum": [
              "all",
              "with_contacts",
              "with_email",
              "problems"
            ],
            "type": "string",
            "description": "Filters the output. Charging is unaffected: it follows what was actually found, not what you keep.",
            "default": "all"
          },
          "exportFormats": {
            "title": "Also export as a file",
            "type": "array",
            "description": "Optionally write the results as a real downloadable CSV and/or Excel file, on top of the dataset.",
            "items": {
              "type": "string",
              "enum": [
                "csv",
                "xlsx"
              ],
              "enumTitles": [
                "CSV",
                "Excel (.xlsx)"
              ]
            },
            "default": []
          },
          "outputDatasetName": {
            "title": "Also append to a named dataset",
            "type": "string",
            "description": "Optional. Every run's results are also appended to a dataset of this name, so a scheduled job builds one growing list. Not charged again."
          },
          "maxItems": {
            "title": "Maximum websites",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many rows, a cost guard while you are testing. There is a hard ceiling of 50,000 per run regardless."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "Optional. If set, the run summary (counts and download links, never the contact details themselves) is POSTed here as JSON when the run finishes. Only charged on a confirmed 2xx."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}