# Facebook Marketplace Scraper - $1.20/1K Listings (`thirdwatch/facebook-marketplace-scraper`) Actor

Scrape Facebook Marketplace listings, item details, photos, prices, GPS coordinates, and vehicle attributes over fast public HTTP. No login or browser required.

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

## Pricing

from $0.70 / 1,000 marketplace listings

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Facebook Marketplace Scraper

> **Thirdwatch portfolio:** 5K users across 88 public Actors, 2M+ records delivered, and >99% run success. [Explore all Thirdwatch Actors](https://apify.com/thirdwatch).

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 the public Facebook Marketplace Relay data directly over HTTP. It does **not** launch a browser, require a Facebook login, or 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 do not pay the much higher network cost of downloading 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?

- **Public HTTP extraction:** no browser startup, Facebook credentials, or user cookies
- **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
- **Low price:** from $0.70 to $1.20 per 1,000 listings, depending on your Apify tier

### Quick start

Search for listings in New York:

```json
{
  "queries": ["used sofa", "standing desk"],
  "location": "nyc",
  "maxResultsPerQuery": 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/"}
  ],
  "maxResultsPerQuery": 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 | — |
| `maxResultsPerQuery` | Maximum unique results per query or URL, up to 1,000 | `50` |
| `includeDetails` | Enrich descriptions, photos, coordinates, attributes, and vehicles | `false` |
| `minPrice` / `maxPrice` | Price filters | — |
| `radiusKm` | Search radius from 1 to 500 km | `65` |
| `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 |

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.

### Pricing

This Actor uses transparent pay-per-event pricing. You pay for unique listings actually written to the dataset:

- FREE: $1.20 per 1,000 listings
- BRONZE: $1.00 per 1,000 listings
- SILVER: $0.80 per 1,000 listings
- GOLD: $0.70 per 1,000 listings

When `includeDetails` succeeds, the additional enrichment price is $2.70 / $2.50 / $2.30 / $2.20 per 1,000 enriched listings from FREE through GOLD. Search-only monitoring remains at the base listing price. There is no start fee, failed enrichments are not charged, and failed or empty searches do not produce billable diagnostic records.

### Public-data limitations

Facebook changes its public Marketplace interface without notice. Some regions, listings, or fields may require a logged-in Facebook session and therefore cannot be returned by an anonymous public-data Actor. Seller identity is commonly withheld from anonymous visitors; this Actor returns `seller: null` rather than claiming unavailable private data. VIN and some vehicle fields appear only when the seller discloses them.

The Actor accesses public pages only. Use the data in accordance with applicable laws and Facebook's terms, and avoid collecting personal data without a lawful purpose.

### 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.

# 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 Facebook throttles your proxy region.

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

Facebook withholds Marketplace data from datacenter IP ranges. A residential proxy is required for reliable results.

## Actor input object example

```json
{
  "queries": [
    "used sofa"
  ],
  "location": "nyc",
  "maxResults": 50,
  "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/Zxvm9WcSkBuSEOwbO/openapi.json
