{
  "openapi": "3.0.1",
  "info": {
    "title": "Company Contact Details & Website Email Finder",
    "description": "Contact information scraper for company websites: find email addresses, phone numbers, WhatsApp numbers and social media links (LinkedIn, Facebook, Instagram, X) from URLs or domains. B2B lead generation, one row per site. You pay $0.002 per site with an email. Ranked bestEmail for your CRM.",
    "version": "0.1",
    "x-build-id": "yfbL45D8cC9mreBuJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/datagleaner~website-contact-details-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-datagleaner-website-contact-details-scraper",
        "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/datagleaner~website-contact-details-scraper/runs": {
      "post": {
        "operationId": "runs-sync-datagleaner-website-contact-details-scraper",
        "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/datagleaner~website-contact-details-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-datagleaner-website-contact-details-scraper",
        "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": {
          "websites": {
            "title": "Websites",
            "type": "array",
            "description": "Company websites to scan, one per line. `example.com` and `https://www.example.com/` both work. Only the same domain is crawled. Example: `[\"acme.com\", \"https://www.example.org\"]`. Billing: $0.002 per site where an email is found; sites with no email are free. Give at least one of Websites, Company names, Google Maps searches, Start URLs or a Dataset ID; with none, a small built-in 1-site example runs.",
            "items": {
              "type": "string"
            }
          },
          "companyNames": {
            "title": "Company names (instead of websites)",
            "type": "array",
            "description": "Optional. Company names, one per line, when you do not have their websites. Runs Company Domain Finder on your account to find each company's website first; it bills its own $0.0008 per website found (no charge when none is found), then this Actor bills as usual. A name with no website found gets one free row with `failureReason`. Add a location after a comma to tell same-named companies apart (`Bosch, Germany`). Example: `[\"Stripe\", \"Bosch, Germany\"]`.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "companyCountry": {
            "title": "Country for the company names",
            "type": "string",
            "description": "Optional. A country name or ISO code (`DE`, `Japan`) passed to Company Domain Finder for every name that has none of its own. Only used with Company names. Example: `DE`."
          },
          "searchQueries": {
            "title": "Google Maps searches (instead of websites)",
            "type": "array",
            "description": "Optional. Google Maps searches, one per line, such as `dentists in Denver, CO`, when you do not have a list of websites. The run first finds the places with our Google Maps Leads Actor as a sub-run on your account (it bills its own per-place price), then scrapes each place's website for contacts. A place with no website gets one free row with `failureReason: no_website_on_maps`. Example: `[\"dentists in Denver, CO\"]`.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxPlacesPerQuery": {
            "title": "Max places per Google Maps search",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Only used with Google Maps searches. Each place found is billed by Google Maps Leads at its own per-place price.",
            "default": 20
          },
          "startUrls": {
            "title": "Start URLs (same format as other contact scrapers)",
            "type": "array",
            "description": "Optional alias of Websites, in the format other contact scrapers use: a list of `{\"url\": \"https://example.com\"}` objects. Merged with Websites and the dataset, duplicates removed. Example: `[{\"url\": \"https://example.com\"}]`.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "outputFormat": {
            "title": "Output format",
            "enum": [
              "default",
              "compatible"
            ],
            "type": "string",
            "description": "`compatible` also adds the field names other contact scrapers use (`url`, `originalStartUrl`, `domain`, `depth`, `referrerUrl`, `scrapedUrls`, `emails` and `phones` as plain string lists, `phonesUncertain`, `linkedIns`, `twitters`, `instagrams`, `facebooks`, `youtubes`, `tiktoks`, `pinterests`, `discords`, `snapchats`, `threads`, `telegrams`, `reddits`, `whatsapps`). Then `emails` and `phones` are plain strings and our detailed objects move to `emailDetails` and `phoneDetails`. Billing is unchanged.",
            "default": "default"
          },
          "datasetId": {
            "title": "Dataset ID from another run",
            "type": "string",
            "description": "Optional. Dataset ID of another run. Websites are read from the first present field of `website`, `url`, `domain`, `site`, `homepage`, `link`, `companyWebsite`, `web`. Items without a website are skipped, and each row carries the item's `title` or `name` as `sourceTitle`. Example: `Zk5f8GhJq2xYabcDe` (the run's `defaultDatasetId`)."
          },
          "datasetUrlField": {
            "title": "Website field in the dataset",
            "type": "string",
            "description": "Optional. Name of the dataset field that holds the website, tried before the default field names. Example: `companyWebsite`."
          },
          "maxDatasetItems": {
            "title": "Max dataset items to read",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Upper bound on how many items are read from the dataset.",
            "default": 1000
          },
          "maxPagesPerSite": {
            "title": "Max pages per site",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Pages read per site: the home page plus the most promising contact, about, legal/impressum and team pages, up to this many. Also accepted under the name `maxRequestsPerStartUrl`.",
            "default": 8
          },
          "maxDepth": {
            "title": "Max link depth",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many links away from the start URL the crawl may go. `0` reads the start page only (no links, no sitemap). `1` (default) reads the start page and the pages it links to. `2` and more also follow contact-like links found on those pages, still within Max pages per site.",
            "default": 1
          },
          "includeUrlPatterns": {
            "title": "Only follow URLs matching",
            "type": "array",
            "description": "Optional. Follow only pages whose URL matches at least one pattern; the start URL is always read. A pattern is matched against the full URL, ignoring case. `*` matches any characters and `?` one character. A pattern without `*` or `?` matches when the URL contains it (`/about/`). A pattern with them must match the whole URL, so start it with `*` to match anywhere (`*/team/*`), or with `/` to match the path (`/en/*`). Start with `re:` for a regular expression (`re:/(contact|about)`). Objects `{\"glob\": \"...\"}` and `{\"regexp\": \"...\"}` also work. Leave empty to follow any page. Example: `[\"/contact\", \"*/team/*\"]`.",
            "items": {
              "type": "string"
            }
          },
          "excludeUrlPatterns": {
            "title": "Never follow URLs matching",
            "type": "array",
            "description": "Optional. Skip pages whose URL matches any pattern, same syntax as Only follow URLs matching (for example `/blog/`, `*/careers/*`, `re:\\.html$`). Exclude wins over include. The start URL is always read. Example: `[\"/blog/\"]`.",
            "items": {
              "type": "string"
            }
          },
          "extractPeople": {
            "title": "Extract people from team pages",
            "type": "boolean",
            "description": "Adds a `people` list to each site row: name, job title, seniority, department and, when the site prints one next to the person, an email. Read from the company's own team, about and leadership pages only (up to 25 people per site, up to 12 extra pages). Free for now: no extra charge.",
            "default": false
          },
          "defaultCountry": {
            "title": "Default phone country",
            "type": "string",
            "description": "Optional ISO country code (e.g. `US`, `TW`, `JP`) used to read local phone numbers when the site's own country cannot be inferred. Leave empty to infer from the domain, page language and structured data."
          },
          "respectRobotsTxt": {
            "title": "Respect robots.txt",
            "type": "boolean",
            "description": "Skip pages that the site's robots.txt disallows.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Sites in parallel",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many websites are crawled at the same time.",
            "default": 10
          },
          "maxConcurrencyPerDomain": {
            "title": "Requests in parallel per domain",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Polite limit on simultaneous requests to a single website.",
            "default": 2
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 3,
            "maximum": 120,
            "type": "integer",
            "description": "How long to wait for each page before retrying.",
            "default": 20
          },
          "retryBlockedWithProxy": {
            "title": "Retry blocked sites through Apify Proxy",
            "type": "boolean",
            "description": "When a site answers the first request with HTTP 403, 429 or 503, or with a bot-check page, retry that site once through Apify Proxy (datacenter) with a browser's request headers. Sites that answer normally never use the proxy. The proxy traffic of retried sites is billed by Apify as normal platform usage (about US$0.0005 per retried site); the Actor's own price is unchanged. Ignored when you set your own proxy configuration.",
            "default": true
          },
          "residentialRetry": {
            "title": "Use residential proxy for blocked sites",
            "type": "boolean",
            "description": "Off by default. When on, a blocked site is retried through Apify's residential proxy instead of the datacenter proxy. Residential traffic is billed by Apify per gigabyte (a few cents for a few hundred small pages), so leave it off unless blocked sites matter to you. Needs a plan with residential proxy.",
            "default": false
          },
          "renderFallback": {
            "title": "Read pages in a browser when no email is found",
            "type": "boolean",
            "description": "Off by default. For a site that still has no email after the full plain crawl, opens its home page and its best contact page (2 pages at most) in a headless browser and reads the final page plus the data the page loaded. Slower (about 10 to 25 seconds per rendered site) and uses more memory: a run with this on starts with 2048 MB by default (1024 MB otherwise); if you set the memory yourself, give it 2048 MB or more. Only sites with no email are rendered; the Actor's price is unchanged.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional. Defaults to no proxy. Format: `{\"useApifyProxy\": true}`. Leave empty to run without a proxy (blocked sites are retried through Apify Proxy when Retry blocked sites is on)."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}