# BBB Better Business Directory Scraper (No Coding Required) (`rosweltvofficial/my-actor`)

The BBB Business Scraper quickly finds and collects info on businesses from the BBB website. Enter a business type and location, and the tool gathers names, addresses, ratings, and more for all matching businesses—fast and easy!

- **URL**: https://beta-securitybyobscurity.apify.com/rosweltvofficial/my-actor.md
- **Developed by:** [Roswel](https://beta-securitybyobscurity.apify.com/rosweltvofficial) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 15 total users, 8 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$10.00 / 1,000 results

This Actor is paid per result. You are not charged for the Apify platform usage, but only a fixed price for dataset items the Actor outputs.

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

# README

## BBB Business Scraper

This Apify actor scrapes business listings and (optionally) detailed business profiles from the Better Business Bureau (BBB) website for any business type and location in the USA or Canada.

### Features

- **Concurrent scraping:** Scrapes up to 5 business profiles at a time for fast results.
- **Flexible search:** Search by business type, location, and country.
- **Detailed output:** Extracts business name, phone, website, accreditation status, BBB rating, years in business, owner info, license numbers, categories, and more.
- **Clean address:** The `address` field is always formatted as `Address, City, State, Zip Code` (if available). There are no separate `city`, `state`, or `zip_code` fields in the output.
- **Robust extraction:** Uses both structured data (JSON-LD) and visible page content for maximum coverage.

### Input Schema

- `business_type` (string): Type of business to search for (e.g. "Garage Door Repair").
- `location` (string): City and state (e.g. "Jacksonville, FL").
- `country` (string): Country ("USA" or "Canada").
- `max_pages` (integer): Maximum number of search result pages to crawl.
- `scrape_profiles` (boolean): Whether to scrape detailed business profiles.
- `include_non_accredited` (boolean): Include non-accredited businesses in results.

### Output Fields

- `business_name`
- `profile_url`
- `phone`
- `address` (always formatted as `Address, City, State, Zip Code`)
- `website`
- `accreditation_status`
- `bbb_rating`
- `business_started`
- `business_incorporated`
- `bbb_file_opened`
- `entity_type`
- `owners`
- `license_numbers`
- `categories`

### Usage

1. Set your search criteria in the Apify input UI or via API.
2. Run the actor.
3. Download the results from the Apify dataset tab.

### Local Development

1. Install dependencies:
   ```sh
   pip install -r requirements.txt
   playwright install
   ```
2. Run the actor locally:
   ```sh
   python src/main.py
   ```

### Notes

- The actor is optimized for Apify's cloud environment but can also be run locally with Docker.
- If you increase the number of concurrent profiles above 5, you may encounter browser crashes or rate limits.
- The address parser is robust for most US/CA addresses, but edge cases may still occur. If you find a problematic address, please report it.

***

MIT License

# Actor input Schema

## `business_type` (type: `string`):

Enter the type of business or service you want to find. Examples: 'Garage Door Repair', 'Plumber', 'Restaurant', 'Dentist', 'Roofing Contractor'

## `location` (type: `string`):

Enter the city and state where you want to find businesses. Examples: 'Jacksonville, FL', 'New York, NY', 'Los Angeles, CA'

## `country` (type: `string`):

The country to search in. Leave as 'USA' for most searches.

## `max_pages` (type: `integer`):

Maximum number of pages to search. Each page shows about 20 businesses.

## `scrape_profiles` (type: `boolean`):

If enabled, I'll visit each business profile to get detailed information like BBB rating, years in business, owner info, and more. This takes longer but gives you much more data.

## `include_non_accredited` (type: `boolean`):

BBB Accredited businesses have higher ratings and more information. Non-accredited businesses may have limited data.

## Actor input object example

```json
{
  "business_type": "Garage Door Repair",
  "location": "Jacksonville, FL",
  "country": "USA",
  "max_pages": 2,
  "scrape_profiles": true,
  "include_non_accredited": true
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("rosweltvofficial/my-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("rosweltvofficial/my-actor").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 '{}' |
apify call rosweltvofficial/my-actor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "BBB Better Business Directory Scraper (No Coding Required)",
        "description": "The BBB Business Scraper quickly finds and collects info on businesses from the BBB website. Enter a business type and location, and the tool gathers names, addresses, ratings, and more for all matching businesses—fast and easy!",
        "version": "0.0",
        "x-build-id": "FLCI7Ydfw7lcxsSiT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/rosweltvofficial~my-actor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-rosweltvofficial-my-actor",
                "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/rosweltvofficial~my-actor/runs": {
            "post": {
                "operationId": "runs-sync-rosweltvofficial-my-actor",
                "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/rosweltvofficial~my-actor/run-sync": {
            "post": {
                "operationId": "run-sync-rosweltvofficial-my-actor",
                "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",
                "required": [
                    "business_type",
                    "location"
                ],
                "properties": {
                    "business_type": {
                        "title": "What type of business are you looking for?",
                        "type": "string",
                        "description": "Enter the type of business or service you want to find. Examples: 'Garage Door Repair', 'Plumber', 'Restaurant', 'Dentist', 'Roofing Contractor'",
                        "default": "Garage Door Repair"
                    },
                    "location": {
                        "title": "Where do you want to search?",
                        "type": "string",
                        "description": "Enter the city and state where you want to find businesses. Examples: 'Jacksonville, FL', 'New York, NY', 'Los Angeles, CA'",
                        "default": "Jacksonville, FL"
                    },
                    "country": {
                        "title": "Country (optional)",
                        "enum": [
                            "USA",
                            "Canada"
                        ],
                        "type": "string",
                        "description": "The country to search in. Leave as 'USA' for most searches.",
                        "default": "USA"
                    },
                    "max_pages": {
                        "title": "How many pages should I search? (optional)",
                        "minimum": 1,
                        "maximum": 2,
                        "type": "integer",
                        "description": "Maximum number of pages to search. Each page shows about 20 businesses.",
                        "default": 2
                    },
                    "scrape_profiles": {
                        "title": "Get detailed business information?",
                        "type": "boolean",
                        "description": "If enabled, I'll visit each business profile to get detailed information like BBB rating, years in business, owner info, and more. This takes longer but gives you much more data.",
                        "default": true
                    },
                    "include_non_accredited": {
                        "title": "Include non-accredited businesses?",
                        "type": "boolean",
                        "description": "BBB Accredited businesses have higher ratings and more information. Non-accredited businesses may have limited data.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
