# Business Address Scraper (`automation-lab/business-address-scraper`) Actor

Extract public business addresses, emails, phones, source URLs, and evidence snippets from company websites and contact pages.

- **URL**: https://apify.com/automation-lab/business-address-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.14 / 1,000 address founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Business Address Scraper

Extract physical business addresses, contact details, and proof snippets from public company websites.

### What does Business Address Scraper do?

Business Address Scraper checks company domains, homepages, contact pages, about pages, legal pages, and common office-location pages for public business address data. It returns structured address records with source URLs and evidence snippets so you can verify where each address came from.

### Who is it for?

- 🧑‍💼 Sales operations teams enriching CRM company records.
- 🧾 Compliance teams checking vendor registered addresses.
- 🏢 B2B data vendors normalizing company-location datasets.
- 🔎 Researchers collecting public contact information from company sites.
- 🧹 RevOps teams cleaning messy domain lists before import.

### Why use this scraper?

Company websites often publish addresses in inconsistent places: a contact page, footer, JSON-LD metadata, legal imprint, or office section. This actor automates the repetitive lookup and preserves evidence so downstream reviewers do not need to re-open every page manually.

### How much does it cost to extract business addresses?

The actor uses pay-per-event pricing: a $0.001 run-start event plus a per-address result event. BRONZE users pay $0.0019 per saved address; higher plans receive volume discounts down to $0.000532 on DIAMOND. For example, 10 saved addresses cost $0.020 on BRONZE and 100 cost $0.191, including the start event. Keep `maxPagesPerSite` low for exploratory runs, then increase it when you are ready to process larger company lists.

### Input overview

You can provide website URLs, contact-page URLs, plain domains, or both. The actor normalizes domains to HTTPS and checks likely contact/about/legal URLs.

### Output overview

Each dataset row is one business-address evidence record. If a site has multiple offices, the actor can save multiple rows up to your `maxResultsPerSite` limit.

### Data fields

| Field | Description |
| --- | --- |
| `inputUrl` | Normalized input URL or domain |
| `sourceUrl` | Page where the address was found |
| `domain` | Company domain |
| `companyName` | Company name inferred from metadata/title |
| `address` | Full extracted address string |
| `streetAddress` | Parsed street line when available |
| `addressLocality` | Parsed city/locality when available |
| `addressRegion` | Parsed state/region when available |
| `postalCode` | Parsed postal code when available |
| `addressCountry` | Parsed country when available |
| `email` | First public email on the page when enabled |
| `phone` | First public phone on the page when enabled |
| `evidenceSnippet` | Text proving the extraction |
| `confidence` | high, medium, or low |
| `extractionMethod` | JSON-LD or visible HTML text |
| `crawledAt` | ISO timestamp |

### How to run it

1. Open the actor on Apify.
2. Add company URLs or domains.
3. Keep the default page limits for a cheap test.
4. Start the run.
5. Export the dataset as CSV, JSON, Excel, or via API.

### Example input

```json
{
  "startUrls": [
    { "url": "https://apify.com/contact" }
  ],
  "domains": ["mozilla.org"],
  "maxPagesPerSite": 5,
  "maxResultsPerSite": 3,
  "includeEmailsPhones": true,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

### Example output

```json
{
  "domain": "apify.com",
  "companyName": "Apify",
  "address": "Štěpánská 704/61, 110 00 Prague, Czech Republic",
  "sourceUrl": "https://apify.com/contact",
  "confidence": "medium",
  "extractionMethod": "html_text"
}
```

### Tips for better results

- ✅ Use company homepages when you are unsure where the contact page is.
- ✅ Use exact contact/legal pages when you already have them.
- ✅ Increase `maxPagesPerSite` for large companies with several office pages.
- ✅ Keep proxy disabled unless a target domain blocks direct HTTP access.
- ✅ Review `evidenceSnippet` before importing records into production systems.

### Handling blocked or unusual sites

The actor is HTTP-first and does not run a browser by default. Some customer-supplied domains may block automated requests, publish addresses only inside images, or require JavaScript. Those domains are skipped without stopping the whole run.

### Confidence levels

High confidence usually means complete structured JSON-LD address fields were found. Medium confidence means structured data is incomplete or visible HTML contains both a street and a separate postal component. Partial visible-text fragments are rejected rather than returned as low-confidence addresses.

### Integrations

Use this actor in workflows such as:

- CRM enrichment: domain list in, verified address rows out.
- Vendor onboarding: check public legal/contact pages before approval.
- Lead routing: infer country or city from company website evidence.
- Data QA: compare scraped public addresses with internal records.
- Compliance review: keep source URL and snippet as an audit trail.

### API usage with Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/business-address-scraper').call({
  domains: ['apify.com'],
  maxPagesPerSite: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
from apify_client import ApifyClient

client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("automation-lab/business-address-scraper").call({
    "domains": ["apify.com"],
    "maxPagesPerSite": 5,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### API usage with cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/automation-lab~business-address-scraper/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"domains":["apify.com"],"maxPagesPerSite":5}'
```

### MCP integration

Connect the actor through the Apify MCP endpoint:

```text
https://mcp.apify.com?tools=automation-lab/business-address-scraper
```

#### Claude Code setup

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/business-address-scraper"
```

#### Claude Desktop setup

Add this JSON to your Claude Desktop MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/business-address-scraper"
    }
  }
}
```

#### Cursor setup

Add the same `mcpServers.apify` JSON entry in Cursor **Settings → Tools & MCP**.

#### VS Code setup

Add the same HTTP MCP server URL to your workspace MCP configuration, then enable the `apify` server in VS Code's MCP tools view.

Example prompts:

- “Extract public business addresses from these 50 vendor domains.”
- “Check which suppliers have a public postal address and show the evidence URL.”
- “Create a CSV with domain, company name, country, and source URL.”

### Legality and responsible use

This actor extracts information from public web pages. Make sure your use case complies with applicable laws, website terms, and privacy requirements. Avoid collecting or processing personal data unless you have a lawful basis.

### FAQ

#### Does it require login?

No. The actor is designed for public pages only.

#### Does it scrape Google Maps?

No. It reads company websites and public contact/legal pages supplied by the user.

#### Why did a domain return no address?

The site may block automated HTTP requests, hide addresses in images, publish only a contact form, or use a format the heuristic cannot identify yet.

#### Can it extract multiple offices?

Yes, up to `maxResultsPerSite`, when multiple address candidates are visible or published in structured data.

### Troubleshooting

If you see too few results, increase `maxPagesPerSite`, provide more exact contact-page URLs, or enable Apify Proxy for domains that block datacenter traffic.

### Related scrapers

- https://apify.com/automation-lab/google-maps-lead-finder
- https://apify.com/automation-lab/company-enrichment-scraper
- https://apify.com/automation-lab/email-finder-scraper

### Changelog

Initial version extracts public business addresses from domains and contact-page URLs with evidence snippets.

### Limits

The actor does not solve CAPTCHAs, log in, OCR images, or guarantee every website exposes a machine-readable address.

### Support

If a public page clearly shows an address but the actor misses it, share the URL and a small example input so the extraction heuristic can be improved.

### Version

0.1.0

# Actor input Schema

## `startUrls` (type: `array`):

Company homepages or contact/about pages to inspect for physical business addresses.

## `domains` (type: `array`):

Optional plain company domains. The actor adds https:// automatically and checks common contact/about pages.

## `maxPagesPerSite` (type: `integer`):

How many homepage/contact/about/legal candidates to fetch for each company.

## `maxResultsPerSite` (type: `integer`):

Maximum address records to save for each company domain.

## `includeEmailsPhones` (type: `boolean`):

Also extract the first public email and phone number near the crawled page text when available.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy only for sites that block direct HTTP requests. Datacenter proxies are usually enough for public contact pages.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://apify.com/contact"
    },
    {
      "url": "https://www.mozilla.org/en-US/contact/"
    }
  ],
  "domains": [
    "apify.com"
  ],
  "maxPagesPerSite": 5,
  "maxResultsPerSite": 3,
  "includeEmailsPhones": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `businessAddresses` (type: `string`):

Default dataset containing one evidence-backed business address per row.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://apify.com/contact"
        },
        {
            "url": "https://www.mozilla.org/en-US/contact/"
        }
    ],
    "domains": [
        "apify.com"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/business-address-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        { "url": "https://apify.com/contact" },
        { "url": "https://www.mozilla.org/en-US/contact/" },
    ],
    "domains": ["apify.com"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/business-address-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://apify.com/contact"
    },
    {
      "url": "https://www.mozilla.org/en-US/contact/"
    }
  ],
  "domains": [
    "apify.com"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call automation-lab/business-address-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/business-address-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Rg1P7fffDa8geCMM9/builds/hgc0wmL675c6F6bGE/openapi.json
