# BusinessesForSale.com Scraper: Businesses & Franchises for Sale (`steadyscrape/businesses-for-sale-scraper`) Actor

Scrape BusinessesForSale.com data: businesses, franchises and M\&A Vault deals for sale in the US, UK, Australia and worldwide, by sector, place and feature, with asking price, revenue, cash flow or net profit, location and tags. Export to JSON, CSV or Excel, or via API.

- **URL**: https://apify.com/steadyscrape/businesses-for-sale-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 listings

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## BusinessesForSale.com Scraper — businesses and franchises for sale in the US, UK, Australia and worldwide

This **BusinessesForSale.com scraper** exports the listings of BusinessesForSale.com, one of the largest marketplaces of
businesses for sale, as clean rows: **title, asking price, revenue (turnover), cash flow or net profit, location,
feature tags, badges, summary, photo and link**, with every figure also read as a number (an exact amount, or the two
ends of a band such as `$100K - $250K`) and its currency. Search by **sector, place and feature** on the US, UK or
Australian site, search the **worldwide** site (every country's listings, Canada, the UAE, South Africa and Europe
included), or paste any BusinessesForSale.com results link.

- **Businesses for sale, franchise ads and M\&A Vault deals**: each row says which it is. Franchise and business-opportunity
  ads give their franchise fee, total investment (as a range), liquid capital, breakeven, lifestyle and management;
  M\&A Vault listings their revenue and profitability. Untick one box to get businesses only.
- **Every listing once per run**: a business found by two searches is delivered and charged once.
- **Nearby listings flagged**: when the site adds a listing from outside the place you searched, `nearby` says how far
  (`12.4 miles from Fort Worth, Texas`).

You pay per listing delivered. Searches without results and links that give nothing are free rows that say why. No
login, no start fee.

### What the BusinessesForSale.com scraper is for

- **Business buyers, search funds and investors**: run a sector-and-place search every day (restaurants in Texas,
  owner-financed businesses in Florida, cafes in Queensland) and get every new listing with its price and cash flow.
- **Business brokers and M\&A advisors**: comparable asking prices, revenue and profit by sector and region; who else
  is selling in your territory, price reductions, distressed and quick-sale listings.
- **Franchise consultants and franchisors**: franchise fees, total investment and liquid capital of the franchise ads
  in each region.
- **Market research**: how many businesses are for sale per sector and place (the site's own count is in every free
  search row), and what they ask.

### How the BusinessesForSale.com scraper works

1. Each sector × place × feature you choose becomes one BusinessesForSale.com search, built exactly as the site's own
   links write it (`/us/search/owner-financed-restaurants-for-sale-in-texas`). A pasted results link is walked as it
   is, from the page it points to.
2. The Actor reads the results pages the site serves to any visitor, 25 listings a page, following the site's own
   "Next" link until your maximum.
3. Each listing card becomes one row; the free search row says how many the site lists, how many were delivered,
   duplicates and skipped franchise ads.

### BusinessesForSale.com scraper input example

```json
{
  "site": "us",
  "sectors": ["restaurants", "cafes"],
  "locations": ["Texas", "Florida"],
  "features": ["owner-financed"],
  "includeFranchiseAds": false,
  "maxResultsPerSearch": 200
}
```

UK pubs in London: `{ "site": "uk", "sectors": ["pubs-bars-and-nightclubs"], "locations": ["London"] }`.
Worldwide online businesses: `{ "site": "worldwide", "sectors": ["online-businesses"], "maxResultsPerSearch": 500 }`.
From links: `{ "startUrls": ["https://us.businessesforsale.com/us/search/italian-restaurants-for-sale-in-chicago"] }`.

### BusinessesForSale.com data output example

One `listing` row (shortened):

```json
{
  "rowType": "listing",
  "id": "a3986335",
  "listingType": "business",
  "url": "https://us.businessesforsale.com/us/cajun-asian-franchise-for-sale-three-locations.aspx",
  "title": "Cajun/Asian Franchise For Sale - Three Locations",
  "summary": "Imagine owning a piece of the booming Cajun-Asian fusion market with this established LA Crawfish franchise opportunity featuring three profitable locations in Texas…",
  "location": "Edinburg, Texas, US",
  "nearby": null,
  "site": "us",
  "currency": "USD",
  "askingPrice": 1900000,
  "askingPriceMin": 1900000,
  "askingPriceMax": 1900000,
  "askingPriceText": "$1,900,000",
  "revenue": 2634758,
  "revenueText": "$2,634,758",
  "profit": 494654,
  "profitText": "$494,654",
  "profitLabel": "Cash Flow",
  "profitMarginPercent": null,
  "franchise": null,
  "badges": [],
  "tags": [],
  "financials": [
    { "label": "Asking Price", "value": "$1,900,000" },
    { "label": "Revenue", "value": "$2,634,758" },
    { "label": "Cash Flow", "value": "$494,654" }
  ],
  "imageUrl": "https://us.businessesforsale.com/uploadsstatic/a3986335mediumthumbnail.jpg?XA8JGg6srVDPDdWV30F9rA==",
  "searchUrl": "https://us.businessesforsale.com/us/search/restaurants-for-sale-in-texas",
  "position": 7,
  "scrapedAt": "2026-10-25T12:00:00.000Z"
}
```

A franchise ad carries `"listingType": "franchise"` and, instead of a price:

```json
"franchise": {
  "feeText": "$49,500",
  "totalInvestmentText": "$222,000 to $591,000",
  "totalInvestmentMin": 222000,
  "totalInvestmentMax": 591000,
  "investmentCurrency": "USD",
  "liquidCapitalText": "$175,000",
  "minimumInvestmentText": null,
  "breakeven": "3 Months",
  "lifestyle": ["Full time", "Part time"],
  "management": ["Owner Managed"]
}
```

#### BusinessesForSale.com listing fields (`rowType: listing`, charged)

| field | what it is |
|---|---|
| `id`, `url` | the site's listing id (`a…` business, `fst…` franchise ad, `mv…` M\&A Vault) and its page |
| `listingType` | `business`, `franchise`, `opportunity` (business-opportunity ad) or `m_and_a_vault` |
| `title`, `summary` | the card's title and teaser |
| `location`, `nearby` | where the business is; `nearby` when the site added it from outside the place searched |
| `site` | the site searched: `us`, `uk`, `australia` or `worldwide` |
| `currency` | ISO code of the figures (`USD`, `GBP`, `AUD`, `EUR`, `AED`…); `null` when no figure is given |
| `askingPrice`, `askingPriceMin`, `askingPriceMax`, `askingPriceText` | the exact price, or the band's ends (`Under $100K` has only a maximum), and the text as printed (`On request`) |
| `revenue`, `revenueMin`, `revenueMax`, `revenueText` | revenue (the UK and Australian sites call it Turnover) |
| `profit`, `profitMin`, `profitMax`, `profitText`, `profitLabel` | `Cash Flow` on the US and worldwide sites, `Net Profit` on the UK and Australian ones |
| `profitMarginPercent` | an M\&A Vault listing's profitability |
| `franchise` | a franchise or opportunity ad's fee, total investment, liquid capital, minimum investment, breakeven, lifestyle, management; else `null` |
| `badges` | `New`, `Updated`, `Price Reduced`, `Visa Ready`, `High Value` |
| `tags` | `Relocatable`, `Work From Home`, `Owner Financed`, `Lease`, `Leasehold`, `Real Property`, `Quick Sale`… |
| `financials` | every label and value the card prints |
| `imageUrl` | the listing's photo (`null` when the site shows only its stock sector picture) |
| `searchUrl`, `position` | the search the listing was found in and its place there |
| `scrapedAt` | when the run read it (UTC, ISO 8601) |

#### Free rows

- `search`: one per search or results link — `ok`, `no_results`, `not_a_list` (the site has no page for that sector
  or place), `blocked`, `not_searched` (spending limit) or `unreadable` — with the site's heading
  (`Restaurants For Sale in Texas`), its own count (`totalListed`; the franchise ads it mixes in are not counted), how
  many listings were delivered, duplicates and skipped franchise ads.
- `link`: a link that is not read, and why (a single listing page, another country site, a filtered search).

The run's `SUMMARY` record counts everything.

### BusinessesForSale.com scraper pricing

| event | price | when |
|---|---|---|
| `listing` | US$0.0008 | each listing delivered: a business, a franchise or opportunity ad, or an M\&A Vault listing |

1,000 listings cost US$0.80. Search rows and link rows are free. The run stops at your spending limit before it
delivers a listing it cannot charge.

### Sites, sectors, places and features

- **Sites**: `us` (us.businessesforsale.com), `uk`, `australia` and `worldwide` (www.businessesforsale.com, every
  country's listings, by sector and feature only). The other country sites (Canada, India, the UAE, France…) answer
  automated readers with a Cloudflare block, so the Actor does not read them; their listings appear on the worldwide
  site.
- **Sectors**: the site's own 13 sectors and their sub-sectors (Food › Restaurants, Online › Apps, Real Estate ›
  Self Storage…). The UK and Australian sites call Real Estate *Commercial Property*.
- **Places**: states, counties, regions and cities as the site names them (`Texas`, `Fort Worth`, `London`,
  `Queensland`). A place the site has no page for gives a free `not_a_list` row.
- **Features**: Owner Financed, Relocatable, Work From Home, Price Reduced, Distressed, Real Property, Freehold,
  Leasehold, Liquidation… Each site offers its own list; the input form says which.

### Limits

- **Listing pages are not read.** BusinessesForSale.com's firewall refuses automated readers on single listings (from
  data centers and residential addresses alike), so the full description, the broker and the seller's contact are
  not in the output: every row links to its page. The data is what the results cards show.
- The site's price, revenue and profit filters, its sort orders and its keyword search are query-string searches that
  its robots.txt closes to automated readers; filter the output instead (every figure is a number).
- Results come in the site's default order, with franchise ads mixed in, 25 a page.
- If the site stops answering (a Cloudflare block or rate limit), the run stops asking, ends successfully and the
  remaining searches are free `blocked` rows: run it again later.

### Is it legal to scrape BusinessesForSale.com?

This Actor reads only public results pages that BusinessesForSale.com shows to any visitor without an account, at a
visitor's pace, and only paths its robots.txt leaves open. It never logs in, never reads member areas and never solves
or bypasses a bot check. Listings may contain names of brokers or sellers' companies; if you store or contact them,
the data-protection rules of your country (GDPR, CCPA…) apply to you. Check BusinessesForSale.com's terms for your use.

This Actor is **unofficial** and is **not affiliated with, endorsed or sponsored by BusinessesForSale.com** or its
owners. BusinessesForSale.com is a trademark of its respective owner.

# Actor input Schema

## `site` (type: `string`):

Which BusinessesForSale.com site to search. <b>All countries</b> (www.businessesforsale.com) lists every country's businesses, Canada, the UAE, South Africa, Greece and the rest included, by sector and feature but not by place.

## `sectors` (type: `array`):

BusinessesForSale.com's own sectors and sub-sectors (<code>Restaurants</code>, <code>Cafes</code>, <code>Online › Apps</code>, <code>Services › Construction</code>…). Each sector is a separate search. Leave empty for every sector. For a deeper sub-sector (<code>Italian Restaurants</code>), open it on the site and paste the link below.

## `locations` (type: `array`):

States, counties, regions or cities as the site names them (<code>Texas</code>, <code>Fort Worth</code>, <code>Williamson County, Texas</code>, <code>London</code>, <code>Queensland</code>), one per line. Each place is a separate search, combined with each sector. A place the site has no page for gives a free row saying so. US, UK and Australian sites only. Up to 100.

## `features` (type: `array`):

Only listings the site tags with this feature: <code>Owner Financed</code>, <code>Relocatable</code>, <code>Work From Home</code>, <code>Price Reduced</code>, <code>Distressed</code>, <code>Real Property</code>, <code>Freehold</code>… Each feature is a separate search (a listing found by two is delivered once). Leave empty for all.

## `includeFranchiseAds` (type: `boolean`):

The site mixes franchisors' ads (<b>Franchise</b>, <b>Opportunity</b>: fee, total investment, liquid capital) into every results list. Untick to get only businesses for sale and M\&A Vault listings; skipped ads are counted in the free search row and not charged.

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

Results pages copied from the US, UK, Australian or worldwide site, one per line: any sector, place or feature page (<code>https://us.businessesforsale.com/us/search/italian-restaurants-for-sale-in-chicago</code>), from page 1 or a later page (<code>…-for-sale-3</code>). Listing pages, filtered searches with <code>?</code> in the link and the other country sites are not read; each gives a free row saying why. The form above searches too when you give it a sector, place or feature. Up to 5,000.

## `maxResultsPerSearch` (type: `integer`):

Stop each search (each sector × place × feature, and each link) after this many listings. The site shows 25 a page. The run's spending limit is respected too.

## Actor input object example

```json
{
  "site": "us",
  "sectors": [
    "restaurants"
  ],
  "locations": [
    "Texas"
  ],
  "includeFranchiseAds": true,
  "maxResultsPerSearch": 25
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

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

No description

# 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 = {
    "site": "us",
    "sectors": [
        "restaurants"
    ],
    "locations": [
        "Texas"
    ],
    "maxResultsPerSearch": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/businesses-for-sale-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 = {
    "site": "us",
    "sectors": ["restaurants"],
    "locations": ["Texas"],
    "maxResultsPerSearch": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/businesses-for-sale-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 '{
  "site": "us",
  "sectors": [
    "restaurants"
  ],
  "locations": [
    "Texas"
  ],
  "maxResultsPerSearch": 25
}' |
apify call steadyscrape/businesses-for-sale-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/businesses-for-sale-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/ORoC9A720Hg5LANB2/builds/WtrGavhmchWRhOlF3/openapi.json
