# Facebook Marketplace Scraper (`scraptivo/facebook-marketplace`) Actor

Collects Facebook Marketplace listings from search URLs, locations, categories, and keyword queries. Returns titles, prices, locations, photos, and optional listing details.

- **URL**: https://apify.com/scraptivo/facebook-marketplace.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**Facebook Marketplace Scraper** collects Marketplace listings from Facebook and turns them into structured data for price research, resale sourcing, and inventory monitoring. Provide a city, keyword, category, or Marketplace URL, run the Actor, and export titles, prices, locations, photos, and listing IDs to JSON, CSV, Excel, or your preferred integration. Use it to compare local asking prices, watch new supply, and automate recurring Marketplace collection. Pricing starts at **$2.00 per 1,000 listings**, with optional listing details at **$2.00 per 1,000**.

### What can you automate with Facebook Marketplace Scraper?

- **Build local buying lists** — Search a city and keyword such as "bike" or "iPhone 15" and export matching listings with price, location, and Marketplace URL.
- **Monitor new supply** — Schedule a run for the last 24 hours or last 7 days and catch fresh listings as they appear.
- **Filter before you export** — Narrow results by category, min/max price, condition, delivery method, listing age, and sort order.
- **Reuse Marketplace URLs** — Paste a search, category, or item URL and keep the location and filters already encoded in the link.
- **Enrich selected listings** — Turn on listing details to add descriptions, photo galleries, coordinates, condition, and shipping text.
- **Feed a sourcing workflow** — Push structured records into Google Sheets, a CRM, or your own pipeline after each run.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Resale and sourcing buyers | Building daily purchase lists from local pickup and shipping listings. |
| Market researchers | Comparing asking prices for the same product across a city or radius. |
| Inventory operators | Watching keywords and categories for new Marketplace supply. |
| Agencies | Collecting structured listing data for client reports without opening Facebook by hand. |

### What data can you collect from Facebook Marketplace?

| Data group | Example fields | How it helps |
|---|---|---|
| Listing identity | `listingId`, title, Marketplace URL, share URI | Deduplicate and reopen the exact item. |
| Price | Formatted price, `priceAmount`, currency | Compare asking prices across a search. |
| Location | Location text, city, state, optional latitude/longitude | Map inventory and plan pickup routes. |
| Media | Primary image, photo gallery | Review the item without opening Marketplace. |
| Status and delivery | Sold, pending, live, partner, local, shipped flags; delivery types | Skip sold items and filter pickup vs shipping. |
| Seller and details | Seller name/ID, description, condition, shipping cost text | Appear when listing details are enabled. |

Description, photo galleries, coordinates, condition, seller fields, and shipping text appear when **Scrape listing details** is enabled. Search-card fields such as title, price, location, image, category, and `listingId` are returned on every listing.

### How to use Facebook Marketplace Scraper

1. Open the [Facebook Marketplace Scraper](https://apify.com/scraptivo/facebook-marketplace) on Apify.
2. Enter a city such as `Berlin, Germany`, a keyword, a category, or paste Marketplace search/category/item URLs.
3. Choose a limit and optional filters — price range, condition, delivery method, listing age, sort order, or listing details.
4. Run the Actor and wait for structured listings to appear in the dataset.
5. Export JSON, CSV, or Excel, or connect the dataset to your workflow.

```json
{
    "location": "Berlin, Germany",
    "searchQueries": ["bike"],
    "categories": ["sports"],
    "maxItems": 8,
    "scrapeListingDetails": false,
    "maxConcurrency": 3,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

### Example workflow

#### Watch Berlin sporting-goods bikes every morning

1. Schedule a daily run with `location` = "Berlin, Germany", `searchQueries` = `["bike"]`, `categories` = `["sports"]`, and `daysSinceListed` = `"1"`.
2. Keep `scrapeListingDetails` off for a cheap card-level snapshot, then turn it on only for listings you want to inspect.
3. Send new records to Google Sheets or Slack through a webhook after each run.
4. Deduplicate user-side against the stable `listingId` field.

### Automate and integrate your results

- **Schedules** — Marketplace inventory turns over quickly. Run **daily** for sourcing and **hourly** only when you need the newest listings in a tight keyword. Create separate scheduled tasks per city and query.
- **Webhooks** — Fire a webhook on run completion to push fresh listings into Sheets, a CRM, or Slack.
- **Exports and API** — Download JSON, CSV, Excel, or HTML from the Apify Console, or start a run from the API:

```shell
curl "https://api.apify.com/v2/acts/scraptivo~facebook-marketplace/runs?token=YOUR-APIFY-TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "location": "Berlin, Germany",
    "searchQueries": ["bike"],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
  }'
```

- **Deduplication** — The Actor appends results on every run and does not deduplicate across runs. Use `listingId` as the stable key when merging datasets.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---|---:|---|---|
| `startUrls` | Array of URLs | No | — | Marketplace search, category, or item URLs. Filters encoded in the URL are applied. |
| `searchQueries` | Array of strings | No | — | Keyword searches such as "mountain bike". Requires a location (field or URL). |
| `location` | String | Conditional | — | City or place (e.g. "Berlin, Germany"). Required for search/category scrapes without a city in the URL. |
| `latitude` | Number | No | — | Optional coordinate override. When set with `longitude`, location text is not resolved. |
| `longitude` | Number | No | — | Optional coordinate override. When set with `latitude`, location text is not resolved. |
| `radiusKm` | Integer | No | `80` | Search radius in kilometers (1–500). |
| `categories` | Array of strings | No | — | Marketplace category slugs. Leave empty for all listings near the location (or the category from start URLs). |
| `minPrice` | Integer | No | — | Minimum listing price in the local currency. |
| `maxPrice` | Integer | No | — | Maximum listing price in the local currency. |
| `condition` | String | No | `any` | `any`, `new`, `used_like_new`, `used_good`, or `used_fair`. |
| `deliveryMethod` | String | No | `all` | `all`, `local_pickup`, or `shipping`. |
| `daysSinceListed` | String | No | `""` | `""` (any time), `"1"` (24 hours), `"7"`, or `"30"`. |
| `sortBy` | String | No | `best_match` | `best_match`, `newest`, `price_asc`, `price_desc`, or `distance`. |
| `scrapeListingDetails` | Boolean | No | `false` | Visit each listing for description, photos, seller, and extra attributes. Charges `listing-details`. |
| `maxConcurrency` | Integer | No | `5` | Parallel detail requests (1–20). |
| `maxItems` | Integer | No | `0` | Maximum listings to collect (`0` = unlimited). |
| `proxyConfiguration` | Proxy object | No | Apify proxy, RESIDENTIAL | Residential proxies are required. |

**Category slugs:** `vehicles`, `propertyrentals`, `propertyforsale`, `apparel`, `classifieds`, `electronics`, `entertainment`, `family`, `free`, `garden`, `hobbies`, `home`, `home-improvements`, `instruments`, `office-supplies`, `pets`, `sports`, `toys`.

#### Do I need a location if I paste Marketplace URLs?

No. A start URL such as `https://www.facebook.com/marketplace/berlin/sports` already carries location and category. Provide `location` when you use `searchQueries` or `categories` without a city in the URL.

### Output example

Each dataset item is one listing. A search-card record looks like this:

```json
{
    "listingId": "958550220194623",
    "url": "https://www.facebook.com/marketplace/item/958550220194623/",
    "title": "Ebike Akku",
    "price": "€180",
    "priceAmount": 180.0,
    "currency": "€",
    "imageUrl": "https://example.com/listing.jpg",
    "location": "Berlin, BE",
    "city": "Berlin",
    "state": "BE",
    "category": "Sporting goods",
    "categoryId": "1383948661922113",
    "deliveryTypes": ["IN_PERSON", "SHIPPING_OFFSITE"],
    "isSold": false,
    "isPending": false,
    "isLive": true,
    "creationTime": "2026-03-23T16:56:03+00:00",
    "sellerName": null,
    "description": null,
    "detailsScraped": false,
    "source": "search / bike / sports / Berlin, Germany",
    "sourceQuery": "bike"
}
```

### How much does it cost to scrape Facebook Marketplace?

The Actor uses pay-per-event pricing plus a small Actor-start event ($0.00005 per start, scaled by memory):

- **$2.00 / 1,000 listings** — a `listing` event for every listing saved to the dataset.
- **$2.00 / 1,000 listing details** — a `listing-details` event only when **Scrape listing details** is enabled and details are collected.

A search-only run of 1,000 listings costs **$2.00**. Enriching the same 1,000 listings with details costs **$4.00**. Volume discounts on Apify paid plans reduce the per-1,000 rate (for example **$1.70 per 1,000** at the Gold plan). Compute units consumed are deducted from your Apify plan.

### Reliability and responsible use

- **Proxy requirement** — Residential proxies are required. The default input uses the Apify RESIDENTIAL group.
- **Conditional fields** — Description, photos, seller, condition, coordinates, and shipping text appear only when listing details are enabled. Marketplace also leaves some guest-visible fields empty.
- **Public listings** — The Actor collects publicly visible Marketplace listing data.
- **Responsible use** — Only use the data in ways that comply with Facebook's terms and applicable law.

### Frequently asked questions

#### Can I scrape Facebook Marketplace by city and keyword?

Yes. Set `location` to a city such as "Austin, TX" and add `searchQueries` such as `["iPhone 15"]`. You can also restrict the run with `categories`, price range, condition, and delivery method.

#### Can I schedule Facebook Marketplace Scraper to run automatically?

Yes. Open the **Scheduler** tab in Apify Console and set a recurring schedule. Daily suits sourcing; use `daysSinceListed` = `"1"` if you only want listings from the last 24 hours.

#### What counts as one result?

Each listing saved to the dataset is one `listing` event ($2.00 per 1,000). If listing details are enabled, each enriched listing also counts as a `listing-details` event at the same rate.

#### Why are some fields empty?

Seller name, description, condition, coordinates, and extra photos are collected only when **Scrape listing details** is enabled. Marketplace also omits some fields on guest-visible cards, so a null value usually means the platform did not show that data.

#### How do I avoid duplicate records?

The Actor does not deduplicate across runs. Use `listingId` as the stable key when merging a fresh dataset into existing data. `maxItems` caps the size of a single run.

#### Do I need a proxy?

Yes. The Actor expects residential proxies. The default configuration uses Apify residential proxies.

### Related Scraptivo automations

- [Kleinanzeigen Scraper](https://apify.com/scraptivo/kleinanzeigen-scraper) — classified listings from Kleinanzeigen.
- [Gumtree Scraper](https://apify.com/scraptivo/gumtree-scraper) — classified listings from Gumtree.
- [Cars.com Scraper](https://apify.com/scraptivo/cars-scraper) — vehicle listings for automotive inventory research.
- [Etsy Scraper](https://apify.com/scraptivo/etsy-scraper) — product listings from Etsy shops and search.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, sample URL, required fields, and expected volume so we can assess the request.

# Actor input Schema

## `startUrls` (type: `array`):

Marketplace search, category, or item URLs (e.g. "https://www.facebook.com/marketplace/berlin/sports", "https://www.facebook.com/marketplace/item/123"). Filters encoded in the URL (location, category, minPrice, maxPrice) are applied. You can use this instead of, or together with, the location and category fields.

## `searchQueries` (type: `array`):

Keyword searches (e.g. "mountain bike", "puppies", "iPhone 15"). Requires a location (field below or a location in start URLs).

## `location` (type: `string`):

City or place to search (e.g. "Berlin, Germany", "Austin, TX"). Resolved to coordinates automatically. Required when using search queries or categories without start URLs.

## `latitude` (type: `number`):

Optional coordinate override. When set with longitude, location text is not resolved.

## `longitude` (type: `number`):

Optional coordinate override. When set with latitude, location text is not resolved.

## `radiusKm` (type: `integer`):

Distance around the location in kilometers.

## `categories` (type: `array`):

Marketplace categories to scrape. Leave empty to scrape all listings near the location (or the category from start URLs).

## `minPrice` (type: `integer`):

Minimum listing price in the local currency. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Maximum listing price in the local currency. Leave empty for no maximum.

## `condition` (type: `string`):

Item condition filter.

## `deliveryMethod` (type: `string`):

How the buyer can receive the item.

## `daysSinceListed` (type: `string`):

Only include listings created in the last N days. Leave empty for any age.

## `sortBy` (type: `string`):

Result order.

## `scrapeListingDetails` (type: `boolean`):

Visit each listing to extract description, photos, seller, and extra attributes. Charges a second pay-per-event (listing-details) when enabled. Detail requests run in parallel and rotate the proxy.

## `maxConcurrency` (type: `integer`):

How many listing-detail requests to run at once (each uses a rotated proxy).

## `maxItems` (type: `integer`):

Maximum number of listings to scrape (0 = unlimited).

## `proxyConfiguration` (type: `object`):

Residential proxies are required. The Actor opens Marketplace as a guest (no Facebook login).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/marketplace/berlin/sports"
    }
  ],
  "searchQueries": [],
  "location": "Berlin, Germany",
  "radiusKm": 80,
  "condition": "any",
  "deliveryMethod": "all",
  "daysSinceListed": "",
  "sortBy": "best_match",
  "scrapeListingDetails": false,
  "maxConcurrency": 5,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

JSON array of scraped Marketplace listings

## `runStats` (type: `string`):

Record count and run timestamps

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.facebook.com/marketplace/berlin/sports"
        }
    ],
    "searchQueries": [],
    "location": "Berlin, Germany",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/facebook-marketplace").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.facebook.com/marketplace/berlin/sports" }],
    "searchQueries": [],
    "location": "Berlin, Germany",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/facebook-marketplace").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.facebook.com/marketplace/berlin/sports"
    }
  ],
  "searchQueries": [],
  "location": "Berlin, Germany",
  "maxItems": 10
}' |
apify call scraptivo/facebook-marketplace --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scraptivo/facebook-marketplace"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/V7rMTv1ZbOtevBMze/builds/d9drybECQzTnJsLIr/openapi.json
