To scrape Facebook Marketplace, give a Facebook Marketplace scraper a keyword and a city, or paste a Marketplace search URL, and it saves every public listing as a row: title, price, the original price when the seller cut it, location, delivery options and when it was posted. On Scrape.ly that's the Facebook Marketplace Scraper. It works without a Facebook account, cookies or your own proxy, and it costs $1.00 per 1,000 listings plus a small usage charge.
This guide covers the fields, the no-code steps, the API (curl, Python, Node.js and MCP), the cost, the pitfalls and the legal picture. It's built on a real run from 23 October 2026: desks between $50 and $300 in Chicago, 10 listings in 9 seconds.
What a Facebook Marketplace scraper returns
The Facebook Marketplace Scraper writes one row per listing. A search gives you the first group of fields; Include listing details (includeDetails) opens each listing for the rest.
| Field | What it holds |
|---|---|
id, url | Listing ID and link |
title, customTitle, subtitles | Listing title, the seller's own title, and short tags such as mileage |
price, priceFormatted | Asking price as a number and as Facebook shows it |
originalPrice, originalPriceFormatted | The earlier price when the seller lowered it |
locationText, city, state | Where the item is |
photoUrl | The main photo |
isLive, isSold, isPending | Listing status |
deliveryTypes | IN_PERSON, DOOR_PICKUP or shipping |
createdAt, creationTime | When the listing was posted |
categoryId | Facebook's Marketplace category |
searchQuery, searchLocation, sourceUrl | Which search found the listing |
With details: description, condition, attributes, photos, latitude, longitude, currency | Full text, item attributes, all photos and the exact map point |
With details, vehicles: vehicle | Make, model, trim, odometer, transmission, fuel, colors, title status, seller type |
Rows also carry seller fields (sellerName, sellerId, sellerType; the profile link, join date and rating come with details). On Marketplace many sellers are private people (all ten in our run were sellerType: User), so treat those fields as personal data: store them only if you need them.
How to scrape Facebook Marketplace without code
- Open the Actor's page in the Scrape.ly Store and sign in.
- Pick a ready-made input. We ran the preset Desks in Chicago from $50 to $300, 10 listings. "Try this input" opens it in the console.
- Change the keyword, city and price bounds to yours. This is the exact input of our run:
{
"searchQueries": ["desk"],
"location": "Chicago, IL",
"minPrice": 50,
"maxPrice": 300,
"maxItems": 10
}- Click Start. Our run took 9 seconds.
- Export the listings as JSON, CSV, Excel or HTML.
The fields that matter most:
searchQueries: one keyword per line, each its own search, the same text you'd type into the Marketplace search box.location: a city (Austin, TX), a ZIP code or a Marketplace slug (nyc,prague). Outside the US, add the country (Munich, Germany); the preset Bikes for sale in Prague shows how.latitudeandlongitudeset an exact point instead, andradiusKmthe radius (default 65 km).maxItems: listings per keyword or search URL (default 20).- Filters:
minPrice,maxPrice,itemCondition,daysSinceListed(1, 7 or 30 days),sortBy,deliveryMethod,availability(including sold listings) andcategory. The preset Cheapest iPhones in Dallas this week combines several. startUrls: Marketplace search, category or listing URLs. Filters inside a URL are kept as they are.includeDetails: opens each listing for the description, all photos, coordinates, condition and vehicle data, at $0.0001 extra per listing.
How to scrape Facebook Marketplace with the API
Create an API token under Settings → API & Integrations and export it as SCRAPELY_TOKEN. The Actors API docs list every endpoint.
curl. A 10-listing search takes seconds, well inside the 45-second limit of the synchronous endpoint, which returns the listings as a JSON array (add ?format=csv for CSV):
curl -X POST "https://api.scrape.ly/v2/actors/shelfbright~facebook-marketplace-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $SCRAPELY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchQueries": ["desk"], "location": "Chicago, IL", "minPrice": 50, "maxPrice": 300, "maxItems": 10}'Python (pip install scrapely-client-python). call() waits however long the run takes, which matters for big searches with details. This example finds listings whose sellers cut the price, the usual sign of a negotiable deal:
import os
from scrapely_client import ScrapelyClient
client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")
run = client.actor("shelfbright/facebook-marketplace-scraper").call(
run_input={"searchQueries": ["desk"], "location": "Chicago, IL", "minPrice": 50, "maxPrice": 300, "maxItems": 10}
)
print(run.status) # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
for item in client.dataset(run.default_dataset_id).iterate_items():
cut = item.get("originalPrice")
if cut:
print(f'{item["priceFormatted"]:>6} (was {item["originalPriceFormatted"]}) {item["locationText"]:16} {item["title"]}')Node.js (npm install scrapely-client):
import { ScrapelyClient } from 'scrapely-client';
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });
const run = await client.actor('shelfbright/facebook-marketplace-scraper').call({
searchQueries: ['desk'],
location: 'Chicago, IL',
minPrice: 50,
maxPrice: 300,
maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((i) => [i.priceFormatted, i.locationText, i.createdAt, i.url]));AI agents (MCP). Add the hosted Scrape.ly MCP server. In Cursor, put this in ~/.cursor/mcp.json:
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}In Claude Code, run claude mcp add --transport http scrapely https://api.scrape.ly/mcp and sign in with /mcp. Then ask: "Use scrapely to run shelfbright/facebook-marketplace-scraper for 'road bike' in Seattle, newest first, 20 listings, and give me a table of price, location and posting date." The agent uses fetch-actor-details to read the input, call-actor to run it and get-actor-output to read the rows. The Facebook Marketplace API page shows the same Actor as an API product.
A real run: desks in Chicago from $50 to $300
We ran the preset on 23 October 2026. It saved 10 listings in 9 seconds of run time and was charged $0.0105. The first five:
| Listing | Price | Was | Location | Delivery | Listed |
|---|---|---|---|---|---|
| Wood Computer Desk | $50 | – | Winnetka, IL | Pickup | 23 Sep 2026 |
| Standing desk and gamer chair | $50 | $75 | Chicago, IL | Pickup | 2 Oct 2026 |
| Work desk with shelf / drawers / LED lighting | $50 | – | Chicago, IL | Pickup | 28 Jul 2026 |
| Desk | $50 | $65 | Chicago, IL | Pickup, door pickup | 27 Sep 2026 |
| Wooden Desk | $75 | – | Chicago, IL | Pickup | 18 Oct 2026 |
The ten listings came from ten different private sellers, so we leave seller names and IDs out of the table entirely. What the full run shows:
- The floor price wins. Seven of ten desks were listed at exactly $50, the bottom of our range. The other three asked $70, $75 and $80. Nothing came close to the $300 cap.
- Price cuts are common. Four sellers had lowered their price: from $75, $65, $100 and $55.
originalPriceshows you which listings are already negotiating. - Listings stay up for months. Posting dates ran from 28 July to 18 October 2026, so a desk search returns stock that has been sitting for weeks next to fresh posts. Sort by
creation_time_descendif you only want new ones. - The radius reaches the suburbs. Seven listings were in Chicago, the others in Winnetka, Evanston and North Aurora, with the default 65 km radius.
- Pickup dominates. All ten offered in-person pickup; three also offered door pickup. None shipped.
The log, without the platform's start-up lines:
2026-10-23T03:02:27.570Z [Scrapely] Container started (setup 2.4 s)
2026-10-23T03:02:28.977Z [scrapely.proxy_configuration] INFO Platform proxy access check succeeded.
2026-10-23T03:02:30.154Z [scrapely.actor] INFO Scraping 1 search(es) or listing(s), up to 10 listings each
2026-10-23T03:02:33.824Z [scrapely.actor] INFO Saved 10 listings (tokens 1.0s, inputs 1.3s, done 4.9s)
2026-10-23T03:02:34.305Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=falseThe Actor had Facebook's tokens after 1.0 seconds and all ten listings saved 4.9 seconds after it started. Listings loaded over the built-in residential proxy, as Facebook requires for logged-out visitors, with no proxy setup from us.
What it costs
The Actor charges $0.001 per listing saved ($1.00 per 1,000) and, when details are on, $0.0001 per listing detail page ($0.10 per 1,000). Platform usage (compute plus residential and datacenter proxy traffic) is billed on top.
For our run: 10 listings × $0.001 = $0.01 in listing fees. The run was charged $0.0105 in total: $0.0003 of compute, $0.00017 of proxy traffic and $0.00005 of dataset writes. Search pages are light, about 2 KB of residential traffic per listing according to the README, so 1,000 listings cost about $1.02 all in. Detail pages are about 110 KB each; with details, the README estimates about $0.10 more in events and $0.23 more in traffic per 1,000 listings.
What to watch out for when scraping Facebook Marketplace
- Seller data is personal data. Many Marketplace sellers are individuals. Keep names, IDs and profile links out of exports you share, or drop them entirely, as we did above.
- One search, one ceiling. A search returns at most what Facebook pages through, usually 1,000 to 2,000 listings. Split big jobs by keyword, category or city.
- Facebook decides the results. It may include nearby listings outside your radius, and "Listed in the last" combined with a price or distance sort returns nothing on Facebook's side. The Actor then ignores the sort; newest-first still works.
- URL filters win. Filters inside a pasted Marketplace URL are used as they are; the input filters apply only to keyword searches.
- New-listing alerts. Schedule a newest-first search (for example hourly) and dedupe on
id; each run then surfaces only what's new to you. - Local currency. Prices are in the seller's currency. Turn on
includeDetailswhen you mix markets, and every row carries itscurrencycode.
Is it legal to scrape Facebook Marketplace?
The Actor reads only listings Facebook shows to logged-out visitors. It never logs in, messages sellers or touches groups-only listings. Facebook's own position is clear: its robots.txt opens with the notice that "Collection of data on Facebook through automated means is prohibited unless you have express written permission from Facebook".
Courts have looked at logged-out scraping of Meta's sites. In Meta Platforms v. Bright Data, a federal court in California ruled on 23 January 2024 that Facebook's and Instagram's terms "do not apply to Bright Data's logged-off scraping of publicly viewable data". That ruling is specific to its facts and to the terms at the time, and it doesn't touch privacy law.
Privacy law is the bigger issue on Marketplace. A private seller's name, profile and location are personal data under the GDPR and the CCPA. Collect only the fields you need, keep them secure and have a lawful basis for processing them. Item data such as price, title and category is far less sensitive. This is general information, not legal advice: if Marketplace data drives a commercial product, ask a lawyer about your case.
Why Scrape.ly for Facebook Marketplace data
- No account to lose. The Actor works logged out, so there's no Facebook account, cookie or login session to get banned, and no browser to keep alive.
- There's no open Marketplace API. Meta's Content Library API does include Marketplace listings from public Pages and profiles, but it runs in a secure research environment and Meta says downloading data from the API is not permitted. For pricing and stock work you need your own rows.
- Real filters, real fields. Price range, condition, recency, sort, delivery, radius and sold listings map to Marketplace's own filters, and price cuts, delivery types and vehicle data come back as fields instead of HTML.
- Cheap enough to schedule. $1.00 per 1,000 listings, and our 10-listing run cost $0.0105. Run it hourly for alerts, and compare used prices with eBay or retail prices as in our price scraping guide. For resale research, the eBay guide covers the other big secondhand market.
FAQ
Can you scrape Facebook Marketplace without logging in?
Yes. The Actor reads the listings Facebook shows to logged-out visitors, over a built-in residential proxy, because Facebook only answers residential IPs without a login. You don't need an account, cookies or your own proxy.
Does Facebook Marketplace have an API?
Not one you can sign up for to pull listings. Meta's Content Library API covers Marketplace listings from public Pages and profiles for research inside a secure environment, and Meta doesn't permit downloading data from it. To get rows for your own analysis, a scraper is the practical route.
How do I scrape Facebook Marketplace with Python?
Install scrapely-client-python, call shelfbright/facebook-marketplace-scraper with a keyword, a location and maxItems, and iterate over the dataset, as in the example above. The client waits for the run to finish.
Can I scrape Facebook Marketplace car listings?
Yes. Search a keyword such as "honda civic" or use the vehicles category, and turn on includeDetails. Vehicle rows then include make, model, trim, mileage, transmission, fuel type, title status and seller type.
How much does it cost to scrape Facebook Marketplace?
$1.00 per 1,000 listings, plus $0.10 per 1,000 if you open listing details, plus platform usage. Our 10-listing run was charged $0.0105 in total.




