# Business Website Scraper: Name, Contact and Tech Stack (`agent-harbor-llc/scrape-business-actor`) Actor

Given a domain, returns one validated business profile: business name and its source, published contact details, and detected technology platforms with evidence. Pay $0.005 per business returned; errors and blocked pages are free.

- **URL**: https://apify.com/agent-harbor-llc/scrape-business-actor.md
- **Developed by:** [Agent Harbor LLC](https://apify.com/agent-harbor-llc) (community)
- **Categories:** Lead generation, Agents
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 96.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 business returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Business Website Scraper: Name, Contact and Tech Stack

One row per business domain with the business name and where it was read from, the contact details the site publishes, and the technology platforms it runs, each with the evidence it was detected from. Every platform claim is checked against its own evidence before you see it, and unsupported claims are struck.

### What it does

Give it business **domains** and it returns, for each one:

- the **business name** and the page element it came from (for example `og:site_name`),
- the **contact** details the site publishes, with a confidence and the evidence (fields are `null` when the site shows none),
- the technology **platforms** the site runs (email marketing, analytics, SEO tags and more), each with category, confidence, detection method and evidence,
- a `validation` result for the profile.

**You pay only for businesses returned with a validated profile.** Invalid domains, dead or blocked sites, timeouts and anything that fails the check are listed in the dataset with the reason, and are free. There is no AI in the scrape itself.

### Who it's for

- Sales and lead-qualification teams that need a clean name, contact and tech stack for a list of domains.
- Agencies that want to know which platforms a prospect runs before pitching.
- AI agents that need a validated business profile as data (see the FAQ).

### Input

| Field | Type | Notes |
|---|---|---|
| `domains` | list of strings | Domains (`example.com`) or URLs; up to 100 per run (each entry past 100 gets a free error row); duplicates removed. Private addresses, IPs and ports are rejected. |

Example input:

```json
{
  "domains": [
    "mailchimp.com"
  ]
}
```

Each entry is one **business**. Set a maximum charge on the run and the Actor stops there. The Output tab has table views for the overview, contact details and technology platforms.

### Output sample

One dataset row per input. Fields:

| Field | Meaning |
|---|---|
| `domain` | The cleaned domain |
| `status` | `ok` (returned and charged), `not_charged`, `invalid_input` or `skipped` |
| `charged` | `true` only for `ok` rows |
| `business_name`, `business_name_source` | Name and the page element it was read from (for example `og:site_name`) |
| `contact` | Contact surface found on the site, with a confidence; fields are `null` when the site publishes none |
| `platforms` | Detected platforms: name, category, confidence and detection method |
| `validation` | The check result for this profile |
| `reason`, `error` | Why a row was not charged |
| `result` | The full profile as returned by Agent Harbor |

Example `ok` row from a real run of this Actor (run `QHeltxvJHj6eyFR5r`, 2026-10-13, input `mailchimp.com`). The `validation` and full `result` fields are left out here for length; `contact` is all `null` because the home page publishes no contact details.

```json
{
  "domain": "mailchimp.com",
  "status": "ok",
  "charged": true,
  "business_name": "Mailchimp",
  "business_name_source": "og:site_name",
  "contact": {
    "email": null,
    "name": null,
    "confidence": "unknown",
    "evidence": null
  },
  "platforms": [
    {
      "platform": "Mailchimp",
      "category": "email_marketing",
      "confidence": "high",
      "method": "script_src",
      "evidence": "https://mailchimp.com/cdn/product/release/dist/js-src/ecs/cookie-preferences-manager.20fc3264ba1c0834.js",
      "ah_integrates": false
    },
    {
      "platform": "Google Tag Manager",
      "category": "analytics",
      "confidence": "high",
      "method": "script_src",
      "evidence": "https://www.googletagmanager.com/gtm.js?id=GTM-MCZTKL&gtg_health=1",
      "ah_integrates": false
    },
    {
      "platform": "Google Search Console",
      "category": "seo",
      "confidence": "high",
      "method": "meta_tag",
      "evidence": "<meta name=\"google-site-verification\" content=\"Xg1n4sbg_Ovzp2zQ3gVV-GBaWZKQeyuePwOikbHbwDU\">",
      "ah_integrates": false
    },
    {
      "platform": "Bing Webmaster",
      "category": "seo",
      "confidence": "high",
      "method": "meta_tag",
      "evidence": "<meta content=\"\" name=\"msvalidate.01\">",
      "ah_integrates": false
    }
  ],
  "reason": "ok"
}
```

### Pricing example

Pay per event, nothing else: **$0.005 per business** (event `business-scraped`), plus **$0.00005** once per run for Apify's start event. The price is set in the Apify Console (this Actor's `actor.json` carries no pricing block); the figure here is the Console price recorded on 2026-10-29, and the Console is the source of truth.

| Size | Cost (plus $0.00005 per run) |
|---|---|
| 1 business | $0.005 |
| 10 businesses | $0.05 |
| 100 businesses | $0.50 |
| 1000 businesses | $5.00 |

So 100 businesses = $0.50 plus the start event. A business is charged only when it came back with a validated profile and its row was saved.

| Event | Charged when | Not charged when |
|---|---|---|
| `business-scraped` | a business came back with a validated profile and its row was saved | the domain was invalid, the site was dead or blocked, the profile failed the check, the service was down, or you reached your maximum cost |

### Limits

- One page per business: the home page the domain resolves to. Contact details on other pages may be missed.
- Up to 100 domains per run; about 30 requests per minute across all users, so a busy period can return `rate_limited` rows (free; retry later).
- A run fails fast, with no charge, if Agent Harbor's service is unreachable.
- A name, contact or platform is only what the home page shows. A missing contact means the page publishes none, not that the business has none.
- The time a run takes was not measured for the example input; each domain is given up to 90 seconds.

### FAQ

**Why is my row `not_charged`?**
The `reason` says: an invalid domain, a blocked or dead site, a profile that failed the check, a busy service (`rate_limited`) or a timeout. None of those cost anything.

**Why is `contact` empty?**
Many home pages publish no contact details. The Actor reports what the page shows and does not guess.

**Is there AI in this?**
No. The scrape is deterministic and the validation strikes any platform claim its own evidence does not support.

#### Use with AI agents / MCP

- **Apify MCP server:** add `agent-harbor-llc/scrape-business-actor` to the `tools` list, for example `https://mcp.apify.com?tools=agent-harbor-llc/scrape-business-actor`. Running Actors through it needs your Apify login or API token.
- **Keep spend bounded:** pass `maxTotalChargeUsd` when you start a run through the API, or set the maximum cost in the Console.
- **Payments:** agents without an Apify account can pay for runs with Apify's agentic payments (x402 USDC on Base, prepaid tokens, or Skyfire). The same service is also sold directly over x402 at `https://x402.agentharbor.agency/scrape` ($0.01 per call, USDC on Base; that price is separate from the Apify price above).

**Who built it?**
Built and run by [Agent Harbor LLC](https://agentharbor.agency).

### Changelog

**0.2** (2026-10-31)

- Added the dataset schema with three table views (Overview, Contact, Technology platforms), an output schema linking to them, full input descriptions, an example input and this README in the Store order.
- The README price line now matches the Console price ($0.005 per business; it said $0.01).
- No change to the run behavior, the output row shape or the charge.

**0.1**: first version. See [CHANGELOG.md](CHANGELOG.md) for the full list.

# Changelog

This Actor's version history is a separate document: https://apify.com/agent-harbor-llc/scrape-business-actor/changelog.md

# Actor input Schema

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

Business websites to profile, one per line, as domains (example.com) or URLs. Up to 100 per run; the same domain given twice is profiled once and each entry past 100 gets a free row with an error instead of a profile. IP addresses, private addresses and ports are rejected. You pay only for businesses returned with a validated profile.

## Actor input object example

```json
{
  "domains": [
    "mailchimp.com",
    "example.org"
  ]
}
```

# Actor output Schema

## `overview` (type: `string`):

Table view 'Overview': status, business name and where it was read from, per business.

## `contact` (type: `string`):

Table view 'Contact': the contact details a site publishes, with confidence and evidence, per business.

## `platforms` (type: `string`):

Table view 'Technology platforms': one line per detected platform with its category, confidence and evidence.

## `results` (type: `string`):

Every field of every row as JSON: domain, status, charged, business_name, business_name_source, contact, platforms, validation, reason, error, result.

# 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 = {
    "domains": [
        "mailchimp.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("agent-harbor-llc/scrape-business-actor").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 = { "domains": ["mailchimp.com"] }

# Run the Actor and wait for it to finish
run = client.actor("agent-harbor-llc/scrape-business-actor").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 '{
  "domains": [
    "mailchimp.com"
  ]
}' |
apify call agent-harbor-llc/scrape-business-actor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,agent-harbor-llc/scrape-business-actor"
        }
    }
}
```

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/OUJeczLhMEBRpyT49/builds/EDSq7Jr2MCe3aBB6s/openapi.json
