# BizQuest Scraper: Businesses for Sale with Financials (`firsthand/bizquest-scraper`) Actor

BizQuest scraper: US businesses for sale by keyword, state, city and industry with asking price and location. Add seller or broker name and phone, cash flow, revenue, year established and reason for selling. Filter by price, cash flow and listing age. From $0.0005 per listing.

- **URL**: https://apify.com/firsthand/bizquest-scraper.md
- **Developed by:** [Firsthand](https://apify.com/firsthand) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 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

## BizQuest Scraper: Businesses for Sale with Financials

Export US businesses for sale from [BizQuest](https://www.bizquest.com) by keyword, state, city and industry: asking price, location, listing type and the seller or broker. Turn on listing details for the contact name and phone, industry, cash flow, gross revenue, year established, employees, reason for selling, financing and the full seller write-up. Filter by price, cash flow, revenue and listing age the same way as on the site, or paste BizQuest search links. Download as Excel, CSV or JSON, or call the Actor through the API.

### What you get

- **Listing**: title, asking price, location and state, listing type (established business, asset sale, startup, real estate for sale or lease), short summary, price reduced and recently added flags, photos, link to the BizQuest page. Industry, contact name and phone come with the search row for part of the listings (often on searches without a keyword) and for every listing with details on.
- **With "Add cash flow, revenue and seller write-up" on**, each listing adds: industry, contact name and phone, broker company and profile link, cash flow (when the seller shows it), gross revenue, EBITDA, inventory and FF\&E with whether they are included in the price, year established, full-time and part-time employees, building size, the full description, reason for selling, facilities, competition, growth, support and training, financing options, county, and the street address and ZIP code when the seller shows them.

Fields stay empty when the seller does not disclose them; many sellers hide cash flow or the address until a buyer signs an NDA.

### How to use it

1. Type keywords (`laundromat`, `HVAC`, `car wash`) and locations (`Texas`, `CA`, `Austin, TX`). Every keyword runs in every location; leave locations empty for the whole US.
2. Optional filters: industry, listing types, asking price, cash flow and gross revenue ranges, listed within N days, established after a year.
3. Or paste search or industry links from bizquest.com with your filters already set. Links run first and keep their own filters; clear keywords and locations if you want only the links.
4. Run and download the dataset.

### BizQuest businesses for sale by state and city

Put one or more states or cities in `locations`: `Florida`, `California`, `Colorado`, `NJ` or `Miami, FL`. With an empty keyword the Actor lists every business for sale there; with a keyword such as `laundromat` it returns only laundromats for sale in those places, each with the asking price and, with details on, the cash flow and revenue.

### BizQuest export to Excel and CSV

Every run saves a table you can download as Excel, CSV, JSON or HTML from the Storage tab, or fetch through the Apify API. One row is one BizQuest listing, in the same order as on the site.

### Example output

```json
{
  "id": "2475900",
  "title": "Iconic 40 year established restaurant for sale in South Cape!!",
  "askingPrice": 445000,
  "location": "Cape Coral, FL",
  "state": "FL",
  "industry": "Food & Beverage",
  "listingType": "established business",
  "summary": "Full Service Restaurant, equipped with 110 seats. Price Reduction!",
  "contactName": "Ron DeMuro",
  "contactPhone": "(239) 699-5506",
  "priceReduced": true,
  "url": "https://www.bizquest.com/business-for-sale/iconic-40-year-established-restaurant-for-sale-in-south-cape/BW2475900/",
  "cashFlow": 248000,
  "grossRevenue": 1185000,
  "inventory": 20000,
  "ffe": 300000,
  "inventoryIncludedInPrice": true,
  "yearEstablished": 1986,
  "fullTimeEmployees": 12,
  "buildingSquareFeet": 4000,
  "reasonForSelling": "Family Health.",
  "support": "Owners will help in the transition.",
  "financing": "Seller will hold a note with at least $400k down.",
  "city": "Cape Coral",
  "county": "Lee County",
  "postalCode": "33904"
}
```

### Pricing

Pay per result, no monthly fee and no start fee of our own:

| What | Price |
|---|---|
| Listing row (price, location, type, summary, link) | $0.0005 |
| Contact, industry, cash flow, revenue and seller write-up from the listing page | $0.0005 per listing |

1,000 listings cost $0.50, or $1.00 with listing details. You pay only for rows in your dataset; a listing already returned in the same run is not charged twice, and an empty listing page is not charged. Set "Maximum cost per run" in the run options to cap the spend.

### BizQuest API for developers

Start the Actor through the Apify API or the Python and JavaScript clients and read the dataset when it finishes. Listing details are off when `includeDetails` is missing from the input. Input example:

```json
{
  "keywords": ["laundromat"],
  "locations": ["Texas", "Florida"],
  "priceMax": 1000000,
  "cashFlowMin": 100000,
  "includeDetails": true,
  "maxItems": 500
}
```

Inputs written for other BizQuest actors on Apify also work: `filterKeyword`, `filterLocation`, `filterPriceMin`, `filterPriceMax`, `filterCashFlowMin`, `filterCashFlowMax`, `filterListingAgeDays`, `includeListingDetails`, `keyword`, `location`, `state`, `industry`, `listingType`, `listedWithinDays`, `dateListingAdded`, `enrichDetails`, `searchUrl`, `searchUrls`, `startUrl` and `results_wanted` are read as the matching fields.

### Good to know

- `New York, NY` on BizQuest is the whole state; for the city use a borough such as `Brooklyn, NY`.
- Industry names follow the BizQuest list (`Restaurants`, `Car Wash`, `Coin Laundry & Laundromat`). For a narrow trade such as HVAC, a keyword finds more than an industry.
- Keywords search the whole listing text on BizQuest, so `restaurant` also finds listings that only mention a restaurant nearby. Combine a keyword with an industry for tighter results.
- BizQuest shows up to 10,000 listings for one search; split very broad searches by state.
- Links to single listing pages are skipped; paste search result links instead.
- A place BizQuest does not know (a misspelled city, for example) is skipped with a warning in the log instead of returning listings from all of the US. Some small towns have no page of their own on BizQuest; use their county instead, for example `St. Charles County, MO`.
- Sellers often hide cash flow; with details on, the listing is still charged for the other details it adds (revenue, write-up, reason for selling), and `cashFlow` stays empty.
- The Actor reads public BizQuest listings only. Contact sellers and brokers in line with the rules for business contact in your country.

# Actor input Schema

## `keywords` (type: `array`):

What you would type in the BizQuest keyword box, for example 'laundromat', 'HVAC' or 'car wash'. Every keyword runs in every location. Empty lists all businesses.

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

US states or cities with the state code, for example 'Texas', 'CA' or 'Austin, TX'. Empty searches the whole country.

## `category` (type: `string`):

BizQuest industry name, for example 'Restaurants', 'Retail Stores', 'Auto & Automotive' or 'Health & Medical'. Empty means all industries.

## `listingTypes` (type: `array`):

Which BizQuest listing types to include. Empty means established businesses, business assets and business real estate (the site default).

## `priceMin` (type: `integer`):

US dollars. Empty or 0 means no limit.

## `priceMax` (type: `integer`):

US dollars. Empty or 0 means no limit.

## `cashFlowMin` (type: `integer`):

US dollars. Empty or 0 means no limit.

## `cashFlowMax` (type: `integer`):

US dollars. Empty or 0 means no limit.

## `revenueMin` (type: `integer`):

US dollars. Empty or 0 means no limit.

## `revenueMax` (type: `integer`):

US dollars. Empty or 0 means no limit.

## `listedWithinDays` (type: `integer`):

Only listings added in the last N days, for example 7 or 30. Empty means any time.

## `establishedAfterYear` (type: `integer`):

Only businesses established after this year.

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

Search result pages copied from bizquest.com with your filters, for example https://www.bizquest.com/businesses-for-sale-in-texas-tx/?q=... A link keeps its own filters; links run before keywords and locations, so clear those fields if you want only the links. Single listing pages are not supported.

## `includeDetails` (type: `boolean`):

Opens each listing for the contact name and phone, industry, cash flow, gross revenue, EBITDA, inventory, FF\&E, year established, employees, reason for selling, facilities, financing and the full description. Charged once per listing. Off when the field is missing from an API call.

## `maxItems` (type: `integer`):

Listings in total across all keywords, locations and links. 100 if empty, 0 means no limit.

## `maxItemsPerQuery` (type: `integer`):

Limit for each keyword in each location and for each link (the site shows up to 10,000). Empty or 0 means no limit.

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

BizQuest search pages work without a proxy. Turn Apify Proxy on only if runs get refused.

## Actor input object example

```json
{
  "keywords": [
    "restaurant"
  ],
  "locations": [
    "Florida"
  ],
  "includeDetails": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "restaurant"
    ],
    "locations": [
        "Florida"
    ],
    "includeDetails": true,
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("firsthand/bizquest-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 = {
    "keywords": ["restaurant"],
    "locations": ["Florida"],
    "includeDetails": True,
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("firsthand/bizquest-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 '{
  "keywords": [
    "restaurant"
  ],
  "locations": [
    "Florida"
  ],
  "includeDetails": true,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call firsthand/bizquest-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,firsthand/bizquest-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/hSYVEG3cWrG8q1yru/builds/HGRrBZiozgWIRd1Wi/openapi.json
