# Facebook Marketplace Scraper - Listings, Prices & Sellers (`eiv/facebook-marketplace-scraper`) Actor

Scrape Facebook Marketplace listings by keyword and city, category or pasted URL: title, price, photos, location, seller, listing date and status. Optional details: description, coordinates, all photos, seller rating, vehicle specs. Only-new monitoring. No login.

- **URL**: https://apify.com/eiv/facebook-marketplace-scraper.md
- **Developed by:** [Eimantas V](https://apify.com/eiv) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 0 monthly users, 99.2% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Facebook Marketplace Scraper** extracts listings from **Facebook Marketplace**: title, price, currency, photo, city, exact listing date, status, seller and delivery options, plus optional details (full description, coordinates, all photos, condition, seller rating, vehicle specs). Search by keyword in any city or postal code, browse categories, or paste Marketplace URLs and listing links. Run it on a schedule to get **only new listings and price drops**. No login, no cookies, no browser, from **$0.50 per 1,000 listings**.

```
title                                        price  location                listed
Mongoose 20-inch Kids' Bike w/ Training...   $45    Flushing, NY            2026-11-02 16:53
Guardian Ethos Kids Bike                     $125   Elmont, NY              2026-11-02 13:01
Electric bike                                $500   Bronx, NY               2026-11-02 00:55
60cm Project Bike                            $100   Brooklyn, NY            2026-11-02 14:12
```

**Benchmark: 100 bike listings in New York in 9 seconds (7 requests); 40 sofas in Chicago with full details in 26 seconds.**

### What does Facebook Marketplace Scraper do?

It searches Facebook Marketplace the way a logged-out visitor does and returns every listing as a clean row you can export to Excel, CSV or JSON, or send to Google Sheets, Make, Zapier or an AI agent. Give it search terms and locations, pick categories, or paste the URL of any Marketplace search you set up in your browser, filters included.

- **Search any city in the world.** Type "New York, NY", "London", "Vilnius, Lithuania", a postal code or coordinates; prices come in the local currency, with the currency code.
- **Every Facebook filter.** Sort order, price range, condition, date listed, available or sold, local pickup or shipping, exact match, and vehicles by year and mileage (from a pasted URL).
- **Optional listing details.** Full description, exact coordinates, condition and attributes, all photos, seller rating and join date, shipping, and vehicle specs: make, model, trim, year, mileage, transmission, fuel, colours, title status.
- **Only new listings.** Scheduled runs deliver only listings posted since the last run, plus listings whose price or status changed (with the previous price), so price drops and new deals reach you without duplicates.
- **Only pay for results.** Searches that fail, duplicates found by two searches, filtered-out and unchanged listings are never charged.
- **Built for automation.** Run it on a schedule, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets or an AI agent through Apify's MCP server.

### Why it is fast and cheap

It calls the same data endpoints Facebook's own Marketplace page uses, without a browser: one request returns 24 listings with their prices, dates and sellers. Location names are resolved through Facebook's own place search, and listing details are read only when you ask for them. That is why a 100-listing search finishes in seconds and costs a fraction of browser-based scrapers.

### What data can you extract from Facebook Marketplace?

| Field | Example | What it is |
|---|---|---|
| `title` | `Down sofa` | The listing title |
| `price`, `priceFormatted`, `currency` | `40`, `$40`, `USD` | Asking price as a number, as shown, and its currency |
| `originalPrice` | `100` | The struck-through earlier price after a price cut |
| `listedAt`, `hoursSinceListed` | `2026-10-24T17:18:00Z`, `256.8` | When it was posted, exact to the second |
| `city`, `state`, `locationText` | `Chicago`, `IL` | Where the item is |
| `status`, `isSold`, `isPending` | `available` | available, pending, sold or hidden |
| `imageUrl` | `https://scontent...jpg` | The main photo |
| `sellerName`, `sellerId`, `sellerProfileUrl` | `Jane D.` | The seller as shown on the listing |
| `deliveryTypes`, `shippingOffered` | `["IN_PERSON"]` | Local pickup or shipping |
| `subtitle` | `67K miles` | Facebook's extra line, e.g. a vehicle's mileage |
| `url`, `id` | `https://www.facebook.com/marketplace/item/1040710359029470/` | Link and listing id |
| `description` \* | `89x40 ... pick up only Lakeview` | The seller's full description |
| `latitude`, `longitude` \* | `41.954`, `-87.654` | The listing's map pin |
| `condition`, `attributes` \* | `Used – good` | Condition and structured attributes |
| `photos`, `photoCount` \* | `5` | Every photo of the listing |
| `sellerRating`, `sellerRatingCount`, `sellerJoinedAt` \* | `5`, `1`, `2007-12-17` | Seller trust signals |
| `vehicle` \* | `{ make: "Honda", model: "Civic", year: 2018, mileage: 67000, ... }` | Vehicle specs |
| `relatedSearches` \* | `["couch sofa", ...]` | Searches Facebook relates to the listing |
| `changeType`, `previousPrice` | `price_changed`, `350` | Only-new mode: what changed since the last run |
| `input`, `searchQuery`, `searchLocation`, `searchCategory` | `sofa · Chicago, IL` | Which of your searches found it |

\* With **Listing details** on (and always for listing links).

### How to scrape Facebook Marketplace

1. Click **Try for free**. Enter **Search terms** (for example `bike`) and **Locations** (for example `New York, NY`), or paste Marketplace URLs.
2. Set filters if you need them (price, condition, date listed, sold items) and **Max listings**: you pay per listing, so this is also your cost cap.
3. Click **Start**. A 100-listing search takes about 10 seconds; with details about a minute.
4. Open the **Output** tab (views: Listings, Details, Vehicles, New and changed), or download JSON, CSV, Excel or HTML.

To monitor Marketplace, turn on **Only new listings**, sort by **Date listed: newest first**, save the input as a task and add a schedule (for example every 15 minutes).

### How much does it cost to scrape Facebook Marketplace?

You pay per listing returned; details are an optional add-on per listing. Prices drop on higher Apify plans:

| Apify plan | Per 1,000 listings | Details add-on, per 1,000 | Listings with details, per 1,000 |
|---|---|---|---|
| Free | $0.90 | $3.50 | $4.40 |
| Starter | $0.75 | $3.00 | $3.75 |
| Scale | $0.65 | $2.75 | $3.40 |
| Business | $0.50 | $2.50 | $3.00 |

- 1,000 bike listings across 5 US cities on Starter: **$0.75**.
- A monitor checking 3 searches every 15 minutes that finds 300 new listings a day: 9,000 listings a month = **$6.75 on Starter**; a check that finds nothing new costs only the $0.00005 start.
- Listing links (facebook.com/marketplace/item/...) always include details, so they cost listing + details.
- A run also costs **$0.00005** to start. A search that fails, or matches nothing, costs nothing more.
- The Free plan's $5 monthly credit covers about **5,500 listings** (or about 1,100 with details).

### Input

```json
{
    "searchQueries": ["bike", "iphone 13"],
    "locations": ["New York, NY", "London, United Kingdom"],
    "categories": [],
    "urls": ["https://www.facebook.com/marketplace/la/vehicles?minYear=2015&maxMileage=100000"],
    "sortBy": "creation_time_descend",
    "maxPrice": 500,
    "daysSinceListed": "7",
    "includeDetails": false,
    "onlyNewListings": false,
    "maxItems": 200,
    "maxItemsPerSearch": 50
}
```

| Field | Default | Notes |
|---|---|---|
| Search terms | `bike` (example) | Each term is searched in every location (and category) |
| Locations | `New York, NY` (example) | City, "City, State", postal code, or "latitude, longitude" |
| Categories | none | 16 Marketplace categories; with terms they narrow the search, without terms they are browsed |
| Marketplace URLs or listing links | none | Searches, categories, city pages, single listings; a URL's own filters win |
| Sort by | Suggested | Newest first, price low/high, distance |
| Minimum / maximum price | none | In the location's currency; maximum 0 = free items |
| Condition | any | New, used - like new / good / fair |
| Date listed | any time | Last 24 hours, 7 days or 30 days |
| Availability | available | Or sold, for sold-price research |
| Delivery method | all | Local pickup or shipping only |
| Listed after | none | A date or "3 days"; older listings are dropped before charging |
| Title must / must not mention | none | Keyword filters on the title, applied before charging |
| Listing details | off | The details add-on |
| Only new listings | off | For scheduled runs; memory kept in a named key-value store in your account |
| Max listings / per search | 100 / 100 | Your cost caps |
| Proxy | Apify residential | Keep it: Facebook refuses Marketplace searches from datacenter addresses. Proxy traffic is included in the price |

### Output

Each listing is one row in the dataset. Every export includes all fields; the **Listings**, **Details**, **Vehicles** and **New and changed** views show the key columns. A listing with details:

```json
{
    "recordType": "listing",
    "input": "sofa · Chicago, IL",
    "searchQuery": "sofa",
    "searchLocation": "Chicago, Illinois",
    "id": "1040710359029470",
    "url": "https://www.facebook.com/marketplace/item/1040710359029470/",
    "title": "Down sofa",
    "price": 40,
    "priceFormatted": "$40",
    "currency": "USD",
    "originalPrice": 100,
    "listedAt": "2026-10-24T17:18:00.000Z",
    "city": "Chicago",
    "state": "IL",
    "status": "available",
    "sellerName": "Jane D.",
    "deliveryTypes": ["IN_PERSON"],
    "detailsFetched": true,
    "description": "89x40(deep)x27 height. Has some peeling on the corners ... pick up only Lakeview 60613.",
    "condition": "Used – good",
    "latitude": 41.95404,
    "longitude": -87.65441,
    "photoCount": 5,
    "sellerJoinedAt": "2007-12-17T02:50:24.000Z",
    "sellerRating": 5,
    "sellerRatingCount": 1,
    "relatedSearches": ["couch sofa", "vintage sofa couch", "lounge couch"],
    "vehicle": null,
    "changeType": null,
    "scrapedAt": "2026-11-04T10:07:44.642Z"
}
```

A search or link that cannot be read becomes a row with `"recordType": "error"` and an `errorCode` instead of failing the whole run:

| `errorCode` | Meaning |
|---|---|
| `NOT_FOUND` | No such place, location or listing (sold and removed, deleted, or a wrong link) |
| `NO_LOCATION` | A search without a location |
| `BLOCKED` / `RATE_LIMITED` | Facebook refused the requests; run again later |
| `FACEBOOK_ERROR` | Facebook rejected the request itself (it may have changed Marketplace; please report it) |

Error rows are never charged.

### Tips and limits

- **Facebook decides the search area.** Logged out, Marketplace ignores the radius setting and searches about 60 km around the place you give (the same results a visitor sees). Use several locations to cover a wider region.
- **Sold-price research:** set Availability to Sold, then compare `price` and `listedAt`.
- **Cheaper runs:** details cost four times a listing; turn them on only when you need descriptions, coordinates or vehicle specs, or use Title must mention / must not mention to keep only listings worth details.
- **Seller names** are hidden by Facebook in some feeds (vehicle categories); details fill them in.
- **Not available logged out:** seller profiles beyond name and id, messages, and property rentals and home sales feeds.
- **Hit your spending limit?** The run stops cleanly at your maximum cost per run and keeps everything it collected. Raise the limit in the run options to get more.

### FAQ

#### Is it legal to scrape Facebook Marketplace?

This Actor collects only data that Facebook shows publicly to visitors who are not logged in. Results contain seller names, which laws such as the GDPR protect. Scrape personal data only for a legitimate purpose, and ask a lawyer if you are unsure. Facebook is a trademark of Meta Platforms, Inc.; this Actor is not affiliated with or endorsed by Meta.

#### How does "Only new listings" work?

Each search remembers, in a key-value store in your account, which listings it delivered and when it last ran. The next run delivers listings posted since then and listings whose price or status changed (`changeType`: `new`, `price_changed` or `status_changed`, with `previousPrice`). Unchanged and older listings are skipped and never charged. Use a different memory name for independent monitors, and "Forget what was delivered before" to start over.

#### Can I use it through the API or with Make, Zapier and n8n?

Yes. Every run can be started through the [Apify API](https://docs.apify.com/api/v2) and returns the dataset as JSON, CSV or Excel. Schedules, webhooks and integrations for Make, Zapier, n8n and Google Sheets are on the **Integrations** tab.

#### Can AI agents use it?

Yes. Agents connected to [Apify's MCP server](https://mcp.apify.com) can find and run this Actor as a tool, with the same per-listing pricing. "Find used road bikes under $300 in Chicago listed this week" maps directly to its search terms, location, price and date fields.

#### Why did I get fewer listings than I asked for?

Either the search has fewer listings than your limit, a filter or "only new" removed them, the run reached your maximum cost per run, or it reached its timeout. The log says which, and nothing collected before that is lost.

### Related scrapers

- [Facebook Groups Scraper](https://apify.com/eiv/facebook-groups-scraper): buy-and-sell group posts, where many local deals are listed outside Marketplace.
- [Facebook Pages Scraper](https://apify.com/eiv/facebook-pages-scraper): contact details, followers and ratings of business sellers' Pages.
- [Facebook Search Scraper](https://apify.com/eiv/facebook-search-scraper): Facebook posts, Pages and people by keyword, for "for sale" posts outside Marketplace.
- [Contact Details Scraper](https://apify.com/eiv/contact-details-scraper): emails and phones from dealers' and shops' websites.

### Support

Missing a field, or found a search that does not work? Open an issue on the **Issues** tab with the input you used, and it will be looked at quickly.

# Actor input Schema

## `searchQueries` (type: `array`):

What to look for, one per line, e.g. "bike" or "iphone 13". Each term is searched in every location below (and in every category, if you pick some). Leave empty to browse categories instead.

## `locations` (type: `array`):

Where to search, one per line: a city ("New York, NY", "London", "Vilnius, Lithuania"), a postal code ("10001"), or "latitude, longitude". Facebook decides the search area around it (about 60 km for a city). Needed for search terms and categories; pasted URLs carry their own location.

## `categories` (type: `array`):

Optional. With search terms: only listings in these categories. Without search terms: browse these categories near each location. Home improvement and office supplies can be browsed but not combined with a search term.

## `urls` (type: `array`):

Optional. Paste Facebook Marketplace URLs straight from your browser: searches (facebook.com/marketplace/nyc/search?query=bike\&maxPrice=300), categories (facebook.com/marketplace/la/vehicles), city pages, or single listings (facebook.com/marketplace/item/123456789). A URL's own filters win over the filters below.

## `startUrls` (type: `array`):

The same as the field above, in the URL-list shape other Actors output, so a previous Actor's results can be fed straight in.

## `sortBy` (type: `string`):

Facebook's order of results. "Date listed: newest first" suits monitoring and makes date limits stop paging early.

## `minPrice` (type: `integer`):

Optional. In the local currency of the location (dollars in New York, euros in Paris).

## `maxPrice` (type: `integer`):

Optional. In the local currency of the location. Use 0 for free items only.

## `itemCondition` (type: `array`):

Optional. Only listings in these conditions. Leave empty for any condition.

## `daysSinceListed` (type: `string`):

Only listings posted within the last day, week or month.

## `availability` (type: `string`):

Listings for sale now, or sold ones (useful for sold-price research).

## `deliveryMethod` (type: `string`):

Local pickup only, shipping only, or both.

## `exactMatch` (type: `boolean`):

Ask Facebook for listings that match the search term more exactly (fewer loosely related results).

## `listedAfter` (type: `string`):

Optional. Keep only listings posted on or after this date, e.g. 2026-11-01 or "3 days". Older listings are dropped before charging; with "newest first" paging stops at the first page that is entirely older.

## `includeKeywords` (type: `array`):

Optional. Keep only listings whose title mentions at least one of these words (case-insensitive), e.g. "trek", "specialized". Checked before charging.

## `excludeKeywords` (type: `array`):

Optional. Drop listings whose title mentions any of these words, e.g. "kids", "broken", "parts". Checked before charging. A short word also matches longer ones ("car" matches "cargo").

## `includeDetails` (type: `boolean`):

Read each listing's page data too: full description, exact coordinates, condition and attributes, all photos, seller rating and join date, shipping, and vehicle specs (make, model, mileage, transmission, title status). Charged as one extra "listing-details" event per listing that got them: $3.00 per 1,000 on Starter, $2.50 on Business. About 5x slower.

## `onlyNewListings` (type: `boolean`):

For scheduled runs: deliver only listings this search has not delivered before, plus listings whose price or status changed (marked in changeType, with the previous price). Unchanged listings are skipped and never charged. Works best with "newest first".

## `monitoringStoreName` (type: `string`):

Name of the key-value store in your account that remembers what each search delivered. Use a different name for independent monitors that share searches.

## `resetMonitoring` (type: `boolean`):

Start this run with an empty memory: everything found is delivered (and charged) again, and the memory starts over.

## `maxItems` (type: `integer`):

Stop after this many listings in total. You pay per listing, so this is also your cost cap for the run.

## `maxItemsPerSearch` (type: `integer`):

Stop after this many listings from any single search (one term in one location, one category, one URL), so one big search cannot use the whole budget.

## `proxyConfiguration` (type: `object`):

Keep the default (Apify residential). Facebook answers Marketplace searches only to residential addresses: Apify's own and datacenter addresses are refused on the first request. Residential traffic is included in the price per listing.

## `maxConcurrency` (type: `integer`):

How many searches run at the same time (listing details are read 6 at a time within each search).

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one response before trying another address.

## `maxRetries` (type: `integer`):

Retries for failed connections when no proxy is used. With a proxy, a refused request moves to a new address instead (up to 6).

## Actor input object example

```json
{
  "searchQueries": [
    "bike"
  ],
  "locations": [
    "New York, NY"
  ],
  "sortBy": "best_match",
  "daysSinceListed": "any",
  "availability": "available",
  "deliveryMethod": "all",
  "exactMatch": false,
  "includeDetails": false,
  "onlyNewListings": false,
  "monitoringStoreName": "facebook-marketplace-monitor",
  "resetMonitoring": false,
  "maxItems": 100,
  "maxItemsPerSearch": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 3,
  "requestTimeoutSecs": 30,
  "maxRetries": 2
}
```

# Actor output Schema

## `results` (type: `string`):

One row per listing (recordType "listing"), plus one uncharged row per search or link that could not be read (recordType "error").

## `summary` (type: `string`):

Totals for the run: searches, listings, listings with details, failures, why the run stopped, requests and residential traffic.

## `details` (type: `string`):

The same rows in the details view: description, coordinates, photos and seller rating (when Listing details is on).

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "bike"
    ],
    "locations": [
        "New York, NY"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eiv/facebook-marketplace-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["bike"],
    "locations": ["New York, NY"],
}

# Run the Actor and wait for it to finish
run = client.actor("eiv/facebook-marketplace-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "bike"
  ],
  "locations": [
    "New York, NY"
  ]
}' |
apify call eiv/facebook-marketplace-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,eiv/facebook-marketplace-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/nvSlTMyCeULjPkB7G/builds/KQiS8GB169ga7Pk35/openapi.json
