# Facebook Marketplace Scraper by City: Prices, Dates & New Items (`neverempty/facebook-marketplace-monitor`) Actor

For flippers, resellers and price research: Facebook Marketplace listings for any keyword near any city you type, with title, price, currency, listing date, photo and link. A 6-city run on 2026-10-12 returned 592 listings, every one dated. Watch mode returns only new listings. No login.

- **URL**: https://apify.com/neverempty/facebook-marketplace-monitor.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listing returneds

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 by City: Prices, Dates & New Items

**Scrape Facebook Marketplace for any keyword near any city you type, or any latitude and longitude, and get one row per listing with title, price, currency, city, listing date, photo and link.** Schedule it with watch mode on and each later run returns only the listings that are new since the run before, ready to export as JSON, CSV or Excel or to send to Slack, Discord, email or a webhook.

Built for flippers, resellers, deal-alert bots and used-price research. The example input (`bike` in `New York, NY`) returns 24 New York listings. A 6-city run on 2026-10-12 (Tokyo, London, São Paulo, Austin, Toronto and Sydney) returned 592 listings, every one with its listing date and the currency shown on the listing: JPY, GBP, BRL, USD, CAD and AUD.

Ask it things like "find new Facebook Marketplace listings for a road bike near Austin every hour", "collect used sofa prices on Marketplace in London", or "watch Marketplace in Toronto for a PS5 under $300".

### What you get

- **Any city, anywhere**: type `Austin, TX`, `London, UK`, `Tokyo`, `São Paulo` or `Paris, France`, or give coordinates such as `40.71,-74.00`. Tested on runs in New York, Austin, Chicago, Toronto, London, Tokyo, São Paulo and Sydney. Every row says which place was searched and which Marketplace area Facebook used.
- **Listing date and time on every row** (`postedAt`), so you can sort by freshness and see how long an item has been up.
- **Real listings from a keyword and a city name**: type what you want and where, and each row is one listing with its own price, photo and link.
- **Filters that Marketplace itself uses**: radius in km, minimum and maximum price, item condition, listed in the last 1, 7 or 30 days, and sort by newest, price or distance.
- **Watch mode** (`onlyNew`): the first run remembers what is listed now; later runs return only listings posted after that, plus price changes with the previous price. Old listings that resurface in the results are not reported as new.
- **Paste a Marketplace search URL** if you already have a search set up on facebook.com; its filters are used as they are.
- **No account, no cookies, no login.** It reads the same public search results a logged-out visitor sees.
- **Export as JSON, CSV or Excel**, or connect the dataset to email, Slack, Zapier, Make or a webhook.

### Who it is for

- **Resellers and flippers** who want new deals delivered to them instead of refreshing the app.
- **Price researchers** comparing what an item sells for in different cities or countries.
- **Deal alerts and bots**: schedule it, connect the dataset to email, Slack, Discord or a webhook, and only new items arrive.

### Input example

```json
{
  "searchQueries": ["road bike", "mountain bike"],
  "locations": ["Austin, TX", "30.2672,-97.7431"],
  "radiusKm": 40,
  "maxPrice": 800,
  "sortBy": "newest",
  "maxResultsPerSearch": 50,
  "onlyNew": true
}
```

Each search term is searched near each location (up to 10 searches per run).

### Output example

```json
{
  "status": "ok",
  "changeType": "new",
  "listingId": "1234567890123456",
  "title": "Trek road bike 56cm",
  "price": 450,
  "currency": "USD",
  "priceFormatted": "$450",
  "previousPrice": null,
  "city": "Austin",
  "state": "TX",
  "postedAt": "2026-10-12T21:54:46.000Z",
  "isSold": false,
  "deliveryTypes": ["IN_PERSON"],
  "imageUrl": "https://scontent.xx.fbcdn.net/...",
  "url": "https://www.facebook.com/marketplace/item/1234567890123456/",
  "searchQuery": "road bike",
  "searchPlace": "Austin, Texas, United States",
  "facebookLocation": "Austin",
  "searchRadiusKm": 40
}
```

`changeType` is `first-check`, `new` or `price-change` in watch mode, and empty otherwise. `price` is in the currency shown on the listing; `currency` is read from the price symbol (left empty when the symbol is not one we can map with certainty).

### How to use watch mode

1. Run once with `onlyNew: true`. The first run returns the current first page and remembers it.
2. Schedule the same input (for example every 15 or 60 minutes) in Apify Schedules.
3. Each later run returns only new listings and price changes. If nothing changed, you get one free row that says so.

Use `watchName` to keep separate memories for the same search (for example one per customer), and `resetMonitoringState` to start over.

### Pricing

You pay per listing returned. Rows that explain why nothing was returned (no results, unknown place, a request Facebook refused, invalid input) are free. In watch mode a run that finds nothing new for a search costs one small check event instead of listings.

### FAQ

**How do I get alerts for new Facebook Marketplace listings?**
Turn on `onlyNew`, schedule the Actor, and connect the dataset to an integration (email, Slack, Discord, Zapier, Make or a webhook). Only listings posted since the previous run are returned.

**Can I scrape Facebook Marketplace for a specific city?**
Yes. Type the city name (`Chicago, IL`, `Toronto`, `London, UK`, `Tokyo`) or give latitude and longitude, add a radius in km, and every row comes back with the place that was searched.

**Can I export Facebook Marketplace listings to CSV or Excel?**
Yes. Every run's dataset downloads as JSON, CSV or Excel, and it can be sent to email, Slack, Zapier, Make or a webhook.

**How soon does watch mode report a new listing?**
On the first run after the listing appears in Facebook's public search results, with its real listing time in `postedAt`. Facebook decides when that is; see "Good to know" below.

**Does it work outside the United States?**
Yes. Locations are looked up from a built-in list of world cities (every city with 15,000+ people), or you can give latitude and longitude for any spot.

**Can I see when an item was listed?**
Yes, `postedAt` is the listing time Facebook shows for the item, in UTC.

**Do I need a Facebook account or cookies?**
No. The Actor never logs in.

**Can I search by price, condition and date?**
Yes: `minPrice`, `maxPrice` (in the local currency), `condition`, `daysSinceListed` and `sortBy`.

### Good to know

- New listings reach the public (logged-out) search results with a delay that Facebook decides; in our tests on 2026-10-13 the newest public results were from several hours up to about a day earlier. Watch mode reports a listing as soon as it appears there, with its real listing time.
- Facebook decides how many results a logged-out visitor sees for one search; for most searches the list ends after a few pages (about 50 to 150 listings). The Actor tells you in a free row when the list ended. Run several narrower searches (more terms or more locations) to cover more.
- Facebook places the search at the nearest Marketplace area to your coordinates; the row's `facebookLocation` names it.
- The results are what Facebook shows to logged-out visitors. Contact details, seller names, seller profiles and messages are not collected.
- Item condition is a search filter; the row does not repeat the condition of each item.
- When you sort by price and also use `daysSinceListed`, the age filter is applied by the Actor using each listing's time (Facebook returns no results for that combination).
- City names come from GeoNames (geonames.org, CC BY 4.0).

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

What to search for, one term per line, as you would type it in the Marketplace search box (for example bike, iphone 15, sofa). Each term is searched near each location. Leave empty only if you paste search URLs below.

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

Where to search, one per line: a city such as Austin, TX or London, UK or Tokyo, or a latitude,longitude pair such as 40.71,-74.00. Works in any country. Each row shows the place that was searched.

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

How far from the location to search, in kilometres (1 to 500). Empty uses 65 km, the same as the Marketplace search page.

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

Lowest price to return, in the local currency of the location (dollars, pounds, yen and so on). Empty means no lower limit.

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

Highest price to return, in the local currency of the location. Empty means no upper limit.

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

Return only items in these conditions, as the seller marked them. Empty means any condition.

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

Return only items listed in the last 1, 7 or 30 days. Empty means any time.

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

Order of the results. Empty uses newest first, which is also what watch mode needs.

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

Optional. Paste the address of a Marketplace search page, for example https://www.facebook.com/marketplace/nyc/search/?query=bike\&maxPrice=300. The filters in the URL are used as they are.

## `maxResultsPerSearch` (type: `integer`):

Most listings to return for each search (1 to 300). Empty uses 50. In watch mode this caps the new listings returned per run; the rest come in the next run.

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

On: the first run remembers what is listed now, and later runs return only listings posted since then and price changes. Off: return the current results every time.

## `includePriceChanges` (type: `boolean`):

In watch mode, also return listings whose price changed since the last check, with the previous price. Off returns only new listings.

## `watchPages` (type: `integer`):

How many result pages (about 24 listings each) watch mode reads on each run (1 to 15). Empty uses 5.

## `watchName` (type: `string`):

Optional label that keeps separate memories for the same search, for example one per schedule. Letters, digits, dot, dash and underscore.

## `resetMonitoringState` (type: `boolean`):

On: forget what this watch remembered and start again from the current listings.

## Actor input object example

```json
{
  "searchQueries": [
    "bike"
  ],
  "locations": [
    "New York, NY"
  ],
  "maxResultsPerSearch": 24,
  "onlyNew": false,
  "includePriceChanges": true,
  "resetMonitoringState": false
}
```

# Actor output Schema

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

One row per Facebook Marketplace listing: listing ID, title, price with currency and the price as shown, city and region, listing time, photo, delivery type, seller display name, listing link, its position, and the place Facebook searched around. Watch mode marks rows first-check, new or price-change (with the previous price). A search with no listings, nothing new, an unknown place or a request Facebook refused comes back as a free row that says why.

# 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"
    ],
    "maxResultsPerSearch": 24
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/facebook-marketplace-monitor").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"],
    "maxResultsPerSearch": 24,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/facebook-marketplace-monitor").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"
  ],
  "maxResultsPerSearch": 24
}' |
apify call neverempty/facebook-marketplace-monitor --silent --output-dataset

```

## MCP server setup

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

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/xpfcNNyzXI4TtI7Cx/builds/0glsQWqFoivIG063G/openapi.json
