# Facebook Marketplace Scraper: Prices and Price Drops

> Facebook Marketplace scraper: enter a city and search words. Get price, photos, location, delivery options and a market price check. No login.

URL: https://cliqtomedia.com/actors/facebook-marketplace/

Category: Classifieds & second-hand · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/facebook-marketplace?fpr=cliqto

Get public Facebook Marketplace listings by city and search words. Each row has the price, photos, location and delivery options. Repeat runs can show only new listings or price drops.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `pattaya` in City. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Facebook Marketplace Scraper collects public Facebook Marketplace listings by city and search words, without a Facebook login, and returns one row per listing with the price, photos, location, delivery options and a market price comparison.



### Good for

- Watch a city for new listings of a product and get only the new ones on every scheduled run.
- Track price drops on used cars, motorbikes, phones or furniture you are following.
- Compare asking prices in one or several cities: every search gets a median price, and every listing shows how far below that median it is.

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Listing | $0.00089 (from $0.000623 on paid Apify plans) | One Marketplace listing saved to the Dataset from search results (title, price, location, photo, post date). |
| Listing with details | $0.008 (from $0.0056 on paid Apify plans) | One listing saved with its own page read: description, condition, all photos (only when Listing details is on). Charged instead of Listing, not on top. |
| Search | $0.008 (from $0.0056 on paid Apify plans) | One search (city and keyword, or start URL) that got an answer from Facebook, even when it finds nothing. |
| Unchanged listing checked | $0.0004 (from $0.00028 on paid Apify plans) | One known listing re-checked by price tracking and found unchanged, so no row was saved (only when Track price changes is on). |
| Listing page checked | $0.008 (from $0.0056 on paid Apify plans) | One listing page opened that gave no paid row: outside the radius, or a removal check. Removed rows themselves are free. |

- One result: about $0.0009.
- 1,000 results: about $0.89.
- Every day 100 results, for 30 days: about $2.67 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 8 November 2026. Current price: https://apify.com/cliqtomedia/facebook-marketplace?fpr=cliqto

## Questions

### Do I need a Facebook account or cookies?

No. The Actor reads Marketplace as a visitor who is not logged in.

### Can I get seller names or phone numbers?

No. Seller data is never saved.

### Does it return all listings in a city?

No. It returns what Facebook shows a visitor for your search. Use several search words to cover more.

### How do I get only new listings every day?

Turn on `onlyNew`, give the monitor a `monitorName` and run it on an Apify schedule. Listings you already have are skipped free.

### Which countries work?

Any city where Facebook Marketplace works. Prices come in the local currency, with `priceUsd` when Facebook shows it.

## Data fields

- `listingId` (string): Marketplace listing id.
- `url` (string): Public listing page.
- `title` (string): Listing title.
- `price` (number): Asking price in the local currency; null when no price. 0 means free.
- `currency` (string): ISO currency of the price (THB, USD, EUR…).
- `priceText` (string): Price as Marketplace shows it.
- `priceUsd` (number): Price in US dollars as Marketplace converts it, when given.
- `originalPrice` (number): Earlier price shown crossed out by Marketplace, when the seller lowered it.
- `location` (string): City and region of the listing.
- `city` (string): City of the listing.
- `state` (string): Region or state.
- `country` (string): Country code.
- `locationId` (string): Marketplace location id of the listing city.
- `latitude` (number): Approximate latitude (with details).
- `longitude` (number): Approximate longitude (with details).
- `distanceKm` (number): Distance from the searched city centre, km (with details).
- `category` (string): Marketplace category slug.
- `categoryId` (string): Marketplace category id.
- `condition` (string): Item condition (with details), e.g. used_good.
- `deliveryTypes` (array): Delivery methods offered.
- `shippingOffered` (boolean): Seller offers shipping (with details).
- `postedAt` (string): When the listing was posted (ISO time).
- `status` (string): active, pending, sold, or removed (monitoring).
- `subtitle` (string): Extra line under the title, e.g. mileage of a vehicle.
- `primaryImage` (string): Main photo.
- `images` (array): Photo links; all photos with details.
- `hasVideo` (boolean): Listing has a video.
- `description` (string): Full description (with details).
- `vehicle` (object): Vehicle data (with details): make, model, trim, mileage, transmission, fuel, colours, owners, private seller or dealer.
- `changeType` (string): Monitoring: new, priceDown, priceUp, stillActive or removed.
- `firstSeenAt` (string): Monitoring: when this search first saw the listing.
- `previousPrice` (number): Monitoring: price on the previous run.
- `priceDropPercent` (number): Monitoring: price drop since the previous run, %.
- `marketMedianPrice` (number): Median price of this search.
- `belowMarketPercent` (number): How far below the search median the price is, % (negative = above). Needs 5+ priced listings.
- `isRepost` (boolean): Same title, price and city as a listing seen before under another id. Null outside monitor mode.
- `searchQuery` (string): Search words that found the listing.
- `searchLocation` (string): Searched city.
- `searchCategory` (string): Searched category.
- `detailsStatus` (string): ok, not_requested, gone (listing page removed) or failed.

## Input settings

- `city` (string): City to search, as text: "Pattaya", "Chiang Mai", "New York", "London, GB". Add a country code when a name exists in several countries. A Marketplace city slug ("nyc") or numeric location id also works.
- `query` (string): What to look for, as you would type it in Marketplace search, e.g. "motorbike", "iphone 15", "sofa". Leave empty to browse a whole category.
- `category` (string): Marketplace category. With search words it narrows the search; without them the whole category of the city is listed.
- `priceMin` (integer): Lowest price in the local currency of the city (baht in Pattaya, dollars in New York).
- `priceMax` (integer): Highest price in the local currency of the city.
- `maxItems` (integer): Listings to save per search (each city × search word is one search). You pay one small search fee per search plus each saved listing; a search that stops early costs less.
- `onlyNew` (boolean): Save only listings this search has not returned before. Run it on a schedule to get each new listing once. Reposts of an old listing under a new id are skipped too.
- `trackChanges` (boolean): Compare with the previous run of the same search: each row gets changeType new, priceDown or priceUp with previousPrice and priceDropPercent; listings that disappeared and are confirmed sold or deleted come as removed. Unchanged listings are left out unless you turn on the next option; each one left out is charged as a cheap listing check.
- `includeUnchanged` (boolean): With price tracking, also save listings that did not change (changeType stillActive).
- `monitorName` (string): Optional name to keep this monitor's memory apart from other runs of the same search (letters, digits, "-", "_").
- `dedupeReposts` (boolean): Treat a listing with the same title, price and city as one already seen as a repost: marked isRepost, and skipped in only-new mode.
- `maxRemovedChecks` (integer): How many disappeared listings to open per search to confirm they were sold or deleted. Each check is charged as a listing page check; removed rows themselves are free. 0 turns the check off.
- `includeDetails` (boolean): Open each listing page for condition, full description, all photos, exact position, delivery and vehicle data (make, model, mileage). Charged as a detailed listing.
- `radiusKm` (integer): Keep only listings within this distance of the city centre. Reads each listing page for its position, so rows are detailed listings; pages outside the radius are charged as listing page checks.
- `condition` (array): Only listings in these conditions.
- `delivery` (string): Only listings with this delivery method.
- `daysSinceListed` (string): Only listings posted recently.
- `maxAgeHours` (integer): Keep only listings posted at most this many hours ago, by the posting time Facebook shows. Finer than "Listed within"; listings without a posting time are kept.
- `availability` (string): Sold asks Facebook for listings already marked sold, for example to see what sold and at what price.
- `strictQuery` (boolean): Facebook also returns loosely related listings. Turn this on to keep only listings whose title contains every word of the search query.
- `sortBy` (string): Order of the first page. To go past one page the Actor also reads other orders and price bands, so the dataset is not strictly sorted.
- `cities` (array): Extra cities, searched with the same words and filters. Up to 50 searches per run (cities × search words).
- `queries` (array): Extra search words; each is searched in every city.
- `startUrls` (array): Paste Marketplace links from your browser: a search (facebook.com/marketplace/bangkok/search/?query=honda), a category page, or a single listing (facebook.com/marketplace/item/…). Filters in the link are kept.
- `locationId` (string): Marketplace location id or slug from a Marketplace link, if you prefer it to a city name.

## Step by step on Apify

1. Open the Input tab. City is prefilled with `pattaya` (box 1). Any city name works, for example `london` or `los angeles`.
2. Keep Search words = `motorbike` or type your own (box 2).
3. Keep Max listings = `10` from the form (box 3). If you leave it empty, the Actor saves up to 50 listings per search.
4. Click Start.
5. Open the Output tab. Switch views with the tabs (box 1), check Title, Price and Currency (box 2) and Below median % (box 3).

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Export listings for a city and product | `city`, `query`, `maxItems` | Listing | `title`, `price`, `currency`, `url`, `postedAt` | CSV or Excel export |
| Get only new listings on a schedule | `onlyNew` + Apify schedule | New listing | `listingId`, `title`, `price`, `firstSeenAt` | Slack or Notion via `deliveryConnector` |
| Track price drops and removed listings | `trackChanges`, `monitorName` | Changed listing | `changeType`, `previousPrice`, `priceDropPercent` | Webhook or Slack |
| Find underpriced items | `query`, `priceMin`, `priceMax` | Listing with market comparison | `marketMedianPrice`, `belowMarketPercent` | Spreadsheet |
| Compare markets across cities | `cities`, `queries` | Market summary per search | `MARKET_SUMMARY`: `median`, `p25`, `p75`, `count` | API |
| Read full listing pages | `includeDetails` or `startUrls` with item links | Detailed listing | `description`, `condition`, `distanceKm`, `vehicle` | Database |

## Tips

- Turn on onlyNew and set a monitorName. Run it on a schedule to get only new listings.
- The default timeout is 5 minutes. Raise it for thousands of listings.
- Photo links expire after some days. Download the photos you want to keep.

## Limits



- Public listings only. The Actor never logs in, so anything Facebook shows only to signed-in users is not available, and no seller name, profile or contact is saved.
- Up to 50 searches per run (cities × search words), up to 5000 listings per search, up to 500 item links per run.
- The default run timeout is 5 minutes, enough for a few hundred listings. For thousands, raise the timeout in the run options; one run works for 30 minutes at most. When time runs out, saved rows are kept and the search is marked `PARTIAL` with `TIME_LIMIT`.
- Facebook decides which listings appear and in what order. A search can show fewer listings than the city has, and rows are not strictly sorted even with `sortBy`.
- `priceUsd` appears only when Facebook shows a dollar price. Photo links are Facebook links that expire after some days; download photos you want to keep.
- Monitor memory keeps up to 5000 listings per search, in a store named `facebook-marketplace-state` in your own Apify account.
- Description, condition, exact distance and vehicle details need `includeDetails` (or `radiusKm`), which costs more per listing.

## Sample result

```json
{
  "listingId": "1347713167500771",
  "url": "https://www.facebook.com/marketplace/item/1347713167500771/",
  "title": "2012 Honda Click 125",
  "price": 18900,
  "currency": "THB",
  "priceText": "฿18,900",
  "priceUsd": 556.2,
  "originalPrice": null,
  "city": "Pattaya",
  "country": "TH",
  "category": "vehicles",
  "condition": null,
  "deliveryTypes": ["IN_PERSON"],
  "postedAt": "2026-06-28T11:02:15.000Z",
  "status": "active",
  "subtitle": "20K km",
  "primaryImage": "https://scontent…fbcdn.net/…jpg",
  "description": null,
  "changeType": null,
  "marketMedianPrice": 26900,
  "belowMarketPercent": 29.7,
  "isRepost": null,
  "searchQuery": "motorbike",
  "searchLocation": "Pattaya",
  "detailsStatus": "not_requested"
}
```

## Use it from code

Actor ID: `cliqtomedia/facebook-marketplace`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/facebook-marketplace").call(run_input={
    "city": "pattaya",
    "query": "motorbike"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~facebook-marketplace/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"city": "pattaya", "query": "motorbike"}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/facebook-marketplace")
result = tool.invoke({"run_input": {"city": "pattaya", "query": "motorbike"}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Similar tools

- [Craigslist Scraper - Listings, Prices & Photos, No Login](https://cliqtomedia.com/actors/craigslist-scraper/)
- [OLX Listings Scraper: Poland, Ukraine, Romania & More](https://cliqtomedia.com/actors/olx-listings-scraper/)
- [eBay Sold Listings Scraper - Sold Prices & Dates](https://cliqtomedia.com/actors/ebay-sold-listings/)
- [AutoScout24 Scraper - EU Car Listings & Prices, No login](https://cliqtomedia.com/actors/car-listings-scraper/)
- [Avito Listings Scraper: Prices, Details and New Ads](https://cliqtomedia.com/actors/avito-scraper/)
- [Depop Scraper - Listings, Prices, Brands & Shops](https://cliqtomedia.com/actors/depop-scraper/)
