Flippa Marketplace Scraper
Pricing
$0.01 / listing scraped
Flippa Marketplace Scraper
Scrape Flippa.com listings — price, revenue, profit, multiples, traffic, monetization, niche, and more. Perfect for deal sourcing and market research.
Pricing
$0.01 / listing scraped
Rating
0.0
(0)
Developer
Kevin
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
The Flippa deal-finding and market monitoring API — not just a scraper.
Scrape Flippa.com listings with ROI scoring, undervaluation detection, price-drop tracking, sold-listing research, direct URL enrichment, and automatic export to Slack, Airtable, Notion, Google Sheets, and any webhook.
Built for acquisition investors, deal teams, brokers, and anyone who wants Flippa's data piped into their own workflow.
Why this actor vs. the alternatives
| Feature | This actor |
|---|---|
| ROI score (0–100) with transparent formula | ✅ |
| Undervaluation flagging with per-type benchmarks | ✅ |
| Price-drop tracking across runs | ✅ |
| Sold listings research | ✅ |
| Direct URL enrichment (enrich specific listings) | ✅ |
| Mixed inputs: search filters + individual URLs in one run | ✅ |
| Confidence score (how complete is each listing's data) | ✅ |
| Flagged reasons per listing (why it was flagged) | ✅ |
| Normalized enums for type, sale method, monetization | ✅ |
| Output modes: Full / ETL / Alerts-only | ✅ |
| Native Slack, Airtable, Notion, Google Sheets, webhook | ✅ |
| Summary stats record per run | ✅ |
| Trust/badge indicators (verified, editor's choice, managed) | ✅ |
| Auction/offer state fields | ✅ |
| Traffic, domain age, seller rating | ✅ (with detail pages) |
What data is extracted
Core fields (every listing)
| Field | Description |
|---|---|
url | Direct link to the listing |
title | Listing headline |
description | Business description excerpt |
askingPrice | Asking price (e.g. "USD $118,000") |
monthlyProfit | Net monthly profit (e.g. "USD $3,956 p/mo") |
monthlyRevenue | Monthly revenue when disclosed |
profitMultiple | Valuation multiple (e.g. "3.4x Profit") |
revenueMultiple | Revenue multiple (e.g. "1.2x Revenue") |
propertyType | Normalized enum: SaaS, Ecommerce, Amazon FBA, Content / Blog, Affiliate, Newsletter, Domain, App, Marketplace, Directory, Services, Forum / Community |
monetizationType | How the business makes money |
category | Industry/niche |
listingAge | Age of the business |
saleMethod | Normalized enum: Auction, Buy It Now, Classified |
isVerified | Verified listing badge |
isEditorChoice | Editor's Choice badge |
isManagedByFlippa | Managed by Flippa badge |
isSold | true if from Flippa's sold listings section |
scrapedAt | ISO timestamp |
ROI & analysis fields (when roiScoring is enabled)
| Field | Description |
|---|---|
roiScore | 0–100. Higher = faster payback. 100 = under 0yr payback, 0 = 5yr+ payback |
paybackYears | Asking price ÷ annual profit. Years to recoup investment |
isUndervalued | true if payback is below the threshold for this business type |
roiBenchmarkUsed | The payback threshold that determined isUndervalued |
roiExplanation | Human-readable reason: e.g. "Payback 2.1yr vs 3.5yr benchmark for SaaS" |
confidenceScore | 0–100. How many of the 8 key fields (price, profit, type, category, etc.) are populated |
flaggedReasons | Array of reasons this listing was flagged: undervalued, price_drop, new_listing, sold, low_confidence |
Price tracking fields (when trackPriceDrops is enabled)
| Field | Description |
|---|---|
priceDropped | true if price is lower than when last seen |
priceDrop | Dollar amount of the reduction |
priceHistory | Full price history array: [{ price, priceNum, date }] — one entry per price change |
firstSeenAt | ISO timestamp of when this listing was first scraped |
lastSeenAt | ISO timestamp of when this listing was last seen in a run |
relisted | true if this listing was previously marked as removed and has reappeared |
Removal detection records (when trackPriceDrops is enabled)
At the end of each run, listings that were previously tracked but not seen in the current run are flagged. A record is pushed to the dataset with:
| Field | Description |
|---|---|
_isRemoval | true — use this to identify removal event records |
likelyRemoved | true |
removedAt | ISO timestamp of when removal was detected |
lastSeenAt | When it was last seen before disappearing |
firstSeenAt | When it was first seen |
askingPrice | Last known asking price |
priceHistory | Full price history up to removal |
flaggedReasons | ["likely_removed"] |
Detail page fields (when scrapeDetailPages is enabled)
| Field | Description |
|---|---|
yearEstablished | Year the business was founded |
sellerRating | Seller reputation score |
monthlyVisitors | Monthly traffic when disclosed |
annualOrganicTraffic | Annual organic visits when disclosed |
domainAge | Age of the domain (e.g. "7 years") |
offersCount | Number of active offers |
bidsCount | Number of bids (auction listings) |
daysRemaining | Days left in auction or listing window |
annualRevenue | Annual revenue figure when disclosed |
Summary record (end of every run)
| Field | Description |
|---|---|
_isSummary | true — use this to filter out summary records |
totalScraped | Total listings saved this run |
undervaluedCount | Undervalued listings count |
priceDropCount | Price-drop listings count |
likelyRemovedCount | Listings not seen this run, newly flagged as likely removed |
avgAskingPrice | Average asking price across saved listings |
avgPaybackYears | Average payback period |
avgConfidenceScore | Average data completeness score |
typeBreakdown | Count by normalized property type |
flagBreakdown | Count by each flag reason |
outputMode | Which output mode was used |
runCompletedAt | ISO timestamp |
ROI score explained
roiScore = max(0, min(100, round(100 - (paybackYears / 5) * 100)))
- 100 = 0 years payback (extremely underpriced)
- 60 = 2 years payback (strong deal)
- 30 = 3.5 years payback (fair market for SaaS)
- 0 = 5+ years payback (expensive)
The roiBenchmarkUsed field shows the exact threshold used for isUndervalued, and roiExplanation gives a plain-English explanation for every listing.
Per-type defaults:
| Type | Default benchmark |
|---|---|
| SaaS | 3.5 years |
| Ecommerce / FBA | 2.5 years |
| Content / Blog / Affiliate / Newsletter | 3.0 years |
| Other | 3.0 years |
All thresholds are configurable in the actor input.
Example output
{"url": "https://flippa.com/12283554","title": "GovTech SaaS — 96% margins, $29.9K revenue, evergreen webinar funnel","description": "$29.9K revenue, 96% margins, custom GovTech SaaS with 1M+ B2G contact database","askingPrice": "USD $114,999","monthlyProfit": "USD $2,396 p/mo","monthlyRevenue": null,"profitMultiple": "3.4x Profit","revenueMultiple": "3.3x Revenue","propertyType": "SaaS","monetizationType": "Services & Subscriptions","category": "Business","listingAge": "5 years","saleMethod": "Buy It Now","isVerified": true,"isEditorChoice": false,"isManagedByFlippa": false,"isSold": false,"roiScore": 20,"paybackYears": 4.0,"isUndervalued": false,"roiBenchmarkUsed": 3.5,"roiExplanation": "Payback 4.0yr vs 3.5yr benchmark for SaaS","confidenceScore": 87,"flaggedReasons": [],"priceDropped": false,"priceDrop": null,"firstSeenAt": "2026-03-20T09:00:00.000Z","scrapedAt": "2026-04-02T04:00:00.000Z"}
Input options
Inputs & Filters
| Parameter | Type | Default | Description |
|---|---|---|---|
listingUrls | Array | [] | Individual Flippa listing URLs or IDs to enrich directly. Can be mixed with category filters in the same run |
outputMode | Enum | full | full = all fields, etl = nulls stripped, alerts = only flagged listings |
propertyType | Array | [] | Filter by: website, fba, ios_app, android_app, domain, business, newsletter |
siteType | Array | [] | Filter by: saas, ecommerce, content, blog, dropship, affiliate, etc. |
minPrice | Integer | — | Minimum asking price (USD) |
maxPrice | Integer | — | Maximum asking price (USD) |
minMonthlyProfit | Integer | — | Minimum monthly profit (USD) |
maxMonthlyProfit | Integer | — | Maximum monthly profit (USD) |
minRoiScore | Integer | — | Minimum ROI score 0–100 |
titleKeywords | Array | [] | Only return listings whose title contains any of these keywords |
descriptionKeywords | Array | [] | Only return listings whose description contains any of these keywords |
maxResults | Integer | 50 | Maximum total listings to save (up to 1,000) |
ROI & Alerts
| Parameter | Type | Default | Description |
|---|---|---|---|
roiScoring | Boolean | true | Add ROI fields to every listing |
onlyUndervalued | Boolean | false | Only save undervalued listings |
undervaluedMultipleThreshold | Number | — | Global payback override — overrides all per-type thresholds |
saasBenchmarkYears | Number | 3.5 | Payback threshold for SaaS |
ecommerceBenchmarkYears | Number | 2.5 | Payback threshold for Ecommerce / FBA |
contentBenchmarkYears | Number | 3.0 | Payback threshold for content, blog, affiliate, newsletter |
defaultBenchmarkYears | Number | 3.0 | Fallback for all other types |
onlyNewListings | Boolean | false | Skip listings seen in previous runs |
includeSoldListings | Boolean | false | Also scrape sold listings (tagged isSold: true) |
trackPriceDrops | Boolean | false | Detect and flag price reductions across runs |
scrapeDetailPages | Boolean | false | Visit each listing page for traffic, domain age, seller rating, auction state |
Integrations
| Parameter | Type | Description |
|---|---|---|
webhookUrl | String | POST to this URL at end of run (Zapier, Make, n8n) |
slackWebhookUrl | String | Send formatted Block Kit report to Slack |
airtableApiKey | String (secret) | Airtable Personal Access Token |
airtableBaseId | String | Airtable Base ID |
airtableTableName | String | Table name (default: Flippa Listings) |
notionApiKey | String (secret) | Notion Internal Integration Token |
notionDatabaseId | String | Notion database ID |
googleServiceAccountJson | String (secret) | Google service account JSON key |
googleSheetsId | String | Google Sheets spreadsheet ID |
googleSheetName | String | Sheet tab name (default: Flippa Listings) |
Use cases
Deal sourcing
Find undervalued businesses matching your acquisition criteria. Set siteType: ["saas"], maxPrice: 200000, onlyUndervalued: true.
Keyword targeting
Use titleKeywords: ["AI", "recurring", "MRR"] to surface only businesses matching your thesis.
Undervalued alerts
Schedule daily runs with onlyUndervalued: true + onlyNewListings: true + slackWebhookUrl. Get notified only when a new undervalued listing appears.
Price drop alerts
Enable trackPriceDrops: true. Combine with outputMode: "alerts" to save only listings where something changed.
Enrich a shortlist
Paste 10 listing URLs into listingUrls. Get a full structured dataset back in seconds — without manual browsing.
Sold listings research
Enable includeSoldListings: true to see what actually transacted and at what prices. Useful for benchmarking current asks.
ETL pipeline
Set outputMode: "etl" — every listing has null fields stripped, giving clean rows ready for Postgres, BigQuery, or Airtable without empty columns.
Acquisition watchlist
Run on a schedule with onlyNewListings: true + trackPriceDrops: true. Build a persistent history of listings you're monitoring. Each listing accumulates a full priceHistory array across runs. Listings that disappear from Flippa are automatically flagged as likelyRemoved and pushed as removal-event records. Listings that reappear after removal are flagged as relisted — a strong signal of a motivated seller.
Output modes
| Mode | What gets saved | Best for |
|---|---|---|
full | Every listing, all fields including nulls | Default, maximum data |
etl | Every listing, null/empty fields removed | Databases, spreadsheets, Airtable |
alerts | Only listings with at least one flaggedReason | Scheduled alert runs, Slack notifications |
flaggedReasons values: undervalued, price_drop, relisted, new_listing, sold, low_confidence, likely_removed
Direct listing URL mode
Instead of (or in addition to) category scraping, you can pass individual listing URLs:
{"listingUrls": ["https://flippa.com/12345678","https://flippa.com/12283554","11223344"]}
Bare IDs (numbers) are automatically expanded to full Flippa URLs. Each listing is fully extracted from its detail page and returns the same schema as a search-scraped listing — including ROI fields, confidence score, flagged reasons, and all trust/traffic indicators.
Mix with search filters in the same run: if you also set siteType: ["saas"], the actor will scrape the SaaS category AND enrich your direct URLs in one run.
Setting up the deal alert workflow
- Set these inputs:
onlyUndervalued: trueonlyNewListings: truetrackPriceDrops: trueoutputMode: "alerts"slackWebhookUrlorwebhookUrl
- Tune your benchmarks (e.g.
saasBenchmarkYears: 3.0for stricter SaaS deals) - Optionally add
titleKeywords: ["recurring", "MRR", "B2B"]to narrow the niche - Go to Actors → Schedules in the Apify console and set it to run daily
- You'll receive a Slack message only when a new undervalued or price-dropped listing appears
Integrations
Webhook (n8n / Zapier / Make / custom)
Posts this payload at end of run:
{"source": "flippa-marketplace-scraper","runId": "abc123","timestamp": "2026-04-01T00:00:00.000Z","totalScraped": 50,"count": 50,"listings": [ ... ]}
- Zapier → "Webhooks by Zapier" → "Catch Hook"
- Make → "Webhooks" → "Custom webhook"
- n8n → "Webhook" trigger node
Slack
Get an Incoming Webhook URL at api.slack.com/messaging/webhooks. Each run sends a Block Kit formatted card with run stats and the top 5 deals by ROI score.
Airtable
- Create a Personal Access Token at airtable.com/account with
data.records:writescope - Create a table named Flippa Listings with these columns:
| Column | Type |
|---|---|
| Title | Single line text |
| URL | URL |
| Asking Price | Single line text |
| Monthly Profit | Single line text |
| Monthly Revenue | Single line text |
| Profit Multiple | Single line text |
| Revenue Multiple | Single line text |
| Type | Single line text |
| Monetization | Single line text |
| Category | Single line text |
| Listing Age | Single line text |
| Sale Method | Single line text |
| Description | Long text |
| Scraped At | Single line text |
| ROI Score | Number |
| Payback (yrs) | Number |
| Undervalued | Checkbox |
| Confidence Score | Number |
| Price Dropped | Checkbox |
| Price Drop ($) | Number |
| Sold | Checkbox |
- Find your Base ID at
airtable.com/developers/web/api/introduction
Notion
- Go to notion.so/my-integrations → New integration → copy the Internal Integration Token
- Create a database with matching properties (see Airtable table above for field names/types; use Select for Type, Monetization, Category, Sale Method)
- Share the database with your integration (··· → Connections)
- Copy the database ID from the URL
Google Sheets
- Enable the Sheets API at console.cloud.google.com → create a Service Account → download JSON key
- Share your sheet with the service account email (Editor access)
- Paste the full JSON into
googleServiceAccountJson - Copy the spreadsheet ID from the URL
The actor writes a header row on the first run, then appends rows on subsequent runs.
Pricing
$0.01 per listing — flat rate, all features included.
- 50 listings = $0.50
- 500 listings = $5.00
- 1,000 listings = $10.00
Apify platform usage (compute + residential proxy bandwidth) is billed separately. Most runs of 50–200 listings cost under $0.50 in platform fees.
Tips
- Leave all filters empty + set
maxResults: 200for a broad market sweep - Combine
siteType: ["saas"]+maxPrice: 100000+minRoiScore: 50to instantly surface fast-payback SaaS under $100K outputMode: "etl"is the cleanest option for piping data into databases — no empty columns- Use
listingUrlsto enrich a specific shortlist without running a full category scrape - Enable
scrapeDetailPagesonly when you need traffic/domain/seller data — it roughly doubles run time trackPriceDropsis most useful on a recurring schedule — the first run just stores baseline prices- Use
confidenceScoreto filter out listings where Flippa hides key data behind NDA:minConfidenceScoreisn't an input filter yet, but you can post-filter in your downstream tool
Notes
- Revenue and profit figures marked "Confidential" by sellers on Flippa are not accessible and are not scraped
- Residential proxies are required — Flippa blocks datacenter IPs on its listing routes
- Sold listing prices populate the
askingPricefield (Flippa shows sale price in the same position) - Flippa's site structure may change; if fields stop populating, leave a review and we'll update selectors
- The
_isSummary: truerecord at the end of each dataset is a run-level stats row — filter it out in downstream tools if needed