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

Scrape public Facebook Marketplace search results by keyword and city. Returns listing ID, title, numeric price, currency, city/state, photo, delivery options, listing date and status, with optional description, GPS coordinates and attributes, plus a new-listings-only monitoring mode.

- **URL**: https://apify.com/thirdwatch/facebook-marketplace-scraper.md
- **Developed by:** [Thirdwatch](https://apify.com/thirdwatch) (community)
- **Categories:** Social media, E-commerce
- **Features:** Limited permissions
- **Stats:** 13 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 results

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

> **Thirdwatch portfolio:** 8,800+ users across 140+ public Actors, 2M+ records delivered, >95% run success. [Explore all Thirdwatch Actors](https://apify.com/thirdwatch).

### What you get

Scrape Facebook Marketplace listings by keyword, location, category, search URL, or item URL. Get one clean dataset row per listing with prices, descriptions, photos, coordinates, condition, delivery options, timestamps, and structured vehicle data.

This Actor reads Facebook's own public listing data directly, with no Facebook login required and no charge for empty diagnostic rows. That makes scheduled price tracking and new-listing monitoring fast and economical. Full item-page enrichment is optional, so high-frequency search monitors can skip the extra cost of fetching every detail page.

### What you can do

- Monitor newly listed Marketplace items in a city
- Track second-hand prices and local inventory
- Find cars by make, model, price, condition, and radius
- Collect full item descriptions and image galleries
- Build local resale, market-research, and lead-generation datasets
- Feed listing data into Google Sheets, webhooks, Zapier, Make, or your API

### Why use this Facebook Marketplace scraper?

- **No login required:** no Facebook credentials or user cookies needed
- **One row per listing:** easy to export and process; no nested result batches
- **Real pagination:** uses the query ID and cursor supplied dynamically by Facebook
- **Rich detail enrichment:** descriptions, all photos, GPS, attributes, and vehicle specs
- **Monitoring mode:** return only listing IDs not seen in earlier runs
- **Fair billing:** a result event is charged only when a unique listing is returned, at a low price per 1,000 listings

### Quick start

Search for listings in New York:

```json
{
  "queries": ["used sofa", "standing desk"],
  "location": "nyc",
  "maxResults": 50,
  "includeDetails": false
}
```

Find newly listed cars within a price range:

```json
{
  "queries": ["Toyota Camry"],
  "location": "losangeles",
  "minPrice": 5000,
  "maxPrice": 18000,
  "radiusKm": 50,
  "sortBy": "creation_time_descend",
  "daysSinceListed": "7",
  "includeDetails": true
}
```

Scrape a saved search, category, or individual item directly:

```json
{
  "startUrls": [
    {"url": "https://www.facebook.com/marketplace/nyc/vehicles"},
    {"url": "https://www.facebook.com/marketplace/item/123456789012345/"}
  ],
  "maxResults": 100
}
```

### Input options

| Field | Description | Default |
|---|---|---:|
| `queries` | Marketplace keywords to search | `used sofa` |
| `location` | Marketplace URL location slug such as `nyc`, `london`, or `sydney` | `nyc` |
| `searchUrls` | Existing Marketplace search or category URLs | — |
| `startUrls` | Direct item, search, or category URLs | — |
| `maxResults` | Maximum unique results per query or URL, up to 2,000 | `10` |
| `includeDetails` | Enrich descriptions, photos, coordinates, attributes, and vehicles | `false` |
| `detailConcurrency` | How many item pages to fetch in parallel when `includeDetails` is on | `5` |
| `minPrice` / `maxPrice` | Price filters | — |
| `radiusKm` | Search radius from 1 to 500 km | Facebook's default |
| `sortBy` | Relevance, newest, price ascending, or price descending | `relevance` |
| `itemCondition` | Any, new, like new, good, or fair | `any` |
| `daysSinceListed` | Any time, 1 day, 7 days, or 30 days | `any` |
| `deliveryMethod` | All, local pickup, or shipping | `all` |
| `monitoringMode` | Return only listing IDs not seen in previous runs | `false` |
| `monitoringKey` | Optional stable key that isolates one monitor's history | derived from searches |
| `proxyConfiguration` | Network routing settings. Defaults are tuned for reliable access; most users can leave this as-is. | auto |

You may supply queries, URLs, or both. Filters entered separately apply to generated query URLs; filters already present in supplied URLs are preserved.

Up to 20 combined queries, searches, categories, and direct item URLs can be processed in one run. Larger workloads should be split across Tasks so failures and schedules remain isolated.

### Output fields

Every dataset item represents one unique Marketplace listing.

| Field | Meaning |
|---|---|
| `id`, `item_url` | Facebook listing ID and canonical Marketplace URL |
| `title`, `description` | Listing title and full public description |
| `price`, `currency`, `formatted_price` | Current numeric and display price |
| `original_price`, `formatted_original_price` | Previous price when Facebook exposes one |
| `location`, `city`, `state` | Public listing location |
| `latitude`, `longitude` | Public item coordinates when exposed |
| `condition`, `attributes` | Condition and other listing attributes |
| `primary_image_url`, `photos`, `photo_count` | Main image and full photo gallery |
| `delivery_types` | Pickup and shipping options |
| `creation_time`, `created_at` | Listing publication time, when Facebook exposes it |
| `is_live`, `is_sold`, `is_pending` | Listing status flags |
| `vehicle` | Make, model, trim, odometer, transmission, fuel, VIN, colors, title status, specifications, and features when disclosed |
| `source_query`, `searched_location`, `search_url` | Source and reproducibility metadata |
| `scraped_at` | UTC extraction timestamp |

Example output:

```json
{
  "id": "123456789012345",
  "item_url": "https://www.facebook.com/marketplace/item/123456789012345/",
  "title": "2019 Toyota Camry SE",
  "description": "Clean title, one owner...",
  "price": 15900,
  "currency": "USD",
  "location": "Los Angeles, California",
  "latitude": 34.0522,
  "longitude": -118.2437,
  "condition": "Used - Good",
  "photo_count": 12,
  "vehicle": {
    "make": "Toyota",
    "model": "Camry",
    "trim": "SE",
    "transmission": "Automatic"
  }
}
```

### Monitoring new Facebook Marketplace listings

Enable `monitoringMode` and schedule the Actor. The Actor stores previously returned listing IDs in a persistent named key-value store, then emits only newly discovered listings. Its history key is derived from the searches and URLs, or you can set `monitoringKey` explicitly. Connect a webhook to receive alerts without maintaining your own deduplication database.

For isolated monitors, create a separate Apify Task per saved search so each Task keeps the intended input and schedule.

The monitor retains the most recent 100,000 listing IDs per monitoring key. Use separate keys for unrelated markets or long-running high-volume feeds.

### Migrating from version 1

Version 2 returns one dataset row per listing. Version 1 returned one batch object containing a nested `listings` array plus diagnostic fields such as `block_reason`. Update integrations to iterate dataset rows directly. Failed or blocked requests now fail explicitly and do not create billable diagnostic rows.

### Support

If a public Marketplace URL stops returning data, open an issue with the Actor run ID, location slug, and a redacted example URL. Do not include Facebook credentials or private account cookies.

### Use cases

- E-commerce teams tracking prices and assortment
- Marketplace analysts comparing categories
- Resellers and sourcing teams finding products

### Limitations

- Facebook changes its public Marketplace interface without notice, and some regions, listings, or fields require a logged-in Facebook session; those cannot be returned since this Actor works without logging in.
- Seller identity is commonly withheld from anonymous visitors, so `seller` returns `null` rather than a guess.
- VIN and some other vehicle fields only appear when the seller chose to disclose them.
- Listings that are removed or marked sold between runs will no longer appear; this Actor reflects the Marketplace as it looks at run time, not a historical record.

### Related Actors

- [Craigslist Scraper](https://apify.com/thirdwatch/craigslist-scraper) — Thirdwatch — another local classifieds source for the same resale/price-tracking workflow
- [Amazon Product Scraper - Prices, Deals & Monitoring](https://apify.com/thirdwatch/amazon-product-scraper) — Thirdwatch — compare resale prices against new retail listings

Last verified: 2026-09

More scrapers at [thirdwatch.dev](https://thirdwatch.dev).

# Actor input Schema

## `queries` (type: `array`):

Marketplace search terms, for example "used sofa", "iphone 15" or "mountain bike". Each query is scraped separately.

## `location` (type: `string`):

Facebook Marketplace city slug used in the URL, for example nyc, losangeles, chicago, london, toronto or sydney. Unknown slugs fall back to Facebook's own default region.

## `maxResults` (type: `integer`):

Maximum unique listings returned for each query or URL. Facebook returns up to 24 listings per page, so higher values simply page deeper.

## `searchUrls` (type: `array`):

Optional public Facebook Marketplace search or category URLs. Filters already present in the URL are preserved as-is.

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

Optional public Facebook Marketplace item URLs (facebook.com/marketplace/item/...). Also accepts search or category URLs. Kept for compatibility with saved tasks built on v2.0.

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

Open each listing's public item page to add description, GPS coordinates, all photos, condition, attributes and vehicle data. Slower and uses more requests.

## `detailConcurrency` (type: `integer`):

How many item pages to fetch in parallel when full item details are enabled. Lower this if you see slower or less reliable results.

## `minPrice` (type: `number`):

Only return listings priced at or above this amount, in the local Marketplace currency.

## `maxPrice` (type: `number`):

Only return listings priced at or below this amount, in the local Marketplace currency.

## `radiusKm` (type: `integer`):

Distance from the selected Marketplace location. Leave empty to use Facebook's default radius.

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

Order search results by relevance, newest listing date, or price.

## `itemCondition` (type: `string`):

Restrict results to a single seller-declared condition.

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

Restrict results to listings published within the selected period.

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

Restrict results to local pickup only or to listings that offer shipping.

## `monitoringMode` (type: `boolean`):

Remember listing IDs across runs and return only listings this Actor has not returned before. Ideal for scheduled deal alerts.

## `monitoringKey` (type: `string`):

Optional stable name that isolates one monitor's history. Leave blank to derive it automatically from the queries and URLs used.

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

Network routing settings. The default is tuned for reliable access to Marketplace listings; most users can leave this as-is.

## Actor input object example

```json
{
  "queries": [
    "used sofa"
  ],
  "location": "nyc",
  "maxResults": 10,
  "includeDetails": false,
  "detailConcurrency": 5,
  "sortBy": "relevance",
  "itemCondition": "any",
  "daysSinceListed": "any",
  "deliveryMethod": "all",
  "monitoringMode": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "queries": [
        "used sofa"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/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 = { "queries": ["used sofa"] }

# Run the Actor and wait for it to finish
run = client.actor("thirdwatch/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 '{
  "queries": [
    "used sofa"
  ]
}' |
apify call thirdwatch/facebook-marketplace-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thirdwatch/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/bwJPoqBac5RbJEL8I/builds/FXQwQVLgZAgfYXOF1/openapi.json
