Flippa Scraper - Businesses, Revenue, Profit & Multiples
Pricing
from $0.80 / 1,000 results
Flippa Scraper - Businesses, Revenue, Profit & Multiples
From $0.80/1K. Scrape Flippa listings with full enrichment, including revenue, profit, valuation multiples, traffic, business age, location, monetization, badges and more. Search with filters or URLs, with concurrent enrichment for fast, low-resource runs.
Pricing
from $0.80 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Flippa Scraper: Asking Price, Financials, Multiples and Verification Data
Flippa Scraper turns flippa.com, a marketplace for buying and selling websites, apps, domains and online businesses, into structured, exportable data. Search live and recently sold listings by 25+ filters, or paste search-result and single-listing links straight from your browser. Each record carries 80+ curated fields (asking price, monthly and annual profit/revenue, profit and revenue multiples, traffic, site age, seller location, monetization, sale method, plus every verification and badge flag the listing shows) alongside the complete raw payload the marketplace returned. Export to JSON, CSV or Excel, or read the dataset through the API. Turn on Incremental mode to monitor a saved search on a schedule and receive only what changed.
Why This Scraper?
- 80+ curated fields, plus the full payload. Asking price, monthly/annual profit and revenue, profit and revenue multiples, traffic (uniques, page views), site age, seller location, monetization and sale method, with the complete search-card and detail payloads preserved under
rawandapiRawso nothing the marketplace shows is left behind. - Two ways to find listings. Filter by 25+ dimensions, from asset type and sale method to price/profit/revenue ranges, verified status, seller location and domain extension, or paste any flippa.com search-result or listing URL straight from your browser.
- Auctions and classifieds together. Track Buy It Now, reserve-met, price-dropped and First Access auctions alongside fixed Asking Price listings, open or recently sold.
- Trust signals on every search record. Verified revenue, verified traffic, manual vetting, Super Seller, Editor's Choice, broker and sponsored tags come through without extra clicks.
- Resilient to interruption. An aborted run keeps every record already collected, and an automatic same-run checkpoint survives a platform restart or migration without duplicate rows or double charges.
- Built for monitoring. Incremental mode returns only new, updated and reappeared listings on a recurring run, and expired ones once a run proves it covered the whole tracked search, or resume one specific interrupted crawl with a run id.
- Billed only for what actually comes back. The optional per-listing detail fetch is charged only when it is retrieved and kept in the output, never for a call that failed or a row suppressed as unchanged.
Use Cases
- Buyers and brokers: screen new listings against your own thresholds (multiples, verified revenue, minimum traffic) as soon as they list.
- Market and pricing research: build a historical dataset of asking prices, multiples and time-on-market across asset types to spot trends.
- Deal-flow monitoring: track a saved search on a schedule and get only what changed, so a pipeline stays current without re-reading the whole marketplace.
- Due diligence: pull the detail record for a shortlist of listing URLs into your own workflow or spreadsheet before making an offer.
Data You Get
Sample shape: values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
id | "10000001" |
url | "https://flippa.com/10000001-sample-listing" |
title | "Established SaaS tool with recurring subscribers" |
propertyName | "sample-saas-app.test" |
hostname | null (detail-only field, currently dead in every mode, see below) |
propertyType | "saas" |
category / siteType | "Internet" / "AiAppsAndTools" |
monetization | "Subscription" |
saleMethod / saleMethodTitle | "classified" / "Asking Price" |
status | "open" (also "won" for recently sold) |
price / priceText | 42000 / "USD $42,000" |
priceDropped / priceDroppedPercent | true / 15 |
monthlyProfit / monthlyRevenue | 2100 / 3400 |
profitMultiple / revenueMultiple | 3.1 / 1.9 |
uniquesPerMonth / pageViewsPerMonth | 12400 / 45000 |
siteAge / ageInMonths | "4 years" / 4 (search mode reads the site's own years figure straight through without converting to months, so this is not actually a months count there; a pasted single-listing URL does convert it, see below) |
businessLocation / sellerLocation | "ON, Canada" / null (detail-only field, currently dead in every mode) |
isVerifiedRevenue / isVerifiedTraffic | true / false |
isManuallyVetted / isSuperSeller | false / true |
bidCount | 0 (classifieds and auctions both default to 0 here; null only on a pasted single-listing URL) |
allVerifications | [{ "provider": "revenue-verified", "tooltip_text": "Revenue verified via a linked account." }] |
integrations | ["stripe"] |
raw / apiRaw | full search-card payload, preserved verbatim / listing detail payload (currently always null, see below) |
A search-mode record also carries targetRaiseAmount, ttmRevenue, authorityScore, appRating, badges, keyData, scores, early-access fields and several media/thumbnail variants, all pulled straight from the search card. Detail-only fields (externalUrl, businessModel, industry, revenueSources, appDownloadsPerMonth) currently come back null/empty in every mode because flippa.com's anonymous per-listing detail feed is not answering (observed since 2026-09); see "What a pasted single-listing URL returns" below for the fields that are also missing specifically on a pasted single-listing URL. Incremental mode adds four extra columns on top: changeType ("NEW", "UPDATED", "UNCHANGED", "REAPPEARED" or "EXPIRED"), changedFields (an array, populated only on "UPDATED" rows), firstSeenAt and lastSeenAt.
How to Use
- Pick a mode:
search(filter by 25+ dimensions) orurl(paste flippa.com search-result or listing links). - For Search mode, set your filters (asset type, price/profit/revenue range, verification, seller location and more). For URL mode, paste one or more links.
- Turn Fetch Detail Data on or off, and set Max Listings / Max Pages to control run size and cost.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.
Search by filters:
{"mode": "search","status": ["open"],"propertyTypes": ["saas"],"sortBy": "most_recent","fetchDetails": true,"maxListings": 25}
Verified-revenue listings above a profit floor:
{"mode": "search","status": ["open"],"verifiedRevenueOnly": true,"minMonthlyProfit": 500,"fetchDetails": true,"maxListings": 25}
Paste multiple search URLs:
{"mode": "url","urls": ["https://flippa.com/search?search_template=most_relevant&filter%5Bstatus%5D=open&filter%5Bproperty_type%5D=saas","https://flippa.com/search?search_template=most_relevant&filter%5Bstatus%5D=open&filter%5Bproperty_type%5D=ecommerce_store"],"fetchDetails": false,"maxListings": 40}
Recurring monitoring (schedule this run with Incremental mode on):
{"mode": "search","status": ["open"],"propertyTypes": ["saas"],"incrementalMode": true,"maxListings": 100}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/flippa-com-scraper").call(run_input={"mode": "search","propertyTypes": ["saas"],"status": ["open"],"maxListings": 25,})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["title"], listing["price"], listing["monthlyProfit"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/flippa-com-scraper').call({mode: 'search',propertyTypes: ['saas'],status: ['open'],maxListings: 25,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
What a pasted single-listing URL returns
Pasting one listing's URL (https://flippa.com/<id>) in URL mode fetches just that record from the public listing page, since flippa.com's anonymous per-listing detail feed is not answering (observed since 2026-09; kept as an automatic fallback in case access returns). The listing page still supplies identity, asking price, monthly profit/revenue, profit and revenue multiples, page views, and site age (converted to months here, unlike the search-mode value described above) and business location directly; it also builds its own small raw object from the page rather than leaving it null. It does not carry the much longer list of fields that only ever came from a search-results card: status, every verification and badge flag (isVerifiedRevenue, isVerifiedTraffic, isManuallyVetted, isEditorsChoice, isSuperSeller, isSponsored, isBrokerSeller, and the other early-access/is* flags), bidCount, uniquesPerMonth, integrations, allVerifications, badges, scores, ttmRevenue, targetRaiseAmount, authorityScore, appRating, summary, monetization, primaryPlatform, endAt, keyData, and the full search-card apiRaw/raw payload; these come back null, empty, or absent on a pasted single-listing URL. category/propertyType on a pasted URL come from the listing page's own structured data rather than the search index, so the exact wording can differ slightly from a search-mode record for the same listing. If a listing you need is reachable through a filtered search instead of a direct link, searching for it returns the fuller record.
Pagination and Max Pages
maxPages: 0 (the default) does not mean "no results". It means the walk continues, page by page, until one of the run's real terminators is hit: the result total flippa.com's own search response reports for that search, flippa.com's own ceiling of 25 listings per page across 400 pages (about 10,000 results per search), or an empty page. A page whose listings were already collected earlier in the same run does not stop the walk either; it is skipped and pagination continues, so overlapping searches never cut a later search short. Max Listings (default 20) is the actor's sole finite soft cap on how many records a run pushes; set it to 0 to pull the whole result set for a search, still bounded by the terminators above, or set Max Pages to a positive number to cap pages explicitly instead.
Resume and recurring updates
There are two different tools here; pick the one that matches what you are doing.
| Need | Use |
|---|---|
| A crawl stopped and should continue | resumeFromRunId |
| Run the same search on a schedule and receive only changes | incrementalMode |
| Keep separate recurring campaigns for similar searches | distinct stateKey values |
| A normal full snapshot | leave both off |
Resume (resumeFromRunId) continues one specific interrupted or previous large pull: paste a run id or dataset id and this run skips listings already collected there, returning only the remaining new ones. Duplicate ids from earlier in the same run, or from a previous run supplied through resumeFromRunId, are skipped without stopping the walk, so a resumed run keeps paging past everything it already has and still reaches genuinely new listings further into the result set. An automatic same-run checkpoint also protects against a platform migration or restart without any input needed: an interrupted run picks up from where it stopped, same dataset, no duplicate listings, no double charges.
Incremental mode (incrementalMode) is for a schedule (for example, daily or weekly): the actor remembers the previous run of the same search by itself, so no run id needs to be pasted. The first run returns everything as NEW. Later runs return only NEW, UPDATED and REAPPEARED listings by default; unchanged listings are suppressed and not billed unless emitUnchanged is on. EXPIRED rows, and any later REAPPEARED classification, are only produced once a run both has emitExpired on and proves it scanned the whole tracked search to its natural end (not capped by Max Listings, not a resume, not resuming from a mid-walk checkpoint); a partial run leaves the previous state untouched instead of guessing. When you paste more than one search or listing URL in a single run, listing ids are deduplicated across all of them so the same listing is never pushed twice, but this dedup only ever skips pushing a duplicate, never stops an individual search's own pagination early, so a later search in a multi-URL run is not cut short by overlap with an earlier one.
EXPIRED means a previously tracked listing was not found anywhere in this run's scan; it does not distinguish a listing that sold from one that was simply delisted or removed. If your tracked search only matches open listings (status: ["open"]), a sale that moves a listing to "won" status looks identical to a straightforward removal: both surface as EXPIRED. Include "won" in status if you want a sold listing to keep being tracked (as an UPDATED row) instead of disappearing into EXPIRED. State is isolated per search filter and per fetchDetails setting automatically; set stateKey to name or deliberately share a monitoring campaign.
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.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search to filter by dimensions, or url to paste flippa.com links. |
status | array | (none, behaves as open when left empty) | open for live listings, won for recently sold, or both. |
propertyTypes | array | (none) | Asset types: website, fba, saas, ecommerce_store, plugin_and_extension, ai_apps_and_tools, youtube, ios_app, android_app, game, crypto_app, social_media, newsletter, service_and_agency, service, projects_and_concepts, domain, other. Leave empty for all. |
siteTypes | array | (none) | Granular site type within an asset type. Leave empty for any. |
saleMethods | array | (none) | auction, classified, or both. Leave empty for both. |
sortBy | string | most_relevant | most_relevant, most_recent, ending_soonest, or most_active. |
minPrice | integer | (none) | Minimum asking price in USD. |
maxPrice | integer | (none) | Maximum asking price in USD. |
minMonthlyProfit | integer | (none) | Minimum monthly net profit. |
maxMonthlyProfit | integer | (none) | Maximum monthly net profit. |
minMonthlyRevenue | integer | (none) | Minimum monthly revenue. |
maxMonthlyRevenue | integer | (none) | Maximum monthly revenue. |
minUniquesPerMonth | integer | (none) | Minimum monthly unique visitors. |
minAgeMonths | integer | (none) | Minimum listing/site age in months. |
maxAgeMonths | integer | (none) | Maximum listing/site age in months. |
tlds | array | (none) | Domain extensions to include (com, org, io, ai, app, and so on). Leave empty for any. |
sellerLocation | string | (none) | ISO 2-letter country code (us, gb, au) or region code (afr, nam, sam, asi, eeu, weu, oce). |
verifiedRevenueOnly | boolean | false | Only listings with Flippa-verified revenue. |
verifiedTrafficOnly | boolean | false | Only listings with Flippa-verified traffic. |
manuallyVettedOnly | boolean | false | Only listings the marketplace team or a broker has manually vetted. |
editorsChoiceOnly | boolean | false | Editor's Choice listings only. |
superSellerOnly | boolean | false | Listings from Super Sellers only. |
brokerSellerOnly | boolean | false | Brokered listings only. |
sponsoredOnly | boolean | false | Sponsored (premium) listings only. |
buyItNowOnly | boolean | false | Auctions with a Buy It Now option only. |
reserveMetOnly | boolean | false | Auctions where the reserve has been met only. |
priceDroppedOnly | boolean | false | Listings whose price has been reduced only. |
managedByFlippaOnly | boolean | false | Listings managed by the marketplace team only. |
earlyAccessOnly | boolean | false | First Access listings only. |
revenueGenerating | string | any | yes, no, or any. |
urls | array | (none) | flippa.com search-result or listing URLs to scrape directly (URL mode). Filter-mode fields are ignored. |
fetchDetails | boolean | true | When on, also fetches the per-listing detail record, meant to add externalUrl, hostname, businessModel, industry, revenuePerMonth/profitPerMonth, appDownloadsPerMonth, revenueSources and sellerLocation. Currently none of these come back populated, since flippa.com's anonymous per-listing detail feed is not answering; see the FAQ below. Costs one extra request per listing while the feed is being tried; ignored for a pasted single-listing URL, which is always treated and billed as a detail record regardless of this setting. |
maxListings | integer | 20 | Hard cap on listings pushed to the dataset, the actor's sole finite default limit. 0 means unlimited, bounded only by Max Pages and flippa.com's own ceiling. |
maxPages | integer | 0 | Pages to walk per search (25 listings/page). 0 walks the whole result set for that search, still bounded by flippa.com's own result total or page ceiling. A positive number caps pages explicitly. |
resumeFromRunId | string | (none) | ID of a previous run or dataset. Listings already collected there are skipped, so this run returns only new ones. |
incrementalMode | boolean | false | For scheduled runs of the same search or URLs: remembers state itself and classifies each listing NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED. |
stateKey | string | (none) | Optional name for a monitoring campaign. Left empty, the state key is derived automatically from the search filters (or URLs) and the Fetch Detail Data setting. |
emitUnchanged | boolean | false | Incremental mode only. Also return (and bill) listings unchanged since the last run. |
emitExpired | boolean | false | Incremental mode only. Also return (and bill) listings from a previous run no longer found, once a run has fully scanned the tracked search. |
proxy | object | (none, prefilled with Apify Proxy enabled) | Default Apify proxy works for flippa.com; residential is optional and rarely needed. |
mcpConnectors | array | (none) | Optional: send a summary of each record to apps authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which item pages are created. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live listing.
{"id": "10000001","url": "https://flippa.com/10000001-sample-listing","title": "Established SaaS tool with recurring subscribers","summary": "Brief seller pitch text shown on the search card.","propertyName": "sample-saas-app.test","propertyType": "saas","siteType": "AiAppsAndTools","category": "Internet","monetization": "Subscription","primaryPlatform": null,"saleMethod": "classified","saleMethodTitle": "Asking Price","status": "open","endAt": null,"price": 42000,"originalPrice": 48000,"priceText": "USD $42,000","priceDropped": true,"priceDroppedPercent": 12.5,"currency": "USD","monthlyProfit": 2100,"monthlyRevenue": 3400,"annualProfit": 25200,"annualRevenue": 40800,"profitMultiple": 3.1,"revenueMultiple": 1.9,"uniquesPerMonth": 12400,"pageViewsPerMonth": 45000,"authorityScore": 28,"siteAge": "4 years","ageInYears": "4 years","ageInMonths": 4,"businessLocation": "ON, Canada","isVerifiedRevenue": true,"isVerifiedTraffic": false,"isManuallyVetted": false,"isEditorsChoice": false,"isSuperSeller": true,"isBrokerSeller": false,"isSponsored": false,"bidCount": 0,"thumbnailUrl": "https://static.flippa.com/assets/sample-placeholder.svg","keyData": [{ "label": "Type", "value": "SaaS" },{ "label": "Site Age", "value": "4 years" }],"badges": [],"allVerifications": [{ "provider": "revenue-verified", "tooltip_text": "Revenue verified via a linked account." }],"integrations": ["stripe"],"raw": { "/* full search-card object */": "..." }}
Plan Requirement
- The default Apify proxy works for flippa.com out of the box; the actor rotates connections automatically when one is refused. Residential is supported but rarely needed; use it only if you observe rotation pressure on very large jobs.
- Detail enrichment (
fetchDetails) makes one extra request per listing in Search mode while the detail feed is still being tried, and is billed only when it is retrieved and kept in the output; a failed or skipped attempt is never charged. Once the feed's repeated failures trip an internal breaker, no further detail requests are made for the rest of that run even with the toggle on. A pasted single-listing URL always carries the detail-enrichment surcharge, since fetching that one listing's data is what returns the record at all. - flippa.com's anonymous per-listing detail feed is not currently answering (observed since 2026-09), so
externalUrl,hostname,businessModel,industry,revenueSourcesandappDownloadsPerMonthcome back empty across every mode until it is restored. Every field that comes from a search-results card, rather than this feed, is unaffected in search mode; a pasted single-listing URL is missing a much longer list of fields for a different reason, since it never had a search card to begin with, see "What a pasted single-listing URL returns" above.
FAQ
How much does it cost?
You pay per listing returned, with the optional detail-enrichment surcharge billed only when it is actually retrieved. The Pricing tab shows the current rates. Use Max Listings to cap the cost of any run.
Is it legal to scrape flippa.com?
This actor collects only publicly available marketplace listing data. You are responsible for how you use it: follow flippa.com's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution, particularly around any seller-identifying or financial details a listing discloses.
Can I monitor a search over time and only get new or changed listings?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and reappeared listings, and unchanged ones are not billed. Turn on emitExpired if you also want listings that disappeared from the tracked search returned as tombstone rows, once a run proves it scanned the whole search.
Why are some fields null on a listing I scraped?
Two separate reasons. First, flippa.com's anonymous per-listing detail feed is not currently answering, so a handful of detail-only fields (externalUrl, hostname, businessModel, industry, revenueSources, appDownloadsPerMonth) come back empty everywhere until that changes. Second, if you pasted one listing's URL directly rather than finding it through a search, several search-card-only fields (status, verification and badge flags, bidCount, uniquesPerMonth) are not available on that page and also come back null; see "What a pasted single-listing URL returns" above.
Why did my run fail instead of returning an empty dataset?
If flippa.com refuses every request, the run stops with a clear message so "no listings matched" is never confused with "nothing could be read", and nothing is charged. Retry with an Apify Residential proxy. If the site was reachable but your filters matched nothing, the run finishes successfully with an empty dataset and a status message instead.
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.
๐ Want more e-commerce data?
Pair this actor with these related scrapers from the same team:
| ๐ BusinessesForSale.com Scraper From $1.5/1K. Extract businesses and franchises listed for sale on BusinessesForSale.com... | ๐ ProductReview.com.au Scraper Scrape ProductReview.com.au products, businesses and customer reviews. Search by... |
| ๐ BizBuySell Scraper From $1.5/1K. Extract business-for-sale and franchise listings from bizbuysell.com with... | ๐ BizQuest Scraper Extract business-for-sale, franchise, and asset listings from BizQuest. Search by... |
| ๐ท๏ธ 2dehands & 2ememain Scrape classifieds from 2dehands.be and 2ememain.be by keyword, filters, or URLs. Returns... | ๐ผ Superprof Scraper Scrape Superprof tutors by subject and location, or paste tutor URLs. One rich record per... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- ๐ ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
- โญ Enjoying it? A quick review on the actor page helps other users find it.