Business For Sale Aggregator — Normalized Deal Feed
Pricing
from $127.50 / 1,000 deal feed returneds
Business For Sale Aggregator — Normalized Deal Feed
Find businesses to buy: aggregate business-for-sale and small-M&A listings from many broker marketplaces into one normalized, deduplicated acquisition 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
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Find businesses to buy without 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 — a searchable deal database with structured asking price, revenue, cash flow, sector, location, broker, and a link back to each source listing — so acquirers, search funds, and brokers can screen acquisition deal flow in a single pass.
What this does
- Pulls listings from multiple broker marketplaces in one run — currently DealStream, BizQuest, and BusinessesForSale — 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. 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). |
Output
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"}
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.
Example
{"sources": ["bizquest", "businessesforsale", "dealstream"],"sectors": ["software", "ecommerce"],"maxAskingPriceUsd": 5000000,"maxListings": 100}
Returns up to 100 normalized software/ecommerce listings under $5M asking price, merged and deduplicated across the three 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 three 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. - Deduplication: exact source+id dedup within a run.
FAQ
Which marketplaces are covered? DealStream, BizQuest, and BusinessesForSale 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 seller contact details or full prospectuses? No — it returns structured facts plus a link to the source listing, where the full write-up lives.
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.
- No commercial real estate (LoopNet-style property listings) — this is operating businesses for sale.
- No buyer/seller PII or contact scraping.
- 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.
Design notes: www.scotthelvick.com/tools/business-for-sale-aggregator