# BizBuySell Scraper — Business for Sale Listings (`muhammadafzal/bizbuysell-scraper`) Actor

Scrape public BizBuySell business-for-sale listings with asking price, cash flow, revenue, EBITDA, location, category, descriptions, images, and operational details.

- **URL**: https://apify.com/muhammadafzal/bizbuysell-scraper.md
- **Developed by:** [Muhammad Afzal](https://apify.com/muhammadafzal) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 bizbuysell listing scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

## BizBuySell Scraper — Business for Sale Listings

Collect structured, public business-for-sale listings from [BizBuySell](https://www.bizbuysell.com/). The Actor turns search, category, location, and individual listing pages into normalized deal records for acquisition sourcing, market mapping, comparable research, and AI-agent workflows.

Each dataset item can include the listing title and ID, location, category, asking price, cash flow, EBITDA, gross revenue, real-estate terms, established year, employees, inventory, FF\&E, description, detailed public facts, images, and canonical source URL.

### Why use this Actor?

BizBuySell pages are browser-rendered and frequently reject generic automated HTTP clients. This Actor uses a Camoufox/Firefox browser profile, bounded concurrency, coherent sessions, and the proxy route selected in the input. It extracts public JSON-LD and visible listing content, deduplicates by listing ID, validates every record before storage, and preserves truthful diagnostics when access is blocked or a query is empty. Owner proxy credentials remain encrypted Actor secrets and are never logged or written to output.

It never logs in, submits an inquiry, reveals paid BizBuySell Edge data, solves a CAPTCHA, or accesses seller/account pages.

### Input

| Field | Default | Description |
| --- | --- | --- |
| `startUrls` | All businesses | Public search, location, category, or business-opportunity URLs. |
| `maxResults` | `10` | Strict cap from 1 to 500 on stored and billed listings. |
| `scrapeDetails` | `true` | Open each public detail page for richer financial and operational fields. |
| `includeImages` | `true` | Include public listing image URLs. |
| `maxConcurrency` | `2` | Browser concurrency from 1 to 5. |
| `proxyConfiguration` | US residential | Apify or custom proxy configuration. |

Example search input:

```json
{
  "startUrls": [{ "url": "https://www.bizbuysell.com/florida-businesses-for-sale/" }],
  "maxResults": 25,
  "scrapeDetails": true,
  "includeImages": true,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

You can also supply one or more direct public listing URLs. The Actor rejects account, seller, broker, inquiry, and membership URLs before crawling.

### Output

One default-dataset item represents one unique public listing:

```json
{
  "listingUrl": "https://www.bizbuysell.com/business-opportunity/example-auto-repair-shop/2526238/",
  "sourceSearchUrl": "https://www.bizbuysell.com/florida-businesses-for-sale/",
  "listingId": "2526238",
  "title": "Established Auto Repair & Service Shop",
  "location": "Jacksonville, FL",
  "city": "Jacksonville",
  "state": "FL",
  "category": "Auto Repair and Service Shops",
  "askingPrice": 870000,
  "cashFlow": 290000,
  "ebitda": null,
  "grossRevenue": 1335000,
  "realEstatePrice": 550000,
  "realEstateIncluded": false,
  "establishedYear": 1960,
  "employees": "5 Full-time",
  "inventory": null,
  "ffe": "$150,000 Included in asking price",
  "businessDescription": "A long-established automotive repair business.",
  "detailedInformation": {
    "Facilities": "Multiple service bays",
    "Reason for Selling": "Owner retiring"
  },
  "imageUrls": ["https://images.bizbuysell.com/shared/listings/example-W768.webp"],
  "scrapedAt": "2026-09-04T12:00:00.000Z"
}
```

Undisclosed or unavailable fields are `null`, not invented. The `OUTPUT` key-value record separately reports `DATA`, `EMPTY`, `BLOCKED`, or `REJECTED`, plus request failures, warnings, delivered records, and confirmed billing events.

### Pay Per Event pricing

| Event | Price |
| --- | ---: |
| Actor start | $0.00005 per GB of run memory (minimum one event) |
| Valid listing stored | $0.01 per listing ($10 per 1,000) |

The primary `listing-scraped` event is charged only after a unique, schema-valid result is written. A 25-result run therefore has at most $0.25 in listing events, plus the memory-based actor-start event. At scale, 1,000 stored listings cost $10 in listing events. `maxResults` is enforced across every supplied URL, duplicate ID, retry, and resume.

### Reliability and limitations

- BizBuySell can change its markup or access policy. The Actor retries failures a bounded number of times, retires challenged sessions, preserves partial valid results, and writes actionable warnings to `OUTPUT`.
- Detail enrichment is best effort. If a search card is public but its detail page is unavailable or no longer exposes usable fields, the Actor stores the validated search-card record and reports the fallback in `OUTPUT` instead of hanging or losing the result.
- A successful container with zero records is not presented as a successful data scrape. Expected no-match searches return `EMPTY`; systemic Akamai, verification, or rate-limit responses return `BLOCKED` with zero listing charges.
- Search pages currently expose a finite result window. For broad collection, provide focused category/location URLs or multiple public search URLs; all results are deduplicated globally.
- Public listing statements are supplied by sellers or representatives and are not independently verified by BizBuySell or this Actor. Treat financial figures as leads for due diligence, not investment advice.
- Accessing a public page does not automatically grant every reuse. You are responsible for following BizBuySell terms, applicable laws, rate limits, and any required permissions. Do not use the Actor for spam, prohibited profiling, credit/eligibility decisions, or attempts to identify confidential sellers.

### AI agent usage

For a compact agent call, set `scrapeDetails` and `includeImages` to `false`, then request a small `maxResults`. For diligence-oriented screening, enable detail pages and inspect `askingPrice`, `cashFlow`, `grossRevenue`, `detailedInformation`, and `sourceSearchUrl`. Always read the `OUTPUT` summary so an empty or blocked run is not mistaken for a market with no opportunities.

# Actor input Schema

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

Use this for public BizBuySell search, location, category, or individual business-opportunity pages. Enter one full URL per item, for example https://www.bizbuysell.com/businesses-for-sale/. Defaults to the all-businesses search. Account, seller, broker, inquiry, and Edge pages are not accepted.

## `maxResults` (type: `integer`):

Use this to set a strict stored-listing and result-event cap across all input URLs. Defaults to 10 and accepts 1 through 500. Retries and navigation pages do not count as results.

## `scrapeDetails` (type: `boolean`):

Use this for full descriptions, financials, established year, employees, facilities, and other public details. Defaults to true. Set false for a faster search-card export. The Actor never opens inquiry, account, CAPTCHA, or paid Edge content.

## `includeImages` (type: `boolean`):

Use this to include public listing image URLs in each record. Defaults to true. Set false for smaller agent responses and CSV exports.

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

Use this to balance speed and target load. Defaults to 2 and accepts 1 through 5. Keep the default unless you have permission and a measured reason to increase it.

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

Use this to select an Apify or custom proxy. BizBuySell rejects many datacenter requests, so the default uses a sticky US residential session. Disabling the proxy can produce Akamai access denials.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.bizbuysell.com/florida-businesses-for-sale/"
    }
  ],
  "maxResults": 25,
  "scrapeDetails": true,
  "includeImages": true,
  "maxConcurrency": 1,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

Schema-valid public BizBuySell listing records in the default dataset.

## `summary` (type: `string`):

Outcome, result count, warnings, request diagnostics, and confirmed result-event count.

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.bizbuysell.com/businesses-for-sale/"
        }
    ],
    "maxResults": 10,
    "scrapeDetails": true,
    "includeImages": true,
    "maxConcurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.bizbuysell.com/businesses-for-sale/" }],
    "maxResults": 10,
    "scrapeDetails": True,
    "includeImages": True,
    "maxConcurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.bizbuysell.com/businesses-for-sale/"
    }
  ],
  "maxResults": 10,
  "scrapeDetails": true,
  "includeImages": true,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call muhammadafzal/bizbuysell-scraper --silent --output-dataset

```

## MCP server setup

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

```

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

## OpenAPI specification

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