Businesses For Sale — BizBuySell, BizQuest, BusinessesForSale
Pricing
from $127.50 / 1,000 deal feed returneds
Businesses For Sale — BizBuySell, BizQuest, BusinessesForSale
Find businesses to buy: aggregate business-for-sale and M&A listings from BizBuySell, BizQuest, DealStream, and BusinessesForSale into one normalized, deduplicated deal feed. Filter by sector, location, asking price and revenue; get price, revenue, cash flow, broker and source link per listing.
Pricing
from $127.50 / 1,000 deal feed returneds
Rating
0.0
(0)
Developer
Scott Helvick
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
2
Monthly active users
2 days ago
Last modified
Categories
Share
Businesses For Sale — DealStream, BizQuest, BusinessesForSale, BizBuySell
Buying a business means tab-hopping across a dozen broker marketplaces, each with its own layout, currency, and price formatting. This Actor aggregates business-for-sale and small-M&A listings from multiple broker marketplaces into one normalized, deduplicated acquisition deal feed — structured asking price, revenue, cash flow, sector, location, and broker, plus a link back to each source listing — so acquirers, search funds, and brokers screen acquisition deal flow in a single pass.
One run returns listings like this:
{"title": "Profitable SaaS Business with Recurring Revenue","askingPriceUsd": 1200000,"revenueUsd": 850000,"cashFlowUsd": 300000,"sector": "Software & Technology","location": "California, United States","source": "bizquest","sourceUrl": "https://www.bizquest.com/business-for-sale/profitable-saas/abc123"}
The input is prefilled to pull software and e-commerce deals under $5M across all four marketplaces — the first run needs zero setup, so just start it.
What this does
- Pulls listings from multiple broker marketplaces in one run — currently DealStream, BizQuest, BusinessesForSale, and BizBuySell — and merges them into a single structured dataset.
- Returns structured financial facts per listing: asking price (USD), annual revenue, cash flow / SDE, sector, location, broker, and the canonical source URL.
- Filters across all sources at once: by sector/industry, location, asking-price range, and minimum revenue — so you screen the whole field with one set of criteria.
- Deduplicates by source + listing id, returning a clean, agent-ready feed.
- Facts-first, link-out: each record carries the structured facts plus a short summary and a link to the full listing on its source — it points you to the deal, it doesn't rehost the seller's full write-up or photos.
- Built agent-first: one structured dataset record per listing, designed to be filtered and ranked by an LLM or a downstream pipeline.
Why a normalized multi-source feed matters
The business-for-sale market is fragmented across many independent and franchise-broker marketplaces, each siloed behind its own search UI. Single-site scrapers hand you one marketplace in that marketplace's raw shape — you still do the cross-source merge, currency normalization, and dedup by hand. The value here is the layer above the single-site scrape: consistent fields across sources, USD-normalized prices, dedup, and one filter pass — the part that's tedious and brittle to build yourself, and that no single-site scraper provides.
How it compares to single-site scrapers
| Single-site scraper | Business For Sale Aggregator | |
|---|---|---|
| Sources per run | one marketplace | multiple marketplaces |
| Output shape | each site's raw fields | one normalized schema |
| Price | as-displayed (mixed currencies) | USD-normalized (non-USD left explicit) |
| Cross-source dedup | none | yes |
| Filtering | per-site | unified across sources |
| Use | scrape one site | screen the whole field |
Input
| Field | Type | Required | Description |
|---|---|---|---|
sources | array of string | no | Which broker marketplaces to aggregate. Valid: dealstream, bizquest, businessesforsale, bizbuysell. Empty = all supported. |
sectors | array of string | no | Industry/sector keywords to filter on (e.g. software, restaurant). Empty = all sectors. |
locations | array of string | no | Location keywords (country/state/region/city). Empty = all locations. |
minAskingPriceUsd | integer | no | Only listings at/above this asking price (USD). |
maxAskingPriceUsd | integer | no | Only listings at/below this asking price (USD); excludes undisclosed-price listings. |
minRevenueUsd | integer | no | Only listings reporting at/above this annual revenue (USD). |
maxListings | integer | no | Cap on normalized listings returned (default 100, max 1000). |
enrichDetails | boolean | no | Also open each returned listing's own page and add the extra financial facts published there. Off by default; at most the first 100 listings of a run are enriched. See below. |
Output
Every dataset record includes retry, derived from the record-level errorClass: null for a result, later to retry after a short delay, with_changes to correct the input before retrying, or never to avoid repeating the same request.
One dataset record per normalized, deduplicated listing:
{"listingId": "bizquest:abc123","title": "Profitable SaaS Business with Recurring Revenue","askingPriceUsd": 1200000,"revenueUsd": 850000,"cashFlowUsd": 300000,"sector": "Software & Technology","location": "California, United States","broker": "Acme Business Brokers","source": "bizquest","sourceUrl": "https://www.bizquest.com/business-for-sale/profitable-saas/abc123","listedAt": "2026-05-30","description": "Established SaaS with high gross margins and low churn...","fetchedAt": "2026-06-17T08:00:00Z"}
With enrichDetails on, each enriched record also carries the detail-page fields —
contactName, contactPhone, listedBy, brokerage, brokerProfileUrl,
ebitdaUsd, inventoryUsd, ffeUsd, realEstate, yearEstablished, employees,
financingOffered — and back-fills revenueUsd / cashFlowUsd where the search
result left them blank:
{"listingId": "bizquest:abc123","title": "Profitable SaaS Business with Recurring Revenue","askingPriceUsd": 1200000,"revenueUsd": 850000,"cashFlowUsd": 300000,"ebitdaUsd": 275000,"inventoryUsd": 40000,"ffeUsd": 120000,"realEstate": "Leased","yearEstablished": 1998,"employees": 12,"financingOffered": true,"contactName": "Alex Sample","contactPhone": "555-010-1234","listedBy": "broker","brokerage": "Example Business Brokers","sector": "Software & Technology","location": "California, United States","source": "bizquest","sourceUrl": "https://www.bizquest.com/business-for-sale/profitable-saas/abc123","fetchedAt": "2026-06-17T08:00:00Z"}
Financial fields are null when the source doesn't disclose them. askingPriceUsd is
populated only when the source quotes USD — non-USD listings keep a null USD price (so
a foreign-currency figure is never silently mislabeled) until currency conversion ships.
Optional detail enrichment
Set enrichDetails to true and the run opens each returned listing's own page and
adds the extra facts published there. Off by default.
| Field | Type | What it is |
|---|---|---|
contactName | string | The name printed under "Listed By" on the listing |
contactPhone | string | The phone printed on the listing, digits and dashes |
listedBy | string | broker or owner — who published the listing |
brokerage | string | Brokerage name — broker-listed businesses only |
brokerProfileUrl | string | Link to the broker's profile — broker-listed businesses only |
cashFlowUsd | number | Cash flow / SDE — back-filled when the search result didn't show it |
revenueUsd | number | Gross revenue — back-filled when the search result didn't show it |
ebitdaUsd | number | Reported EBITDA |
inventoryUsd | number | Inventory value |
ffeUsd | number | Furniture, fixtures and equipment value |
realEstate | string | Real-estate arrangement (owned, leased, included in the sale) |
yearEstablished | integer | Four-digit year the business was established |
employees | integer | Headcount as reported |
financingOffered | boolean | Whether seller financing is stated as offered |
- At most the first 100 listings of a run are enriched. Listings beyond that keep their search-result fields; the run summary reports how many were skipped.
- Included in the per-run fee — enrichment does not change what a run costs you. It does add runtime.
- Every field is nullable. A source that doesn't publish a fact leaves it
null. A small share of detail pages may be unavailable on a given run — those listings are returned un-enriched, keeping their search-result fields, and the run still succeeds. The run summary reports how many detail pages were read and how many weren't. - The contact the listing publishes.
contactNameandcontactPhonecarry the name and number the marketplace prints on the listing, andlistedBytells you whose they are:brokerwhen the marketplace attributes the listing to a named brokerage,ownerwhen the business is being sold directly by its owner. That distinction is worth filtering on — owner-listed deals mean no broker in the middle, while broker-listed ones also carrybrokerageandbrokerProfileUrlso you can see the firm's other listings. Both arenullfor sources that print no contact, andlistedByisnullwhen no contact is printed. Email addresses are never returned, from any listing. - Facts only. Enrichment never returns descriptions, marketing copy, or photos.
- Which fields you actually get varies by marketplace. Each source publishes a
different subset, and a fact the source doesn't print is
nullrather than guessed. A figure that can't be read unambiguously — a range, a non-USD amount, an "on request" placeholder — is also leftnullrather than turned into a number that looks exact but isn't.
Example
{"sources": ["bizquest", "businessesforsale", "dealstream", "bizbuysell"],"sectors": ["software", "ecommerce"],"maxAskingPriceUsd": 5000000,"maxListings": 100}
Returns up to 100 normalized software/ecommerce listings under $5M asking price, merged and deduplicated across the four marketplaces.
Calling from an AI agent
Discoverable via the Apify MCP server (mcp.apify.com) as
shelvick/business-for-sale-aggregator. Run it from the Apify Python SDK:
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("shelvick/business-for-sale-aggregator").call(run_input={"sectors": ["software"], "maxAskingPriceUsd": 2000000, "maxListings": 50})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["askingPriceUsd"], listing["sourceUrl"])
Or the REST run-sync endpoint (POST /v2/acts/shelvick~business-for-sale-aggregator/run-sync-get-dataset-items?token=…)
with the same JSON input. Every output field is structured for direct filtering/ranking.
Pricing
Pay-per-event, billed only on success: a single flat fee per run that returns at least one listing, charged after the records are pushed. The fee is the same whether the run returns one listing or hundreds, so broad multi-source searches stay predictable — and runs that fail or return no listings are never charged. See the Pricing tab on this Store page for the current per-run rate and any active subscriber discounts.
Behavior
- Per-source resilience: if one marketplace fails to fetch, the run continues with the others and reports what it returned — a partial source outage never fails the run.
- Latency: typically under a minute for a single-sector run across all four sources; scales with the number of sectors requested.
- Coverage: v1 fetches the first search page per source per sector; very large result
sets are sampled to
maxListings. WithenrichDetailson, up to 100 of the returned listings additionally have their own page read. - Deduplication: exact source+id dedup within a run.
- Telemetry: to improve reliability and coverage, this Actor reports anonymous usage metrics and diagnostic events to the developer — run outcome counts, per-source health signals, and, only when something goes wrong, the relevant input fields. No account identifiers are collected, and telemetry never affects a run.
FAQ
Which marketplaces are covered? DealStream, BizQuest, BusinessesForSale, and BizBuySell today. More sources are planned.
Are prices converted to USD? USD-quoted listings are returned in USD; non-USD listings
return a null USD price (never a mislabeled figure) until currency conversion ships.
Does it return full prospectuses? No — it returns structured facts plus a link to
the source listing, where the full write-up lives. The published contact name and phone
are available via enrichDetails; email addresses never are.
Can I get fuller financials per listing? Turn on enrichDetails to add EBITDA,
inventory, FF&E, real estate, year established, employees, and financing, and to
back-fill revenue and cash flow — for up to 100 listings per run, at no extra cost.
Does it return contact details? Yes, where the listing publishes them:
enrichDetails returns the name and phone printed on the listing, plus listedBy so
you know whether you're looking at a broker or the owner, and the brokerage name and
profile link for broker-listed businesses. Email addresses are never returned.
Can I filter by revenue or cash flow? You can filter by minimum revenue and by asking-price range; every record also includes revenue and cash flow when disclosed for your own downstream filtering.
What this doesn't do
- No authentication / no gated or members-only listings — public search results only.
- No full descriptions or photos rehosted — facts + a source link only, detail enrichment included.
- No commercial real estate (LoopNet-style property listings) — this is operating businesses for sale.
- No email addresses, ever — published phone contacts only.
- No automated outreach or CRM sync.
Use a single-site scraper if you only need one marketplace in its raw shape and don't need cross-source normalization. Use a commercial-real-estate listings tool for property (not business) deals. Use a dedicated company-financials tool if you need audited financials rather than broker-reported figures.
Related Actors
| Actor | Use it when |
|---|---|
| Secretary of State Business Search + UCC Liens | you've found a business to buy — verify the legal entity and check for UCC liens |
| Local Market Saturation & Competitor Density Analyzer | you want to gauge how saturated the local market is before you commit |