Facebook Marketplace Scraper
Pricing
from $4.00 / 1,000 marketplace listing scrapeds
Facebook Marketplace Scraper
Scrape Facebook Marketplace search results and listing details, with prices, photos, sellers, locations and item status as clean structured data. Works with Apify MCP and the API.
Pricing
from $4.00 / 1,000 marketplace listing scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
8 days ago
Last modified
Categories
Share
What is Facebook Marketplace Scraper?
Facebook Marketplace Scraper is an Apify Actor for search queries, direct item URLs, item IDs, and location lookups. It accepts Marketplace input and returns one record per saved result, so a single row can represent a location lookup, a search listing, or an item detail record. The dataset includes fields such as title, listing ID, listing URL, price, photos, seller data, location, delivery types, sold/live/pending status, and scraped timestamp. The outcome is clean structured Marketplace data that is ready for downstream analysis, SEO pipelines, and AI agents, including use through Apify MCP.
Best fit and connected workflows
This Actor fits workflows that start from a Marketplace search term and location, then move into structured records for research or automation. It also fits workflows that already have a specific listing URL or numeric item ID and need a detailed record.
Common routing patterns include:
- Search by query and location to collect listings for market research or lead discovery.
- Resolve a location query into coordinates, then search around that area.
- Enrich search listings with item details when you want description, seller, photo, and status fields in the same workflow.
- Use direct item URLs or item IDs when your workflow already has a target listing.
- Read RUN_SUMMARY and OUTPUT from the key-value store when an agent needs run-level telemetry alongside dataset rows.
Practical scenario
A resale analyst starts with searchQueries: ["office chairs"] and locationQuery: "Austin, TX". The actor returns listing rows with fields such as title, listingId, listingUrl, price, location, isSold, and scrapedAt. The analyst reviews price and status patterns, then sends selected listingUrl values back into a follow-up run with includeItemDetails: true to collect richer item records before deciding which listings deserve manual review.
Input
| Field | Type | Purpose |
|---|---|---|
searchQueries | array[string] | Marketplace search terms such as bikes, sofas, apartments, iPhone, or office chairs. |
itemUrls | array[object] | Direct Facebook Marketplace item URLs to scrape in detail. |
itemIds | array[string] | Numeric listing IDs when the full URL is unavailable. |
locationQuery | string | City or place to resolve into Marketplace coordinates before search. |
latitude | number | Search latitude. |
longitude | number | Search longitude. |
radiusKm | number | Search radius around resolved coordinates. |
minPrice | number | Minimum listing price filter. |
maxPrice | number | Maximum listing price filter. |
maxListings | integer | Maximum search listing records saved across all queries. |
maxPages | integer | Maximum provider result pages requested per query. |
countPerPage | integer | Number of listings requested per page. |
sortBy | string | Provider-side ordering, such as suitable match, distance, newest, or price order. |
deliveryMethod | string | Delivery filter such as all, local pickup, or shipping. |
condition | string | Item condition filter. |
dateListed | string | Date-listed filter. |
availability | string | Listing availability filter. |
startCursor | string | Provider pagination cursor from RUN_SUMMARY.nextCursors. |
dataSource | string | Data source mode. Auto resolves to provider mode for Marketplace. |
providerOrder | string | Choose which managed provider API is tried first. |
includeItemDetails | boolean | Fetch item detail records for each search listing. |
includeLocationResults | boolean | Save location lookup results to the dataset when location search is used. |
includeRawData | boolean | Include raw source objects in each dataset row. |
Focused JSON example
{"searchQueries": ["bike"],"locationQuery": "Austin, TX","radiusKm": 40,"maxListings": 25,"maxPages": 2,"countPerPage": 24,"sortBy": "suggested","deliveryMethod": "all","condition": "all","dateListed": "all","availability": "in_stock","dataSource": "auto","includeItemDetails": false,"includeLocationResults": true,"includeRawData": false}
Output
The dataset can contain three record types:
locationlistingitem
| Field | Type | Meaning |
|---|---|---|
recordType | string | Location, listing, or item record. |
source | string | Provider used for the record. |
query | string | Location query that produced a location record. |
searchQuery | string | Search term that produced a listing. |
name | string | Location name. |
title | string | Listing title. |
listingId | string | Marketplace listing ID. |
listingUrl | string | Marketplace listing URL. |
description | string | Item or listing description. |
createdAt | string | Creation time when available. |
price | object | Price object. |
location | object | Location object. |
primaryPhotoUrl | string | Main photo URL. |
photoUrls | array[string] | Photo URLs. |
seller | object | Seller object. |
deliveryTypes | array[string] | Delivery types. |
isSold | boolean | Sold status. |
isLive | boolean | Live status. |
isPending | boolean | Pending status. |
scrapedAt | string | Timestamp for the saved record. |
Illustrative JSON record
{"recordType": "listing","source": "provider","searchQuery": "bike","title": "Used mountain bike","listingId": "1880804689276480","listingUrl": "https://www.facebook.com/marketplace/item/1880804689276480/","price": {},"location": {},"isSold": false,"scrapedAt": "2026-06-11T00:00:00.000Z"}
How it works
This Actor uses provider-backed Marketplace access. The manifest indicates configured provider APIs are used in provider mode, with the routing options listed in the input schema available as owner secrets. The live contract also shows:
autoresolves to provider mode because Facebook Marketplace is login-heavy.providerOrdercontrols which managed provider API is tried first.includeItemDetailsadds a per-listing item detail request.startCursoraccepts the pagination cursor fromRUN_SUMMARY.nextCursors.- Dataset rows and execution telemetry are saved separately, with
RUN_SUMMARYandOUTPUTin the default key-value store.
Pricing
Facebook Marketplace Scraper uses Pay per event with Apify platform usage included. Charged events include marketplace listing rows, item detail rows, location lookup rows, and the actor start event. Each event type is billed separately, and Apify platform usage is included. For current rates and the exact pricing mix, open the live Pricing tab in the Apify Console.
For example, if a run saves twenty-five listing rows and five item detail rows, the total charge is based on those event counts with Apify platform usage included for the run.
Use with AI agents (MCP)
This Actor is usable through Apify MCP as a structured Marketplace data source. It returns dataset rows that an agent can read, summarize, filter, or pass into follow-up actions. The Actor identity for tool routing is khadinakbar/facebook-marketplace-scraper.
A practical MCP prompt might look like this:
Search Facebook Marketplace for office chairs around Austin, TX, return the listings with price, location, and sold status, then read the dataset rows and summarize which ones are available.
Output interpretation for agents:
- Use
recordTypeto separate location lookups from listings and item details. - Use
listingIdandlistingUrlas stable record references. - Use
isSold,isLive, andisPendingto infer current item state from the saved row. - Use
RUN_SUMMARYfor counts, provider status codes, cursors, and stop reason. - Use
OUTPUTfor a compact run summary.
Provenance and scope guidance:
- Rows come from configured provider APIs, as reflected in the live contract.
- Pagination can continue with
startCursorwhen the run summary provides a next cursor. - Cost grows with saved events and with item detail enrichment, so agents should request item details only when they need the fuller record.
Apify API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const run = await client.actor('khadinakbar/facebook-marketplace-scraper').call({searchQueries: ['bike'],locationQuery: 'Austin, TX',radiusKm: 40,maxListings: 10,includeItemDetails: false,});const dataset = client.dataset(run.defaultDatasetId);const { items } = await dataset.listItems({ clean: true });console.log(items);
Best results and outcome guidance
Start with one search query and one location so the returned rows stay easy to review. Use locationQuery for city-based workflows, or latitude and longitude when your system already has coordinates. Keep maxListings, maxPages, and countPerPage aligned with the amount of data you need. Turn on includeItemDetails when your workflow needs the expanded item record fields such as description, photos, seller data, and status. Use startCursor for a continuation run when you want to resume from the next provider page.
Continue the workflow
- Then use Facebook Page Scraper to extend Facebook Marketplace Scraper research with a complementary content contract.
- Then use Facebook Post Search Scraper to extend Facebook Marketplace Scraper research with a complementary discovery contract.
Design note
I found that the dataset contract uses recordType as the main discriminator, and the required fields are only recordType, source, and scrapedAt. That makes the output flexible while still giving every row a consistent provenance timestamp.
FAQ
When should I use search queries versus item URLs?
Use searchQueries when you want Marketplace results for a topic and location. Use itemUrls or itemIds when your workflow already has a specific listing and needs a detailed row.
How does location handling work?
You can provide a locationQuery such as a city name, or set latitude and longitude directly. The live contract also allows saving the location lookup row with includeLocationResults.
What happens if I need more results from the same search?
Use startCursor with the next cursor from RUN_SUMMARY.nextCursors to continue pagination from a later point in the provider results.
How do I connect this Actor to an AI workflow?
Use the Actor through Apify MCP, read the dataset rows, and combine them with RUN_SUMMARY or OUTPUT for agent logic. The structured fields support downstream filtering, ranking, and record matching.
How can I reduce output volume?
Lower maxListings, reduce maxPages, or keep includeItemDetails off unless the workflow specifically needs item-level fields.
Responsible use
Use this Actor in ways that respect applicable platform terms, privacy expectations, and your own data-handling policies. Treat seller and listing data as sourced records, preserve provenance through source and scrapedAt, and request only the fields your workflow needs.