BizQuest Scraper at a glance
BizQuest Scraper is a ready-to-run Apify actor from abotapi for collecting lead generation data. Its documented output includes id, title, asking price, cash flow and ebitda, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Lead Generation, Real Estate, Automation
- Pricing
- $1.70 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 27 options
Extract business-for-sale, franchise, and asset listings from BizQuest. Search by category, US state, asking price, or use BizQuest URLs. Returns 50+ fields, including asking price, location, photos, broker name and phone where available, ready for CRM, deal pipeline, or spreadsheet use.
What BizQuest Scraper $1💰 Businesses, Franchises & Asset Listings can do
- 50+ fields on every listing, including the full broker contact block (name, phone, brokerage, profile link), something many quick scrapers skip.
- Two ways to find listings. Filter by category, US state, keyword and asking price, or paste any BizQuest search or category URL and skip the filters entirely.
- Optional full detail mode. Turn on includeDetails for about 30 more fields per listing: gross income, inventory, FF&E, employee counts, reasons for selling, financing and year established.
- No page limit by default. maxPages defaults to unlimited, and the run stops on its own once the site's own reported total is reached. maxListings (default 20, 0 for unlimited) is the one cap you set.
- Two different ways to keep a search current. Resume one interrupted run from its run or dataset id, or turn on incremental mode to schedule the same search repeatedly and get back only what changed.
- Nothing is dropped. Every record keeps the complete source item under raw, so a field the site adds later still reaches your dataset without a code change.
Choose what to collect
These inputs let you configure BizQuest Scraper $1💰 Businesses, Franchises & Asset Listings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | How to find listings. 'search' builds filtered URLs from the fields below. 'url' walks BizQuest URLs you paste. |
categorystring | Industry category to filter by (search mode). Leave empty for all categories. |
locationsarray | US states to search, by name or two-letter code (e.g. "Florida" or "FL"). One server-side filtered search runs per state. Leave empty for nationwide. City-level filtering is best done in URL mode. |
keywordstring | Optional phrase to match in the listing title or description (applied after fetch). |
sortBystring | Server-side ordering of results (applied before pagination, so it ranks the whole result set). Default is the site's featured order. |
minPriceinteger | Only keep listings at or above this asking price. Listings with no disclosed price are excluded when set. |
maxPriceinteger | Only keep listings at or below this asking price. |
Show 20 more inputs
| Input | What it controls |
|---|---|
subCategorystring | Narrow to one BizQuest sub-category (e.g. Restaurants, Auto Body & Repair). A sub-category belongs to one parent category and replaces the Category choice above. Applied server-side through the site's own sub-category pages. |
minCashFlowinteger | Only listings whose disclosed cash flow is at or above this amount. Applied by BizQuest's own search server-side, so it narrows the whole result set before paging. The cash flow shown on the list page is often hidden by the site; turn on Fetch full listing details to see it where the seller discloses it. |
maxCashFlowinteger | Only listings whose disclosed cash flow is at or below this amount (server-side, same as Min cash flow). |
listedWithinDaysinteger | Only listings first posted in the last N days (for example 7 for new deals this week). Applied server-side before paging. |
establishedAfterYearinteger | Only businesses established in or after this year, e.g. 2015 (server-side). |
urlsarray | Paste BizQuest search, category, state, city, county or broker-profile URLs (nationwide, paginated page-N, mobile m. host and ?q= sort links included). Filter fields above are ignored in URL mode. Pagination continues from the page in the URL onward. A ?q= sort is applied; other ?q= filters, franchise pages and broker directories are skipped with a warning. Leave empty to use the example list. |
includeDetailsboolean | When on, adds ~30 extra fields per listing: gross income, inventory, FF&E, full description, employees, reasons for selling, financing, year established, and more. Runs concurrently and adds little time or cost. |
maxPagesinteger | Optional bound on result pages (50 listings each) walked per search/URL. Use 0 to walk the whole catalogue: the run stops on its own once the site's reported total is reached, a page comes back empty, or a page returns no new listings. This does NOT cap the number of listings; use Max listings for that. |
maxListingsinteger | Hard cap on listings across all searches (the main limit). Set 0 for no limit at all. |
resumeFromRunIdstring | Optional. ID of a previous run of this actor (or a dataset ID). Listings already in that dataset are skipped, so this run returns only NEW listings (a delta). Combine both runs' datasets for the full set. Max listings then counts only the new listings. For recurring daily/weekly monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs compare every listing against the last run (asking price, cash flow, EBITDA, title, description, location, category, broker details, photos and the other listing fields) and return only NEW, UPDATED and REAPPEARED listings, with an UPDATED row's changedFields naming what moved. Never compared, because they change with no real listing change: the scrape timestamp, call-tracking phone numbers, ad-tier and sponsor ids, the result-rank offset, and the age badges (recently added, recently updated, hot property, price reduced). Use What counts as a change to compare only price and cash-flow figures. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each category/location/keyword/sort/price/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search filters and detail setting, different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max listings capped it, or when Resume or a mid-run checkpoint continuation was used. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
expireAfterMissedScansinteger | Only used with Emit expired listings. A listing is marked EXPIRED only after it has been missing from this many complete scans in a row (default 1). Raise it (for example 3) so a listing that briefly drops out of the search results is not reported as gone. A listing that comes back resets the count. EXPIRED means the listing was no longer found in the search; it does not prove the business was sold or delisted. |
compactUpdatesboolean | Off by default. When on, UPDATED and EXPIRED rows are short: listing id, url, title, current asking price, cash flow and EBITDA, plus priceChanges showing the old and new value of each moved price field. NEW rows always carry the complete listing record. Detail enrichment is not billed for compact rows because they do not carry the detail data. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling (scrape time, call-tracking phone, ad-tier ids, result rank and age badges never trigger an UPDATED). Use this if another field turns out to be noisy in your setup, for example a photo list that rotates. A dotted name ignores a nested key: raw.img, contactInfo.contactPhoto, diamondMetaData.regionId. The raw block mirrors the upstream listing, so to ignore a value completely, ignore both its top-level field and its raw copy. Ignored fields are still returned in the output; they only stop counting as a change. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
idID (text)titleTitle (text)askingPriceAsking Price (number)cashFlowCash Flow (number)ebitdaEBITDA (number)categoryCategory (text)locationLocation (text)regionState (text)brokerNameBroker (text)brokerPhoneBroker Phone (text)urlURL (link)changeTypeChange (text)Show 22 more fields
changedFieldsChanged Fields (text)firstSeenAtFirst Seen (date)lastSeenAtLast Seen (date)brokerCompanyBrokerage (text)tpnPhoneTracking Phone (text)brokerProfileUrlProfile (text)grossIncomeGross Income (number)inventoryInventory (number)ffeFF&E (number)realEstateReal Estate (number)yearEstablishedYear Established (number)employeesFullTimeEmployees (full-time) (number)employeesPartTimeEmployees (part-time) (number)buildingSquareFeetBuilding Sq Ft (number)summarySummary (text)reasonsForSellingReason for Selling (text)competitionCompetition (text)growthGrowth (text)leaseTermsLease Terms (text)financingOptionsFinancing (text)fullDescriptionFull Description (text)detailFetchedDetail Fetched (boolean)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": 20000001,
"listNumber": 20000001,
"title": "Sample Established Service Company",
"url": "https://www.bizquest.com/business-for-sale/sample-listing/BW20000001/",
"description": "Recurring-revenue service company with a stable client base.",
"image": "https://images.bizquest.com/shared/listings/000000000.jpg",
"images": [
"https://images.bizquest.com/shared/listings/000000000.jpg"
],
"askingPrice": 750000,
"cashFlow": 220000,
"ebitda": 180000,
"location": "Florida",
"region": "FL",
"stateName": "Florida",
"category": "Home & Garden",
"categoryId": 316,
"isFranchise": false,
"brokerName": "Jane Doe",
"brokerCompany": "Sample Brokerage",
"brokerPhone": "+10000000000",
"brokerProfileUrl": "/business-broker/sample-brokerage/jane-doe/BW00000/",
"contactInfo": {
"contactFullName": "Jane Doe",
"brokerCompany": "Sample Brokerage"
},
"hotProperty": false,
"recentlyAdded": true,
"sourceUrl": "https://www.bizquest.com/businesses-for-sale-in-florida-fl/",
"scrapedAt": "2026-01-01T00:00:00.000000+00:00",
"raw": {
"header": "Sample Established Service Company",
"price": 750000,
"urlStub": "sample-established-service-company"
}
}Ways to use this data
- Business brokers and M&A advisors: track new listings and price movements across categories and states to feed a prospecting pipeline.
- Buy-side searchers and search funds: build a filtered deal-flow list by industry, price band or state, and monitor it on a schedule for new matches.
- Market researchers and analysts: measure asking price, cash flow and EBITDA trends across categories and regions over time.
- Franchise resale trackers: use the franchise fee and capital fields to watch franchise resale activity by category.
- Lead generation for lenders and service providers: use the broker contact fields to build outreach lists tied to active listings.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does BizQuest Scraper return?
The documented output for BizQuest Scraper includes id, title, asking price, cash flow, ebitda, category, location and state. Availability of each field depends on the source page and the selected mode.
How much does BizQuest Scraper cost?
It costs $1.70 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated listings, and unchanged ones are not billed. A quiet run that finds nothing changed still completes normally and simply returns zero rows, it is not an error.
Why did my incremental run return fewer rows than Max listings?
Under incremental mode, Max listings caps how many listings are scanned, not how many are returned. If most of what it scans is unchanged, it can legitimately return far fewer rows than the cap, or zero, on a quiet day.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
