# BusinessesForSale.com Scraper (`extract-labs/businessesforsale-scraper`) Actor

Scrape BusinessesForSale.com listings, search pages, and page ranges. Get asking prices, financials, descriptions, property details, business operations, listing status, and broker information in clean JSON, CSV, or Excel records.

- **URL**: https://apify.com/extract-labs/businessesforsale-scraper.md
- **Developed by:** [Extract Labs](https://apify.com/extract-labs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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** turns listing links and search pages into
clean, structured business-for-sale data. Each successful listing is saved to
your Apify Dataset as soon as it's ready.

Just add your BusinessesForSale.com links and start the run. There is no proxy
or technical setup for you to manage.

We also remove duplicates automatically. If the same listing appears in your
input or on more than one search page, we save it once per run. This keeps your
Dataset clean and prevents duplicate result charges.

### What this scraper collects

The output keeps the same labels used on the listing page. Depending on what
the seller has shared, a result can include:

- Listing ID, title, location, and full description
- Asking Price, Sales Revenue, and Cash Flow, using the page's own labels
- Property Information
- Business Operation details
- Other Information, including training and financing
- Seller reference, listing status, and broker information

If the page doesn't show a value, we leave it out instead of guessing.

### How to use it

You don't need to write JSON or know how to code:

1. Open the **Input** tab and keep **Form** selected.
2. Paste a link into **BusinessesForSale.com URLs**.
3. Click **Start**.

We'll take it from there.

#### 1. One or several listings

Paste the listing link into **BusinessesForSale.com URLs**:

```text
https://canada.businessesforsale.com/canadian/long-est-full-service-towing-and-recovery-business.aspx
```

To collect several listings in the same run, paste the first link, click
**+ Add**, and paste the next one. Put each listing in its own field. You can
add up to 100 links at a time.

#### 2. One or several search-results pages

Set your filters on BusinessesForSale.com and copy the search-page link from
your browser. We'll collect every business shown on that page and open each
listing for its full details:

```text
https://us.businessesforsale.com/us/search/last-14-days-manufacturing-businesses-for-sale
```

To collect several search pages in the same run, paste the first search-page
link, click **+ Add**, and paste the next one. Put each search page in its own
field. We'll remove any listing that appears in more than one search.

#### 3. One or several page ranges

To collect several pages, replace the page suffix with a range such as
`-[1-3]`:

```text
https://us.businessesforsale.com/us/search/last-14-days-manufacturing-businesses-for-sale-[1-3]
```

We'll process page 1, then page 2, and then page 3. You can request up to 100
pages in one range. To collect several ranges in the same run, click **+ Add**
and put each range link in its own field.

You can also mix listing links, search pages, and page ranges in one run.

### Output

Open the run's **Dataset** tab to view or download results as JSON, CSV, or
Excel. This is a preview of one result; you don't need to create it yourself.

```json
{
  "URL": "https://canada.businessesforsale.com/canadian/long-est-full-service-towing-and-recovery-business.aspx",
  "Listing ID": "3956504",
  "Title": "Long-est. Full-service Towing & Recovery Business For Sale",
  "Location": "Not Disclosed, Ontario, Canada",
  "Asking Price": "$2,400,000 (CAD) Furniture / Fixtures included",
  "Sales Revenue": "$1,233,255 (CAD)",
  "Cash Flow": "$587,998 (CAD)",
  "Business Operation": {
    "Management type": "This business is owner operated.",
    "Reasons for selling": "Owners retiring.",
    "Employees": "5 FT/1 PT",
    "Years established": "35"
  },
  "Listed by": {
    "Name": "Murphy Business & Financial",
    "Profile URL": "https://us.businessesforsale.com/us/agents/murphy-business-and-financial",
    "Listings": "View 454 Murphy Business & Financial listings"
  }
}
```

### During a run

- Each successful listing is saved right away.
- If you stop the run, completed listings stay in your Dataset.
- Duplicate listings are saved and charged once per run.
- Failed listings are not stored as empty or misleading results.

### For developers

You can run the Actor through the Apify API using `startUrls` and read completed
records from the default Dataset.

### Frequently asked questions

#### Do I need to know how to code?

No. Keep **Form** selected, paste your links, and click **Start**.

#### Do I need to set up a proxy?

No. There are no proxy settings in the input form.

#### What happens if the same listing appears more than once?

We remove duplicates automatically and charge a successful listing once per
run.

#### Can I add several search pages to one run?

Yes. Click **+ Add** and paste each search page into its own URL field. You can
also combine separate search pages with page ranges.

#### Why is a field missing?

We collect what the public listing shows. If a seller hasn't provided a value,
we leave that field out.

### Need help?

Send us the public BusinessesForSale.com URL and your Apify run ID. Please
don't include passwords, tokens, or anything private. We'll check what
happened.

# Actor input Schema

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

Paste a listing or search-page link. Click + Add to include more listing or search-page links in the same run. You can also use a page range such as -\[1-3].

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://canada.businessesforsale.com/canadian/long-est-full-service-towing-and-recovery-business.aspx"
    }
  ]
}
```

# Actor output Schema

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

Collected listing details.

# 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://canada.businessesforsale.com/canadian/long-est-full-service-towing-and-recovery-business.aspx"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("extract-labs/businessesforsale-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://canada.businessesforsale.com/canadian/long-est-full-service-towing-and-recovery-business.aspx" }] }

# Run the Actor and wait for it to finish
run = client.actor("extract-labs/businessesforsale-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://canada.businessesforsale.com/canadian/long-est-full-service-towing-and-recovery-business.aspx"
    }
  ]
}' |
apify call extract-labs/businessesforsale-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,extract-labs/businessesforsale-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/ddMXKTc73cQhB5nWJ/builds/VZUOxR6ZFeX9tvUi6/openapi.json
