Facebook Marketplace Scraper - Prices & Price Drops, No Login avatar

Facebook Marketplace Scraper - Prices & Price Drops, No Login

Pricing

from $0.62 / 1,000 listings

Go to Apify Store
Facebook Marketplace Scraper - Prices & Price Drops, No Login

Facebook Marketplace Scraper - Prices & Price Drops, No Login

Scrape Facebook Marketplace listings by city, keyword, category and price without login: title, price, location, photos, post date, plus condition, description and all photos on request. New-listing and price-drop monitoring, market price summary. No seller data.

Pricing

from $0.62 / 1,000 listings

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Security

Limited permissions

Share

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.

Use it to watch a local market, find new listings and price drops, or export Marketplace prices to a spreadsheet. The smallest run (Pattaya, "motorbike", 10 listings) takes under 10 seconds and costs about $0.017 on the Free plan.

Facebook Marketplace Scraper: city and search words in, listings with prices, new-listing and price-drop flags out, export to JSON or CSV

Table of contents

What it does

The Actor opens Facebook Marketplace as a logged-out visitor in the city you name, runs your search and saves the listings it finds: title, price (also in US dollars when Facebook shows it), photos, city, category, delivery options, posting time and a link to the listing. It can also open each listing page for the description, condition, exact distance and vehicle details.

For monitoring, it remembers what it saw before. A repeat run can return only new listings, or mark price drops, price rises and removed listings.

It never logs in and never saves seller names, profiles or contact details.

Good fit

  • 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.

👉 Try it now: open the input form

How it works

  1. You give a city and search words (or paste Marketplace links from your browser). Several cities and several search words are combined into separate searches.
  2. The Actor reads the public Marketplace search pages for each search, applies your filters (price, condition, delivery, age, availability) and drops reposts of the same item. If you asked for details, it also opens each listing page.
  3. It saves one Dataset row per listing, a market price summary per search (MARKET_SUMMARY) and a run report (RUN_SUMMARY) with the status of every search. In monitor mode it also stores what it saw, so the next run can find new listings and price changes.

👉 Try it now: open the input form

Quick start

Input form: box 1 is the City field, box 2 is Search words, box 3 is Max listings

  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).

    Output table: box 1 the view tabs, box 2 title, price and currency, box 3 percent below the search median

Expected result: 10 motorbike listings from Pattaya with prices in Thai baht, links and photos, in under 10 seconds.

👉 Try it now: open the input form

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Export listings for a city and productcity, query, maxItemsListingtitle, price, currency, url, postedAtCSV or Excel export
Get only new listings on a scheduleonlyNew + Apify scheduleNew listinglistingId, title, price, firstSeenAtSlack or Notion via deliveryConnector
Track price drops and removed listingstrackChanges, monitorNameChanged listingchangeType, previousPrice, priceDropPercentWebhook or Slack
Find underpriced itemsquery, priceMin, priceMaxListing with market comparisonmarketMedianPrice, belowMarketPercentSpreadsheet
Compare markets across citiescities, queriesMarket summary per searchMARKET_SUMMARY: median, p25, p75, countAPI
Read full listing pagesincludeDetails or startUrls with item linksDetailed listingdescription, condition, distanceKm, vehicleDatabase

👉 Try it now: open the input form

Input

Input fields

A run needs a place (city, cities, locationId or a Marketplace link) and a search word (query, queries) or a category. Everything else is optional.

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
cityCitytextone place is requiredprefill pattayacity nameWhere to searchlondonUse the city name people use in English
querySearch wordstextquery or categoryprefill motorbikeany wordsWhat to search foriphone 15Short words find more
categoryCategoryselectnonone18 Marketplace categories, e.g. vehicles, electronics, propertyrentalsSearch inside one categoryvehiclesCan be used without query
priceMin, priceMaxPrice rangewhole numbernonone0 or more, local currencyKeeps listings in this price range5000, 30000Use the city's currency
maxItemsMax listingswhole numbernodefault 50, prefill 101–5000Listings saved per search200Raise the run timeout for big runs
onlyNewOnly new listingsyes/nonofalseReturns only listings not seen in earlier runstrueFor scheduled runs
trackChangesTrack price drops and removalsyes/nonofalseMarks new, price-down, price-up and removed listingstrueFor price watching
includeUnchangedInclude unchanged listingsyes/nonofalseWith trackChanges, also saves listings that did not changetrueOnly if you need the full list each time
monitorNameMonitor nametextnononeletters, digits, spaces, -, _Keeps this monitor's memory apartpattaya-bikesUse one name per monitor
dedupeRepostsSkip repostsyes/nonotrueDrops the same item posted againtrueKeep it on
maxRemovedChecksMax removal checkswhole numberno200–200How many missing listings are checked before being marked removed50Each check is paid
includeDetailsInclude detailsyes/nonofalseOpens each listing page for description, condition, distance, vehicle datatrueCosts more per listing
radiusKmRadius (km)whole numbernonone1–500Keeps listings within this distance of the city20Turns on details
conditionConditionlistnoanynew, used_like_new, used_good, used_fairItem condition filter["new"]
deliveryDeliveryselectnoanylocal_pick_up, shippingDelivery filtershipping
daysSinceListedListed withinselectnoany1, 7, 30 daysMarketplace age filter7
maxAgeHoursPosted within (hours)whole numbernonone1–8760Drops listings older than this48
availabilityAvailabilityselectnoavailableavailable, soldActive or sold listingssold
strictQueryTitle must contain all wordsyes/nonofalseDrops listings whose title lacks any of your wordstrueFacebook search is loose
sortBySortselectnobest_matchbest_match, creation_time_descend, price_ascend, price_descend, distance_ascendOrder Facebook returnscreation_time_descendNewest first for monitors
citiesMore citieslistnononecity namesExtra cities["bangkok", "chiang mai"]Each city × word is one search
queriesMore search wordslistnononewordsExtra search words["honda", "yamaha"]
startUrlsMarketplace linkslistnononefacebook.com/marketplace search, category or item linksRuns your browser links; filters in the link are kepthttps://www.facebook.com/marketplace/bangkok/search/?query=hondaEasiest way to copy a search
locationIdLocation idtextnononenumeric id or city slug from a Marketplace linkExact Marketplace location112306758786227When a city name is ambiguous
outputFormatRow formatselectnoflatflat, nestedFlat columns or grouped objectsnestedflat is best for spreadsheets
deliveryConnectorSend results toMCP connectornononeyour connectorPosts a short summary after the runSee below
deliveryTargetNotion page or channeltextnononeNotion page link or Slack channel IDWhere the summary goes

Input field names used by other Marketplace scrapers also work: urls for startUrls, resultsLimit for maxItems, includeListingDetails or getListingDetails for includeDetails.

Interacting settings

WhenInput AInput BEffective behaviorExampleCost/result effect
Several places and wordscitiesqueriesEvery city × word pair is a separate search, 50 at most3 cities × 2 words = 6 searchesOne search fee each; maxItems applies per search
Both monitor optionsonlyNewtrackChangestrackChanges wins: known listings are compared, not droppedUnchanged listings are paid as cheap checks
Radius filterradiusKmincludeDetailsRadius needs the listing page, so details are readradiusKm: 20Listings outside the radius are paid as page checks
Link with filtersstartUrlsquery, priceMin…Filters written in the link are used for that link…/search/?query=honda&maxPrice=50000
Item linksstartUrls with /marketplace/item/…Each item page is read, up to 500 per runCharged as detailed listings

Input examples

Smallest run

{
"city": "pattaya",
"query": "motorbike",
"maxItems": 10
}

Expected behavior: one search in Pattaya. Expected output: 10 listings with title, price, currency, url, primaryImage. Limit or cost note: under 10 seconds and $0.017 on Free.

New listings every morning

{
"city": "los angeles",
"query": "couch",
"maxItems": 100,
"onlyNew": true,
"sortBy": "creation_time_descend",
"monitorName": "la-couches"
}

Expected behavior: the first run saves up to 100 listings; later runs save only listings that were not there before. Expected output: new listings with firstSeenAt. Limit or cost note: listings already seen are skipped free; you pay the search fee and the new rows.

Price watch with details

{
"city": "bangkok",
"query": "iphone 15",
"strictQuery": true,
"trackChanges": true,
"includeDetails": true,
"maxItems": 50,
"monitorName": "bkk-iphone"
}

Expected behavior: saves listings with description and condition; later runs mark priceDown, priceUp, new and removed. Expected output: changeType, previousPrice, priceDropPercent, condition, description. Limit or cost note: detailed listings cost more; unchanged listings are paid as checks only.

👉 Try it now: open the input form

Output

Output fields

These are the flat row fields (outputFormat: "flat"). With nested the same data is grouped into objects such as price and market.

FieldMeaningTypeCan be empty?Example / enumSource / notes
listingIdMarketplace listing idtextno1347713167500771
urlLink to the listingtextnohttps://www.facebook.com/marketplace/item/…/
titleListing titletextno2012 Honda Click 125As written by the seller
priceAsking pricenumberyes189000 when Facebook shows ฿0 (free or "ask for price"); placeholders like 9999999 are kept as the seller wrote them
currencyCurrency codetextyesTHB
priceTextPrice as showntextyes฿18,900
priceUsdPrice in US dollarsnumberyes556.2Only when Facebook shows it
originalPriceEarlier price shown by Facebooknumberyes21000When the seller lowered it
location, city, state, countryListing placetextyesPattaya, TH
latitude, longitude, distanceKmCoordinates and distance from the searched citynumberyes9.7With details
category, categoryIdMarketplace categorytextyesvehiclescategory is empty when Facebook uses an id outside the 18 known categories; categoryId is still set
conditionItem conditiontextyesused_like_newWith details
deliveryTypes, shippingOfferedPickup or shippinglist / yes-noyes["IN_PERSON"]
postedAtWhen it was listeddate-timeyes2026-06-28T11:02:15.000Z
statusListing statustextnoactive, sold, pending, removed
subtitleExtra line under the titletextyes20K kmOften mileage for vehicles
primaryImage, images, hasVideoPhotoslink / list / yes-noyesFacebook image links expire after some days
descriptionListing texttextyesWith details
vehicleMake, model, mileage, transmission, fuel, coloursobjectyes{"make":"Honda","model":"Forza",…}Vehicle listings with details
changeTypeWhat changed since the last runtextyesnew, priceDown, priceUp, removed, stillActiveMonitor mode only
firstSeenAt, previousPrice, priceDropPercentMonitor historydate-time / numberyes8.2Monitor mode only
marketMedianPriceMedian price of this searchnumberyes26900From the listings read in the search. Prices of 0 and 1, placeholders like 9999999 and prices over 50x the median are left out
belowMarketPercentHow far below the mediannumberyes29.7Only when at least 5 priced listings; empty for prices left out of the median. Negative means the price is above the median
isRepostLooks like a repost of an earlier itemyes/noyesnullOnly in monitor mode (onlyNew or trackChanges)
searchQuery, searchLocation, searchCategoryWhich search found ittextyesmotorbike, Pattaya
detailsStatusWas the listing page readtextnonot_requested, ok, gone, failed
fetchedAtWhen the row was saveddate-timeno

Output entities and surfaces

SituationDataset/API/KVS/live viewResult shapeUser action
Normal itemDataset, views Listings, With details, ChangesOne row per listingOpen, export or filter
Market pricesKey-value store MARKET_SUMMARYPer search: currency, count, min, p25, median, p75, max, meanCompare cities or products
Domain-empty resultDataset empty, RUN_SUMMARY status NO_RESULTSSearch list with found: 0Try other words or a bigger city
Partial resultRows saved, RUN_SUMMARY status PARTIAL with a reason (MAX_ITEMS, TIME_LIMIT, CHARGE_LIMIT, LOGIN_WALL, UNKNOWN_LOCATION, SOURCE_ERROR)Saved rows are keptRead the reason, then raise the limit or retry
Technical failureRUN_SUMMARY status ERROR or INVALID_INPUT, run marked failedMessage in the summary and logFix the input or retry later

Output example

{
"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"
}

This trimmed row comes from the smallest run above. null means Marketplace did not show that value on the search page: condition, description and coordinates come only with includeDetails, and monitor fields only with onlyNew or trackChanges.

Send results to Slack or Notion

Pick your connector in the optional deliveryConnector field. After the run saves its data, the Actor posts a short summary (up to 25 rows and a link to the full dataset) there. Put a Notion page link or a Slack channel ID in deliveryTarget: in Notion every run is added on top of that one page, so your workspace does not fill up with new pages. A delivery error never fails the run and costs nothing extra. Connect a service once in Apify Console → MCP connectors.

👉 Try it now: open the input form

Pricing

Pricing unit

You pay per event. Apify platform usage is included: there is no separate compute charge and no start fee.

EventWhen it is chargedFreeBronzeSilverGold and up
searchOnce per search (city × search words), after Facebook answered with a results page$0.008$0.0072$0.0064$0.0056
listingEach saved listing from search pages$0.00089$0.000801$0.000712$0.000623
listing-detailsEach saved listing with its page read (instead of listing, not on top)$0.008$0.0072$0.0064$0.0056
listing-checkedEach unchanged listing confirmed in trackChanges mode$0.0004$0.00036$0.00032$0.00028
listing-page-checkEach listing page Facebook answered that is not saved: a removal check, or a listing outside radiusKm$0.008$0.0072$0.0064$0.0056
  • A search that finds nothing, or where no listing passes your filters, costs only the search fee ($0.008 on Free).
  • With onlyNew, listings you already have are skipped free: a repeat run with nothing new costs only the search fee.
  • Removed listings found by a removal check are saved free; the check itself is paid.
  • Invalid input fails before any search and costs nothing.
  • A search that Facebook refused (login page, block, no answer after retries) or a city Facebook did not accept costs nothing.
  • If your run's maximum charge is reached, the Actor stops, keeps what it saved and reports PARTIAL with CHARGE_LIMIT.

Cost examples

Measured on real runs, Free plan prices.

ScenarioInput scopeExpected item/event countBase chargeOptional chargeStop/cap behavior
Smallest runPattaya, "motorbike", 10 listings1 search + 10 listings$0.017noneUnder 10 s
Nothing foundNonsense search words1 search$0.008noneNO_RESULTS
Medium exportLos Angeles, "couch", 200 listings1 search + 200 listings$0.186noneAbout 15 s
Details20 listings with includeDetails1 search + 20 detailed$0.168noneAbout 25 s
Monitor repeatonlyNew, 10 seen skipped, 10 new saved1 search + 10 listings$0.017noneSeen listings free
Price watch, nothing changedtrackChanges, 98 known listings1 search + 98 checks$0.047removal checks if anyAbout 15 s
Large export3 cities × 2 words, 1000 each6 searches + 3227 listings$2.92noneAbout 8 min; raise the timeout

One search with N listings, by plan:

Plan10 listings100 listings1000 listings
Free$0.017$0.097$0.898
Bronze$0.015$0.087$0.808
Silver$0.014$0.078$0.718
Gold and up$0.012$0.068$0.629

👉 Try it now: open the input form

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.

👉 Try it now: open the input form

API, export and integrations

  • API: start a run with the input JSON above through the Apify API or client libraries; read rows from the run's Dataset.
  • Export: download the Dataset as JSON, CSV, Excel, XML or HTML from the Output tab or the API.
  • Scheduling: create an Apify schedule with onlyNew or trackChanges and a monitorName; each run continues from the previous one.
  • Webhooks / no-code: use an Apify webhook on run success to pass the Dataset to Make, Zapier, n8n or your own endpoint. changeType tells the next step what happened.
  • Slack / Notion: set deliveryConnector and deliveryTarget (see Send results to Slack or Notion).

Use with AI agents (MCP)

  • MCP server URL with only this Actor: https://mcp.apify.com?tools=cliqtomedia/facebook-marketplace.
  • Smallest useful input: {"city": "pattaya", "query": "motorbike", "maxItems": 10}.
  • Key output fields: title (what is sold), price and currency (asking price), url (listing link), belowMarketPercent (how much cheaper than the search median), changeType (new or changed, in monitor mode).
  • A small run takes under 10 seconds and costs about $0.017 on Free. Keep maxItems small for quick answers; 50 searches per run at most.

👉 Try it now: open the input form

Troubleshooting

No listings

Symptom: the run succeeds, the Dataset is empty, RUN_SUMMARY says NO_RESULTS. Likely reason: Facebook has no listings for these words in this city, or your filters (strictQuery, price, condition, maxAgeHours) removed all of them. Check: searches[].found in RUN_SUMMARY shows how many listings were read before filters. Action: use shorter or English search words, turn off strictQuery, widen the price range or try a bigger city.

City not found

Symptom: the search is marked UNKNOWN_LOCATION. Likely reason: Facebook has no Marketplace page under this city name. Check: open Marketplace in your browser, pick the city and look at the link. Action: paste that link into startUrls, or copy the number or slug after /marketplace/ into locationId.

Run stopped early

Symptom: PARTIAL with TIME_LIMIT. Likely reason: the run timeout (5 minutes by default) ended before all listings were read. Check: RUN_SUMMARY.searches[].pagesRead and the run duration. Action: raise the timeout in the run options, lower maxItems or split the cities into several runs. Saved rows are kept.

Charge limit reached

Symptom: PARTIAL with CHARGE_LIMIT. Likely reason: the maximum cost per run you set was reached. Check: the run's charged events. Action: raise the maximum charge or ask for fewer listings.

Facebook asked to log in

Symptom: PARTIAL or ERROR with LOGIN_WALL. Likely reason: Facebook showed a login page instead of listings for this request. Check: the run log names the search. Action: run again later. The Actor never logs in, so it cannot get past this page.

Input rejected

Symptom: the run fails at once with INVALID_INPUT. Likely reason: no place, no search word or category, a non-Marketplace link, or more than 50 searches. Check: the message in the run log, for example "Add a search word (query) or a category". Action: fix the field named in the message. Invalid runs cost nothing.

👉 Try it now: open the input form

FAQ

Do I need a Facebook account or cookies?

No. The Actor reads Marketplace as a logged-out visitor. Do not give it your cookies or password.

Why is my run empty, and do I pay for it?

Facebook found nothing, or your filters removed everything. You pay only the search fee ($0.008 on Free). RUN_SUMMARY shows how many listings were read before filters.

Does it return every listing in the city?

No. It returns what Facebook shows a logged-out visitor for your search, up to maxItems. Use several search words or categories 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.

Can I get seller names or phone numbers?

No. Seller data is never saved.

Which countries work?

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

👉 Try it now: open the input form

👉 Try it now: open the input form

Support

For a bug, question or feature request, open the Actor's Issues tab on Apify. Include the run ID, your input (without private data) and the status from RUN_SUMMARY. Never send tokens, cookies or passwords.

👉 Try it now: open the input form