Businesses For Sale — BizBuySell, BizQuest, BusinessesForSale avatar

Businesses For Sale — BizBuySell, BizQuest, BusinessesForSale

Pricing

from $127.50 / 1,000 deal feed returneds

Go to Apify Store
Businesses For Sale — BizBuySell, BizQuest, BusinessesForSale

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

Scott Helvick

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

2

Monthly active users

2 days ago

Last modified

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 scraperBusiness For Sale Aggregator
Sources per runone marketplacemultiple marketplaces
Output shapeeach site's raw fieldsone normalized schema
Priceas-displayed (mixed currencies)USD-normalized (non-USD left explicit)
Cross-source dedupnoneyes
Filteringper-siteunified across sources
Usescrape one sitescreen the whole field

Input

FieldTypeRequiredDescription
sourcesarray of stringnoWhich broker marketplaces to aggregate. Valid: dealstream, bizquest, businessesforsale, bizbuysell. Empty = all supported.
sectorsarray of stringnoIndustry/sector keywords to filter on (e.g. software, restaurant). Empty = all sectors.
locationsarray of stringnoLocation keywords (country/state/region/city). Empty = all locations.
minAskingPriceUsdintegernoOnly listings at/above this asking price (USD).
maxAskingPriceUsdintegernoOnly listings at/below this asking price (USD); excludes undisclosed-price listings.
minRevenueUsdintegernoOnly listings reporting at/above this annual revenue (USD).
maxListingsintegernoCap on normalized listings returned (default 100, max 1000).
enrichDetailsbooleannoAlso 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.

FieldTypeWhat it is
contactNamestringThe name printed under "Listed By" on the listing
contactPhonestringThe phone printed on the listing, digits and dashes
listedBystringbroker or owner — who published the listing
brokeragestringBrokerage name — broker-listed businesses only
brokerProfileUrlstringLink to the broker's profile — broker-listed businesses only
cashFlowUsdnumberCash flow / SDE — back-filled when the search result didn't show it
revenueUsdnumberGross revenue — back-filled when the search result didn't show it
ebitdaUsdnumberReported EBITDA
inventoryUsdnumberInventory value
ffeUsdnumberFurniture, fixtures and equipment value
realEstatestringReal-estate arrangement (owned, leased, included in the sale)
yearEstablishedintegerFour-digit year the business was established
employeesintegerHeadcount as reported
financingOfferedbooleanWhether 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. contactName and contactPhone carry the name and number the marketplace prints on the listing, and listedBy tells you whose they are: broker when the marketplace attributes the listing to a named brokerage, owner when 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 carry brokerage and brokerProfileUrl so you can see the firm's other listings. Both are null for sources that print no contact, and listedBy is null when 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 null rather than guessed. A figure that can't be read unambiguously — a range, a non-USD amount, an "on request" placeholder — is also left null rather 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 ApifyClient
client = 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. With enrichDetails on, 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.


ActorUse it when
Secretary of State Business Search + UCC Liensyou've found a business to buy — verify the legal entity and check for UCC liens
Local Market Saturation & Competitor Density Analyzeryou want to gauge how saturated the local market is before you commit