Facebook Marketplace Scraper avatar

Facebook Marketplace Scraper

Pricing

from $0.50 / 1,000 record scrapeds

Go to Apify Store
Facebook Marketplace Scraper

Facebook Marketplace Scraper

Reliable Facebook Marketplace scraper. Works without login extracts titles, prices, full descriptions, GPS, photos, and category attributes (vehicle make/year/mileage, property bedrooms). Built-in monitoring mode for incremental scraping. Multi-source SSR JSON parser handles FB shape changes.

Pricing

from $0.50 / 1,000 record scrapeds

Rating

0.0

(0)

Developer

kata Kuri

kata Kuri

Maintained by Community

Actor stats

1

Bookmarked

15

Total users

7

Monthly active users

6 hours ago

Last modified

Share

Reliable, no-login Facebook Marketplace scraper. Returns clean JSON with title, price, full description, photos, GPS coordinates, condition, category, and category-specific attributes (vehicle make/model/year/mileage, property bedrooms/bathrooms, and more).

Works without cookies for 90%+ of public listings. Most other scrapers go silent the moment Facebook rotates its SSR shape — this one walks the inlined JSON and merges every sibling target node, so you don't lose half the fields when FB changes things.

Why this scraper

This actorTypical alternative
Anonymous mode✓ default — no cookies neededOften "required", silently fails
Login wall handlingContent-aware: serves through soft overlaysHard-fails on /login redirect
Description, GPS, photosExtracted from inlined SSR JSON anonymouslyOften null without cookies
SSR shape changesMulti-source merge from every sibling target nodeReturns partial / null when FB rotates
Honest completeness flag_completeness: "basic" | "full"Marks partial data as full
Cross-run dedupBuilt-in monitoring modeAdd-on / missing
Incremental "since X"untilDate filterMissing
Strict keyword matchstrictMatch: true removes broad-match noiseMissing
Auto same-country proxyPicks US / GB / DE / FR / etc. from cityManual config
Pricing (full detail, 1K)$1.51 (Starter+), $2.72 (Free) — pay-per-event$2.60–$44 / 1K + subscriptions

Quickstart

1. Search by keyword + city

{
"searchQuery": "iphone 15",
"city": "newyork",
"maxResults": 50,
"scrapeDetails": true,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

2. Browse a category

{
"city": "losangeles",
"category": "furniture",
"maxResults": 100,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

3. Drop in raw Marketplace URLs

{
"searchUrls": [
"https://www.facebook.com/marketplace/sanfrancisco/cars?minPrice=10000&maxPrice=30000",
"https://www.facebook.com/marketplace/seattle/electronics"
],
"scrapeDetails": true,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

4. Incremental "what's new since yesterday"

{
"searchQuery": "macbook pro",
"city": "austin",
"scrapeDetails": true,
"monitoringMode": true,
"monitoringStoreName": "fb-macbook-austin",
"untilDate": "2026-04-25",
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Schedule this hourly; you'll only ever pay for net-new listings.


Input configuration

FieldTypeDefaultDescription
searchUrlsstring[]Paste any Marketplace URL: /marketplace/<city>/, /marketplace/<city>/<category>, /marketplace/<city>/search?query=.... Combinable with the search-builder fields.
searchQuerystringKeyword. Combined with city / category to build a URL.
citystringCity slug. Use Facebook's slug (e.g. newyork, losangeles, london, paris, berlin).
categoryenumvehicles, cars, phones, furniture, clothing, property-rentals, appliances, etc.
sortByenumbest-matchnewest, price-low, price-high, distance, best-match.
conditionenumnew, used-like-new, used-good, used-fair.
minPrice / maxPriceintPrice filter (in the city's local currency).
radiusKmintFB defaultSearch radius from city center, max 100 km.

Scope and cost control

FieldTypeDefaultDescription
maxResultsintunlimitedHard cap on listings returned. The crawler stops as soon as this is hit.
scrapeDetailsbooltrueVisit each listing's detail page for description, GPS, full photo set, condition, category attributes. Cheaper to leave off if you only need card data.
maxConcurrencyint3Parallel browser tabs (1–10). Keep low (2–3) to stay under FB's bot-detection threshold.

Filters

FieldTypeDefaultDescription
strictMatchboolfalseDrop any listing whose title doesn't contain every word of the query. Filters out FB's broad-match noise.
untilDatestringISO date (2026-04-25). Skip listings posted before this date. Only applied when detail-scraping captures publishedAt.

Incremental scraping

FieldTypeDefaultDescription
monitoringModeboolfalseTrack listing IDs across runs in a named Key-Value store. Skip any IDs already pushed in earlier runs.
monitoringStoreNamestringfb-marketplace-seenName of the KV store. Use different names to keep separate watchlists.

Authentication (optional)

FieldTypeDefaultDescription
cookieStatestringOptional Facebook session cookies as JSON. Anonymous works for public card and detail data; supply cookies only if you need seller name/profile (FB hides those server-side anonymously). Stored as a secret.

Infrastructure

FieldTypeDefaultDescription
proxyConfigurationobjectStandard Apify proxy config. Residential strongly recommended — datacenter IPs are blocked by Facebook. If you set a city and use residential without a countryCode, the actor auto-picks a same-country proxy.

Output schema

Each row in the dataset:

{
"listingId": "1279908470484354",
"title": "iPhone 12 Pro Max - Mint condition",
"price": 425,
"currency": "USD",
"condition": "Used - Like New",
"category": "807311116002614",
"description": "Selling my iPhone 12 Pro Max, 256GB, mint condition...",
"city": "Austin",
"location": "Austin, TX",
"latitude": 30.267153,
"longitude": -97.743057,
"images": ["https://scontent.../photo1.jpg"],
"sellerName": null,
"sellerProfileUrl": null,
"deliveryType": "IN_PERSON",
"listingUrl": "https://www.facebook.com/marketplace/item/1279908470484354/",
"publishedAt": "2026-04-30T23:00:11.000Z",
"scrapedAt": "2026-05-02T08:00:00.000Z",
"attributes": { "subtitles": ["256 GB", "Like new"] },
"isSold": false,
"isPending": false,
"_completeness": "full"
}

Vehicle listings additionally fill attributes.vehicleMake, vehicleModel, vehicleYear, mileage, mileageUnit, transmission, fuelType, exteriorColor, interiorColor, vehicleSellerType, vin.

Property listings additionally fill attributes.bedrooms, bathrooms, areaSize, areaUnit, propertyType, yearBuilt.

_completeness is "basic" when only card-level data was captured, "full" when detail-page enrichment landed.

sellerName and sellerProfileUrl are null in anonymous mode — Facebook hides seller PII server-side without login.


Pricing

Pay-per-event with automatic Apify-plan discounts. You pay only for what's scraped — no subscription, no minimums.

EventFreeStarterScaleBusiness
Actor start (per run)$0.02$0.01$0.009$0.008
Record scraped (per 1,000)$0.70$0.50$0.50$0.50
Detail-enriched listing (per 1,000)$2.00$1.00$1.00$1.00

Typical run costs

ModeFree planStarter / Scale / Business
Search-only (1,000 listings, scrapeDetails: false)$0.72$0.51
Full detail (1,000 listings, default)$2.72$1.51
Search-only (10,000 listings)$7.02$5.01
Full detail (10,000 listings)$27.02$15.01

Plus standard Apify residential-proxy traffic, billed to your account separately.

Cost vs alternatives

ScraperFull-detail 1K listingsSubscription
This actor (Starter+)$1.51none
apify/facebook-marketplace-scraper$2.60none
memo23/facebook-marketplace-cheeriousage-based$25/mo
datavoyantlab/facebook-marketplace-scraper$0.45–$4.00$28/mo
webdatalabs/deal-finder$44.00 (deals only)none

How it stays reliable

Three defensive layers, in priority order:

  1. Inlined SSR JSON — Facebook ships every page with multiple <script type="application/json"> blobs containing the full GraphQL responses. The actor scans every script, walks the JSON tree (up to 20 levels deep), and merges sibling target nodes so you don't lose half the fields when FB changes its shape.
  2. Live /api/graphql interceptor — when the page fires GraphQL calls (logged-in sessions or client-side re-fetches), those payloads are parsed too. Same parser, same field set.
  3. Open Graph meta tagsog:title, og:description, og:image are always populated even if FB rotates its SSR shape.

Plus:

  • Per-context warm-up — visit /marketplace/ once before the real navigation so FB's bot detector sees a browser that browsed first.
  • Content-aware block detection — only fail on /login redirects when there's no marketplace data on the page; FB often serves the full data with a login overlay on top.
  • ID-matching guard — fields are only merged from items whose id matches the target listing, so the "Similar items" sidebar can't leak into your row.

Common scenarios

Build a price-tracking feed

{
"searchQuery": "iphone 15",
"city": "newyork",
"scrapeDetails": false,
"monitoringMode": true,
"monitoringStoreName": "fb-iphone15-nyc-prices"
}

Schedule hourly. Each run only pushes listings you haven't seen — perfect for a (timestamp, listingId, price) time series.

Monitor a niche category

{
"city": "boston",
"category": "musical-instruments",
"monitoringMode": true,
"monitoringStoreName": "fb-instruments-boston",
"untilDate": "2026-04-01",
"scrapeDetails": true
}

Strict comparison shopping

{
"searchQuery": "macbook pro 14",
"city": "sanfrancisco",
"strictMatch": true,
"scrapeDetails": true
}

strictMatch drops any listing whose title doesn't contain both "macbook" and "pro" — no chargers, no docks, no accessories.

Used-car research

{
"city": "dallas",
"category": "cars",
"minPrice": 5000,
"maxPrice": 25000,
"condition": "used-good",
"sortBy": "newest",
"scrapeDetails": true,
"maxResults": 200
}

Returns full vehicle attributes (vehicleMake, vehicleModel, vehicleYear, mileage, transmission, fuelType) for each listing.


FAQ


Issues / contact

Open an issue on this actor's page on Apify Store, or contact the maintainer through the Apify console.