Facebook Marketplace Scraper with Availability Tracking
Pricing
from $3.99 / 1,000 results
Facebook Marketplace Scraper with Availability Tracking
Facebook Marketplace Scraper extracts product listings, prices, titles, descriptions, seller details, locations, categories, and other marketplace data from Facebook Marketplace. Automate product research, price tracking, competitor analysis, local market research, and lead generation.
Pricing
from $3.99 / 1,000 results
Rating
0.0
(0)
Developer
ScraperX
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
16 hours ago
Last modified
Categories
Share
Facebook Marketplace Scraper with Availability Tracking — Prices, Photos, Location & Sold Status
Scrape Facebook Marketplace search results and — uniquely — find out what actually happened to each listing. Every row carries a derived availabilityStatus: available, sold, pending or hidden, built from Facebook's own is_sold / is_pending / is_live / is_hidden flags, with the raw booleans included so you can audit the logic yourself.
That turns a listing scraper into a sell-through tracker: scrape today, rescan next week, and you know exactly which items sold, at what price, and how fast.
What you get
| 🛒 Listing data | 📦 Availability | 📍 Location & delivery |
|---|---|---|
| Title and full description | Derived availabilityStatus | Latitude / longitude |
| Price with currency & formatted amount | isSold, isPending, isLive, isHidden | Human-readable location text |
| Strikethrough (was) price | Per-run status tally row | Delivery types (shipping / local pickup) |
| Item condition (New, Used – good, …) | Status filtering at source | Marketplace category ID |
| All listing photos with dimensions | Listing timestamp | |
| Listing attributes (make, model, year…) | Direct item URL | |
| Video, subtitles, seller reference | Scrape timestamp |
Key features
- Availability tracking that actually resolves. Most Marketplace scrapers just dump listings. This one classifies each one into
available/sold/pending/hiddenand keeps the four raw Facebook booleans alongside it, so nothing is a black box. - Per-run status summary row. Every run emits one aggregate row —
totalListings,availableCount,soldCount,pendingCount,hiddenCount— so you get the headline number without post-processing. It is emitted regardless of your status filter. - Status filtering at source. Set
statusFiltertosoldto output only sold-marked listings — perfect for a "what actually moves in this category" analysis without paying for rows you would discard. - Two depth modes. With deep detail tracking on, each listing's detail page is opened for description, attributes and full photo sets. Turn it off for a fast, cheap availability-only sweep — the status is derived either way.
- Watchlists from search URLs. Each Marketplace search URL becomes a tracked feed. Mix queries, cities and categories in one run to build a single watchlist.
- Full sweeps supported. Set the per-URL limit to
0to check every listing a feed returns. - Structured pricing. Prices come with
amount,currency,formatted_amountand offset values, plus the strikethrough price when the seller has reduced it — discount detection is trivial. - Residential proxy routing on every Facebook request for reliability at scale.
Use cases
- Sell-through and demand analysis — rescan the same searches over time and measure what percentage of listings end up
sold, and how quickly. - Resale & flipping research — find what a category actually sells for locally, not just what people ask.
- Price monitoring — track price changes and markdowns (
strikethroughPricevslistingPrice) across a watchlist. - Local market research — map supply, price and condition distribution by city or category.
- Inventory monitoring — watch competitors' listings and know the moment something is marked sold or pending.
- Lead generation — identify active sellers in a category and location.
- Dealer and dropshipping sourcing — spot underpriced, available listings the moment they appear.
- Academic / market datasets — build a longitudinal dataset of a local secondhand market.
How it works
- You provide Marketplace search URLs — each becomes a tracked feed.
- The Actor pages each search feed through residential proxies, collecting listing nodes.
- Availability is derived for every listing from Facebook's own flags into a single, readable
availabilityStatus. - With deep detail tracking on, each listing's detail page is opened for the description, attribute list and full photo set.
- Your status filter is applied, and matching rows stream into the dataset.
- A
status_summaryrow is appended with the tally for the whole run.
Quick start
- Open Facebook Marketplace in your browser, search for what you want and set your filters (city, category, price).
- Copy the URL — e.g.
https://www.facebook.com/marketplace/108479165840750/search/?query=iphone. - Paste it into Listings to monitor.
- Set Listings checked per tracked URL (start with 40–50;
0= full sweep). - Click Start, then export the Output tab as CSV, Excel or JSON.
Minimal input
{"trackUrls": ["https://www.facebook.com/marketplace/108479165840750/search/?query=iphone"],"listingsPerUrl": 50,"deepDetailTracking": true}
Input configuration
| Field | Type | Default | Description |
|---|---|---|---|
trackUrls | array | — | Facebook Marketplace search URLs to monitor. Each URL becomes a tracked feed; mix queries, cities and categories to build one watchlist. |
listingsPerUrl | integer | 50 | How many listings to check per tracked URL. 0 = check every listing the feed returns (full sweep). |
deepDetailTracking | boolean | true | On: open each listing's detail page for description, attributes and full photos. Off: faster, cheaper search-only availability pass. |
statusFilter | string | all | Output only listings whose derived status matches: all, available, sold, pending, hidden. The status_summary row is emitted either way. |
proxyConfiguration | object | Apify Proxy, RESIDENTIAL | Facebook requests always go through residential proxies; this section fine-tunes region and session preferences. |
Tip: to build a watchlist, save a Task with several
trackUrlsand attach a Schedule. ComparingavailabilityStatusperidbetween runs gives you a clean sold/unsold timeline.
Output data
Two row types share the dataset, distinguished by type and isAggregate.
Listing rows (type: "listing", isAggregate: false)
| Field | Type | Description |
|---|---|---|
availabilityStatus | string | available, sold, pending or hidden — the derived status. |
isSold, isPending, isLive, isHidden | boolean | Facebook's raw flags behind the derived status. |
id | string | Marketplace listing ID. |
itemUrl | string | Direct link to the listing. |
listingTitle | string | Listing title. |
description | string | Full description (deep detail mode). |
listingPrice | object | { amount, currency, formatted_amount_zeros_stripped, amount_with_offset_in_currency }. |
strikethroughPrice | object | Previous price when the seller has marked it down. |
condition | string | Human-readable condition: New, Used - like new, Used - good, Used - fair, Used. |
listingAttributes | array | { attribute_name, label, value } — make, model, year, mileage, size etc., depending on category. |
listingPhotos | array | All photos with image.uri, image.width, image.height, id and accessibility_caption. |
primaryListingPhoto | object | The main photo. |
listingVideo | array | Video attachments, when present. |
location | object | Latitude / longitude. |
locationText | string | Human-readable location. |
deliveryTypes | array | Shipping / local pickup options. |
listingCategoryId | string | Marketplace category ID. |
customSubTitlesWithRenderingFlags | array | Subtitle chips Facebook shows under the title. |
timestamp | string | Listing creation time (ISO). |
isViewerSeller | boolean | Whether the viewing session owns the listing. |
facebookUrl | string | The tracked search URL that produced the row. |
scrapedAt | string | When the row was collected. |
Summary row (type: "status_summary", isAggregate: true)
totalListings, availableCount, soldCount, pendingCount, hiddenCount, scrapedAt.
Example output
{"type": "listing","isAggregate": false,"availabilityStatus": "sold","isSold": true,"isPending": false,"isLive": true,"isHidden": false,"id": "1234567890123456","itemUrl": "https://www.facebook.com/marketplace/item/1234567890123456/","listingTitle": "iPhone 14 Pro 256GB — Deep Purple","description": "Excellent condition, battery health 91%, boxed with charger.","listingPrice": { "amount": "540", "currency": "GBP", "formatted_amount_zeros_stripped": "£540" },"strikethroughPrice": { "formatted_amount": "£599" },"condition": "Used - like new","listingAttributes": [{ "attribute_name": "storage", "label": "Storage", "value": "256 GB" }],"listingPhotos": [{ "image": { "uri": "https://scontent.xx.fbcdn.net/…", "width": 1440, "height": 1440 }, "id": "998877" }],"location": { "latitude": 53.4808, "longitude": -2.2426 },"locationText": "Manchester, UK","deliveryTypes": ["LOCAL_PICK_UP"],"timestamp": "2026-08-02T10:12:00Z","facebookUrl": "https://www.facebook.com/marketplace/108479165840750/search/?query=iphone","scrapedAt": "2026-08-10T09:51:33Z"}
{"type": "status_summary","isAggregate": true,"availabilityStatus": "all","totalListings": 200,"availableCount": 142,"soldCount": 41,"pendingCount": 9,"hiddenCount": 8,"scrapedAt": "2026-08-10T09:53:02Z"}
Illustrative values — a live run returns current Marketplace data.
Usage examples
What actually sells in a category
{"trackUrls": ["https://www.facebook.com/marketplace/108479165840750/search/?query=road%20bike"],"listingsPerUrl": 0,"statusFilter": "sold","deepDetailTracking": true}
Fast, cheap availability sweep across a watchlist
{"trackUrls": ["https://www.facebook.com/marketplace/108479165840750/search/?query=iphone","https://www.facebook.com/marketplace/111111111111111/search/?query=iphone","https://www.facebook.com/marketplace/222222222222222/search/?query=iphone"],"listingsPerUrl": 100,"deepDetailTracking": false,"statusFilter": "all"}
Only live listings, for sourcing
{"trackUrls": ["https://www.facebook.com/marketplace/108479165840750/search/?query=macbook%20pro"],"listingsPerUrl": 80,"statusFilter": "available"}
Weekly sell-through tracking
Save the input as a Task, attach a weekly Schedule, then join runs on id and compare availabilityStatus — every listing that flipped from available to sold is a confirmed sale, and listingPrice tells you at what price.
Run it from your own code
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("scraperx/facebook-marketplace-scraper").call(run_input={"trackUrls": ["https://www.facebook.com/marketplace/108479165840750/search/?query=iphone"],"listingsPerUrl": 50,"statusFilter": "all",})for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row["type"] == "status_summary":print("SOLD:", row["soldCount"], "of", row["totalListings"])else:print(row["availabilityStatus"], row["listingTitle"], row["listingPrice"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });const run = await client.actor('scraperx/facebook-marketplace-scraper').call({trackUrls: ['https://www.facebook.com/marketplace/108479165840750/search/?query=iphone'],listingsPerUrl: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
cURL
curl -X POST "https://api.apify.com/v2/acts/scraperx~facebook-marketplace-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \-H "Content-Type: application/json" \-d '{"trackUrls":["https://www.facebook.com/marketplace/108479165840750/search/?query=iphone"],"listingsPerUrl":50}'
Integrations
Push results to Google Sheets, Airtable, Slack, Make, Zapier, Google Drive or any endpoint via webhooks. Combine with Schedules to build a rolling availability history.
Pricing
Pay-per-event: a small Actor-start charge plus a charge per listing row delivered. Two ways to keep cost down:
- Turn
deepDetailTrackingoff when you only need availability and price — the status is derived either way. - Use
statusFilterso you only pay for the rows you actually want.
Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during each run.
Limits & good to know
- Search URLs only. The tracker works from Marketplace search feeds. Grab the URL from your browser after applying city, category and price filters.
listingsPerUrlis per tracked URL, so five URLs at 100 each can return up to 500 listing rows plus one summary row.- Marketplace is location-scoped. The numeric ID in the URL is the city — use a proxy in a matching region for the most consistent results.
hiddenandpendingare Facebook's own labels; a listing can also simply disappear, in which case it stops appearing in the feed rather than turning up as sold.- Photo URIs point at Facebook's CDN and expire — download assets promptly if you need to keep them.
- Deep detail mode is slower: it is one extra page load per listing.
- Default run options are 4 GB memory and a 1-hour timeout — raise the timeout for full sweeps.
FAQ
Do I need a Facebook account or cookies? No. The Actor reads public Marketplace search results.
How does it know a listing sold?
Facebook exposes is_sold, is_pending, is_live and is_hidden on each listing. The Actor derives a single availabilityStatus from them and returns the raw booleans too.
Can I get only sold items?
Yes — set statusFilter to sold. The run still emits the full status_summary tally.
What is the status_summary row?
One aggregate row per run with the totals by status. Filter it out with type == "listing" if you only want listings.
How do I track a whole city or category?
Build the search on Marketplace with your filters, copy the URL, and set listingsPerUrl to 0 for a full sweep.
Do I get seller contact details? Marketplace does not publish seller phone numbers or e-mails. You get the listing, its location and the seller reference Facebook exposes.
Which export formats are supported?
JSON, CSV, Excel (XLSX), XML and RSS. JSON keeps listingPrice, listingPhotos and listingAttributes nested.
Can I run this on a schedule? Yes — that is the intended workflow. Availability tracking only becomes powerful when you compare runs over time.
Legal & responsible use
This Actor collects publicly visible Facebook Marketplace listings — the same content any visitor sees. It does not log in, contact sellers, or access private data. Listings may include personal information; if you process it, ensure you have a lawful basis under GDPR and similar rules, and comply with Facebook's terms and applicable law.
Support
Need extra fields, a different status logic, or a custom Marketplace monitoring pipeline? Open an issue on the Issues tab.