BizBuySell Business Listings Scraper avatar

BizBuySell Business Listings Scraper

Pricing

Pay per event

Go to Apify Store
BizBuySell Business Listings Scraper

BizBuySell Business Listings Scraper

📊 Extract public BizBuySell listings, asking prices, seller-disclosed financials, operating details, and broker contacts for acquisition sourcing.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Turn public BizBuySell business-for-sale searches into clean, analysis-ready data.

Collect listing IDs, titles, descriptions, locations, asking prices, images, availability, and canonical URLs. Enable detail enrichment to add seller-disclosed cash flow or SDE, gross revenue, EBITDA, real estate, inventory, FF&E, rent, established year, employees, and public broker fields when available.

Use the scraper for recurring acquisition sourcing, new-listing monitoring, broker research, lending analysis, and market comparables. No BizBuySell account is required for supported public pages.

What does BizBuySell Business Listings Scraper do?

The Actor accepts national or US-state BizBuySell businesses-for-sale URLs.

It then:

  • 🔎 normalizes supported www.bizbuysell.com URLs to the public mobile surface;
  • 📄 follows bounded path-based pagination;
  • 🧩 reads structured listing data from page JSON-LD;
  • 🔐 deduplicates records by BizBuySell productId;
  • 🎯 applies optional minimum and maximum asking-price filters;
  • 💰 optionally enriches each record from its public detail page;
  • 📦 saves typed records to an Apify dataset for export or integration.

Unsupported city and category paths fail clearly instead of silently returning the wrong geographic scope.

Who is it for?

Acquisition entrepreneurs

Build a repeatable pipeline of businesses that fit your geography and price range.

Search funds and independent sponsors

Monitor multiple states, enrich candidate financials, and send records into a deal CRM.

Business brokers

Compare active inventory, asking prices, locations, and seller-disclosed operating metrics.

Lenders and M&A analysts

Create market-comparable datasets for screening, valuation research, and sector coverage.

Data teams

Schedule extraction and connect results to a warehouse, spreadsheet, webhook, or BI workflow.

Why use this BizBuySell scraper?

  • Structured output: receive consistent fields instead of copying listing cards manually.
  • Repeatable monitoring: schedule the same state searches daily or weekly.
  • Bounded runs: control item count and pages for predictable execution.
  • Financial enrichment: collect optional details only when your workflow needs them.
  • Stable identity: use productId to compare snapshots and detect new or removed inventory.
  • Fail-closed filters: records without numeric prices do not slip through active price filters.
  • Resilient extraction: detail-page failures do not discard valid search-page records.
  • Export options: download JSON, CSV, Excel, XML, RSS, or connect through the API.

Supported BizBuySell URLs

Supported inputs are:

  • national search: https://www.bizbuysell.com/businesses-for-sale/
  • state search: https://www.bizbuysell.com/california-businesses-for-sale/
  • state search: https://www.bizbuysell.com/texas-businesses-for-sale/
  • another valid US-state businesses-for-sale path

The Actor also accepts equivalent m.bizbuysell.com URLs.

City, county, category, keyword-query, and arbitrary detail URLs are not accepted as search starts in v1. This boundary prevents the mobile surface from appearing to honor a filter that it may ignore.

Input

FieldTypeDefaultDescription
startUrlsarrayCalifornia searchNational or state BizBuySell search URLs
maxItemsinteger25Maximum unique listings saved across all searches
maxPagesPerUrlinteger3Maximum pages requested for each search URL
enrichDetailsbooleanfalseVisit public listing pages for extra details
includeBrokerContactsbooleanfalseCapture public broker fields when displayed
minAskingPriceintegerMinimum numeric asking price
maxAskingPriceintegerMaximum numeric asking price
requestDelayMillisinteger500Polite delay between requests
proxyConfigurationobjectdirectOptional Apify or custom proxy fallback

Example input

{
"startUrls": [
{ "url": "https://www.bizbuysell.com/california-businesses-for-sale/" },
{ "url": "https://www.bizbuysell.com/texas-businesses-for-sale/" }
],
"maxItems": 100,
"maxPagesPerUrl": 3,
"enrichDetails": true,
"includeBrokerContacts": true,
"minAskingPrice": 100000,
"maxAskingPrice": 2000000
}

Start with one page and 10 listings while evaluating the output. Increase volume only after confirming the search scope matches your workflow.

Output data

Each dataset row represents one business listing.

FieldDescription
productIdStable BizBuySell listing identifier
titlePublic listing headline
descriptionSearch-card description when present
urlCanonical BizBuySell detail URL
location, city, statePublic listing geography
askingPrice, askingPriceNumericFormatted and numeric asking price
currencyPrice currency, usually USD
availabilityStructured listing availability
imagePublic listing image URL
cashFlow, cashFlowNumericSeller-disclosed cash flow or SDE
grossRevenue, grossRevenueNumericSeller-disclosed gross revenue
ebitda, ebitdaNumericSeller-disclosed EBITDA
realEstatePublic real-estate terms when present
inventoryPublic inventory value or note
ffeFurniture, fixtures, and equipment value or note
rentMonthlyPublic rent value or note
establishedYearParsed four-digit establishment year
employeesPublic employee information
brokerName, brokerCompany, brokerPhonePublic broker fields when displayed
searchUrlNormalized search that produced the record
sourcePageSearch result page number
scrapedAtUTC extraction timestamp

Optional fields are omitted when a seller did not disclose them. Missing values are not invented.

Example output

{
"productId": "2508641",
"title": "Maid Brigade of Redwood City- includes 3 branded vehicles",
"url": "https://www.bizbuysell.com/business-opportunity/maid-brigade-of-redwood-city-includes-3-branded-vehicles/2508641/",
"location": "San Mateo County, CA",
"city": "San Mateo County",
"state": "CA",
"askingPrice": "$219,000",
"askingPriceNumeric": 219000,
"currency": "USD",
"availability": "InStock",
"searchUrl": "https://m.bizbuysell.com/california-businesses-for-sale/",
"sourcePage": 1,
"scrapedAt": "2026-07-20T00:00:00.000Z"
}

Live records change as sellers add, edit, or remove listings.

How to scrape BizBuySell listings

  1. Open the Actor in Apify Console.
  2. Add one national or state businesses-for-sale URL.
  3. Choose a small maxItems value for your first run.
  4. Set maxPagesPerUrl to control pagination.
  5. Enable detail enrichment only if financial or operating fields are needed.
  6. Add price boundaries for a targeted acquisition screen.
  7. Click Start.
  8. Review the Business listings dataset view.
  9. Export the data or connect it to your downstream workflow.

How much does it cost to scrape BizBuySell listings?

The Actor uses pay-per-event pricing:

  • a one-time Run started event of $0.005 per run;
  • one Item extracted event for each saved business listing;
  • tiered per-item rates that decrease with your Apify plan.
Apify tierPrice per listing
FREE$0.000054519
BRONZE$0.000047408
SILVER$0.000036978
GOLD$0.000028445
PLATINUM$0.000018963
DIAMOND$0.000013274

The pricing panel shows the applicable tier before every run. A small 10-item evaluation run remains inexpensive. Detail enrichment makes additional source requests but does not create extra output-item events.

To control cost:

  • combine searches in one run instead of launching many one-listing runs;
  • keep maxPagesPerUrl bounded;
  • leave enrichment disabled when search-card data is sufficient;
  • use snapshots and productId to avoid unnecessary downstream reprocessing.

Price filtering and deal screening

Set minAskingPrice and/or maxAskingPrice as integer dollar amounts.

When a price filter is active:

  • listings with a numeric asking price are compared against the boundary;
  • listings outside the boundary are skipped;
  • listings with no parseable asking price are skipped.

This fail-closed behavior is useful for automated screens because “price not disclosed” cannot be mistaken for a qualifying zero-dollar opportunity.

Detail enrichment

Enable enrichDetails to visit each saved candidate's public listing page.

Seller-dependent fields may include:

  • cash flow or seller's discretionary earnings;
  • gross revenue;
  • EBITDA;
  • real-estate terms;
  • inventory and FF&E;
  • monthly rent;
  • established year;
  • employee information.

BizBuySell sellers decide which values to disclose. An omitted output field means it was not reliably present, not that its value is zero.

Broker contact extraction

Set both enrichDetails and includeBrokerContacts to request public broker fields.

Contact data is emitted only when the page displays a recognizable name, company, or phone label. The Actor does not bypass login, reveal private data, or infer hidden contact information.

Use contact data responsibly and comply with applicable outreach, privacy, and anti-spam rules.

Pagination and deduplication

The Actor follows BizBuySell's numbered state or national result pages.

It stops when:

  • maxItems has been reached;
  • maxPagesPerUrl has been reached;
  • a page contains no structured listings;
  • a page contributes no new product IDs.

Duplicate listings across pages or overlapping state inputs are saved once per run.

Scheduling a business listing monitor

Create an Apify schedule for a daily or weekly run.

A practical monitoring workflow is:

  1. run the same state URLs on a schedule;
  2. export productId, price, location, and timestamps;
  3. compare the latest dataset with the previous snapshot;
  4. flag new IDs, removed IDs, and changed asking prices;
  5. notify an acquisition team through email, Slack, or a webhook.

Use an integration platform or your warehouse to retain snapshot history.

Integrations

Google Sheets

Send selected listing fields to a shared deal-screening sheet.

Airtable or a CRM

Upsert on productId so recurring runs update existing acquisition records.

Slack and email

Notify a channel when a new listing meets geography, price, or financial criteria.

Webhooks

Trigger valuation, enrichment, or diligence workflows after a run succeeds.

Data warehouses

Load JSON or CSV into BigQuery, Snowflake, PostgreSQL, or another analytics store for comparable analysis.

Apify API with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/bizbuysell-business-listings-scraper').call({
startUrls: [{ url: 'https://www.bizbuysell.com/texas-businesses-for-sale/' }],
maxItems: 50,
maxPagesPerUrl: 2,
enrichDetails: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Apify API with Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/bizbuysell-business-listings-scraper').call(run_input={
'startUrls': [{'url': 'https://www.bizbuysell.com/florida-businesses-for-sale/'}],
'maxItems': 50,
'maxPagesPerUrl': 2,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Apify API with cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~bizbuysell-business-listings-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [{"url":"https://www.bizbuysell.com/new-york-businesses-for-sale/"}],
"maxItems": 25,
"maxPagesPerUrl": 1
}'

Poll the returned run ID or use an Apify client to wait for completion and retrieve the default dataset.

Use with Apify MCP

Connect the Actor to AI agents through Apify MCP.

Claude Code setup

claude mcp add --transport http apify \
"https://mcp.apify.com/?tools=automation-lab/bizbuysell-business-listings-scraper"

Claude Desktop setup

Add this configuration to Claude Desktop's MCP settings, then provide your Apify token through your secure environment:

{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com/?tools=automation-lab/bizbuysell-business-listings-scraper"
}
}
}

Cursor setup

Open Settings → MCP, add the same mcpServers JSON, and enable the apify server.

VS Code setup

Open your workspace MCP configuration, add the same HTTP server URL, and approve the Apify tools for the workspace.

Example prompts:

  • “Collect 50 California businesses for sale below $2 million.”
  • “Enrich current Texas business listings and return those with disclosed cash flow.”
  • “Build a dataset I can compare with last week's acquisition pipeline.”

Tips for reliable runs

  • Begin with one supported state URL and one page.
  • Keep the default request delay unless you have a specific reason to change it.
  • Avoid overlapping searches when you do not need cross-market monitoring.
  • Enable enrichment only for shortlisted records to reduce run time.
  • Use a proxy only if direct access from your execution region is blocked.
  • Treat seller-disclosed financials as leads for verification, not audited statements.
  • Store productId as the durable key in downstream systems.

Limitations

  • v1 supports national and US-state businesses-for-sale paths, not city or category paths.
  • Search inventory and page composition can change between runs.
  • Seller-disclosed details vary by listing.
  • Broker contact fields may be absent or represented in a format the extractor does not recognize.
  • Detail enrichment is best-effort; a blocked detail page does not remove the base listing.
  • The Actor collects public data and does not log in or solve interactive challenges.

The Actor accesses publicly available pages without authentication. Web-scraping legality depends on the data, jurisdiction, purpose, contractual terms, and how you use the results.

You are responsible for:

  • reviewing BizBuySell's current terms and robots guidance;
  • complying with privacy, database, copyright, and outreach laws;
  • avoiding excessive request volume;
  • establishing a lawful basis for processing personal contact data;
  • respecting deletion, suppression, and opt-out obligations.

This documentation is not legal advice.

Troubleshooting

Why did my URL fail validation?

Use the national /businesses-for-sale/ path or a US-state /{state}-businesses-for-sale/ path. City, category, query-filtered, and detail URLs are outside the supported v1 contract.

Why are financial fields missing?

Enable enrichDetails. If a field remains absent, the seller may not have disclosed it or the page may use an unrecognized presentation.

Why did a filtered run return no records?

The current pages may contain no listings inside your price range. Listings without a numeric asking price are intentionally excluded when a price filter is active.

Why did detail enrichment take longer?

Each candidate requires an additional public page request. Reduce maxItems, disable enrichment, or enrich only a shortlist.

What should I do after a block?

Keep pacing conservative and configure Apify Proxy as a fallback. Do not repeatedly retry large runs against a blocked route.

FAQ

Does the Actor require a BizBuySell account?

No. It uses supported public search and detail pages.

Can I scrape several states in one run?

Yes. Add multiple state URLs to startUrls; duplicate product IDs are saved once.

Can I monitor listing changes?

Yes. Schedule runs and compare datasets by productId, askingPriceNumeric, and scrapedAt.

Does it return every financial metric?

It returns recognized fields when sellers disclose them. It does not estimate missing financials.

Can I export to CSV or Excel?

Yes. Use the dataset export menu or API export endpoints.

Does it support residential proxies?

Yes, through proxyConfiguration, though the public mobile surface is attempted directly by default.

Combine this Actor with other automation-lab acquisition data products for broader sourcing coverage:

Each marketplace has different inventory, fields, and seller practices. Keep source-specific product IDs and canonical URLs when combining datasets.

Data quality checklist

Before automating a decision:

  • confirm the listing URL still resolves;
  • verify the asking price and disclosed financial period;
  • distinguish gross revenue, EBITDA, and SDE;
  • review whether real estate or inventory is included in the asking price;
  • contact the broker or seller through appropriate channels;
  • perform independent financial, legal, and operational diligence.

The scraper accelerates discovery and screening. It does not replace due diligence.

Support

For reproducible support, include:

  • the Actor run ID;
  • a sanitized copy of the input;
  • the affected search or listing URL;
  • the expected field or record;
  • the approximate run time.

Do not include private credentials or unrelated personal data.