BizBuySell Scraper
Pricing
from $3.00 / 1,000 results
BizBuySell Scraper
Scrape business-for-sale listings from BizBuySell.com. Extract asking price, cash flow, gross revenue, location, and description from search results and category pages.
Pricing
from $3.00 / 1,000 results
Rating
5.0
(29)
Developer
Crawler Bros
Maintained by CommunityActor stats
29
Bookmarked
43
Total users
17
Monthly active users
3.2 hours
Issues response
17 days ago
Last modified
Categories
Share
Scrape business-for-sale listings from BizBuySell.com, the largest online marketplace for buying and selling small businesses. Extract asking prices, cash flow, gross revenue, locations, and descriptions from search results and category pages.
What can this scraper do?
- Search results — Enter any BizBuySell search, category, or location URL and extract every listing
- Asking price — Listed price as both formatted (
$1,150,000) and numeric (1150000) for sorting/filtering - Location data — City and state extracted into a single
locationfield - Business descriptions — Full listing description, not truncated to card preview
- Optional financial enrichment — Set
enrichDetails: trueto also pull Cash Flow (SDE), Gross Revenue, EBITDA, Real Estate, Inventory, FF&E, Rent, Established year, and Employees - Listing image — Each listing's photo is downloaded and re-hosted in this run's Apify storage so the URL works in any browser without Akamai blocking; original BBS CDN URL is preserved as
imageOriginal - Automatic pagination — Walks pages 1, 2, 3... until
maxItemsis reached or results run out - Fast & free of proxy — No browser, no proxy required. Each page is one HTTP request, ~2 seconds per page
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchUrl | string | Yes | https://www.bizbuysell.com/businesses-for-sale/ | BizBuySell URL to scrape (search results, category, or location page). Auto-rewritten to the mobile subdomain. |
maxItems | integer | No | 50 | Maximum number of listings to extract (1--1,000) |
enrichDetails | boolean | No | false | If true, fetches each listing's detail page to add Cash Flow, Gross Revenue, EBITDA, Real Estate, Established, Employees, FF&E, Rent. One extra HTTP request per listing. |
proxy | object | No | – | Optional. The actor uses the unprotected mobile subdomain (m.bizbuysell.com) and works without proxy from Apify datacenter IPs. |
Supported URL formats
| URL Pattern | Example |
|---|---|
| All businesses for sale | https://www.bizbuysell.com/businesses-for-sale/ |
| State filter | https://www.bizbuysell.com/california-businesses-for-sale/ |
| Category filter | https://www.bizbuysell.com/restaurant-businesses-for-sale/ |
| City filter | https://www.bizbuysell.com/businesses-for-sale/los-angeles-ca/ |
| Search results | https://www.bizbuysell.com/businesses-for-sale/?q=laundromat |
| Price range | https://www.bizbuysell.com/businesses-for-sale/?pmin=100000&pmax=500000 |
Example input
{"searchUrl": "https://www.bizbuysell.com/restaurant-businesses-for-sale/","maxItems": 100}
{"searchUrl": "https://www.bizbuysell.com/businesses-for-sale/?q=laundromat","maxItems": 25,"enrichDetails": true}
How does it bypass Akamai?
BizBuySell's main www. site is fronted by Akamai Bot Manager, which blocks datacenter IPs. The actor side-steps this entirely by hitting m.bizbuysell.com (the unprotected mobile subdomain) with curl_cffi's real-Chrome TLS fingerprint impersonation. No browser, no proxy, no retries needed — every run completes in a few seconds.
User-supplied www.bizbuysell.com URLs are auto-rewritten to m.bizbuysell.com so paste-and-run works for any of the URL formats listed above.
Why are images re-hosted?
BizBuySell's image CDN (images.bizbuysell.com) is also Akamai-fronted and intermittently 403s direct browser opens from flagged IPs (the same residential / mobile IPs that originally browsed BBS heavily). The actor downloads each image during the run using its working Chrome TLS fingerprint, stores it in this run's Apify key-value store, and emits the stable Apify-hosted URL as image. The original BBS CDN URL is kept under imageOriginal for traceability. The mirrored URL renders correctly in any browser, dashboard, or downstream tool.
What does enrichDetails add?
By default each listing record contains: title, description, url, productId, image, location, askingPrice (numeric + formatted). Set enrichDetails: true to also fetch each listing's detail page and pull labeled financial fields:
cashFlow— Seller's Discretionary Earnings (SDE)grossRevenue— annual gross revenueebitda— earnings before interest/taxes/depreciation/amortizationrealEstate— included real estate value (or "Owned" / "Leased")inventory,ffe,rentMonthly— inventory value, FF&E, monthly rentestablished— year the business was foundedemployees— headcount
Output
Empty fields are omitted (no nulls / blank strings reach the dataset).
Always-present fields
| Field | Type | Description |
|---|---|---|
url | string | Direct link to the listing on www.bizbuysell.com |
productId | string | BizBuySell's numeric listing ID |
title | string | Business listing title |
description | string | Listing summary (full text, not truncated) |
searchUrl | string | The search URL this listing was found on (mobile-rewritten) |
scrapedAt | string | ISO 8601 UTC timestamp |
Usually-present fields
| Field | Type | Description |
|---|---|---|
location | string | City, State (e.g. Bonita Springs, FL) |
image | string | Apify-hosted URL of the listing's primary photo (mirrored for browser-friendly access) |
imageOriginal | string | Original BizBuySell CDN URL (Akamai-fronted; may 403 from flagged IPs in browsers) |
askingPrice | string | Formatted price (e.g. $1,150,000) or "Not Disclosed" |
askingPriceNumeric | integer | Numeric price for filtering/sorting (omitted when "Not Disclosed") |
enrichDetails: true — additional fields per listing
| Field | Type | Description |
|---|---|---|
askingPriceDetail | string | Asking price as shown on the detail page (may include qualifiers) |
cashFlow | string | Seller's Discretionary Earnings (SDE) |
grossRevenue | string | Annual gross revenue |
ebitda | string | EBITDA |
realEstate | string | Real estate value or status (Owned, Leased, $X*) |
inventory | string | Inventory value (often "Included" or $X) |
ffe | string | Furniture, fixtures & equipment |
rentMonthly | string | Monthly rent |
established | string | Year founded (or "Not Disclosed") |
employees | string | Number of employees |
category | string | BizBuySell business category (when populated by source) |
Sample output (without enrichDetails)
{"url": "https://www.bizbuysell.com/business-opportunity/outpatient-physical-therapy-practice-for-sale/2501583/","productId": "2501583","title": "Outpatient Physical Therapy Practice For Sale","description": "A 32-year operating history, approximately $1.56M in FY 2025 revenue, and an embedded referral network that has reached 700+ physicians — this owner-operated outpatient physical therapy practice in Southwest Florida is a thriving, fully operational business...","image": "https://api.apify.com/v2/key-value-stores/e3sxDlkCKsIIMTxzg/records/image-2501583.webp","imageOriginal": "https://images.bizbuysell.com/shared/listings/250/2501583/895434dc-989d-4045-86b2-5f0e3396481e-W336.webp","location": "Bonita Springs, FL","askingPrice": "$1,150,000","askingPriceNumeric": 1150000,"searchUrl": "https://m.bizbuysell.com/established-businesses-for-sale/","scrapedAt": "2026-05-02T08:25:18.567890+00:00"}
Sample output (with enrichDetails: true)
Adds the financial fields by fetching each listing's detail page (one extra HTTP request per listing):
{"url": "https://www.bizbuysell.com/business-opportunity/outpatient-physical-therapy-practice-for-sale/2501583/","productId": "2501583","title": "Outpatient Physical Therapy Practice For Sale","location": "Bonita Springs, FL","askingPrice": "$1,150,000","askingPriceNumeric": 1150000,"askingPriceDetail": "$1,150,000","cashFlow": "$319,844","grossRevenue": "$1,562,370","ebitda": "$233,264","realEstate": "$2,095,000*","established": "Not Disclosed","image": "https://api.apify.com/v2/key-value-stores/e3sxDlkCKsIIMTxzg/records/image-2501583.webp","imageOriginal": "https://images.bizbuysell.com/shared/listings/250/2501583/895434dc-989d-4045-86b2-5f0e3396481e-W336.webp","description": "A 32-year operating history...","searchUrl": "https://m.bizbuysell.com/established-businesses-for-sale/","scrapedAt": "2026-05-02T08:25:18.567890+00:00"}
Tips for best results
- Start with a small
maxItems(5–10) to verify your URL works before running large jobs - Each search page yields ~55–58 listings, so
maxItems: 100typically completes in 2 page fetches - Use specific category or location URLs to get targeted results — pagination respects all BizBuySell URL filters
- Set
enrichDetails: trueif you need financial figures (Cash Flow, Revenue, EBITDA) — adds one HTTP request per listing - Some listings show "Not Disclosed" for asking price — this is BizBuySell's actual display value, not a scraper limitation
- Empty fields are omitted from output records; downstream consumers always see a stable schema
Limitations
- Only US-based businesses are listed on BizBuySell — the scraper does not cover international marketplaces
- "Not Disclosed" prices yield no
askingPriceNumeric; sort/filter logic should treat those records separately - Some sponsored / featured listings may not have a
productIdand are filtered out - Detail-page financial fields are only present when the seller has filled them in
- BizBuySell may rate-limit aggressive scraping; the actor inserts a 0.5s pause between requests to stay polite
Frequently Asked Questions
Do I need a BizBuySell account to use this scraper? No. All listing data is publicly accessible.
How many listings can I scrape?
Up to 1,000 per run via maxItems. BizBuySell pages have ~55–58 listings each, so a 1,000-item run walks ~18–19 pages.
Why is the asking price "Not Disclosed" for some listings? Some sellers choose to hide their asking price. The scraper preserves whatever BizBuySell displays.
Can I filter by business type, location, or price range?
Yes. Apply your filters on bizbuysell.com, copy the resulting URL, and paste it as searchUrl. The scraper follows every filter encoded in the URL — category, state, city, price range (pmin/pmax), keyword (q), etc.
Do I need a proxy?
No. The actor uses BizBuySell's mobile subdomain (m.bizbuysell.com), which is unprotected. Runs work from any Apify datacenter IP without proxy.
Why is the scraper so fast?
HTTP-only — no browser launch, no anti-bot challenge wait. Each page is one request that returns a structured SearchResultsPage JSON-LD payload with all listing data ready to extract. Typical run: 2–10 seconds.
What if I need cash flow / revenue but enrichDetails is too slow?
At ~0.5s per listing, enrichment for 50 listings takes ~30s — well within reasonable run times. If you need bulk enrichment for thousands of listings, run multiple smaller jobs in parallel with different searchUrl filters.
What happens if no listings are found? The actor exits with a clear failure message. This usually means the URL was invalid, returned no results (e.g. an over-narrow filter), or the BBS site was temporarily unreachable. Re-run or widen your filter.