What the Flippa scraper collects
Scrapes Flippa search and category listing pages — any /search URL with any filter[...] combination, plus /websites, /apps, /domains and /buy/sitetype/saas. Each listing becomes one 33-column row read from the page's own embedded JSON, written to JSON or CSV with a run sidecar.
Filtered search
Input: A /search URL with any filter[...] parametersOne row per listing with price, profit, revenue, multiples, industry, monetization, age, country and badges.
Category shortcuts
Input: A category URL such as /websites, /apps, /domains or /buy/sitetype/saasThe same listing rows for Flippa's category pages, with the category label taken from the URL or --category.
From zero to Flippa data in 3 steps
Install
Clone the repository and install one browser engine. Python 3.9+.
$ git clone https://github.com/2scraper/flippa-scraper.git && cd flippa-scraper $ pip install -r requirements.txt $ pip install -r requirements-playwright.txt $ playwright install chromium
Run a scraper
Pick what you need and run it. Every flag is documented in the README.
$ python3 playwright_scraper.py --url "https://flippa.com/search?filter%5Bproperty_type%5D=saas" --pages 3 --out saas_listings --format both$ python3 playwright_scraper.py --url "https://flippa.com/buy/sitetype/saas" --pages 3 --format bothGet structured data
Rows land in JSON or CSV (
--format), with a.meta.jsonsidecar recording status, pages fetched and why the run stopped.
Flippa data fields
33 columns per row in a predictable schema. The most useful ones:
| Field | What it holds |
|---|---|
sku | Flippa's numeric listing id |
title | Card heading, e.g. "SaaS | Health and Beauty" |
description | The seller's one-line summary |
price | Asking price as a number |
currency | Currency of the page (USD, or EUR on /fr) |
original_price | Price before a reduction, where reduced |
discount_pct | Discount computed from the two prices |
asset_type | SaaS, Ecommerce, Domain, … |
industry | Industry as Flippa labels it |
monetization | How the business earns: Ads, Services & Subscriptions, … |
monthly_profit | Net monthly profit (can be negative) |
monthly_revenue | Monthly revenue |
profit_multiple | Flippa's own profit multiple |
revenue_multiple | Flippa's own revenue multiple |
sale_method | classified or auction |
verified_listing | Verified badge, from the site's own field |
[
{
"source": "flippa.com",
"scraped_at": "2026-09-19T14:40:54.654480+00:00",
"url": "https://flippa.com/12857417",
"sku": "12857417",
"title": "SaaS | Health and Beauty",
"price": 436829.0,
"currency": "USD",
"original_price": 927250.0,
"discount_pct": 52.9,
"category": "saas",
"price_source": "state+dom",
"page": 1,
"position": 1,
"description": "Profitable B2B SaaS for fitness coaches | €188k ARR run-rate | 94% gross margin | Growi…",
"asset_type": "SaaS",
"industry": "Health and Beauty",
"monetization": "Services & Subscriptions",
"monthly_profit": 13202.0,
"monthly_revenue": 16671.0,
"profit_multiple": 2.8,
"revenue_multiple": 2.2,
"age_text": "3 years",
"country": "France",
"status": "open",
"sale_method": "classified",
"bid_count": 0,
"broker_name": "Broker name redacted for this sample",
"managed_by_flippa": true,
"sponsored": true,
"editors_choice": true,
"confidential": true,
"verified_listing": true,
"image_url": "https://static.flippa.com/assets/search/placeholders/saas-ad80efb3.svg"
},
{
"source": "flippa.com",
"scraped_at": "2026-09-19T14:40:54.654826+00:00",
"url": "https://flippa.com/13287671",
"sku": "13287671",
"title": "SaaS | Business",
"price": 3000000.0,
"currency": "USD",
"original_price": null,
"discount_pct": null,
"category": "saas",
"price_source": "state+dom",
"page": 1,
"position": 2,
"description": "Fast-growing B2B data and intelligence platform with more than $1M in revenue, $786k in…",
"asset_type": "SaaS",
"industry": "Business",
"monetization": "Services & Subscriptions",
"monthly_profit": 82500.0,
"monthly_revenue": 91667.0,
"profit_multiple": 3.0,
"revenue_multiple": 2.7,
"age_text": "1 year",
"country": "CO, United States",
"status": "open",
"sale_method": "classified",
"bid_count": 0,
"broker_name": "Broker name redacted for this sample",
"managed_by_flippa": false,
"sponsored": true,
"editors_choice": true,
"confidential": true,
"verified_listing": true,
"image_url": "https://static.flippa.com/assets/search/placeholders/saas-ad80efb3.svg"
}
]First 2 of 8 rows from a real run — sample_output.json. Long values shortened here.
Handles what breaks naive Flippa scrapers
No browser rendering needed
Flippa is an Angular app, but every listing ships as JSON in the first response. That is the primary path; the rendered cards are a fallback that agreed on all 22 shared columns for 25 of 25 rows.
Pagination the site hides
There is no next link, and a bare ?page=2 is deleted by the app. The scraper uses page[number] and verifies page 2 holds new listings, reporting partial instead of a one-page "success".
Promoted rows not fabricated
A zero-match query still returns five promoted listings next to totalResults: 0; they are not written as results.
Window vs. whole catalogue
The sidecar's coverage field separates a complete run of the pages asked for from an exhaustive one, so a 3-page sample is never read as the whole market.
Scraping infrastructure included
The same tested core runs every 2scraper repository, so the hard parts work the same way on every site.
CAPTCHA handling
Detects the challenge a page really serves and, with a 2Captcha key, solves it only when it blocks the data — a capped number of solves per page.
Proxy rotation
Single proxy or a pool from a file, rotated on blocks with a fresh browser per exit. Credentials stay out of argv and logs.
Fingerprints
Optional complete device identity from the 2Captcha Fingerprint API — user agent, client hints, locale and timezone that agree with each other.
Scraping Browser API
Point --cdp-endpoint at a managed Chromium with its own exit country — no browser infrastructure to run yourself.
Honest run metadata
Every run writes a .meta.json sidecar and distinct exit codes: complete, blocked, empty and partial are never confused, and a failed run never overwrites good data.
Diff two runs
diff_runs.py compares two complete Flippa snapshots by id — new, removed and changed rows for monitoring.
What teams do with Flippa data
Deal sourcing
Pull every open SaaS or ecommerce listing with profit and revenue to shortlist acquisitions by multiple.
Valuation benchmarks
Track profit_multiple and revenue_multiple by asset type and industry to see what online businesses sell for.
Price-drop monitoring
Diff daily runs by sku to catch reduced listings, with discount computed from original_price.
Market research
Measure supply by industry, monetization model, age and country across Flippa's marketplace.
Free to run. Pay only for what the site requires.
Runs with no key, proxy or account
You need none of the paid products here: every number in the README was measured with no key, proxy or Scraping Browser, and the daily canary passes from a bare GitHub runner. Proxies add volume and a chosen country; the Scraping Browser API removes local browser infrastructure; the Scraper API fetches with no browser at all; captcha solving covers the Cloudflare Turnstile Flippa configures on /signup, not on listings.
Optional 2Captcha services — captcha solving, the Scraping Browser API, residential proxies and fingerprints — work behind one key.
Good to know
- brand, rating and in_stock columns are deliberately absent: Flippa's listings carry no such data.
- The rendered-card fallback keys industry and monetization on English labels only.
- Fingerprints were not verified: the test key answered 403 at the fingerprint endpoint.
2scraper vs. hosted scraper APIs
| 2scraper | Typical hosted API | |
|---|---|---|
| Code | Open source, MIT — read and patch it | Closed |
| Cost | Free; optional services billed only when used | Subscription or per request / per result |
| Runs on | Your machine, server or CI | The vendor's infrastructure |
| Output | JSON/CSV files + run metadata | API responses |
| When the site changes | Fix it yourself or open an issue / PR | Wait for the vendor |
Flippa scraper FAQ
Which Flippa pages can it scrape?
Any /search URL with any combination of filter[...] parameters, and the category shortcuts /websites, /apps, /domains and /buy/sitetype/saas.
Which output formats are supported?
JSON, CSV or both, with a <out>.meta.json sidecar recording status, coverage, failed pages and the site's own total_results.
Do I need a proxy or a 2Captcha key?
No. Flippa is behind Cloudflare but served ordinary requests, including plain curl, every time it was measured in Sep 2026.
Why do French pages show different prices?
Localised paths convert prices, e.g. 436,829 USD on /search became 380,546 EUR on /fr/search. The currency column follows the page; do not mix locales in one dataset.
Why doesn't profit_multiple always equal price ÷ 12 × profit?
It is Flippa's own figure over a profit window the scraper cannot see; 53 of 63 listings agreed within 0.15. It is reported as published.
Is scraping Flippa legal?
It reads public listing pages only — no login, no form submissions. It is public data; follow the site's terms and the law.