# Facebook Marketplace Scraper: listings, prices & details (`pikoulas/facebook-marketplace`) Actor

Scrape Facebook Marketplace listings by keyword, city or category: price, location, photos, date, sold status, and with details the description, every photo, vehicle specs and rental details. Price, condition, date and delivery filters. No login, no browser.

- **URL**: https://apify.com/pikoulas/facebook-marketplace.md
- **Developed by:** [Spyridon Pikoulas](https://apify.com/pikoulas) (community)
- **Categories:** E-commerce, Lead generation, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

Scrape Facebook Marketplace listings the way its search works:

- **Search terms in places:** each keyword searched around each city, ZIP code or
  `latitude,longitude` you give, within a radius.
- **Categories:** browse a category (vehicles, rentals, electronics, furniture, free stuff...) in
  each place, or narrow the search terms to it.
- **Marketplace URLs:** paste a search or category page (`facebook.com/marketplace/nyc/search?query=bike&maxPrice=500`,
  `facebook.com/marketplace/la/vehicles`) with its filters, or single listings.

Every listing comes with its title, price and currency, the price before a price drop, city and
state, main photo, the date it was listed, and whether it is sold or pending. Turn on
`includeDetails` for what the listing's page shows: its **description**, **every photo** and
video, exact coordinates and ZIP code, condition and other attributes, a vehicle's **make, model,
trim, mileage, VIN, title status, transmission, fuel and colours**, and a rental's **type, beds
and baths, amenities, street and walk score**.

Filter by price, condition, how recently it was listed, local pickup or shipping, and sort by
price, date or distance. It needs no login and no browser. It costs **$0.40 per 1,000 listings**.

### What people use it for

- **Reselling and flipping:** new listings under a price in several cities, newest first.
- **Price research:** what used cars, furniture or electronics actually sell for, city by city.
- **Rental market tracking:** rents, sizes and locations of the apartments listed in an area.
- **Lead generation:** dealers and sellers active in a category and a region.

### How to scrape Facebook Marketplace

1. Click **Try for free**; Apify's free plan covers a first run.
2. Enter **Search terms** with **Locations**, or **Marketplace URLs**, and how many listings you want.
3. Click **Start**, then download the results as JSON, CSV, Excel or HTML, or read them through
   the API.

An input with more options:

```json
{
  "searchTerms": ["road bike", "standing desk"],
  "locations": ["Austin, TX", "Chicago, IL", "https://www.facebook.com/marketplace/nyc/"],
  "maxPrice": 800,
  "condition": ["new", "used_like_new"],
  "daysSinceListed": 7,
  "sortBy": "creation_time_descend",
  "maxListingsPerSearch": 200,
  "includeDetails": true,
  "urls": ["https://www.facebook.com/marketplace/la/vehicles?maxPrice=15000"]
}
```

Each search term runs in each location; `maxListingsPerSearch` counts per term and location. A
listing found by two searches comes once. Give the state or country with a city name ("London,
UK", "Portland, OR"): Marketplace ranks places near you first, and the log says which place each
name became. With a `category` and no search terms, the category is browsed in each location.
The filters don't apply to `urls`, which keep their own.

### Output

A listing:

```json
{
  "id": "1123438843542176",
  "url": "https://www.facebook.com/marketplace/item/1123438843542176/",
  "title": "Brand New Desk with Keyboard Tray",
  "price": 100,
  "currency": "USD",
  "priceFormatted": "$100",
  "previousPrice": null,
  "city": "New York",
  "state": "NY",
  "latitude": null,
  "longitude": null,
  "photos": ["https://scontent.xx.fbcdn.net/v/t39.84726-6/821631717_….jpg"],
  "hasVideo": false,
  "sellerName": null,
  "sellerId": null,
  "isSold": false,
  "isPending": false,
  "createdAt": "2026-09-25T14:34:24Z",
  "deliveryTypes": ["IN_PERSON"],
  "subtitles": [],
  "categoryId": "1583634935226685",
  "search": "standing desk in New York, New York"
}
```

With `includeDetails`, a listing adds its page's details, and `photos` holds all of them:

```json
{
  "description": "New 32-inch smart television with 720P resolution. This unit has Tizen OS and supports HDR 10.",
  "latitude": 43.645935058594,
  "longitude": -79.381713867188,
  "locationText": "Toronto, ON",
  "postalCode": null,
  "countryCode": null,
  "category": "Electronics & computers",
  "categorySlug": "electronics",
  "attributes": {"Condition": "New"},
  "videos": [],
  "isShippingOffered": false
}
```

A vehicle's `attributes`:

```json
{
  "Condition": "USED", "make": "Mitsubishi", "model": "Lancer", "trim": "ES Sedan 4D",
  "mileage": 105133, "mileageUnit": "MILES", "transmission": "AUTOMATIC", "fuelType": "GASOLINE",
  "exteriorColor": "white", "interiorColor": "grey", "owners": "ONE", "titleStatus": "CLEAN",
  "sellerType": "PRIVATE_SELLER", "paidOff": "IS_PAID_OFF",
  "gas_mileage_city": "26.00 MPG", "safety_ratings_overall": "4 Star Rating"
}
```

A rental's:

```json
{
  "details": ["Apartment", "1 bed · 1 bath", "In-unit laundry"],
  "street": "E 5th St", "walkScore": 99, "transitScore": 100, "bikeScore": 99
}
```

### Use it as an API

One call runs it and returns the results as JSON (for runs under 5 minutes; longer ones start a
run and read its dataset). Apify's Python and JavaScript clients, and its Make, Zapier and n8n
integrations, work the same way.

```bash
curl -X POST "https://api.apify.com/v2/acts/pikoulas~facebook-marketplace/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["bike"], "locations": ["New York, NY"], "maxListingsPerSearch": 50}'
```

AI agents can call it as a tool through Apify's MCP server: `https://mcp.apify.com?tools=pikoulas/facebook-marketplace`.

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

You pay **$0.0004 per listing**, which is $0.40 per 1,000, or **$0.0006 per listing with its
details** instead. Facebook doesn't answer Apify's own servers, so runs go through Apify's
residential proxy and also pay its traffic, $0.0012 per 100 KB: about 1 KB a listing, or 90 KB
with the details, so about $0.01 or $1.10 per 1,000 listings. There are no monthly fees.

### Good to know

- Logged out, Facebook rarely shows who is selling: `sellerName` is mostly `null`, and the
  details never have it.
- Vehicle and rental pages' own filters (make, year, mileage, bedrooms) aren't applied for
  visitors who aren't logged in; price, radius and the category are.
- Cars, Motorcycles, Home improvement supplies and Office supplies can be browsed, but not
  searched with a term: with one, the term is searched in every category.
- Marketplace needs a place to search around: a search term or category with no location (and
  no Marketplace URL) is an error.
- The price is in the listing's own currency (`CA$50` is 50 CAD); `price` is `0` for free items.

### FAQ

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

It collects only what Facebook Marketplace shows publicly, without logging in. Scraping public data is
generally legal, but personal data is protected by laws such as the GDPR and the CCPA, and
Meta's terms may limit how you use what you collect. If you're unsure, ask a lawyer;
Apify's [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) is a good start.

#### Something missing or not working?

Open an issue on the **Issues** tab with the input you used, or ask there for a field you need.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords searched on Marketplace in each location below, as its search box does.

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

Where to search: city names ("Austin, TX", "London, UK"; add the state or country, as Marketplace ranks places near the run's IP first), ZIP codes, "latitude,longitude", or Marketplace URLs of a place (facebook.com/marketplace/nyc/). Each search term is searched in each location.

## `category` (type: `string`):

Browse a category in each location, or narrow the search terms to it. Cars, Motorcycles, Home improvement supplies and Office supplies can be browsed but not searched with a term on Marketplace.

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

In the location's currency, whole units.

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

In the location's currency, whole units.

## `condition` (type: `array`):

Only items in these conditions (items that have one; vehicles and rentals don't).

## `daysSinceListed` (type: `integer`):

Only listings posted in the last 1, 7 or 30 days, or any number.

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

Local pickup only, shipping only, or both.

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

The order Marketplace gives listings in.

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

How far around each location to search. Marketplace's default is 65 km (40 miles).

## `maxListingsPerSearch` (type: `integer`):

Listings taken from each search (each term in each location, each URL). Marketplace pages through a thousand and more for a common term in a big city.

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

Each listing's page too: description, every photo and video, exact coordinates, ZIP code, attributes (condition, brand), vehicle specs (make, model, mileage, VIN, title status) and rental details (beds, baths, laundry, walk score). Charged as Listing with details, and about 80 KB of traffic a listing.

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

Search and category pages (facebook.com/marketplace/nyc/search?query=bike\&maxPrice=500, facebook.com/marketplace/la/vehicles), scraped with the filters in their URL, and listing URLs or IDs (facebook.com/marketplace/item/...), scraped with their details.

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

Facebook refuses Apify's own IPs, so a run with none set switches to Apify's residential proxy by itself, charged as residential traffic. A US residential proxy is what works.

## Actor input object example

```json
{
  "searchTerms": [
    "bike"
  ],
  "locations": [
    "New York, NY"
  ],
  "deliveryMethod": "all",
  "sortBy": "best_match",
  "radiusKm": 65,
  "maxListingsPerSearch": 20,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `listings` (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 = {
    "searchTerms": [
        "bike"
    ],
    "locations": [
        "New York, NY"
    ],
    "maxListingsPerSearch": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("pikoulas/facebook-marketplace").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 = {
    "searchTerms": ["bike"],
    "locations": ["New York, NY"],
    "maxListingsPerSearch": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("pikoulas/facebook-marketplace").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 '{
  "searchTerms": [
    "bike"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxListingsPerSearch": 20
}' |
apify call pikoulas/facebook-marketplace --silent --output-dataset

```

## MCP server setup

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

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/sAD1I42gOnCsSBqA0/builds/h5KXmwznZ6QQZnUa7/openapi.json
