# Bbb Scraper with Contacts | Better Business Bureau (`fatihtahta/bbb-scraper`) Actor

Extract structured Better Business Bureau business profiles including emails, social medias, ratings, locations, reviews, complaints and more. Built for due diligence, reputation monitoring, lead enrichment, and production-grade analytics pipelines.

- **URL**: https://apify.com/fatihtahta/bbb-scraper.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 50 total users, 17 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.99 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## BBB Scraper | Better Business Bureau

**Slug:** `fatihtahta/bbb-scraper`

### Overview

BBB Scraper | Better Business Bureau collects structured business records from BBB search results, category pages, and individual business profiles, including business identity, contact details, locations, service areas, categories, BBB organization metadata, ratings, accreditation signals, and relevant profile links. [BBB.org](https://www.bbb.org) is a widely used public source for business profiles, reputation indicators, and local service-provider discovery, making its data valuable for research, enrichment, monitoring, and operational reporting. The actor turns public BBB pages into repeatable JSON records that can be used in analytics tools, CRMs, data pipelines, and reporting workflows. It is designed for automated, recurring data acquisition where consistent structure and predictable output are more important than manual browsing. Results reflect the public information available at run time, enabling dependable collection workflows without making assumptions about future availability or completeness.

### Why Use This Actor

- **Market research and analytics:** collect structured extraction outputs for category coverage, geographic distribution, BBB ratings, service areas, and business classification analysis.
- **Product and content teams:** build normalized business directories, vendor indexes, local-service pages, and internal research datasets from public profile attributes.
- **Developers and data engineering teams:** feed repeatable collection results into downstream systems, ETL jobs, warehouses, enrichment pipelines, and operational reporting flows.
- **Lead generation and enrichment teams:** create focused prospect lists from BBB search, category, or profile URLs with contact, location, category, and reputation attributes.
- **Monitoring and competitive tracking teams:** schedule recurring data acquisition to observe market movement, provider presence, profile changes, and category-level coverage over time.

### Common Use Cases

- **Market intelligence:** monitor business coverage, category movement, ratings, locations, and service-area patterns across BBB listings.
- **Lead generation:** build targeted prospect lists from public BBB business profiles and category searches.
- **Competitive monitoring:** track public profile attributes for businesses, service providers, and organizations in specific markets.
- **Catalog and directory building:** populate internal databases with structured public business records.
- **Data enrichment:** add current public BBB attributes to CRM, BI, vendor, or analytics datasets.
- **Recurring reporting:** schedule periodic runs for dashboards, alerts, trend analysis, and operational review.

### Quick Start

1. Choose one or more BBB search, category, or business profile URLs that define the businesses you want to collect.
2. Add those URLs to `startUrls`.
3. Set a small `limit`, such as `10`, for the first validation run.
4. Run the actor in Apify Console.
5. Inspect the first dataset records to confirm the fields match your use case.
6. Increase the `limit`, add more BBB URLs, or schedule the actor once the output is verified.

### Input Parameters

The actor accepts BBB URLs, a maximum business-record limit, an optional coverage setting, and an optional Apify connection configuration.

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `startUrls` | `array` | One or more BBB.org search result, category, or individual business profile URLs. This field defines the target scope for the run and can combine multiple BBB URL types in the same input. | - |
| `limit` | `integer` | Maximum number of business records to save from each BBB search or category target. Minimum value: `10`. | `50000` |
| `maximize_coverage` | `boolean` | When enabled, search and category targets are checked through additional BBB sorting views to collect more unique businesses from broad result sets. Direct business profile URLs are not expanded. | `false` |
| `proxyConfiguration` | `object` | Apify connection configuration for region-specific access or more controlled connection behavior. | `{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}` |

### Choosing Inputs

Use `startUrls` to define the scope of collection. A BBB search or category URL is useful when you want multiple businesses from a segment, while a direct business profile URL is useful when you need a specific organization. Broader BBB URLs improve discovery, and more focused BBB URLs produce more targeted datasets.

Start with a small `limit` to validate record shape and relevance before collecting larger datasets. Increase `limit` after confirming the output quality, or split work into multiple runs when you want separate datasets by geography, category, market, or monitoring segment.

Enable `maximize_coverage` for broad search or category URLs when BBB caps a single sorted result set before your requested limit. The actor will check alternate BBB sort views internally, deduplicate repeated businesses in the final dataset, and stop when the requested limit is reached.

### Example Inputs

#### Search or Category Run

```json
{
  "startUrls": [
    "https://www.bbb.org/search?find_text=Roofing%20Contractors&find_entity=10126-000&find_type=Category&find_country=USA"
  ],
  "limit": 25,
  "maximize_coverage": true
}
````

#### Direct Business Profile Run

```json
{
  "startUrls": [
    "https://www.bbb.org/us/il/danville/profile/home-improvement/u-nailed-it-contracting-llc-0724-1000021781"
  ],
  "limit": 10
}
```

#### Multi-Target Discovery Run

```json
{
  "startUrls": [
    "https://www.bbb.org/search?find_text=Auto+Brokers&find_entity=50032-000&find_type=Category&find_loc=19901&find_country=USA",
    "https://www.bbb.org/search?find_text=Home+Improvement&find_entity=10079-000&find_type=Category&find_country=USA"
  ],
  "limit": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

### Output

#### Output Destination

The actor writes results to an Apify dataset as JSON records. The dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs with minimal post-processing.

When multiple entity types or record shapes exist, this README documents each shape separately based on the provided Example Output.

#### Record Envelope And Stable Identifiers

Each output record is a `business` record with top-level fields such as `type`, `id`, `url`, `name`, and `record_type`. The recommended idempotency key is `id`, with `url` as a useful secondary key when syncing into systems that prefer URL-based identity. For repeated runs, use `id` to deduplicate records or upsert existing business profiles instead of creating duplicates. Stable identifiers make records easier to merge, deduplicate, and sync across repeated runs.

The `source_context.source_url` field identifies the BBB source URL associated with the collected record, while `source_context.seed_value` identifies the input seed that led to the result.

#### Examples

##### Example: business (`type = "business"`)

```json
{
  "type": "business",
  "id": "0724_1000021781_75268",
  "url": "https://www.bbb.org/us/il/danville/profile/home-improvement/u-nailed-it-contracting-llc-0724-1000021781",
  "name": "U Nailed It Contracting LLC",
  "record_type": "business",
  "business": {
    "business_id": "1000021781",
    "listing_id": "0724_1000021781_75268"
  },
  "contact": {
    "phone": "(217) 304-7547",
    "phones": [
      "(217) 304-7547"
    ]
  },
  "location": {
    "address": {
      "street": "440 Avenue C",
      "city": "Danville",
      "region": "IL",
      "postal_code": "61832-5510"
    },
    "coordinates": {
      "latitude": 40.121929168701165,
      "longitude": -87.64965057373047
    },
    "service_area": {
      "has_service_area": true,
      "description": "Danville and 30 miles",
      "summary": [
        "47832",
        "47847",
        "47854",
        "47875",
        "47917",
        "47918",
        "47921",
        "47928",
        "47932",
        "47949",
        "47952",
        "47958",
        "47966",
        "47969",
        "47974",
        "47975",
        "47982",
        "47984",
        "47987",
        "47991",
        "47993",
        "60924",
        "60932",
        "60939",
        "60942",
        "60949",
        "60960",
        "60963",
        "60973",
        "61801",
        "61802",
        "61803",
        "61810",
        "61811",
        "61812",
        "61814",
        "61816",
        "61817",
        "61831",
        "61832",
        "61833",
        "61834",
        "61841",
        "61844",
        "61846",
        "61847",
        "61848",
        "61849",
        "61850",
        "61852",
        "61857",
        "61858",
        "61859",
        "61862",
        "61864",
        "61865",
        "61866",
        "61870",
        "61871",
        "61873",
        "61876",
        "61877",
        "61878",
        "61883",
        "61924",
        "61932",
        "61940",
        "61942",
        "IL",
        "IN",
        "USA"
      ]
    }
  },
  "classification": {
    "primary_category": {
      "id": "10079-000",
      "name": "Home Improvement"
    },
    "categories": [
      {
        "name": "Home Improvement",
        "id": "10079-000"
      },
      {
        "name": "Roofing Contractors",
        "id": "10126-000"
      },
      {
        "name": "General Contractor",
        "id": "10035-000"
      },
      {
        "name": "Painting Contractors",
        "id": "10095-000"
      }
    ],
    "bbb": {
      "bbb_id": "0724",
      "bbb_name": "BBB of Central Illinois"
    },
    "charity": {
      "is_charity": false,
      "has_charity_seal": false,
      "is_accredited_charity": true
    }
  },
  "reputation": {
    "bbb_rating": "A+",
    "rating_score": 100.0,
    "is_bbb_member": true
  },
  "media": {
    "logo_url": "https://m.bbb.org/prod/ProfileImages/1720140e-d166-466c-9483-3a34e76d684c.jpeg"
  },
  "links": {
    "request_quote": "https://www.bbb.org/central-illinois/quote/request-u-nailed-it-contracting-llc-1000021781",
    "leave_review": "https://www.bbb.org/us/il/danville/profile/home-improvement/u-nailed-it-contracting-llc-0724-1000021781/leave-a-review",
    "business_login": "https://www.bbb.org/central-illinois/login"
  },
  "attributes": {
    "request_quote_enabled": true,
    "request_quote_url_id": 739
  },
  "source_context": {
    "seed_type": "url",
    "seed_value": "https://www.bbb.org/search?find_text=Roofing%20Contractors&find_entity=10126-000&find_type=Category&find_country=USA&page=1",
    "source_url": "https://www.bbb.org/search?find_country=USA&find_entity=10126-000&find_text=Roofing+Contractors&find_type=Category&page=1",
    "page_index": 1,
    "domain": "www.bbb.org",
    "scraped_time": "2026-05-03T22:02:51.082755+00:00"
  }
}
```

### Field Reference

#### Business Record

- **type** *(string, required)*: Record entity type. In the example output, this is `business`.
- **id** *(string, required)*: Stable business record identifier and recommended idempotency key.
- **url** *(string, required)*: Public BBB business profile URL.
- **name** *(string, required)*: Business name.
- **record\_type** *(string, required)*: Record classification. In the example output, this is `business`.
- **business.business\_id** *(string, optional)*: BBB business identifier.
- **business.listing\_id** *(string, optional)*: BBB listing identifier.
- **contact.phone** *(string, optional)*: Primary phone number when publicly available.
- **contact.phones** *(array, optional)*: List of phone numbers when publicly available.
- **location.address.street** *(string, optional)*: Street address.
- **location.address.city** *(string, optional)*: City.
- **location.address.region** *(string, optional)*: State, province, or region code.
- **location.address.postal\_code** *(string, optional)*: Postal code.
- **location.coordinates.latitude** *(number, optional)*: Latitude coordinate.
- **location.coordinates.longitude** *(number, optional)*: Longitude coordinate.
- **location.service\_area.has\_service\_area** *(boolean, optional)*: Indicates whether a service area is listed.
- **location.service\_area.description** *(string, optional)*: Human-readable service-area description.
- **location.service\_area.summary** *(array, optional)*: Service-area entries such as postal codes, regions, or countries.
- **classification.primary\_category.id** *(string, optional)*: Primary BBB category identifier.
- **classification.primary\_category.name** *(string, optional)*: Primary BBB category name.
- **classification.categories** *(array, optional)*: List of BBB categories associated with the business.
- **classification.categories\[].name** *(string, optional)*: Category name.
- **classification.categories\[].id** *(string, optional)*: Category identifier.
- **classification.bbb.bbb\_id** *(string, optional)*: BBB organization identifier.
- **classification.bbb.bbb\_name** *(string, optional)*: BBB organization name.
- **classification.charity.is\_charity** *(boolean, optional)*: Indicates whether the record is marked as a charity.
- **classification.charity.has\_charity\_seal** *(boolean, optional)*: Indicates whether a charity seal is shown.
- **classification.charity.is\_accredited\_charity** *(boolean, optional)*: Indicates whether the charity accreditation flag is present.
- **reputation.bbb\_rating** *(string, optional)*: BBB rating, such as `A+`, when available.
- **reputation.rating\_score** *(number, optional)*: Numeric rating score when available.
- **reputation.is\_bbb\_member** *(boolean, optional)*: Indicates BBB membership or accreditation status when available.
- **media.logo\_url** *(string, optional)*: Public logo image URL when available.
- **links.request\_quote** *(string, optional)*: Public request-quote URL when available.
- **links.leave\_review** *(string, optional)*: Public review submission URL when available.
- **links.business\_login** *(string, optional)*: Public BBB business login URL when available.
- **attributes.request\_quote\_enabled** *(boolean, optional)*: Indicates whether request-quote functionality is available.
- **attributes.request\_quote\_url\_id** *(number, optional)*: Request-quote URL identifier when available.
- **source\_context.seed\_type** *(string, optional)*: Type of input seed associated with the record.
- **source\_context.seed\_value** *(string, optional)*: Input seed value associated with the record.
- **source\_context.source\_url** *(string, optional)*: BBB source URL associated with the collected record.
- **source\_context.page\_index** *(number, optional)*: Source page index when applicable.
- **source\_context.domain** *(string, optional)*: Source domain.
- **source\_context.scraped\_time** *(string, optional)*: Collection timestamp in ISO 8601 format.

### Data Quality, Guarantees, And Handling

- **Structured records:** results are normalized into predictable JSON objects for downstream use.
- **Best-effort extraction:** fields may vary by region, session, availability, or public website presentation.
- **Optional fields:** null-check optional fields in downstream code because public profiles can differ in completeness.
- **Deduplication:** use `id` as the strongest stable key from the output, with `url` as a secondary reference when needed.
- **Freshness:** results reflect the publicly available data at run time.
- **Repeated runs:** use the recommended idempotency key when syncing data into warehouses, CRMs, or search indexes.

### Tips For Best Results

- Start with a small `limit` to validate output shape before scaling up.
- Use one BBB geography, category, or segment per run when you need cleaner segmentation.
- Use direct business profile URLs when you need specific organizations.
- Use BBB search or category URLs when the goal is broader discovery.
- Increase `limit` only after confirming the first records match your use case.
- Schedule recurring runs for monitoring workflows instead of relying on manual one-off exports.
- Use `id` for deduplication when storing records over time.

### How To Run On Apify

1. Open the Actor in Apify Console.
2. Configure the available input fields for the target scope.
3. Set the maximum number of outputs to collect.
4. Click **Start** and wait for the run to finish.
5. Download results in JSON, CSV, Excel, or other supported formats.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**

Schedule runs to keep BBB business datasets fresh for monitoring, enrichment, and reporting workflows. Recurring runs are useful when teams need updated public profile attributes without manual collection.

- Navigate to **Schedules** in Apify Console
- Create a new schedule, such as daily, weekly, or a custom cron schedule
- Configure input parameters
- Enable notifications for run completion
- Add webhooks for automated processing

#### Integration Options

- **CRM enrichment:** sync public BBB profile, contact, location, category, and reputation attributes into account or lead records.
- **Google Sheets or Airtable:** review smaller prospect lists, vendor datasets, or market samples with non-technical teams.
- **Webhooks:** trigger validation, notification, or ingestion workflows after each completed run.
- **Data enrichment pipelines:** join BBB profile attributes to existing company, vendor, or location records.
- **BI dashboards:** monitor category coverage, ratings, geographic distribution, and recurring collection trends.
- **Warehouse exports:** store repeated runs for historical analysis, deduplication, and operational reporting.

### Export Formats And Downstream Use

Apify datasets can be exported or consumed by downstream systems for review, reporting, enrichment, and automated ingestion.

- **JSON:** for APIs, applications, and data pipelines
- **CSV or Excel:** for spreadsheet workflows and manual review
- **API access:** for automated ingestion into internal systems
- **BI and warehouses:** for reporting, dashboards, and historical analysis

### Performance

Estimated run times:

- **Small runs (< 1,000 outputs):** ~3-5 minutes
- **Medium runs (1,000-5,000 outputs):** ~5-15 minutes
- **Large runs (5,000+ outputs):** ~15-30 minutes

Execution time varies based on filters, result volume, and how much information is returned per record. Highly filtered runs can finish faster, while broad discovery or detail-rich records may take longer.

### Limitations

- Availability depends on what [BBB.org](https://www.bbb.org) publicly exposes at run time.
- Some optional fields may be missing on sparse or limited public records.
- Very broad searches may take longer or require higher `limit` values.
- Target-side changes can affect field availability, naming, or record completeness.
- Regional, account, or availability differences may change visible results.

### Troubleshooting

- **No results returned:** check the BBB URLs, category or location spelling in the source URL, and whether the target has matching public records.
- **Fewer results than expected:** broaden the BBB URL scope, raise `limit`, or verify that the target contains enough matching public records.
- **Some fields are empty:** optional fields depend on what each record publicly provides.
- **Run takes longer than expected:** reduce scope, lower `limit` for validation, or split broad collection into smaller segments.
- **Output changed:** compare the current output with the field reference and report a small sample if support is needed.

### FAQ

#### What data does this actor collect?

It collects public BBB business profile data, including business names, BBB profile URLs, contact details, locations, service areas, categories, BBB organization metadata, ratings, accreditation indicators, profile links, and source context when available.

#### Can I filter by location, category, date, price, or other criteria?

The actor accepts BBB search, category, and business profile URLs through `startUrls`. Use the filters available on BBB.org to create the target URL, then provide that URL as input. The input schema does not include separate date, price, sort, or radius fields.

#### Why did I receive fewer results than my limit?

The `limit` is a maximum, not a guarantee. A run may return fewer records if the supplied BBB URL has fewer matching public records or if some records do not expose enough usable information.

#### Can I schedule recurring runs?

Yes. Use Apify schedules to run the actor daily, weekly, or on a custom schedule for monitoring, reporting, and enrichment workflows.

#### How do I avoid duplicates across runs?

Use `id` as the primary idempotency key when storing or syncing records. You can also retain `url` and `source_context.source_url` for traceability.

#### Can I export the data to CSV, Excel, or JSON?

Yes. Apify datasets support common export formats including JSON, CSV, and Excel, as well as API-based access for automated ingestion.

#### Does this actor collect private data?

No. The actor is intended to collect publicly available BBB business information from `https://www.bbb.org`.

#### What should I include when reporting an issue?

Include the input used, the run ID, expected versus actual behavior, and a small output sample when available. Redact anything sensitive before sharing.

### Compliance & Ethics

#### Responsible Data Collection

This actor collects publicly available **business profile** information from **https://www.bbb.org** for legitimate business purposes, including:

- **Local services and vendor** research and market analysis
- Lead enrichment and business-directory maintenance
- Competitive monitoring and operational reporting

Users are responsible for ensuring their use of collected data complies with applicable laws, regulations, and site terms. This section is informational and not legal advice.

#### Best Practices

- Use collected data in accordance with applicable laws, regulations, and the target site's terms
- Respect individual privacy and personal information
- Use data responsibly and avoid disruptive or excessive collection
- Do not use this actor for spamming, harassment, or other harmful purposes
- Follow relevant data protection requirements where applicable, such as GDPR and CCPA

### Support

For help, use the Issues tab or the actor page. Include the input used with sensitive values redacted, the run ID, the expected versus actual behavior, and a small output sample when useful.

# Actor input Schema

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

Enter one or more BBB.org URLs that represent your collection targets. You can combine search result pages, category pages, and individual business profile pages in the same run to build a focused business dataset.

## `limit` (type: `integer`):

Choose the maximum number of business records to save from each BBB search or category target. Use a smaller limit for quick validation, or raise it when you need a larger lead list, vendor dataset, or market research export.

## `maximize_coverage` (type: `boolean`):

When enabled, search and category targets are checked through additional BBB sorting views to collect more unique businesses from broad result sets.

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

Choose a proxy configuration when you need region-specific access or more controlled connection behavior. The default setting is suitable for most BBB scraping workflows, especially larger runs.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.bbb.org/search?find_text=Auto+Brokers&find_entity=50032-000&find_type=Category&find_loc=19901&find_country=USA"
  ],
  "limit": 10,
  "maximize_coverage": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

# 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": [
        "https://www.bbb.org/search?find_text=Auto+Brokers&find_entity=50032-000&find_type=Category&find_loc=19901&find_country=USA"
    ],
    "limit": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/bbb-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": ["https://www.bbb.org/search?find_text=Auto+Brokers&find_entity=50032-000&find_type=Category&find_loc=19901&find_country=USA"],
    "limit": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/bbb-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "https://www.bbb.org/search?find_text=Auto+Brokers&find_entity=50032-000&find_type=Category&find_loc=19901&find_country=USA"
  ],
  "limit": 10
}' |
apify call fatihtahta/bbb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fatihtahta/bbb-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Bbb Scraper with Contacts | Better Business Bureau",
        "description": "Extract structured Better Business Bureau business profiles including emails, social medias, ratings, locations, reviews, complaints and more. Built for due diligence, reputation monitoring, lead enrichment, and production-grade analytics pipelines.",
        "version": "0.0",
        "x-build-id": "U5Emp6xxk3bmLfnpY"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fatihtahta~bbb-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fatihtahta-bbb-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/fatihtahta~bbb-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fatihtahta-bbb-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/fatihtahta~bbb-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fatihtahta-bbb-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": {
                    "startUrls": {
                        "title": "Add BBB Search, Category, or Business Profile URLs",
                        "type": "array",
                        "description": "Enter one or more BBB.org URLs that represent your collection targets. You can combine search result pages, category pages, and individual business profile pages in the same run to build a focused business dataset.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "limit": {
                        "title": "Set Maximum Businesses to Collect",
                        "minimum": 10,
                        "type": "integer",
                        "description": "Choose the maximum number of business records to save from each BBB search or category target. Use a smaller limit for quick validation, or raise it when you need a larger lead list, vendor dataset, or market research export.",
                        "default": 50000
                    },
                    "maximize_coverage": {
                        "title": "Maximize Coverage",
                        "type": "boolean",
                        "description": "When enabled, search and category targets are checked through additional BBB sorting views to collect more unique businesses from broad result sets.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Set Up a Proxy Connection",
                        "type": "object",
                        "description": "Choose a proxy configuration when you need region-specific access or more controlled connection behavior. The default setting is suitable for most BBB scraping workflows, especially larger runs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
