BizQuest Scraper $1๐ฐ Businesses, Franchises & Asset Listings
Pricing
from $1.00 / 1,000 listing results
BizQuest Scraper $1๐ฐ Businesses, Franchises & Asset Listings
From $1/1K. 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.
Pricing
from $1.00 / 1,000 listing results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
3
Monthly active users
20 days ago
Last modified
Categories
Share
BizQuest Scraper
Pull business-for-sale, franchise, and asset listings from BizQuest with the asking price, the location, the photos, and the listing broker's name and phone number where the listing shows them. Run it by filters (category, US state, asking price) or by pasting BizQuest search URLs. Every result is a flat JSON record with 50+ fields, ready to drop into a CRM, a deal pipeline, or a spreadsheet.
Why This Scraper
- 50+ fields per listing, including the broker contact block (broker name, phone, tracking phone, brokerage, profile link) that most BizQuest scrapers leave out.
- Asking price on nearly every card, plus cash flow, EBITDA, and lease terms wherever the listing discloses them, and franchise initial fee and capital where present.
- Two modes: filter search (category, state, asking price, keyword) or paste any BizQuest search or category URL.
- Optional full-detail mode (
includeDetails): adds ~30 more fields per listing, gross income, inventory, FF&E, full description, employee counts, reasons for selling, financing, and year established. - Fast and economical: the asking price, location, category, and broker contact all come from the listing index, so large pulls finish quickly and cost a fraction of heavier tools.
- Resilient connections: automatic exit-IP rotation, country failover (US then CA), and a backup route so long runs keep going.
- Nothing is dropped: every record keeps all of the listing's source fields under
raw, so new fields the site adds reach your dataset automatically. - Walks the whole catalogue by default.
maxPagesdefaults to0(unlimited) โ the run walks every result page, stopping on its own once the site's reported total is reached, a page comes back empty, or a page repeats content already served this walk. There is no artificial page-number ceiling; the only cap you need ismaxListings. maxListingsis the sole cap on volume (default20, so a first run is small and fast; set0for unlimited on paid plans).- Resumable runs. Set
resumeFromRunIdto a previous run or dataset id to collect only the listings that run doesn't already have (a delta) โ combine both datasets for the full set. Long unlimited runs also checkpoint their progress to the key-value store, so an Apify platform migration or a Resurrect of a failed run picks up where it left off instead of starting over. - Incremental & dedup mode for recurring monitoring. Turn on
incrementalModeto schedule this actor daily/weekly against the same search and get back only what changed โNEW,UPDATED,REAPPEARED, and (opt-in)EXPIREDlistings, instead of the full result set every time. See Incremental & Dedup Mode below.
Data You Get
Sample shape, values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
| id | 20000001 |
| title | Sample Established Service Company |
| url | https://www.bizquest.com/business-for-sale/sample-listing/BW20000001/ |
| askingPrice | 750000 |
| cashFlow | 220000 |
| ebitda | 180000 |
| category | Home & Garden |
| location | Florida |
| region | FL |
| stateName | Florida |
| leaseRatePerSquareFoot | null |
| realEstateIncludedInAskingPrice | false |
| isFranchise | false |
| brokerName | Jane Doe |
| brokerCompany | Sample Brokerage |
| brokerPhone | +10000000000 |
| tpnPhone | 0000000000 |
| brokerProfileUrl | /business-broker/sample-brokerage/jane-doe/BW00000/ |
| image | https://images.bizquest.com/shared/listings/000000000.jpg |
| hotProperty | false |
| recentlyAdded | true |
Plus images (array), locationCrumbs, categoryId, listingTypeId, adLevelId, sponsorLevelId, advertiserId, account, auction fields when present, the full contactInfo and diamondMetaData blocks, and the complete upstream item under raw.
With includeDetails on, each record also carries: grossIncome, inventory, ffe, employees (employeesFullTime / employeesPartTime), yearEstablished, buildingSquareFeet, summary, support, financingOptions, reasonsForSelling, competition, growth, fullDescription, leaseTerms, plus the full detail object under detailRaw. Cash flow and EBITDA fill in here too wherever the seller discloses them.
Note on financial fields: asking price, broker contact, location, and category come on nearly every search card. Cash flow, gross income, and EBITDA are published per listing rather than on the index, so they populate when you turn on includeDetails (and only where the seller discloses them).
How to Use
Search one state:
{"mode": "search","locations": ["Florida"],"maxPages": 3,"maxListings": 100,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Category plus state plus price band:
{"mode": "search","category": "Food & Beverage","locations": ["California"],"minPrice": 200000,"maxPrice": 800000,"maxPages": 5,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Several states at once:
{"mode": "search","locations": ["Texas", "Georgia", "Nevada"],"maxListings": 300}
Paste BizQuest URLs (filters are ignored in this mode):
{"mode": "url","urls": ["https://www.bizquest.com/businesses-for-sale-in-florida-fl/","https://www.bizquest.com/food-and-beverage-businesses-for-sale/"],"maxPages": 4}
Walk the whole catalogue for a state (no page cap, still bounded by maxListings):
{"mode": "search","locations": ["Florida"],"maxPages": 0,"maxListings": 0,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Resume a previous run, collecting only listings it doesn't already have:
{"mode": "search","locations": ["Florida"],"maxListings": 0,"resumeFromRunId": "<a previous run id or dataset id from this account>"}
Incremental & Dedup Mode
For scheduled, recurring runs against the same search (daily/weekly monitoring), turn on incrementalMode instead of pasting resumeFromRunId every time. The actor remembers its own baseline between runs (in a key-value store, never re-fetching from BizQuest to check), and classifies every listing it scans:
NEWโ never seen before for this search.UPDATEDโ a real field changed since last time (changedFieldslists exactly which ones).UNCHANGEDโ nothing changed. Suppressed by default (not returned, not billed) โ turn onemitUnchangedto get the full snapshot every run instead.REAPPEAREDโ was gone, is back.EXPIREDโ was tracked, is no longer found. Off by default (emitExpired) and only ever produced when a run does a complete scan of the tracked search โ never whenmaxListingscapped the run, orresumeFromRunId/ a mid-run checkpoint continuation was used, since neither of those proves the rest of the catalogue is actually gone.
{"mode": "search","locations": ["Florida"],"incrementalMode": true,"maxListings": 0,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }}
Every returned row gets changeType, changedFields, firstSeenAt, lastSeenAt added on top of the normal fields.
State is scoped per search. Two runs with different locations/category/keyword/sortBy/minPrice/maxPrice/urls/includeDetails never share a baseline โ each combination tracks its own listings independently. Set stateKey to name a campaign explicitly (useful if you want two differently-configured runs to deliberately share one baseline, or to keep a campaign's identity stable even if you tweak the search later). maxPages, maxListings, and maxNotifyListings are not part of the state key โ raising maxListings continues the same baseline instead of starting a fresh one and re-billing every listing as NEW.
maxListings caps listings SCANNED, not emitted, when incrementalMode is on. On a normal run, maxListings bounds how many rows are returned. On a quiet incremental run almost everything is UNCHANGED and suppressed โ if the cap kept counting emitted rows, the actor would keep walking the entire catalogue trying to backfill 20 changed listings that don't exist, defeating the point of incremental mode (and the cost savings). So under incrementalMode, the actor stops once it has examined maxListings listings, and returns whatever subset of those actually changed โ which on a quiet day can be far fewer than maxListings, or zero. If you set maxListings: 20 in incremental mode and get 3 rows back, that's expected: 20 were scanned, 3 had actually changed. Outside incrementalMode, maxListings behaves exactly as before (caps the rows returned).
A quiet run with nothing to report is normal, not an error. It logs a status message ("N listing(s) scanned, nothing changed since the last run") and returns zero rows โ it never pushes an error/placeholder dataset item (that would bill you for nothing happening).
Fields excluded from change detection (on purpose). A handful of BizQuest fields vary on their own โ clock, promotion, ranking, or ad-account driven โ with zero change to the actual business-for-sale content, so including them would mark nearly every listing UPDATED on every run:
| Field(s) | Why it's excluded |
|---|---|
tpnPhone, tpnPhoneExt | Call-tracking number, provisioned by a third-party vendor independent of listing content. |
recentlyAdded, recentlyUpdated, hotProperty, listingPriceReduced | Age-/promo-relative merchandising badges that decay purely with elapsed time, not with a content edit. |
adLevelId, sponsorLevelId, advertiserId, account | Ad-tier/placement metadata tied to the seller's subscription, not the listing's own data. |
searchOffset | This listing's rank position in the current result ordering โ moves whenever any other listing is added or reordered. |
askingPrice, cashFlow, ebitda, title, description, location, category, brokerName, and brokerCompany (and everything else not listed above) all still trigger UPDATED normally โ only the fields above are excluded, and they're excluded everywhere they appear (including duplicated inside contactInfo/raw), not just at the top level.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | search | search builds filtered URLs from the fields below; url walks pasted URLs. |
| category | string | (any) | Industry category dropdown (search mode). |
| locations | array | ["Florida"] | US states by name or two-letter code. One search runs per state. |
| keyword | string | Phrase to match in the title or description (applied after fetch). | |
| sortBy | string | (featured) | Server-side order: price or cash flow, low-to-high or high-to-low. Ranks the whole result set before paging. |
| minPrice / maxPrice | integer | Asking price band in USD. Listings with no disclosed price are excluded when set. | |
| urls | array | BizQuest search or category URLs (URL mode). | |
| includeDetails | boolean | false | Adds ~30 more fields per listing: gross income, inventory, FF&E, full description, employees, reasons for selling, financing. |
| maxPages | integer | 0 | Optional bound on result pages (50 listings each) walked per search/URL. 0 = walk the whole catalogue: stops on its own at the site's reported total, an empty page, or a page that repeats content already served this walk โ never an artificial page cap. Does not cap listing count; use maxListings for that. |
| maxListings | integer | 20 | The sole cap on total listings collected (max 100,000). 0 means unlimited. |
| resumeFromRunId | string | Optional id of a previous run (or dataset) of this actor. Listings already in that dataset are skipped, so this run returns only new listings (a delta). | |
| incrementalMode | boolean | false | Turn on for recurring/scheduled monitoring of the same search. Returns only NEW/UPDATED/REAPPEARED listings (and, opt-in, EXPIRED) instead of the full result set. See Incremental & Dedup Mode. |
| stateKey | string | Optional. Names the incremental-mode monitoring campaign explicitly; otherwise derived automatically from the search filters. | |
| emitUnchanged | boolean | false | Incremental mode only. Also return (and bill) listings that haven't changed, marked UNCHANGED. |
| emitExpired | boolean | false | Incremental mode only. Also return (and bill) listings no longer found, marked EXPIRED โ only after a complete, uncapped, non-resumed scan. |
| proxy | object | Residential US | Connection settings. Residential US is recommended. |
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape โ the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record โ not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Output Example
Sample shape, values are illustrative placeholders, not from a live listing.
{"id": 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.","askingPrice": 750000,"cashFlow": 220000,"ebitda": 180000,"category": "Home & Garden","categoryId": 316,"location": "Florida","region": "FL","stateName": "Florida","isFranchise": false,"brokerName": "Jane Doe","brokerCompany": "Sample Brokerage","brokerPhone": "+10000000000","tpnPhone": "0000000000","brokerProfileUrl": "/business-broker/sample-brokerage/jane-doe/BW00000/","image": "https://images.bizquest.com/shared/listings/000000000.jpg","images": ["https://images.bizquest.com/shared/listings/000000000.jpg"],"hotProperty": false,"recentlyAdded": true,"contactInfo": { "contactFullName": "Jane Doe", "brokerCompany": "Sample Brokerage" },"sourceUrl": "https://www.bizquest.com/businesses-for-sale-in-florida-fl/","scrapedAt": "2026-01-01T00:00:00.000000+00:00"}
Plan Requirement
BizQuest reliably admits US Residential connections. For dependable results, run on an Apify plan that includes Residential proxy (Starter or higher) and keep proxy.apifyProxyGroups set to ["RESIDENTIAL"] with country US. Datacenter and free-tier runs are admitted only intermittently; the actor will retry across many exit IPs and fall back to a backup route, but may still return few or zero results. When a run returns nothing, it writes a single record explaining how to switch to Residential.