1. 2scraper
  2. Business data & reviews
  3. Flippa
Open source · MITRuns with no key, proxy or account

Flippa Scraper

Online businesses for sale on Flippa — asking price, monthly profit and revenue, multiples — with no key or proxy.

  • Playwright
  • Selenium
  • Puppeteer
  • Scraping Browser API
  • JSON
  • CSV
flippa-scraper
# Filtered search
$ python3 playwright_scraper.py --url "https://flippa.com/search?filter%5Bproperty_type%5D=saas" --pages 3 --out saas_listings --format both
✓ 8 sample rows · 33 columns in sample_output.json
33columns per listing
75listings per 3-page run (measured Sep 2026)
3Flippa locales: English, French, Spanish
0keys, proxies or accounts needed
Available Flippa scrapers

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[...] parameters

One 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/saas

The same listing rows for Flippa's category pages, with the category label taken from the URL or --category.

Quick start

From zero to Flippa data in 3 steps

  1. 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
  2. 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
  3. Get structured data

    Rows land in JSON or CSV (--format), with a .meta.json sidecar recording status, pages fetched and why the run stopped.

Output

Flippa data fields

33 columns per row in a predictable schema. The most useful ones:

FieldWhat it holds
skuFlippa's numeric listing id
titleCard heading, e.g. "SaaS | Health and Beauty"
descriptionThe seller's one-line summary
priceAsking price as a number
currencyCurrency of the page (USD, or EUR on /fr)
original_pricePrice before a reduction, where reduced
discount_pctDiscount computed from the two prices
asset_typeSaaS, Ecommerce, Domain, …
industryIndustry as Flippa labels it
monetizationHow the business earns: Ads, Services & Subscriptions, …
monthly_profitNet monthly profit (can be negative)
monthly_revenueMonthly revenue
profit_multipleFlippa's own profit multiple
revenue_multipleFlippa's own revenue multiple
sale_methodclassified or auction
verified_listingVerified 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.

Built for Flippa

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.

Everything built in

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.

Use cases

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.

Access & pricing

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

2scraperTypical hosted API
CodeOpen source, MIT — read and patch itClosed
CostFree; optional services billed only when usedSubscription or per request / per result
Runs onYour machine, server or CIThe vendor's infrastructure
OutputJSON/CSV files + run metadataAPI responses
When the site changesFix it yourself or open an issue / PRWait for the vendor
FAQ

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.