---
title: "How to Scrape Facebook Marketplace (2026) | Scrape.ly"
description: "Use a Facebook Marketplace scraper to get listings by keyword and city: price, price cuts, location and posting time, with a real run, its cost and code."
url: https://scrape.ly/blog/scrape-facebook-marketplace
markdown: https://scrape.ly/blog/scrape-facebook-marketplace.md
---

[Tutorials](https://scrape.ly/blog/category/tutorials.md)

# How to Scrape Facebook Marketplace: Listings, Prices and Locations

Scrape Facebook Marketplace by keyword and city, or from search, category and listing URLs, and get title, price, price cuts, location, delivery options and posting time as rows. No Facebook login. A real run, its cost, and code for curl, Python, Node.js and AI agents.

[Shelfbright Actor publisher on the Scrape.ly Store](https://scrape.ly/blog/author/shelfbright.md)

- Published

  Oct 23, 2026

- Reading time

  8 min read

![Pixel-art robot with an orange >\_ on its terminal head pulls an item card with a photo and a blue price out of a phone showing the blue Facebook logo above a grid of marketplace items, and drops it into a crate](https://scrape.ly/media/scrape-facebook-marketplace.png?w=1080)

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](https://scrape.ly/store/shelfbright/facebook-marketplace-scraper.md) 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

1. Open the Actor's page in the Scrape.ly Store and sign in.
2. Pick a ready-made input. We ran the preset [Desks in Chicago from $50 to $300, 10 listings](https://scrape.ly/store/shelfbright/facebook-marketplace-scraper/presets/price-range.md). "Try this input" opens it in the console.
3. Change the keyword, city and price bounds to yours. This is the exact input of our run:

```json
{
  "searchQueries": ["desk"],
  "location": "Chicago, IL",
  "minPrice": 50,
  "maxPrice": 300,
  "maxItems": 10
}
```

4. Click **Start**. Our run took 9 seconds.
5. 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](https://scrape.ly/store/shelfbright/facebook-marketplace-scraper/presets/search-prague.md) shows how. `latitude` and `longitude` set an exact point instead, and `radiusKm` the 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) and `category`. The preset [Cheapest iPhones in Dallas this week](https://scrape.ly/store/shelfbright/facebook-marketplace-scraper/presets/recent-price-sort.md) 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.

Scrape.ly Store Facebook Marketplace Scraper Marketplace listings by keyword and city or from URLs: price, price cuts, location, delivery and posting time, plus vehicle data with details. No login. $1 per 1,000 listings.

[Try it free](https://scrape.ly/store/shelfbright/facebook-marketplace-scraper.md) [Browse the Store](https://scrape.ly/store.md)

## 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](https://scrape.ly/docs/api-actors.md) 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):

```shell
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:

```python
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`):

```javascript
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`:

```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](https://scrape.ly/api/facebook-marketplace-api.md) 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. `originalPrice` shows 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_descend` if 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:

```plaintext
20261023T03:02:27.570Z [Scrapely] Container started (setup 2.4 s)
20261023T03:02:28.977Z [scrapely.proxy_configuration] INFO  Platform proxy access check succeeded.
20261023T03:02:30.154Z [scrapely.actor] INFO  Scraping 1 search(es) or listing(s), up to 10 listings each
20261023T03:02:33.824Z [scrapely.actor] INFO  Saved 10 listings (tokens 1.0s, inputs 1.3s, done 4.9s)
20261023T03:02:34.305Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=false
```

The 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 `includeDetails` when you mix markets, and every row carries its `currency` code.

## 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](https://www.facebook.com/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](https://www.courthousenews.com/wp-content/uploads/2024/01/meta-platforms-v-bright-data-ruling-motion-for-summary-judgment.pdf) 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](https://developers.facebook.com/docs/content-library-and-api/content-library-api/overview/). 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](https://scrape.ly/blog/price-scraping.md) guide. For resale research, the [eBay guide](https://scrape.ly/blog/how-to-scrape-ebay.md) 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.

Scrape.ly Store Scrape Facebook Marketplace listings Run the Chicago desks preset as-is, or type your own keyword, city and price range. No login. $1 per 1,000 listings.

[Try it free](https://scrape.ly/store/shelfbright/facebook-marketplace-scraper.md) [Browse the Store](https://scrape.ly/store.md)

About the author

[Shelfbright](https://scrape.ly/blog/author/shelfbright.md) Actor publisher on the Scrape.ly Store

Prices, stock and seller data from shops and marketplaces, from Amazon and AliExpress to Vinted and Leboncoin. For price trackers, catalogue teams and resellers. A Scrapely studio.

- [Website](https://scrape.ly/users/shelfbright.md)

Keep reading

## More in Tutorials

- [![Pixel-art robot with an orange >\_ on its terminal head pulls a stay listing card with a house icon and a star off a house at night, beside a yard sign with the pink Airbnb logo, and drops it into a crate](https://scrape.ly/media/scrape-airbnb.png?w=750)](https://scrape.ly/blog/scrape-airbnb.md)
  ### [Airbnb Scraping: How to Get Listings, Prices and Reviews](https://scrape.ly/blog/scrape-airbnb.md)
  [Airbnb scraping, step by step: pull listings by city with prices for your dates, ratings, hosts and amenities, then every guest review. Two real runs, their exact cost, and code for curl, Python, Node.js and AI agents.](https://scrape.ly/blog/scrape-airbnb.md)
- [![Pixel-art robot with an orange >\_ on its terminal head lifts a job card with a briefcase icon off a search results page headed by the Google G logo, where more job cards are listed, and drops it into a crate](https://scrape.ly/media/scrape-google-jobs.png?w=750)](https://scrape.ly/blog/scrape-google-jobs.md)
  ### [How to Scrape Google Jobs Listings: Titles, Pay and Apply Links](https://scrape.ly/blog/scrape-google-jobs.md)
  [Google Jobs pulls openings from LinkedIn, Indeed, ZipRecruiter and company career sites into one panel. Here is how to scrape Google Jobs by role and city and get each job as a row with company, source board, highlights and apply link, with a real run, its cost and code.](https://scrape.ly/blog/scrape-google-jobs.md)
- [![Pixel-art robot with an orange >\_ on its terminal head pulls a review card with five red rating squares out of a shop front with a striped awning and the red Yelp burst logo on its sign, and drops it into a crate](https://scrape.ly/media/scrape-yelp-reviews.png?w=750)](https://scrape.ly/blog/scrape-yelp-reviews.md)
  ### [How to Scrape Yelp Reviews and Business Data](https://scrape.ly/blog/scrape-yelp-reviews.md)
  [Scrape Yelp reviews for any business URL: full text, stars, dates, photos, reactions and the owner's reply, with keyword, star and date filters. Plus business details from the same page. A real run, its cost, and code for curl, Python, Node.js and AI agents.](https://scrape.ly/blog/scrape-yelp-reviews.md)

## The internet is full of data. Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

[Get Started Free](https://my.scrape.ly/register) [Chat with Support](mailto:support@scrape.ly?subject=Question%20about%20Scrape.ly\&body=Hi%2C%20I%20have%20a%20question%20about%20Scrape.ly.)

No credit card. No setup calls.
