Facebook Marketplace Scraper: Price Trend Checker
Pricing
Pay per usage
Facebook Marketplace Scraper: Price Trend Checker
Scrape listings from Facebook Marketplace with the Facebook Marketplace Scraper. Extract item titles, prices, descriptions, seller info, images, and locations. Perfect for market research, price tracking, and competitor analysis. Fast, accurate, and scalable for bulk listings.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
2
Bookmarked
22
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
Facebook Marketplace Scraper — Listings and Price-Drop Signals
Facebook Marketplace Scraper: Price Trend Checker turns Marketplace search URLs into structured listing data — price, currency, condition, photos — plus Facebook's own discount signals: strikethrough price, comparable price, a derived discount percentage, and a price-drop flag, never estimated when a signal is missing. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. Point it at the searches you're watching and see which listings are genuinely marked down.
What is Facebook Marketplace Scraper: Price Trend Checker?
Facebook Marketplace Scraper: Price Trend Checker is a query-driven Actor: give it one or more Facebook Marketplace search URLs and it returns every listing it finds, enriched with Facebook's own price and discount signals — strikethrough/was-price, comparable price, a derived discount percentage, and a price-drop flag. It runs entirely against Facebook's logged-out public Marketplace pages, seeded with a guest session, so no Facebook account, login, or cookies are required. You can scan search results only (fast) or open each listing's page for full detail — description, condition, attributes, photos (slower, richer).
- Scans one or more Marketplace search URLs in a single run (
priceWatchUrls) - Harvests Facebook's own discount signals — strikethrough price, comparable price, and comparable-price type — without fabricating a "was" price Facebook never showed
- Derives
discountPercentand ahasPriceDropflag from those signals on every listing - Filters output to a price band (
minPrice/maxPrice), a currency, or discounted listings only (onlyDiscounted), before any row is charged - Switches between a fast search-only pass and a deep per-listing detail pass (
fetchFullDetail) - Caps how many listings are scanned per URL before filters apply (
listingsToScan)
What data can you get with Facebook Marketplace Scraper: Price Trend Checker?
Facebook Marketplace Scraper: Price Trend Checker returns one structured record per Marketplace listing, covering identity, pricing, and Facebook's own discount signals. The default dataset view surfaces these 12 columns:
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Listing identity & link | id, marketplace_listing_title, listingTitle, listingUrl, itemUrl | Identify and open the exact listing |
| Price & deal signals | priceAmount, currency, strikethroughPrice, comparablePrice, discountPercent, hasPriceDrop, priceRange | Spot genuine markdowns and filter by price band |
Price-drop and discount signals
This is the field group that separates a plain listing dump from something you can actually use to spot a deal. Facebook itself embeds strikethrough_price (a seller-set "was" price) and comparable_price (a reference price Facebook computes, tagged with comparablePriceType) inside the listing payload for some listings — Price Trend Checker harvests both instead of dropping them, then derives discountPercent by comparing whichever reference price is genuinely higher than the current priceAmount, and sets hasPriceDrop to true only when that comparison finds a real markdown. When a listing carries neither signal, both derived fields come back null rather than a guessed number. A priceRange object (min/max) is also attached for listings Facebook lists with a price band instead of one fixed number.
{"priceAmount": 649,"currency": "USD","strikethroughPrice": "$799","comparablePrice": null,"comparablePriceType": null,"discountPercent": 18.77,"hasPriceDrop": true,"priceRange": null}
Full listing detail (deep mode)
When fetchFullDetail is on (the default), Price Trend Checker also opens each listing's own page and merges in condition, description, listingAttributes, listingPhotos, deliveryTypes, location/locationText, and timestamp — everything a shopper would see by clicking through, without the click. This is slower per listing than the search-only pass, but useful when you need more than a price to decide: an attribute filter, a condition check, or a photo to confirm before you contact the seller.
Why not build this yourself?
Meta does not publish a public API for third-party Marketplace listing search, so any DIY scraper has to reverse-engineer the same private GraphQL surface this Actor uses. Facebook rotates the doc_id values that identify the search and per-listing GraphQL queries, and the lsd/fb_dtsg session tokens needed to authenticate each request, on every deploy — a hardcoded query or token breaks silently within days. This Actor re-extracts both the doc_id (by sweeping the page's own JavaScript bundles for the Relay operation name) and the session tokens (from the bootstrap HTML) on every run, so it tracks Facebook's rotation automatically instead of shipping a value that goes stale.
Facebook also returns intermittent 403/429/503 responses to logged-out Marketplace traffic. This Actor seeds a guest session cookie before its first request, then retries the bootstrap fetch up to four times, each on a freshly rotated residential proxy IP, before giving up on a URL — a single blocked or dead exit IP no longer fails the whole run. Building and maintaining your own doc_id tracker, token refresher, and residential proxy rotation is a standing engineering cost; running the Actor is not.
How to scrape Facebook Marketplace with Facebook Marketplace Scraper: Price Trend Checker?
- Open Facebook Marketplace Scraper: Price Trend Checker on the Apify Store and click Try for free (or Start, if already added to your account).
- Add one or more Facebook Marketplace search URLs to priceWatchUrls — no field is required by the schema, but the run produces no rows without at least one URL here.
- Set listingsToScan to cap how many listings are scanned per URL, and toggle fetchFullDetail for a fast search-only pass or a fuller per-listing pass.
- Optionally narrow the output with minPrice/maxPrice, currency, and onlyDiscounted, then click Start.
- Open the Output tab once the run finishes (or watch it fill in live) and export as JSON or CSV.
Example input for a request:
{"priceWatchUrls": ["https://www.facebook.com/marketplace/108479165840750/search/?query=iphone&exact=false"],"listingsToScan": 50,"onlyDiscounted": true}
How to run multiple queries in one job
Add more than one URL to priceWatchUrls — each is a separate Marketplace search (different keyword, city, or category) scanned independently and pushed to the same dataset. In regular mode (fetchFullDetail off), every URL is fetched concurrently via asyncio.gather. In deep mode (the default), URLs are scanned sequentially for listing IDs first, then every matched listing's detail page is fetched concurrently — up to 100 connections total, 20 per host — before rows are formatted and filtered.
⬇️ Input
No input parameter is required by the schema — provide at least one priceWatchUrls entry for the run to produce anything.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
priceWatchUrls | No | array | One or more Facebook Marketplace search URLs to put on price watch. Each URL is scanned page by page for listings and their price signals. | ["https://www.facebook.com/marketplace/108479165840750/search/?query=iphone&exact=false"] |
listingsToScan | No | integer | How many listings to scan per URL before the deal filters are applied. Use 0 for no cap. Defaults to 20. | 50 |
fetchFullDetail | No | boolean | ON: open each listing page for full detail (description, attributes, photos) — slower but richer. OFF: use only search-result fields — faster. Defaults to on. | true |
minPrice | No | integer | Only keep listings priced at or above this amount. Leave empty for no lower bound. | 100 |
maxPrice | No | integer | Only keep listings priced at or below this amount. Leave empty for no upper bound. | 800 |
currency | No | string | Only keep listings in this ISO currency code (case-insensitive). Leave empty to accept any currency. | USD |
onlyDiscounted | No | boolean | ON: keep only listings with a genuine price drop — a strikethrough/was price or comparable price higher than the current price. Default false. | true |
proxyConfiguration | No | object | Optional Apify Proxy preferences. The Actor always runs Marketplace requests through residential IPs with a guest-session warmup and fresh-IP retry, so this is only advisory. | {"useApifyProxy": false} |
{"priceWatchUrls": ["https://www.facebook.com/marketplace/108479165840750/search/?query=iphone&exact=false"],"listingsToScan": 50,"fetchFullDetail": true,"minPrice": 100,"maxPrice": 800,"currency": "USD","onlyDiscounted": true,"proxyConfiguration": { "useApifyProxy": false }}
Common pitfall: setting minPrice or maxPrice silently drops any listing whose price couldn't be read at all — not just ones outside the band — because a row with no parseable priceAmount can't be placed inside a range. If you want every listing regardless of price completeness, leave both bounds empty and filter afterward.
⬆️ Output
Results are pushed to the dataset as typed JSON, one item per listing that passes the deal filters, with a consistent schema across runs. Every dataset item is a charged row_result event — listings filtered out by minPrice/maxPrice/currency/onlyDiscounted are never pushed and never charged. Download results as JSON, CSV, Excel, or query them through the dataset API.
Scraped results
[{"facebookUrl": "https://www.facebook.com/marketplace/108479165840750/search/?query=iphone","id": "1234567890123456","itemUrl": "https://www.facebook.com/marketplace/item/1234567890123456/","listingAttributes": [{ "attribute_name": "condition", "value": "used_like_new", "label": "Used - like new" }],"condition": "Used - like new","timestamp": "2026-07-20T14:32:00.000Z","deliveryTypes": ["local_pick_up"],"listingPhotos": [{ "__typename": "Photo", "accessibility_caption": "iPhone 13 Pro photo", "image": { "height": 720, "width": 960, "uri": "https://scontent.xx.fbcdn.net/v/t45/iphone1.jpg" }, "id": "9988776655" }],"listingPrice": { "formatted_amount_zeros_stripped": "$649", "amount_with_offset_in_currency": 64900, "amount": "649", "currency": "USD" },"location": { "latitude": 40.7128, "longitude": -74.006 },"locationText": { "text": "Brooklyn, NY" },"listingTitle": "iPhone 13 Pro 128GB Unlocked","description": { "text": "Excellent condition, barely used, comes with original box and charger." },"isHidden": false,"isLive": true,"isPending": false,"isSold": false,"isViewerSeller": false,"listingVideo": [],"listingCategoryId": "687335025335756","strikethroughPrice": "$799","primaryListingPhoto": { "__typename": "Photo", "id": "9988776655", "photo_image_url": "https://scontent.xx.fbcdn.net/v/t45/iphone1.jpg" },"customSubTitlesWithRenderingFlags": [],"priceAmount": 649,"currency": "USD","comparablePrice": null,"comparablePriceType": null,"discountPercent": 18.77,"hasPriceDrop": true,"priceRange": null},{"facebookUrl": "https://www.facebook.com/marketplace/108479165840750/search/?query=iphone","id": "2234567890123456","itemUrl": "https://www.facebook.com/marketplace/item/2234567890123456/","listingAttributes": [{ "attribute_name": "condition", "value": "used_good", "label": "Used - good" }],"condition": "Used - good","timestamp": "2026-07-19T09:10:00.000Z","deliveryTypes": ["local_pick_up", "shipping"],"listingPhotos": [{ "__typename": "Photo", "accessibility_caption": "iPhone 13 photo", "image": { "height": 720, "width": 960, "uri": "https://scontent.xx.fbcdn.net/v/t45/iphone2.jpg" }, "id": "9988776656" }],"listingPrice": { "formatted_amount_zeros_stripped": "$520", "amount_with_offset_in_currency": 52000, "amount": "520", "currency": "USD" },"location": { "latitude": 34.0522, "longitude": -118.2437 },"locationText": { "text": "Los Angeles, CA" },"listingTitle": "iPhone 13 128GB - Great Condition","description": { "text": "Works perfectly, minor scratches on the back." },"isHidden": false,"isLive": true,"isPending": false,"isSold": false,"isViewerSeller": false,"listingVideo": [],"listingCategoryId": "687335025335756","strikethroughPrice": null,"primaryListingPhoto": { "__typename": "Photo", "id": "9988776656", "photo_image_url": "https://scontent.xx.fbcdn.net/v/t45/iphone2.jpg" },"customSubTitlesWithRenderingFlags": [],"priceAmount": 520,"currency": "USD","comparablePrice": null,"comparablePriceType": null,"discountPercent": null,"hasPriceDrop": false,"priceRange": null},{"facebookUrl": "https://www.facebook.com/marketplace/108479165840750/search/?query=iphone","id": "3234567890123456","itemUrl": "https://www.facebook.com/marketplace/item/3234567890123456/","listingAttributes": [{ "attribute_name": "condition", "value": "new", "label": "New" }],"condition": "New","timestamp": "2026-07-21T17:45:00.000Z","deliveryTypes": ["shipping"],"listingPhotos": [{ "__typename": "Photo", "accessibility_caption": "iPhone 13 Pro Max photo", "image": { "height": 720, "width": 960, "uri": "https://scontent.xx.fbcdn.net/v/t45/iphone3.jpg" }, "id": "9988776657" }],"listingPrice": { "formatted_amount_zeros_stripped": "$700", "amount_with_offset_in_currency": 70000, "amount": "700", "currency": "USD" },"location": { "latitude": 41.8781, "longitude": -87.6298 },"locationText": { "text": "Chicago, IL" },"listingTitle": "iPhone 13 Pro Max - Multiple Colors Available","description": { "text": "Sealed box, choice of Graphite, Gold, or Sierra Blue." },"isHidden": false,"isLive": true,"isPending": false,"isSold": false,"isViewerSeller": false,"listingVideo": [],"listingCategoryId": "687335025335756","strikethroughPrice": null,"primaryListingPhoto": { "__typename": "Photo", "id": "9988776657", "photo_image_url": "https://scontent.xx.fbcdn.net/v/t45/iphone3.jpg" },"customSubTitlesWithRenderingFlags": [],"priceAmount": 700,"currency": "USD","comparablePrice": "$850","comparablePriceType": "STRIKETHROUGH_PRICE_FOR_VARIANT","discountPercent": 17.65,"hasPriceDrop": true,"priceRange": { "min": 700, "max": 900 }}]
How can I use the data extracted with Facebook Marketplace Scraper: Price Trend Checker?
- Resale and arbitrage buyers: filter with
onlyDiscountedand aminPrice/maxPriceband, then sort bydiscountPercentto surface listings priced well under Facebook's own reference price before you commit to a flip. - Market researchers: run
priceWatchUrlsacross several cities or categories at once and comparepriceAmountandpriceRangeacross the result set to gauge where a product category sits, city by city. - AI engineers and LLM developers: an agent issues a
priceWatchUrlsquery, receives the structured JSON listing record back, and passespriceAmount,discountPercent, andhasPriceDropto the model as grounded context before it recommends a deal. - Price monitoring builders: schedule repeated runs over a fixed watch list and diff
priceAmount/hasPriceDropbetween runs to catch new markdowns as they appear, rather than checking Marketplace by hand.
How do you monitor price drops on Facebook Marketplace over time?
Monitoring here means running the same priceWatchUrls set repeatedly and comparing what comes back — not a single snapshot, and not a feature the Actor tracks internally. Each run is independent: Price Trend Checker computes discountPercent and hasPriceDrop fresh from whatever strikethrough_price/comparable_price signal Facebook shows at that moment, but it does not store a previous run's prices anywhere to diff against automatically.
To build an actual price-trend history, schedule a recurring run over the same priceWatchUrls using Apify's Scheduler, then keep each run's dataset export and compare them yourself, keyed on id. The fields worth diffing are priceAmount (did the price itself move?), hasPriceDrop (did a markdown appear or disappear?), and discountPercent (how much bigger or smaller is the gap?). A listing whose priceAmount drops between two runs, or whose hasPriceDrop flips from false to true, is the signal worth alerting on — everything else is noise.
A practical workflow: run daily or weekly across a fixed set of search URLs, store each run's dataset export (in your own database, a spreadsheet, or Apify's dataset storage), and diff the current export against the previous one by id. Alert only on the rows where priceAmount or hasPriceDrop actually changed. This turns a one-time price check into an ongoing feed — though the trend history itself lives in however you store the exports, not inside the Actor.
Integrate Facebook Marketplace Scraper: Price Trend Checker and automate your workflow
Facebook Marketplace Scraper: Price Trend Checker works with any language or tool that can send an HTTP request.
REST API with Python
import requestsAPI_TOKEN = "YOUR_APIFY_TOKEN"ACTOR_ID = "scrapier~facebook-marketplace-scraper-price-trend-checker"run_input = {"priceWatchUrls": ["https://www.facebook.com/marketplace/108479165840750/search/?query=iphone"],"onlyDiscounted": True,}resp = requests.post(f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items",params={"token": API_TOKEN},json=run_input,)for row in resp.json():print(row.get("listingTitle"), row.get("priceAmount"), row.get("discountPercent"))
MCP for query-grounded AI agents
Facebook Marketplace Scraper: Price Trend Checker is reachable through Apify's hosted MCP server at https://mcp.apify.com — no local install required for MCP-aware clients such as Claude Desktop and Cursor. An agent connects to the endpoint, discovers this Actor by name, calls it with one or more priceWatchUrls, and gets the JSON listing list — including priceAmount, discountPercent, and hasPriceDrop — back as tool output, enough to ground an answer about which listings are genuinely discounted.
Scheduled monitoring and delivery
Runs can be triggered on a recurring cron schedule using Apify's built-in Scheduler, with results readable afterward through the dataset API or exported as JSON/CSV. This Actor has no dedicated webhook input of its own, but Apify's platform-wide webhook feature can still fire on run completion to push a notification or trigger a downstream job.
Is it legal to scrape Facebook Marketplace?
Scraping publicly accessible Marketplace listings is generally legal in the US — courts have held that accessing data any logged-out visitor can already see does not violate the Computer Fraud and Abuse Act (hiQ Labs, Inc. v. LinkedIn Corp., 9th Cir., 2019). Facebook Marketplace Scraper: Price Trend Checker only returns what a logged-out visitor sees on a Marketplace search page or listing page — it does not bypass a login, paywall, or privacy setting. Listing prices, titles, and descriptions are business/product data rather than personal data, so ToS and database-rights considerations apply more directly than GDPR/CCPA; operational price monitoring of public listings carries a different risk profile than bulk collection for resale or AI training. Consult your legal team for commercial use cases involving bulk data storage.
Frequently asked questions
Does Facebook Marketplace Scraper: Price Trend Checker require a Facebook login?
No. Every request runs against Facebook's logged-out public Marketplace pages, seeded with a guest session cookie; there's no login, cookie, or credential field anywhere in the input.
How many listings does it return per URL?
listingsToScan sets the ceiling per URL — default 20, 0 for no cap — applied before the deal filters run, so the number of rows actually saved and charged can be lower once minPrice/maxPrice/currency/onlyDiscounted are applied.
What's the difference between fetchFullDetail on and off?
On (the default) opens each listing's own page for condition, description, listingAttributes, and photos; off uses only the fields present in the search results and runs faster. Discount signals (strikethroughPrice, comparablePrice, discountPercent, hasPriceDrop) are available either way.
Does Facebook Marketplace Scraper: Price Trend Checker extract Facebook's own discount signals?
Yes — strikethroughPrice, comparablePrice, and comparablePriceType arrive as harvested from Facebook's listing payload, and discountPercent/hasPriceDrop are derived from them. Both derived fields come back null when a listing carries neither signal — nothing is guessed.
Does the price trend checker actually track price trends over time?
Not on its own. Each run is independent and computes discount signals fresh from whatever price data Facebook shows at that moment; the Actor does not persist a previous run's prices to diff against automatically. Building an actual trend means scheduling repeated runs and diffing priceAmount/hasPriceDrop between exports yourself — see "How do you monitor price drops over time?" above.
How does Facebook Marketplace Scraper: Price Trend Checker handle Facebook's anti-bot measures?
It treats 403/429/503 responses and unexpectedly short pages as blocked, then retries the bootstrap fetch up to four times, each on a freshly rotated residential proxy session, after a guest-session warmup seeds a datr cookie before the first request.
How do I monitor price drops on a set of listings over time?
Schedule a recurring run over the same priceWatchUrls using Apify's Scheduler, store each run's dataset export, and diff priceAmount and hasPriceDrop against the previous run's for the same id, alerting only on rows where either actually changed.
Does Facebook Marketplace Scraper: Price Trend Checker work with Claude, ChatGPT, and AI agent frameworks?
Yes. It's reachable through Apify's hosted MCP server at https://mcp.apify.com for MCP-aware clients, and callable as a plain HTTP endpoint from any other agent framework — either path lets an agent retrieve live listing and price data before answering.
Can I filter listings by price band or currency?
Yes — set minPrice and/or maxPrice for a price band and currency for an ISO currency code; listings without a readable price are dropped once a price band is set, since they can't be placed inside a range.
Can I use Facebook Marketplace Scraper: Price Trend Checker without managing proxies or Facebook credentials?
Yes. No Facebook account, login, or cookies are ever required, and the Actor always runs Marketplace requests through a residential proxy with its own guest-session warmup and fresh-IP retry — proxyConfiguration is only advisory.
Your feedback
Found a bug or missing a field? Let us know through the Issues tab on this Actor's Apify Console page — reports are reviewed as part of active maintenance.