How to use it: 3 steps
- Make a free Apify accountApify 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.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
pattayain City. Each start is one run. - Download the resultsWhen 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.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
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.
Who uses it
Local resellers
Find new listings of a product in your city.
Used car and phone buyers
Follow price drops on items you want.
Market analysts
Compare asking prices in one or more cities.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| 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. |
Examples
- 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. That is enough for about 5,600 results.
Prices checked on 8 November 2026. See the current price on Apify.
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.
Details
Step by step on Apify
- Open the Input tab. City is prefilled with
pattaya(box 1). Any city name works, for examplelondonorlos angeles. - Keep Search words =
motorbikeor type your own (box 2). - Keep Max listings =
10from the form (box 3). If you leave it empty, the Actor saves up to 50 listings per search. - Click Start.
- 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 for better results
- 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 and good to know
- 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
PARTIALwithTIME_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 priceUsdappears 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-statein your own Apify account - Description, condition, exact distance and vehicle details need
includeDetails(orradiusKm), which costs more per listing
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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. You need your Apify API token from Apify Console → Settings → API & Integrations.
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)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"}'# 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)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
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 (25)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| City | city | string | "pattaya" |
| Search words | query | string | "motorbike" |
| Category | category | string | |
| Minimum price | priceMin | integer | |
| Maximum price | priceMax | integer | |
| Max listings | maxItems | integer | 10 |
| Only new listings | onlyNew | boolean | false |
| Track price drops and removals | trackChanges | boolean | false |
| Include unchanged listings | includeUnchanged | boolean | false |
| Monitor name | monitorName | string | |
| Skip reposts | dedupeReposts | boolean | true |
| Max removal checks | maxRemovedChecks | integer | 20 |
| Include details | includeDetails | boolean | false |
| Radius (km) | radiusKm | integer | |
| Condition | condition | array | |
| Delivery | delivery | string | |
| Listed within | daysSinceListed | string | |
| Posted within (hours) | maxAgeHours | integer | |
| Availability | availability | string | "available" |
| Title must contain all words | strictQuery | boolean | false |
| Sort | sortBy | string | "best_match" |
| More cities | cities | array | |
| More search words | queries | array | |
| Marketplace links | startUrls | array | |
| Location id | locationId | string |