# BizQuest Franchises For Sale Scraper (`datacach/bizquest-franchises-for-sale-scraper`) Actor

Scrapes franchise brands for sale from BizQuest: name, min liquid capital, franchise fee, total investment range, unit counts, average unit revenue and the states where each franchise is available.

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

## Pricing

from $0.99 / 1,000 franchises

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Scrape **franchise opportunities for sale** from [BizQuest](https://www.bizquest.com/franchise-for-sale/) and export them to JSON, CSV, or Excel — no code required. **Free and Premium (paying) Apify accounts get different run limits** — see the comparison below before you configure Locations, Industries, or Investment amounts.

### What does BizQuest Franchises For Sale Scraper do?

BizQuest Franchises For Sale Scraper extracts franchise brand listings from [BizQuest's franchise directory](https://www.bizquest.com/franchise-for-sale/), the franchise-opportunities section of one of the largest business-for-sale marketplaces in the United States. It returns roughly **1,877 franchise brands**, each with investment figures — minimum liquid capital, franchise fee, total investment range — unit counts, and the list of US states (and Canada) where the franchise is currently available. Just click **Run** to pull the whole catalog, or narrow it down with location, industry, and investment filters first.

### Free vs Premium: what's the difference?

This Actor checks whether your Apify account is on a **free** or **paid (Premium)** plan and automatically caps cost-driving inputs on free runs. The reason is simple: **Locations**, **Industries**, and **Investment amounts** all combine as a cartesian product — pick 3 locations and 2 industries and the run has to walk 6 separate BizQuest listing-page combinations instead of 1. A free run is limited to a single filter combination (**"one facet"**) per input so it can't multiply into an expensive crawl; a paid run has no such ceiling.

| Limit | Free plan | Premium (paid) plan |
|---|---|---|
| Maximum franchises (`maxItems`) | 50 franchises max | Unlimited (`0` = whole catalog, ~1,877 brands) |
| Locations | 1 location | All 52 (Canada + 50 US states + Washington DC) |
| Industries | 1 industry | All 25 |
| Investment amounts | 1 investment bracket | All 19 |
| Start URLs | 1 start URL | Unlimited |
| Maximum concurrency | 5 concurrent requests | Up to 50 |

If you select more than the free-plan cap allows — say 3 locations and 2 industries — the Actor silently keeps only the first item(s) it's allowed to use and **logs exactly what it reduced**, so you're never left guessing why your run returned less than expected:

```
Free plan reduced your input: locations 3 -> 1; industries 2 -> 1
```

Every input field below that carries a free-plan cap says so explicitly in its description. Upgrading to a paid Apify plan removes all six limits — you can then combine every location, industry, and investment bracket at once, or scrape the entire ~1,877-brand catalog in a single unlimited run.

### Why use BizQuest Franchises For Sale Scraper?

- **Franchise brokers** building prospect and lead lists can pull every brand available in a given state or investment bracket instead of clicking through BizQuest's directory by hand.
- **Investors comparing brackets** can filter by investment amount to see which brands fit a target liquid-capital range before reaching out to any of them.
- **Market researchers** tracking unit growth can capture `total_units`, `franchised_units`, and `company_owned_units` on a schedule and watch how a brand's footprint changes over time.

### How to use BizQuest Franchises For Sale Scraper

1. Open the Actor in the [Apify Console](https://console.apify.com/) and go to the **Input** tab.
2. Pick filters — **Locations**, **Industries**, **Investment amounts** — or leave all three empty to scrape the entire catalog. Remember: on a free plan, only the first value picked in each field is used.
3. Set **Maximum franchises** to a small number like `10` for a first test run, or `0` for no limit (unlimited requires a paid plan; free runs are capped at 50 regardless).
4. Click **Run**.
5. When the run finishes, open the **Output** tab and export your results as JSON, CSV, HTML, or Excel, or pull them through the **Apify API**.

### Input

Every field is optional and pre-filled with a working default. Fields marked **Free plan cap** are automatically clamped down when the run is made from a free (non-paying) Apify account.

| Field | Description | Default | Free plan cap |
|---|---|---|---|
| **Locations** | Only return franchises available in these US states (or Canada). Leave empty for all of them. | `[]` (all) | 1 location |
| **Industries** | Only return franchises in these BizQuest categories, such as Pet or Food & Restaurant. Some options are attributes rather than sectors — Home Based, Veteran's, SBA Approved, Cheap Franchises, Top Franchises, High Capital, Master Franchises, and Multi Unit. | `[]` (all) | 1 industry |
| **Investment amounts** | Only return franchises within these investment brackets. Each bracket is an upper bound, so `$50,000` means franchises costing up to $50,000, ranging from "Less than $10,000" up to "$500,000 +". | `[]` (all) | 1 bracket |
| **Start URLs** | Specific BizQuest franchise listing pages to scrape directly, instead of relying on the filters above. | `[]` | 1 URL |
| **Maximum franchises** | Stop the run once this many franchises have been collected. `0` means no limit — the full catalog of roughly 1,877 brands. | `100` | 50 franchises |
| **Delay between requests** | Seconds to pause between page requests. Raise this if the run starts logging HTTP 403 errors. | `0` | — |
| **Maximum concurrency** | How many pages to fetch at the same time. Lower this together with raising the delay if you hit HTTP 403 errors. | `10` | 5 concurrent requests |
| **Proxy configuration** | Not needed for normal runs. Enable only for repeated full-catalog scrapes or if you see HTTP 403 errors. | Apify Proxy off | — |

Locations, Industries, and Investment amounts combine — picking Texas and Pet returns pet franchises available in Texas. That combination is exactly why the free-plan caps exist: each extra filter selection multiplies how many listing pages the run has to walk.

### Output

Each franchise brand is stored as one dataset item. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
  "franchise_id": 16200,
  "name": "Woof Gang Bakery & Grooming",
  "url": "https://www.bizquest.com/woof-gang-bakery-and-grooming-franchise-for-sale/",
  "min_liquid_capital": 100000,
  "investment_min": 184420,
  "investment_max": 506620,
  "total_units": 288,
  "headquarters": "Orlando, FL",
  "available_states": ["AL", "NE", "NV", "NH", "..."],
  "franchised_in_canada": false,
  "training_and_support": true,
  "financing_available": true,
  "extraction_datetime": "2026-08-08T04:53:45.378140+00:00",
  "extraction_date": "08-08-2026"
}
```

### Data fields

| Field | Description |
|---|---|
| `franchise_id` | BizQuest's internal numeric ID for the brand |
| `name` | Franchise brand name |
| `slug` | URL slug used on BizQuest |
| `url` | Direct link to the franchise's listing page |
| `description` | Short brand description |
| `categories` | Industry categories the brand is listed under |
| `min_liquid_capital` | Minimum liquid capital required, in USD |
| `min_franchise_fee` | Franchise fee, in USD |
| `net_worth_required` | Minimum net worth required, in USD |
| `investment_min` / `investment_max` | Total investment range, in USD |
| `total_units` | Total number of units (locations) |
| `franchised_units` | Number of franchisee-owned units |
| `company_owned_units` | Number of company-owned units |
| `new_units_opened` | New units opened, when disclosed |
| `average_unit_revenue` | Average revenue per unit, when disclosed |
| `franchising_since` | Year the brand started franchising |
| `headquarters` | Headquarters city and state |
| `website` | Brand's own website |
| `available_states` | US states (and Canada) where the franchise is currently available |
| `franchised_in_canada` | Whether the brand franchises into Canada |
| `training_and_support` | Whether training and support are offered |
| `financing_available` | Whether financing options are offered |
| `multi_units` | Whether multi-unit ownership is offered |
| `logo` | Brand logo image URL |
| `latest_data_year` | Year the financial figures were reported for |
| `extraction_datetime` | UTC timestamp when the item was extracted (ISO 8601) |
| `extraction_date` | Extraction date in `mm-dd-yyyy` format |

### How much does a BizQuest franchise scrape take?

The full BizQuest franchise catalog is about **1,877 brand pages, one request each**, so a complete run makes a predictable, bounded number of requests regardless of which filters you apply — filters just narrow which pages get fetched. A quick test run with **Maximum franchises** set to `10` finishes in well under a minute. A free-plan run, capped to a single location, industry, and investment bracket combination and 50 franchises, finishes even faster. Set **Maximum franchises** on your first run to see exactly how long a full-size run takes before committing to one.

### Tips

- **Leave every filter empty** to take the fastest path to the whole catalog: with no Locations, Industries, or Investment amounts set, the Actor reads BizQuest's own franchise sitemap in a single request instead of walking filtered listing pages one by one. (On a free plan this still returns only the first 50 franchises found.)
- **Raise the delay and lower the concurrency** if you start seeing HTTP 403 errors in the run log — that means BizQuest is throttling your IP. Free-plan runs are already capped at 5 concurrent requests for this reason.
- **Combine filters deliberately.** Locations, Industries, and Investment amounts all combine with each other, so picking several of each can multiply the number of listing pages the run has to fetch — which is exactly what the free-plan single-facet cap prevents.
- **Watch the run log for "Free plan reduced your input"** — it tells you precisely which fields got clamped and from what to what, so nothing is silently dropped without explanation.
- **Apify's scheduling and integrations** — available to any Actor on the platform, not built into this one — let you run this scraper on a recurring schedule and pipe fresh results into Google Sheets, Slack, Zapier, Make, or a webhook straight from the Apify Console.

### FAQ, disclaimers and support

**What's the difference between free and paid runs of this Actor?** Free (non-paying) Apify accounts get one location, one industry, one investment bracket, one start URL, up to 50 franchises, and 5 concurrent requests per run. Paid accounts have none of those caps — see the [Free vs Premium](#free-vs-premium-whats-the-difference) table above for the full breakdown and the reasoning behind each limit.

**Is it legal to scrape BizQuest?** This Actor collects only publicly available franchise-listing data. Scraping legality depends on your jurisdiction and how you use the data — review BizQuest's Terms of Service and take your own legal advice before commercial use.

**Does this Actor collect personal data?** No. It extracts only franchise-brand and investment data — no broker names, no executive or CEO names, and no phone numbers. BizQuest's underlying data does include a CEO name field, but this Actor deliberately never emits it, so no dataset item ever contains it.

**Does this Actor schedule runs or resume interrupted crawls on its own?** No — each run is a single, self-contained scrape from start to finish. Scheduling, monitoring, and third-party integrations are features of the Apify platform itself, available to any Actor you run there.

Found a bug, or need a field this Actor does not extract yet? Open a ticket in the **Issues** tab on the Actor's page.

# Actor input Schema

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

Only return franchises available in these places. Leave empty for all of them. Picking several locations and several industries scrapes every combination of the two. Free plan runs use only the first location you pick.

## `industries` (type: `array`):

Only return franchises in these categories. Leave empty for all of them. Some options are attributes rather than sectors — 'Home Based', 'Veteran's', 'SBA Approved', 'Cheap Franchises', 'Top Franchises', 'High Capital', 'Master Franchises' and 'Multi Unit' are BizQuest's own filter categories, not industries. Free plan runs use only the first industry you pick.

## `investmentAmounts` (type: `array`):

Only return franchises within these investment brackets. Each bracket is an upper bound, so '$50,000' means franchises costing up to $50,000. Free plan runs use only the first investment amount you pick.

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

Specific BizQuest franchise listing pages to scrape, for example https://www.bizquest.com/franchise-for-sale/pet-franchises-in-texas-tx/. Paste listing pages, not individual franchise pages. Leave empty to rely on the filters above. Free plan runs use only the first start URL you provide.

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

Stop the run once this many franchises have been collected. Set to 0 for no limit, which scrapes the full catalog of roughly 1,900 brands. Keep this low while testing so runs finish quickly. Free plan is capped at 50.

## `requestDelaySeconds` (type: `integer`):

How long to pause between page requests. The default of 0 runs at full speed. Raise it if the run starts logging HTTP 403 errors, which means BizQuest is throttling your IP.

## `maxConcurrency` (type: `integer`):

How many pages to fetch at the same time. Lower this together with raising the delay if you hit HTTP 403 errors. Free plan is capped at 5.

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

This Actor does not need a proxy for normal runs. Enable one only if you are scraping the full catalog repeatedly or seeing HTTP 403 errors.

## Actor input object example

```json
{
  "locations": [],
  "industries": [],
  "investmentAmounts": [],
  "startUrls": [
    {
      "url": "https://www.bizquest.com/franchise-for-sale/pet-franchises-in-texas-tx/"
    }
  ],
  "maxItems": 100,
  "requestDelaySeconds": 0,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://www.bizquest.com/franchise-for-sale/pet-franchises-in-texas-tx/"
        }
    ],
    "maxItems": 100,
    "requestDelaySeconds": 0,
    "maxConcurrency": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("datacach/bizquest-franchises-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 = {
    "startUrls": [{ "url": "https://www.bizquest.com/franchise-for-sale/pet-franchises-in-texas-tx/" }],
    "maxItems": 100,
    "requestDelaySeconds": 0,
    "maxConcurrency": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("datacach/bizquest-franchises-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 '{
  "startUrls": [
    {
      "url": "https://www.bizquest.com/franchise-for-sale/pet-franchises-in-texas-tx/"
    }
  ],
  "maxItems": 100,
  "requestDelaySeconds": 0,
  "maxConcurrency": 10
}' |
apify call datacach/bizquest-franchises-for-sale-scraper --silent --output-dataset

```

## MCP server setup

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