# Facebook Marketplace Scraper & API: New Listing Alerts (`s_actors/facebook-marketplace-scraper`) Actor

Scrape Facebook Marketplace listings by keyword × city, category or link, no login: price, old price, city, posting time, seller, photos, details. Every run remembers its searches: get only new listings and price drops on a schedule.

- **URL**: https://apify.com/s_actors/facebook-marketplace-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** E-commerce, Social media, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.39 / 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.
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 & API: New Listing Alerts

Scrape **Facebook Marketplace listings** by **keyword × city**, by **category** or from any **Marketplace link**, without a Facebook login or cookies. Every listing comes with its title, price, **Facebook's crossed-out old price**, city, exact posting time, sold / pending status, seller, photo and delivery options; turn on **Listing details** for the full description, condition, exact location, all photos and vehicle fields.

Every run **remembers the listings and prices of its searches**. Schedule it and turn on **Only new listings and price drops**: each run returns just the items posted since the last check and the ones that got cheaper, with `previousPrice` and `priceDropPct`. That is a **Facebook Marketplace alert** for resellers, car dealers, flippers and deal hunters, in many cities at once.

```json
{ "searchQueries": ["iphone 15", "ps5"], "locations": ["Austin, Texas", "London"], "maxItemsPerSearch": 100 }
```

Use it as a **Facebook Marketplace API**: one call returns clean JSON for every search word in every city.

#### What you get

One row per listing. Real example, October 2026 (`iphone 15` and `ps5` in Austin and London):

| title | priceFormatted | originalPriceFormatted | city | listedAt | searchQuery | location |
|---|---|---|---|---|---|---|
| Iphone 15 Plus - 128 GB | $395 | | Manor, TX | 2026-10-24 01:54 | iphone 15 | Austin, Texas |
| iPhone 15 pro Max 1tb storage | $730 | | Del Valle, TX | 2026-10-22 03:48 | iphone 15 | Austin, Texas |
| ps5 portal, used like new | $130 | **$160** | San Antonio, TX | 2026-10-22 21:04 | ps5 | Austin, Texas |
| iPhone 15 pro max 512 GB | £600 | | Hove | 2026-10-23 14:32 | iphone 15 | London |
| PS5 (WITH DISK DRIVE) + EDGE CONTROLLER | £500 | **£600** | London | 2026-10-23 21:08 | ps5 | London |

| Field | Description |
|---|---|
| `title`, `url`, `id` | The listing and its link |
| `price`, `priceFormatted`, `currency` | Price as a number, as shown (`£500`), and the currency (`GBP`, `USD`, `EUR`...) |
| `originalPrice`, `discountPct` | The old price Facebook shows crossed out when the seller lowered it, and the discount in % |
| `isNew`, `previousPrice`, `priceChange`, `priceDropPct`, `firstSeenAt` | Compared with earlier runs of the same searches: new listing, its previous price, the change and when it was first seen |
| `city`, `state`, `cityPage` | Where the item is |
| `listedAt` | Exact posting time (UTC) |
| `isSold`, `isPending`, `isLive` | Status |
| `deliveryTypes` | `IN_PERSON` (local pickup), `SHIPPING`... |
| `subtitles`, `customTitle` | Facebook's short facts: mileage of vehicles (`165K km`), beds and baths of rentals |
| `sellerName`, `sellerId`, `sellerType` | Who sells it (a person or a Page) |
| `photoUrl`, `hasVideo`, `categoryId` | Main photo, whether the listing has a video, Marketplace category |
| `searchQuery`, `location`, `category`, `sourceUrl` | Which search found the listing |
| With **Listing details**: `description`, `condition`, `photos`, `locationText`, `latitude`, `longitude`, `postalCode`, `countryCode`, `vehicle` | Full text, condition (`USED`, `NEW`), every photo, exact place; for cars and motorbikes make, model, odometer, transmission, colours, owners and seller type |

#### How it works

1. Add **search words** and **locations** (cities, postal codes or `latitude,longitude`), and / or whole **categories**, and / or **Marketplace links** copied from your browser
2. Set the filters you want: radius, price, condition, date listed, delivery, sort, words the title must or must not contain
3. Run: open the **Listings** or **New & price drops** view, export to CSV / Excel / JSON, or connect a Google Sheet, Slack or a webhook

| Input | What it does |
|---|---|
| **Search words** × **Locations** | Every word in every city: 3 words × 4 cities = 12 searches in one run; listings found twice are returned once |
| **Categories** | Browse a whole category without words: Vehicles, Property rentals, Electronics, Home goods, Free stuff... |
| **Marketplace links** | Any `facebook.com/marketplace/...` link: a search with its filters, a category, or one listing (returned with its details: a status and price check) |
| **Radius, Min / Max price, Condition, Date listed, Delivery, Sort** | The same filters as on Marketplace |
| **Title must include / must not include** | Marketplace search is broad: keep only `iphone 15` titles, drop `case`, `broken`, `parts`. Dropped listings are free |
| **Max listings per search** | Default 100, up to 5,000 per search |
| **Listing details** | Description, condition, exact location, all photos, vehicle fields |
| **Only new listings and price drops** | Alerts: return only what changed since the previous run |

#### Why this Actor

| | |
|---|---|
| 🔔 **Alerts built in** | Every run compares with the previous one: `isNew` and `priceDropPct` on every row, or only the changes with one switch. With newest-first sorting a check stops at the first page with nothing new, so a check with nothing new costs just the $0.002 run start |
| 📉 **Two kinds of price drops** | Facebook's own crossed-out old price (`originalPrice`) and the drop since your last run (`previousPrice`), so you see sellers who lowered the price before and after you started watching |
| 🌍 **Many cities in one run** | Search words × locations, any country: `London`, `Austin, Texas`, `München`, `10115`, coordinates. Currency per city |
| 🧹 **Clean results** | Title filters drop the unrelated items Marketplace mixes into searches, for free |
| 🔓 **No login, no cookies** | Your Facebook account is never used or put at risk |
| 💰 **Low price** | $0.49 per 1,000 listings; details $1.49 per 1,000, only when you want them |

#### Marketplace alerts for new listings

1. Add your search words, cities and filters (for example `ps5`, `Austin, Texas`, max price 300, **Title must not include** `controller`)
2. Turn on **Only new listings and price drops**, sort **newest first**
3. Save as a task and schedule it (every 15 minutes, hourly, daily). Add an integration: email, Slack, Telegram through Zapier or Make, or a webhook to your app

The first run returns the current listings and remembers them; every next run returns only new listings and price drops. The history is kept per set of searches and filters in your account (key-value store `facebook-marketplace-history`, the last 30,000 listings).

#### Pricing

Pay per listing, plus details only when you turn them on. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.002 | $0.002 | $0.002 |
| Listing | $0.00049 | $0.000441 | $0.000392 |
| Listing details (only with **Listing details** on, or for listing links) | $0.00149 | $0.00134 | $0.00119 |

| Task | Cost |
|---|---|
| 100 listings of one search | ~$0.05 |
| 1,000 listings (10 searches × 100) | ~$0.49 |
| 1,000 listings with details | ~$2.48 |
| Hourly alert for one search with ~5 new listings an hour, for a month | ~$3.20 per month |

Repeats, listings dropped by the title filter and listings skipped by **Only new** are free.

#### Ready-made tasks

Open it, change the words and cities, and run:

| Task | What you get |
|---|---|
| [Facebook Marketplace Notifications for New Listings](https://apify.com/s_actors/facebook-marketplace-scraper/examples/facebook-marketplace-notifications-for-new-listings) | New listings and price drops of your searches on every scheduled run |

#### FAQ

**How do I scrape Facebook Marketplace?** Add search words and a city, run, and open the **Listings** view. Or copy the address of a Marketplace search from your browser into **Marketplace links**: its filters are kept.

**Can I get notifications for new Facebook Marketplace listings?** Yes: turn on **Only new listings and price drops**, save the input as a task and schedule it. Connect email, Slack, Zapier, Make or a webhook in the task's Integrations to get each new listing as a message.

**How do I see the price history of a listing?** Facebook does not show it, but this Actor keeps it: each run saves the price of every listing it saw, the next run fills `previousPrice`, `priceChange` and `priceDropPct`. `originalPrice` is the crossed-out price Facebook itself shows after a seller lowers the price.

**Which countries and cities work?** Any place where Marketplace runs: write the city ("Austin, Texas", "Manchester", "Lyon"), a postal code or coordinates. Prices come in the local currency.

**Why do results include unrelated items?** Marketplace search matches loosely and mixes in nearby categories. Use **Title must include** (every word must be in the title) and **Title must not include**: dropped listings are not charged.

**Can I get the seller's phone number or the messages?** No: Marketplace shows contact details only inside Messenger to logged-in users. You get the seller's name, Facebook id and, for dealers, the seller type.

**Do I need a Facebook account?** No. The Actor reads Marketplace the way Facebook shows it to a visitor who is not logged in.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js, n8n or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Find used road bikes under $500 within 40 km of Denver posted this week".

#### Other Facebook tools

| Tool | What it does |
|---|---|
| [Facebook Page Scraper](https://apify.com/s_actors/facebook-page-scraper) | Exact followers, email, phone, website, page creation date, ads status and last post of any page |
| [Facebook Page Search](https://apify.com/s_actors/facebook-page-search-scraper) | Facebook business pages by keyword and city, with exact followers, email, phone and address |
| [Facebook Email Scraper](https://apify.com/s_actors/facebook-email-scraper) | Emails of Facebook pages from the page and its website, mail server checked |
| [Facebook Follower Count Checker](https://apify.com/s_actors/facebook-follower-count-checker) | Exact follower count of many pages and its growth over 7 and 30 days |
| [Facebook Video Transcript](https://apify.com/s_actors/facebook-video-transcript) | Transcripts of Facebook videos and Reels: Facebook captions or AI, SRT and VTT |

#### Is it legal?

The Actor reads only public Marketplace listings that Facebook shows to any visitor, without logging in. Seller names are personal data: handle them in line with GDPR and other privacy laws, and use the data for research, price comparison and your own buying decisions in line with Facebook's terms.

# Actor input Schema

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

One search per line, as you would type it on Marketplace ("iphone 15", "sofa", "honda civic"). Every word is searched in every location below.

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

One per line: a city ("Austin, Texas", "London", "München"), a postal code ("10115", "SW1A 1AA") or "latitude,longitude". Several cities = one run covers all of them; listings found in two of them are returned once.

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

Whole Marketplace categories in every location above, e.g. all Vehicles around Dallas. Optional: search words alone are enough.

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

Optional. Any facebook.com/marketplace/ link copied from your browser: a search with its filters, a category ("/marketplace/nyc/vehicles") or a single listing ("/marketplace/item/123..."; returned with its details, good for status and price checks).

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

Search radius around each location, in kilometres (65 km = 40 miles, Facebook's default).

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

In the local currency of the location. Empty = no minimum.

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

In the local currency of the location. Empty = no maximum.

## `conditions` (type: `array`):

Only listings in these conditions. Empty = any condition.

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

Only listings posted within this period.

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

Order of the results. Newest first is best for alerts: a run stops as soon as it reaches listings it has already seen.

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

Local pickup only, shipping only, or both.

## `titleMustInclude` (type: `array`):

Keep only listings whose title contains every one of these words (not case sensitive). Marketplace search is broad: this drops unrelated items for free.

## `titleExclude` (type: `array`):

Drop listings whose title contains any of these words ("broken", "parts", "case"). Dropped listings are free.

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

Per search word × location, per category × location and per link.

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

Also load each listing's page: full description, condition, exact location and postal code, all photos and vehicle fields (make, model, mileage, transmission, owners). Charged per listing with details on top of the listing.

## `onlyNew` (type: `boolean`):

Return only listings new to these searches and listings whose price went down. The first run returns everything and remembers it. Every row has isNew, previousPrice and priceDropPct either way.

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

How many searches run at the same time.

## `debugLog` (type: `boolean`):

Log every request attempt (for support).

## Actor input object example

```json
{
  "searchQueries": [
    "iphone"
  ],
  "locations": [
    "New York"
  ],
  "radiusKm": 65,
  "daysSinceListed": "",
  "sortBy": "newest",
  "deliveryMethod": "all",
  "maxItemsPerSearch": 100,
  "includeDetails": false,
  "onlyNew": false,
  "maxConcurrency": 5,
  "debugLog": false
}
```

# Actor output Schema

## `listings` (type: `string`):

One row per listing: title, price, old price, city, posting time, status.

## `alerts` (type: `string`):

What changed since the previous run of the same searches.

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

Listing details (with "Listing details" on): description, condition, exact place.

## `all` (type: `string`):

Every field of every row.

# 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": [
        "iphone"
    ],
    "locations": [
        "New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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": ["iphone"],
    "locations": ["New York"],
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/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": [
    "iphone"
  ],
  "locations": [
    "New York"
  ]
}' |
apify call s_actors/facebook-marketplace-scraper --silent --output-dataset

```

## MCP server setup

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