# BBB Scraper — Ratings, Reviews, Complaints & Leads (`memo23/bbb-scraper`) Actor

Scrape bbb.org for B2B leads — owner name, decoded email, phone, website, social profiles, BBB rating, accreditation, address + coordinates, business type, licenses, hours, plus reviews & complaints. Search by term + location or paste BBB URLs. USA & Canada, no login. JSON or CSV.

- **URL**: https://apify.com/memo23/bbb-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Lead generation, AI, Agents
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 business profiles

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 Business Profiles, Ratings, Reviews & Complaints

Turn any Better Business Bureau ([bbb.org](https://www.bbb.org)) search or business-profile URL into clean, structured trust data — BBB rating, accreditation, contact details, address with coordinates, customer reviews and complaints. Search by keyword + location, or paste profile URLs directly. One row per business, JSON or CSV out.

![How the BBB Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-bbb.png)

#### ✨ Why use this scraper?

- **Owner name + decoded email for lead gen** — pulls the principal/owner's name and title, de-obfuscates the business email that BBB hides behind Cloudflare, plus phone, website and social-media profiles (Facebook, Instagram, LinkedIn, X).
- **Full business-trust profile in one row** — BBB letter rating, accreditation status + date, business type (LLC/Corp), years in business, license numbers, operating hours, address, geo-coordinates, categories and the business's own website.
- **Reviews and complaints on demand** — opt in to pull customer reviews (rating, author, text, date, business response) and complaints (type, status, date, text) nested inside each business row.
- **Search or direct URLs** — build searches from a keyword + location, or paste any `bbb.org/search?…` or `/profile/…` URL. Both are auto-detected and mixed in one run. Filter to accredited businesses only.
- **USA & Canada** — works across the whole BBB directory.
- **No login, public pages only** — every field comes from publicly visible BBB profile pages.
- **Built to get through** — BBB sits behind Cloudflare; this Actor clears the challenge with a stealth browser and residential proxies, then harvests at scale with automatic session rotation.

#### 🎯 Use cases

| Audience | What they get |
|---|---|
| **B2B lead generation** | Verified local businesses with phone, website, address and accreditation status — filter by BBB rating for quality leads. |
| **Sales & prospecting** | Build targeted lists by category + city (plumbers in LA, HVAC in Dallas) with contact details ready to import. |
| **Due diligence & compliance** | Check a company's BBB rating, accreditation, years in business, and complaint history before doing business. |
| **Reputation monitoring** | Track a business's (or competitor's) reviews, complaints and rating over time. |
| **Market research** | Aggregate ratings, complaint volumes and category density across a city or region. |

#### 📥 Supported inputs

| Input type | Example |
|---|---|
| Search terms + location | `["plumber"]` + `"Los Angeles, CA"` |
| BBB search URL | `https://www.bbb.org/search?find_country=USA&find_text=plumber&find_loc=Los%20Angeles%2C%20CA` |
| BBB profile URL | `https://www.bbb.org/us/ca/los-angeles/profile/plumber/fords-plumbing-1216-100081178` |

**Not supported:** BBB member-only / login-gated content, the BBB complaint-filing flow, and non-business (charity/`give.org`) profiles.

#### ⚠️ Proxy requirement

BBB is protected by Cloudflare. This Actor **requires residential proxies** and defaults to **Apify Residential (US)**. Datacenter proxies are blocked. You can supply your own residential proxy group in the input; keep the country aligned with your target market (US for `/us/…`, Canada for `/ca/…`).

#### 🔄 How it works

1. **Classify** each start URL as a search-results page or a direct business profile.
2. **Solve Cloudflare once** — a stealth browser clears the managed challenge on a residential IP.
3. **Harvest** every page's HTML inside that solved session (search pages, profiles, review and complaint sub-pages).
4. **Parse** the business data embedded in each page into a normalized row.
5. **Paginate** reviews and complaints when those options are enabled.
6. **Push** one row per business to the dataset; the session auto-rotates its IP if it gets blocked.

#### ⚙️ Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `searchTerms` | array | `["plumber"]` | Category/keyword terms to search. Each is combined with `location`. |
| `location` | string | `"Los Angeles, CA"` | City + state/province for the search terms. Empty = nationwide. |
| `country` | select | `USA` | `USA` or `CAN`. |
| `sort` | select | `Relevance` | Result order: `Relevance`, `Rating`, `Distance`, `Name`. |
| `distance` | integer | — | Search radius in miles from the location. |
| `startUrls` | array | `[]` | BBB search or profile URLs to scrape directly. |
| `accreditedOnly` | boolean | `false` | Only return BBB-accredited businesses (others skipped, not billed). |
| `scrapeReviews` | boolean | `false` | Also collect each business's customer reviews. |
| `scrapeComplaints` | boolean | `false` | Also collect each business's complaints. |
| `maxReviewPages` | integer | `5` | Cap on review pages per business (~25 reviews/page). |
| `maxComplaintPages` | integer | `5` | Cap on complaint pages per business (~25 complaints/page). |
| `maxItems` | integer | `1000` | Hard cap on business profiles scraped. |
| `maxConcurrency` | integer | `5` | Parallel fetches inside the solved session. |
| `proxy` | object | Apify Residential US | Proxy configuration. Residential required. |

#### 📊 Output overview

Each dataset item is **one business**. Core profile fields are always present; `reviews` and `complaints` arrays are added only when you enable those options. Empty fields are returned as `null` (never fabricated).

#### 📦 Output sample

```json
{
  "type": "business",
  "bbbId": "0121",
  "businessId": "87144493",
  "profileUrl": "https://www.bbb.org/us/ny/new-york/profile/plumber/daniels-plumbing-services-0121-87144493",
  "name": "Daniel's Plumbing Services",
  "alternateNames": [],
  "bbbRating": "A+",
  "isAccredited": true,
  "accreditedSince": "2022-03-08",
  "accreditationRevoked": null,
  "accreditationText": "This business supports BBB's services to the public and meets BBB Accreditation standards.",
  "primaryCategory": "Plumber",
  "categories": ["Plumber", "Plumbing Renovation", "Sewer Cleaning", "Plumbing and Heating"],
  "phone": "(212) 369-2500",
  "additionalPhones": [],
  "email": "info@plumbing-manhattan.com",
  "website": "https://www.plumbing-manhattan.com/",
  "additionalWebsites": [],
  "socialMedia": { "facebook": "https://www.facebook.com/danielsplumbingnyc", "instagram": "https://www.instagram.com/danielsplumbing/" },
  "addressLine1": "397 Lexington Ave.",
  "city": "New York",
  "stateCode": "NY",
  "zipCode": "10016",
  "formattedAddress": "397 Lexington Ave., New York, NY 10016",
  "latitude": 40.751465,
  "longitude": -73.97583,
  "servingAreas": [],
  "isHeadquarters": false,
  "businessType": "Corporation",
  "isOutOfBusiness": false,
  "yearsInBusiness": 7,
  "businessStarted": "2018-01-01",
  "numberOfEmployees": null,
  "ownerName": "Mr. Daniel Sheeri",
  "contacts": [{ "name": "Mr. Daniel Sheeri", "title": "President", "isPrincipal": true, "isManagement": true }],
  "licenses": [{ "licenseNumber": "000620", "expirationDate": "2028-06-03", "agency": "New York, NY" }],
  "logoUrl": "https://m.bbb.org/prod/ProfileImages/…/logo.jpg",
  "operatingHours": { "monday": "08:00-17:00", "saturday": "Closed", "sunday": "Closed" },
  "description": "Daniel's Plumbing Services provides residential and commercial plumbing…",
  "paymentMethods": ["Visa", "Mastercard", "Cash"],
  "reviewsTotal": 3,
  "averageStarRating": 5,
  "complaintsTotal": 0,
  "closedComplaintsLast3Years": 0,
  "closedComplaintsLast12Months": 0,
  "requestQuoteUrl": "https://www.bbb.org/…/quote/request-daniels-plumbing-services-87144493",
  "leaveReviewUrl": "https://www.bbb.org/us/ny/new-york/profile/plumber/daniels-plumbing-services-0121-87144493/leave-a-review",
  "reviews": [
    {
      "reviewId": "0121_87144493_701161",
      "rating": 5,
      "author": "M. B",
      "text": "He was fantastic. He really knew his stuff and quickly solved the problem…",
      "date": "2026-01-26",
      "businessResponseText": null,
      "businessResponseDate": null
    }
  ],
  "scrapedAt": "2026-07-11T00:57:00.000Z"
}
````

#### 🗂 Key output fields

| Category | Fields |
|---|---|
| **Identity** | `bbbId`, `businessId`, `profileUrl`, `name`, `alternateNames`, `logoUrl` |
| **Trust** | `bbbRating`, `isAccredited`, `accreditedSince`, `accreditationRevoked`, `accreditationText`, `governmentActions`, `localBbbName`, `localBbbUrl` |
| **Contact & lead-gen** | `phone`, `additionalPhones`, `email` (de-obfuscated), `website`, `additionalWebsites`, `socialMedia` (facebook/instagram/linkedin/twitter/…) |
| **People** | `ownerName`, `contacts[]` — `name`, `title`, `isPrincipal`, `isManagement` |
| **Location** | `addressLine1`, `addressLine2`, `city`, `stateCode`, `zipCode`, `formattedAddress`, `latitude`, `longitude`, `servingAreas`, `isHeadquarters`, `operatingHours` |
| **Business** | `primaryCategory`, `categories`, `businessType`, `isOutOfBusiness`, `yearsInBusiness`, `businessStarted`, `incorporated`, `numberOfEmployees`, `licenses[]`, `description`, `paymentMethods` |
| **Reputation** | `reviewsTotal`, `averageStarRating`, `complaintsTotal`, `closedComplaintsLast3Years`, `closedComplaintsLast12Months` |
| **Action URLs** | `requestQuoteUrl`, `leaveReviewUrl`, `reportUrl` |
| **Reviews** (opt-in) | `reviews[]` — `rating`, `author`, `text`, `date`, `businessResponseText`, `businessResponseDate` |
| **Complaints** (opt-in) | `complaints[]` — `type`, `status`, `date`, `text`, `responseCount` |

#### ❓ FAQ

**Do I need my own proxy?** The Actor defaults to Apify Residential (US), which works out of the box. You can supply a different residential group; datacenter proxies won't get past Cloudflare.

**Can I scrape a single business?** Yes — paste its profile URL into `startUrls`. Search terms are optional.

**Are reviews and complaints always complete?** Reviews and complaints are collected from each business's public sub-pages and paginated up to your page caps. Businesses with very large review/complaint volumes (thousands) may return the most-recent pages rather than the entire archive; raise `maxReviewPages` / `maxComplaintPages` to go deeper.

**Does it work for Canada?** Yes. Set `country` to `CAN` and use a Canadian location, or paste `/ca/…` profile URLs.

**How is it billed?** Pay-per-event: one charge per business profile, plus a small per-review and per-complaint charge when those options are enabled. You only pay for what you collect.

#### 💬 Support

Found a bug or need a field added? Open an issue on the Actor's **Issues** tab and we'll take a look.

#### 🛠 Additional services

Need a custom directory or lead-generation scraper (Yelp, Yellow Pages, Google Maps, industry directories)? We build and maintain production scrapers — reach out via the Issues tab.

#### 🔎 Explore more scrapers

Browse our other business-data and lead-generation Actors on the Apify Store.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the Better Business Bureau, the International Association of Better Business Bureaus, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available BBB business-profile pages — no authenticated endpoints, member-only features, or content behind a BBB login. Users are responsible for ensuring their use complies with BBB's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

***

### SEO Keywords

bbb scraper, better business bureau scraper, scrape bbb, bbb api, bbb.org scraper, apify bbb, bbb business profiles, bbb ratings scraper, bbb accreditation data, bbb reviews scraper, bbb complaints scraper, business reputation data, b2b lead generation scraper, local business leads, business directory scraper, company due diligence data, bbb rating lookup, us business data scraper, canada business directory scraper, business contact scraper, accredited business list, bbb advanced scraper alternative

# Actor input Schema

## `searchTerms` (type: `array`):

Category or keyword terms to search on BBB, e.g. "plumber", "roofing", "hvac". Each term is combined with the location below.

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

City + state (US) or city + province (Canada) for the search terms, e.g. "Los Angeles, CA" or "Toronto, ON". Leave empty for a nationwide search.

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

Country to search within.

## `sort` (type: `string`):

Order of search results. Applies to keyword + location searches.

## `distance` (type: `integer`):

Limit search results to businesses within this many miles of the location. Leave empty for BBB's default radius.

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

Paste BBB search-result pages (https://www.bbb.org/search?...) or direct business-profile URLs (https://www.bbb.org/us/ca/los-angeles/profile/...). Search and profile URLs are auto-detected.

## `accreditedOnly` (type: `boolean`):

When enabled, only BBB-accredited businesses are returned; non-accredited businesses are skipped and not billed.

## `scrapeReviews` (type: `boolean`):

Also collect each business's customer reviews (rating, author, text, date, business response).

## `scrapeComplaints` (type: `boolean`):

Also collect each business's complaints (type, status, date, text, response count).

## `maxReviewPages` (type: `integer`):

Cap on review pages pulled per business (~25 reviews per page). Only used when "Scrape customer reviews" is on.

## `maxComplaintPages` (type: `integer`):

Cap on complaint pages pulled per business (~25 complaints per page). Only used when "Scrape complaints" is on.

## `maxItems` (type: `integer`):

Hard cap on the number of business profiles scraped across all search/start URLs.

## `maxConcurrency` (type: `integer`):

Maximum number of pages fetched in parallel inside the solved browser session. Keep modest (3-8) to stay under BBB's rate limits.

## `proxy` (type: `object`):

BBB is protected by Cloudflare and requires residential proxies. Apify Residential (US) is strongly recommended.

## Actor input object example

```json
{
  "searchTerms": [
    "plumber"
  ],
  "location": "Los Angeles, CA",
  "country": "USA",
  "sort": "Relevance",
  "startUrls": [],
  "accreditedOnly": false,
  "scrapeReviews": false,
  "scrapeComplaints": false,
  "maxReviewPages": 5,
  "maxComplaintPages": 5,
  "maxItems": 1000,
  "maxConcurrency": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "searchTerms": [
        "plumber"
    ],
    "location": "Los Angeles, CA",
    "startUrls": [],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/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 = {
    "searchTerms": ["plumber"],
    "location": "Los Angeles, CA",
    "startUrls": [],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/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 '{
  "searchTerms": [
    "plumber"
  ],
  "location": "Los Angeles, CA",
  "startUrls": [],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call memo23/bbb-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "BBB Scraper — Ratings, Reviews, Complaints & Leads",
        "description": "Scrape bbb.org for B2B leads — owner name, decoded email, phone, website, social profiles, BBB rating, accreditation, address + coordinates, business type, licenses, hours, plus reviews & complaints. Search by term + location or paste BBB URLs. USA & Canada, no login. JSON or CSV.",
        "version": "0.0",
        "x-build-id": "fFns7eYdey36rlpbu"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~bbb-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-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/memo23~bbb-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-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/memo23~bbb-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-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": {
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Category or keyword terms to search on BBB, e.g. \"plumber\", \"roofing\", \"hvac\". Each term is combined with the location below.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City + state (US) or city + province (Canada) for the search terms, e.g. \"Los Angeles, CA\" or \"Toronto, ON\". Leave empty for a nationwide search."
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "USA",
                            "CAN"
                        ],
                        "type": "string",
                        "description": "Country to search within.",
                        "default": "USA"
                    },
                    "sort": {
                        "title": "Sort order",
                        "enum": [
                            "Relevance",
                            "Rating",
                            "Distance",
                            "Name"
                        ],
                        "type": "string",
                        "description": "Order of search results. Applies to keyword + location searches.",
                        "default": "Relevance"
                    },
                    "distance": {
                        "title": "Search radius (miles)",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Limit search results to businesses within this many miles of the location. Leave empty for BBB's default radius."
                    },
                    "startUrls": {
                        "title": "BBB URLs",
                        "type": "array",
                        "description": "Paste BBB search-result pages (https://www.bbb.org/search?...) or direct business-profile URLs (https://www.bbb.org/us/ca/los-angeles/profile/...). Search and profile URLs are auto-detected.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "accreditedOnly": {
                        "title": "Accredited businesses only",
                        "type": "boolean",
                        "description": "When enabled, only BBB-accredited businesses are returned; non-accredited businesses are skipped and not billed.",
                        "default": false
                    },
                    "scrapeReviews": {
                        "title": "Scrape customer reviews",
                        "type": "boolean",
                        "description": "Also collect each business's customer reviews (rating, author, text, date, business response).",
                        "default": false
                    },
                    "scrapeComplaints": {
                        "title": "Scrape complaints",
                        "type": "boolean",
                        "description": "Also collect each business's complaints (type, status, date, text, response count).",
                        "default": false
                    },
                    "maxReviewPages": {
                        "title": "Max review pages per business",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Cap on review pages pulled per business (~25 reviews per page). Only used when \"Scrape customer reviews\" is on.",
                        "default": 5
                    },
                    "maxComplaintPages": {
                        "title": "Max complaint pages per business",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Cap on complaint pages pulled per business (~25 complaints per page). Only used when \"Scrape complaints\" is on.",
                        "default": 5
                    },
                    "maxItems": {
                        "title": "Maximum business profiles",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of business profiles scraped across all search/start URLs.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of pages fetched in parallel inside the solved browser session. Keep modest (3-8) to stay under BBB's rate limits.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "BBB is protected by Cloudflare and requires residential proxies. Apify Residential (US) is strongly recommended.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
