Facebook Marketplace Scraper
Pricing
from $16.00 / 1,000 listing analyzeds
Facebook Marketplace Scraper
Scrape public Facebook Marketplace listings from any city worldwide - no login required. Get title, price, currency, seller location, listing URL and every photo as JSON or CSV. AI identifies brand and model from listing titles in any language: German, French, Japanese, Portuguese and more.
Pricing
from $16.00 / 1,000 listing analyzeds
Rating
2.2
(2)
Developer
WebDataLabs
Maintained by CommunityActor stats
6
Bookmarked
723
Total users
10
Monthly active users
3 days ago
Last modified
Categories
Share
Facebook Marketplace Scraper — deep results, verified city, no login
Scrape hundreds of public Facebook Marketplace listings per search, from the city you actually asked for. Most Marketplace scrapers stop at the ~24 listings on the first screen. This one follows Facebook's own result cursor, so a busy city keeps going — 400 listings in 78 seconds in the verified run below, and a single search has reached 1,846.
What you get
One flat row per listing — 23 fields, no nesting — plus a machine-readable run report.
- Depth, not one screenful. 24 was never Facebook's limit; it is the page size of Facebook's own query. This actor pages through the result cursor until you have what you asked for or Facebook runs out, and the run report says which of the two happened.
- Local pickup vs nationwide shipping, told apart. Facebook silently mixes shipped listings from the whole country into every local feed. Every row carries
shippingAvailable, and one switch removes them. In a verified 400-listing New York run, 25 of the 40 shipped rows were from Arizona, Texas, Illinois, California and Washington — against 1 of 360 local rows. - Verified city — the city is resolved through Facebook's own location list, and the coordinates Facebook echoes back are checked against it. A city Facebook does not accept is a loud failure, never another city's listings.
- Any country, currency and language — verified live on US, Canada, UK, Germany and South Africa in one test pass, returning USD, CAD, GBP, EUR and ZAR.
- Posting time on every row —
postedAtcomes from Facebook's own timestamp, so you can sort for what appeared today. 100% populated across 837 verified rows. - Markdowns surfaced —
originalPricecarries the struck-through price when a seller has cut it (22% of verified rows). - No login, no account, no cookies of yours. Public listings only.
- Honest nulls — an unreadable price is
null, never0; a missing location isnull, never the city you typed. Fields that cannot be filled for a row are left out of that row entirely rather than shipped as a column of nulls. - Flat JSON/CSV output — works directly with Excel, Google Sheets, n8n, Zapier, Make.com
How deep can it go?
| Search | Listings | Requests | Time | Proxy traffic |
|---|---|---|---|---|
| New York, "bicycle" | 400 (capped by input) | 19 | 78 s | 0.5 MB |
| Tucson, electronics / "laptop" | 60 | 4 | 37 s | 0.4 MB |
| Berlin, "fahrrad" | 80 | 5 | 41 s | 0.5 MB |
Depth is limited by what Facebook actually has. A narrow search in a small city exhausts in one or two requests, and the run report then says stopReason: "inventory-exhausted" instead of pretending a cap was hit.
Known limits — read before you run
1. You are billed per listing delivered. "Maximum results" is therefore the field that decides what a run costs. It defaults to 24 — the same volume the previous version returned, so existing saved tasks keep their current cost. Raising it (up to 2000) pulls far more per search and bills accordingly, so set it deliberately.
2. Facebook ignores search radius when you are logged out. Measured on New York / "bicycle": a 2 km radius and a 500 km radius returned the same 63 listings from the same towns, some 70 km out. Rather than pretend, radius is retired — accepted and ignored so existing tasks keep running. Use "Local pickup only", which Facebook does honour, to keep results genuinely near the city.
3. "All Categories" needs a search term. Facebook's city-wide feed is drawn in the browser and is not in the served page at all, so there is nothing to read without one. Any named category (Electronics, Vehicles, Home Goods, …) browses fine with no search term.
4. There is no deal scoring, market value or profit estimate — and there is no hidden one. This actor used to value each listing against eBay SOLD prices. In July 2026 eBay put sold/completed search behind a sign-in wall: requests carrying LH_Sold=1 / LH_Complete=1 return a "Sign in or Register" page with zero results, on every locale, IP and client tested (0 successes in 258 attempts). Scoring against asking prices systematically overstates value and manufactures bargains that do not exist, so marketValue, profitPotential, dealScore, isDeal and friends are gone from the output, the schema and the views rather than shipped as empty columns.
The retired inputs minDealScore, useAuctionComps and radius are still accepted and ignored so existing tasks and schedules keep running; the run log and OUTPUT.retiredInputsIgnored name them. enableDealScoring is the former name of identifyProducts and still works as an alias.
5. Seller profiles are not available. A logged-out Marketplace page carries no seller identity, so no seller fields are returned.
6. Condition and description are sparse without "Visit listing pages". Marketplace search results simply do not carry them — condition appeared on 5% of verified rows from the title alone. With the switch on, up to 8 listing pages are opened and returned a description and Facebook's recorded condition on 8 of 8. Those pages cost more traffic each than the whole search that found them, which is why the cap exists.
7. Reliability depends on residential proxy quality. Facebook blocks datacentre and low-reputation IPs. A blocked attempt is retried on a fresh residential session, and a run that never got a readable page fails with a clear message instead of returning an empty dataset as "success".
Use cases
- Reselling and sourcing — find underpriced local stock, filter to what you can actually collect, sort by
postedAtto get there first - Local market research — hundreds of comparable asking prices in one specific city
- Monitoring — schedule a search and feed new listings into n8n / Zapier / Make.com
Input
| Field | Type | Default | Description |
|---|---|---|---|
location | String | "New York" | City to search. Add state/country when ambiguous: "Tucson, Arizona", "Ottawa, Ontario", "Cape Town, South Africa". |
category | Dropdown | electronics | Item category. "All Categories" requires a search term. |
searchQuery | String | — | Keyword filter, e.g. "iPhone 15", "lawn mower" |
maxListings | Number | 24 | How many listings to collect, up to 2000. This is what a run costs. |
localPickupOnly | Boolean | false | Drop nationwide-shipping listings, keeping only what you can collect in person |
minPrice / maxPrice | Number | — | Price band in the city's local currency, applied by Facebook itself |
identifyProducts | Boolean | true | Identify brand/model/variant/product type from the title |
enableDeepScrape | Boolean | false | Open up to 8 listing pages for description, full photos and stated condition |
proxyCountry | String | auto | Two-letter ISO country code, auto-detected from the city |
url | String | — | Paste a Marketplace URL to scrape it directly (its city is then not verified) |
Tip: Set OPENAI_API_KEY in your actor settings to enable AI product identification, which is markedly better on non-English titles.
Output
A real, unedited row from the verified Tucson, Arizona run above:
{"title": "Laptop Gaming HP Omen","price": 45,"currency": "USD","originalPrice": 450,"location": "Tucson, AZ","searchedLocation": "Tucson, Arizona","postedAt": "2026-06-18T02:30:12.000Z","deliveryTypes": ["IN_PERSON"],"shippingAvailable": false,"category": "electronics","brand": "HP","model": "Omen","variant": null,"productCategory": "laptop","listingUrl": "https://www.facebook.com/marketplace/item/1663997461558321/","listingId": "1663997461558321","imageUrl": "https://scontent.fcae1-1.fna.fbcdn.net/v/t39.84726-6/724640243_27350251781299207_5383915211959303984_n.jpg","images": ["https://scontent.fcae1-1.fna.fbcdn.net/v/t39.84726-6/724640243_27350251781299207_5383915211959303984_n.jpg"],"actualPhotoCount": 1,"deepScraped": false,"scrapedAt": "2026-07-29T08:02:14.299Z"}
condition and description are absent from that row because its listing page was not opened — the keys are left out, not set to null. With enableDeepScrape on, the same listing gains Facebook's own recorded condition, the seller's text and the full photo set:
{"title": "Laptop Gaming HP Omen","condition": "Used - like new","description": "Omen by HP Laptop 17.3' screen, Intel core i7-8750H, NVIDIA GeForce GTX, 1070 Graphics, 1TB HDD + 256 GB SSD, 16 GB SD RAM, 4 Zone Backlit Keyboard.","actualPhotoCount": 5,"deepScraped": true}
Reading deliveryTypes
IN_PERSON, PUBLIC_MEETUP, DOOR_PICKUP and DOOR_DROPOFF mean collection in person. SHIPPING_ONSITE and SHIPPING_OFFSITE mean the seller ships.
Watch out for one thing: IN_PERSON means local to the seller, not to you — a shipped listing three states away carries it too. That is why shippingAvailable is the field to filter on, and why "Local pickup only" uses Facebook's own shipping filter rather than guessing from this array.
Run report (OUTPUT key-value record)
{"outcome": "OK","requestedLocation": "New York","resolvedLocation": "New York, New York","locationVerifiedBy": "facebook-echoed-coordinates","listingsReturned": 400,"maxListingsRequested": 400,"pagesFetched": 19,"stopReason": "max-listings","proxyBytes": 524288,"shippedListings": 40,"localPickupListings": 360,"chargedEvents": 400,"chargeLimitReached": false,"message": "400 listings from New York, New York."}
stopReason is the honest bit: max-listings means you got everything you asked for, inventory-exhausted means Facebook had no more.
Leave a review
Is this actor saving you time? A quick review on the Store helps other people find it — and tells us which fields to add next. Rate this actor →
Legal Disclaimer
This actor is a general-purpose tool for analyzing publicly accessible web data. The user bears sole responsibility for ensuring their specific use complies with applicable laws (GDPR/DSGVO, copyright law), the target website's Terms of Service, and Apify's Terms of Service.
The provider (webdatalabs) expressly disclaims liability for any unauthorized or unlawful use. By using this actor, the user agrees to indemnify the provider against any third-party claims arising from their use of the data.
This tool is not affiliated with Facebook/Meta. All trademarks belong to their respective owners.