# 🛒 Facebook Marketplace Scraper - Prices & Contacts (`apivault_labs/facebook-marketplace-scraper`) Actor

Scrape Facebook Marketplace without login - title, price, location, photos, seller, condition, status, shipping & vehicle specs, plus the seller's email & phone for leads. Search by keyword, category or URL. Dedup, filters, real-time webhook. From $2.5/1K.

- **URL**: https://apify.com/apivault\_labs/facebook-marketplace-scraper.md
- **Developed by:** [Apivault Labs](https://apify.com/apivault_labs) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 listings

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 — Listings, Prices, Sellers & Contacts (No Login)

![Facebook Marketplace Scraper — listings, prices, sellers & contacts](https://api.apify.com/v2/key-value-stores/E76hLVOROveornuAY/records/facebook-marketplace-hero.jpg)

**The Facebook Marketplace scraper that also gives you the seller's email and phone.** Point it at any keyword, category or listing URL and get one clean row per item — **title, price, location (city/GPS), photos, seller, condition, listing status, shipping and vehicle specs** — plus the one field almost no competitor extracts: **seller contact details** for lead generation.

> 💸 **From $2.5 per 1,000 listings — pay only for what you scrape.** No login, no cookies, no API key, no subscription. Tiered pricing: the more you scrape, the cheaper it gets.

Searching for a **Facebook Marketplace scraper**, a **Marketplace lead generation tool**, a **car/vehicle listings scraper**, a **price-monitoring** or **dropshipping product research** tool — without logging in? This is the most contact-focused option on Apify.

---

### ⭐ Why this scraper wins

Most "Facebook Marketplace scrapers" dump the same listing fields. This one adds what buyers, resellers and lead-gen teams actually need:

- 📞 **Seller contacts (email + phone)** — scans each listing's title and description for the contact details sellers paste to skip Facebook messaging. **Turns a product feed into a ready lead list.** *Rare on the market.*
- 🌍 **Geo-targeting** — search by city/location slug (`nyc`, `la`, `london`) with city, state and GPS coordinates on each listing.
- 🔎 **Three input modes** — keyword **search**, **category** browse, or direct **listing/search/category URLs** (incl. bare numeric item IDs).
- 🎯 **Predictable billing** — `maxItems` hard-caps the run. You're billed per listing returned, never per page.
- 🧹 **Deduplication** — one row per listing id across every search term and category, no repeats.
- 🔁 **Retry control** — `maxRetries` rotates a fresh proxy IP with exponential backoff on a login wall or empty page.
- 🔔 **Incremental monitoring** — `onlyNew` emits only listings unseen since your last run; `notifyWebhookUrl` pushes each new one to **Zapier / Make / n8n / Slack / Discord** in real time. Turn a one-off scrape into a live deal-alert feed.
- 🚗 **Vehicle specifics** — mileage and registration year for car/truck listings.
- ⭐ **Seller rating** — average star rating and review count when exposed.
- 📈 **Coverage expansion** — `expandCoverage` re-queries each term across multiple sort orders and dedups, surfacing **2–6× more unique listings** per run.

---

### 🚀 Input modes

**Search by keyword**
```json
{ "mode": "search", "searchTerms": ["iphone 15", "mountain bike"], "location": "nyc", "maxItems": 100 }
````

**Browse a category**

```json
{ "mode": "category", "categories": ["vehicles", "electronics"], "location": "la", "maxItems": 200 }
```

**Direct URLs / item IDs**

```json
{ "mode": "urls", "listingUrls": ["https://www.facebook.com/marketplace/item/123456789012345", "123456789012345"] }
```

***

### 📦 Sample output (one row per listing)

```json
{
  "listingId": "123456789012345",
  "title": "iPhone 15 Pro 256GB — like new",
  "price": 720.0,
  "priceFormatted": "$720",
  "currency": "USD",
  "location": "Brooklyn, NY",
  "city": "Brooklyn", "state": "NY",
  "condition": "Used - Like New",
  "status": "available",
  "sellerName": "John D.",
  "sellerRating": 4.8,
  "primaryPhone": "(347) 555-0199",
  "primaryEmail": "john.d@example.com",
  "hasContact": true,
  "images": ["https://scontent.../photo.jpg"],
  "deliveryTypes": ["SHIPPING", "IN_PERSON"],
  "shippingOffered": true,
  "url": "https://www.facebook.com/marketplace/item/123456789012345"
}
```

***

### 🆚 How it compares

| | **This Actor** | Typical Marketplace scrapers |
|---|:---:|:---:|
| Works without login / cookies | ✅ | varies |
| **Seller email & phone** | ✅ unique | ❌ |
| Keyword + category + URL modes | ✅ | partial |
| Geo-targeting + GPS coordinates | ✅ | ✅ |
| Vehicle specs (mileage / year) | ✅ | partial |
| Deduplication | ✅ | partial |
| Incremental "only new" + webhook | ✅ | ❌ |
| Retry control | ✅ | ❌ |
| Pricing | **from $2.5 / 1K** | $4.5–5 / 1K |

***

### 💼 Use cases

- **🥇 Lead generation** — pull listings in your niche + location and harvest seller **email/phone** into a CRM-ready list. Filter `hasContact: true`.
- **🚗 Vehicle & dealer leads** — scrape `vehicles` with mileage/year, contact private sellers before dealers do.
- **📉 Price monitoring & arbitrage** — track a keyword on a schedule with `onlyNew` + webhook, get alerted the moment a deal is posted.
- **🛒 Dropshipping / reseller research** — see what's selling locally, at what price, with what photos.
- **🏠 Rentals & real estate** — `propertyrentals` category with location and price filters.

***

### 🤖 Copy to your AI assistant

```
Use the Apify Actor apivault_labs/facebook-marketplace-scraper.
Call it with run_input = {
  "mode": "search",
  "searchTerms": ["mountain bike"],
  "location": "nyc",
  "maxItems": 100,
  "enrichContacts": true
}
then read dataset items — one row per listing with title, price, location,
seller, contacts, photos and status. Get a token at
https://console.apify.com/account/integrations
```

***

### ⚙️ Input reference

| Field | Description |
|---|---|
| `mode` | `search`, `category` or `urls` |
| `searchTerms` | Keywords (search mode) |
| `categories` | Category slugs: `vehicles`, `electronics`, `propertyrentals`… |
| `location` | Marketplace location slug (`nyc`, `la`, `london`) |
| `listingUrls` | Item/search/category URLs or bare numeric item IDs |
| `maxItems` | Hard cap on listings saved (1–2000) |
| `enrichContacts` | Extract seller email/phone (default true) |
| `enrichDetails` | Fetch each result's detail page for full description, seller, GPS, contacts |
| `expandCoverage` | Re-query across sort orders for 2–6× more unique listings |
| `onlyNew` | Emit only listings not seen in previous runs (incremental) |
| `notifyWebhookUrl` | POST each new listing as JSON in real time |
| `minPrice` / `maxPrice` | Price filter (search mode) |
| `daysSinceListed` | Freshness filter in days (search mode) |
| `sortBy` | Result ordering (newest, price, distance…) |
| `maxRetries` | Retries on login wall / empty page (0–8) |
| `maxConcurrency` | Parallel requests (1–10) |
| `useResidentialProxy` / `proxyCountry` | Residential proxy and its country |

***

### ❓ FAQ

**Do I need to log in or provide cookies?** No. It reads Facebook's public, logged-out server-rendered data.

**Will I always get the seller's email/phone?** Only when the seller put it in the listing title or description. Many do (to skip FB messaging). Enable `enrichDetails` or pass item URLs to scan the full listing page where contacts and full descriptions live.

**How many listings per search?** Logged-out Facebook exposes a window of recent listings per query. `expandCoverage` multiplies that by querying several sort orders and deduping.

**Is it real-time?** Yes — direct fetch, no cache. Pair `onlyNew` + `notifyWebhookUrl` for live deal alerts.

**What about pricing?** Tiered pay-per-result, from **$5/1K (free plan) down to $2.5/1K** on higher plans. You only pay for listings actually returned.

***

### ⚠️ Note on coverage

Search/category results come from Facebook's logged-out server-rendered data (title, price, location, image, delivery, status). **Full description, seller details and contacts are exposed on the listing's own page** — enable `enrichDetails` or pass listing URLs to pull them. The Actor warms up an anonymous session cookie and retries to maximise success. Failed/blocked URLs are reported separately and not charged.

***

### 💲 Pricing

Tiered pay-per-result: **from $2.5 to $5 per 1,000 listings**, depending on your Apify plan (higher plans = lower rate). You pay only for listings actually returned. No subscription, no API key.

### 🔗 Related Actors

- **[Facebook Page Scraper](https://apify.com/apivault_labs/facebook-profile-scraper)** — public pages/profiles: emails, phone, contacts, posts.
- **[Shopify Store Analyzer](https://apify.com/apivault_labs/shopify-store-analyzer)** — revenue, traffic, tech stack, contacts.

### 📞 Support

Feature requests or custom fields? Reach out via Apify messaging or open an issue on this Actor's page.

# Actor input Schema

## `mode` (type: `string`):

How to find listings: 'search' (keyword + location), 'category' (category + location), or 'urls' (direct listing/search URLs). If you fill several inputs, all are used.

## `searchTerms` (type: `array`):

Keywords to search, e.g. \["iphone 15", "mountain bike"]. Used in 'search' mode.

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

Facebook Marketplace location slug, e.g. 'nyc', 'la', 'london'. Used by search and category modes. Leave empty for the generic search route.

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

Marketplace category slugs to browse, e.g. \["vehicles", "electronics", "propertyrentals"]. Used in 'category' mode.

## `listingUrls` (type: `array`):

Direct Marketplace URLs: item pages (/marketplace/item/<id>), search or category URLs, or bare numeric item IDs. Used in 'urls' mode.

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

Hard cap on listings saved across the whole run (you are billed per listing). 1-2000.

## `enrichContacts` (type: `boolean`):

Scan listing title + description for seller email and phone — many sellers paste them to bypass Facebook messaging. Turns this into a lead list.

## `enrichDetails` (type: `boolean`):

For search/category results, also fetch each listing's own page to fill in full description, seller, coordinates and contacts the search card omitted. Doubles requests per listing — opt-in.

## `expandCoverage` (type: `boolean`):

When maxItems is above ~24, re-query each search term across several sort orders (newest, price asc/desc, distance) and dedup, surfacing far more unique listings. Costs more requests. Ignored for category/URL modes.

## `onlyNew` (type: `boolean`):

Remember listing IDs across runs and emit only items not seen before. Ideal for scheduled monitoring — the first run records a baseline.

## `notifyWebhookUrl` (type: `string`):

Optional. Each new listing is POSTed as JSON to this URL the moment it's found (Zapier/Make/Discord/Slack/n8n). Combine with onlyNew for live alerts.

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

Optional minimum price filter (search mode).

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

Optional maximum price filter (search mode).

## `daysSinceListed` (type: `integer`):

Optional freshness filter — only listings posted within the last N days (search mode). 1, 7 or 30 are typical.

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

Optional result ordering (search mode).

## `maxRetries` (type: `integer`):

How many times to retry a URL that returns a login wall or empty page (each retry rotates the mobile variant and a fresh proxy IP). 0-8.

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

Parallel requests. Higher is faster but more likely to trip Facebook rate limits — 3-5 recommended.

## `timeout` (type: `integer`):

Maximum time to wait for each Facebook request. Pages with lots of media can be slower.

## `useResidentialProxy` (type: `boolean`):

Strongly recommended — Facebook blocks most datacenter IPs for Marketplace. Disable only when running locally.

## `proxyCountry` (type: `string`):

ISO 2-letter country code for the residential proxy (US, GB, DE...). Match it to your target location. Empty = automatic.

## `debug` (type: `boolean`):

Diagnostic: when a search/category page yields no listings, emit a probe record with HTML markers instead of staying silent.

## Actor input object example

```json
{
  "mode": "search",
  "searchTerms": [
    "iphone 15"
  ],
  "location": "nyc",
  "maxItems": 100,
  "enrichContacts": true,
  "enrichDetails": false,
  "expandCoverage": true,
  "onlyNew": false,
  "sortBy": "best_match",
  "maxRetries": 3,
  "maxConcurrency": 3,
  "timeout": 45,
  "useResidentialProxy": true,
  "proxyCountry": "US",
  "debug": false
}
```

# 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 = {
    "searchTerms": [
        "iphone 15"
    ],
    "location": "nyc"
};

// Run the Actor and wait for it to finish
const run = await client.actor("apivault_labs/facebook-marketplace-scraper").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 = {
    "searchTerms": ["iphone 15"],
    "location": "nyc",
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "iphone 15"
  ],
  "location": "nyc"
}' |
apify call apivault_labs/facebook-marketplace-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=apivault_labs/facebook-marketplace-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "🛒 Facebook Marketplace Scraper - Prices & Contacts",
        "description": "Scrape Facebook Marketplace without login - title, price, location, photos, seller, condition, status, shipping & vehicle specs, plus the seller's email & phone for leads. Search by keyword, category or URL. Dedup, filters, real-time webhook. From $2.5/1K.",
        "version": "3.3",
        "x-build-id": "FCVbL5SFqWM8YlNet"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/apivault_labs~facebook-marketplace-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-apivault_labs-facebook-marketplace-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/apivault_labs~facebook-marketplace-scraper/runs": {
            "post": {
                "operationId": "runs-sync-apivault_labs-facebook-marketplace-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/apivault_labs~facebook-marketplace-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-apivault_labs-facebook-marketplace-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "category",
                            "urls"
                        ],
                        "type": "string",
                        "description": "How to find listings: 'search' (keyword + location), 'category' (category + location), or 'urls' (direct listing/search URLs). If you fill several inputs, all are used.",
                        "default": "search"
                    },
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Keywords to search, e.g. [\"iphone 15\", \"mountain bike\"]. Used in 'search' mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Facebook Marketplace location slug, e.g. 'nyc', 'la', 'london'. Used by search and category modes. Leave empty for the generic search route."
                    },
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "Marketplace category slugs to browse, e.g. [\"vehicles\", \"electronics\", \"propertyrentals\"]. Used in 'category' mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listingUrls": {
                        "title": "Listing / search URLs",
                        "type": "array",
                        "description": "Direct Marketplace URLs: item pages (/marketplace/item/<id>), search or category URLs, or bare numeric item IDs. Used in 'urls' mode.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Hard cap on listings saved across the whole run (you are billed per listing). 1-2000.",
                        "default": 100
                    },
                    "enrichContacts": {
                        "title": "Extract seller contacts (email / phone)",
                        "type": "boolean",
                        "description": "Scan listing title + description for seller email and phone — many sellers paste them to bypass Facebook messaging. Turns this into a lead list.",
                        "default": true
                    },
                    "enrichDetails": {
                        "title": "Enrich from each listing's detail page",
                        "type": "boolean",
                        "description": "For search/category results, also fetch each listing's own page to fill in full description, seller, coordinates and contacts the search card omitted. Doubles requests per listing — opt-in.",
                        "default": false
                    },
                    "expandCoverage": {
                        "title": "Expand coverage (more results per term)",
                        "type": "boolean",
                        "description": "When maxItems is above ~24, re-query each search term across several sort orders (newest, price asc/desc, distance) and dedup, surfacing far more unique listings. Costs more requests. Ignored for category/URL modes.",
                        "default": true
                    },
                    "onlyNew": {
                        "title": "Only new listings (incremental)",
                        "type": "boolean",
                        "description": "Remember listing IDs across runs and emit only items not seen before. Ideal for scheduled monitoring — the first run records a baseline.",
                        "default": false
                    },
                    "notifyWebhookUrl": {
                        "title": "Real-time webhook URL",
                        "type": "string",
                        "description": "Optional. Each new listing is POSTed as JSON to this URL the moment it's found (Zapier/Make/Discord/Slack/n8n). Combine with onlyNew for live alerts."
                    },
                    "minPrice": {
                        "title": "Min price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional minimum price filter (search mode)."
                    },
                    "maxPrice": {
                        "title": "Max price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Optional maximum price filter (search mode)."
                    },
                    "daysSinceListed": {
                        "title": "Days since listed",
                        "minimum": 1,
                        "maximum": 90,
                        "type": "integer",
                        "description": "Optional freshness filter — only listings posted within the last N days (search mode). 1, 7 or 30 are typical."
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "best_match",
                            "creation_time_descend",
                            "price_ascend",
                            "price_descend",
                            "distance_ascend"
                        ],
                        "type": "string",
                        "description": "Optional result ordering (search mode).",
                        "default": "best_match"
                    },
                    "maxRetries": {
                        "title": "Max retries per URL",
                        "minimum": 0,
                        "maximum": 8,
                        "type": "integer",
                        "description": "How many times to retry a URL that returns a login wall or empty page (each retry rotates the mobile variant and a fresh proxy IP). 0-8.",
                        "default": 3
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Parallel requests. Higher is faster but more likely to trip Facebook rate limits — 3-5 recommended.",
                        "default": 3
                    },
                    "timeout": {
                        "title": "Timeout per request (seconds)",
                        "minimum": 15,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Maximum time to wait for each Facebook request. Pages with lots of media can be slower.",
                        "default": 45
                    },
                    "useResidentialProxy": {
                        "title": "Use residential proxy (recommended)",
                        "type": "boolean",
                        "description": "Strongly recommended — Facebook blocks most datacenter IPs for Marketplace. Disable only when running locally.",
                        "default": true
                    },
                    "proxyCountry": {
                        "title": "Proxy country code",
                        "type": "string",
                        "description": "ISO 2-letter country code for the residential proxy (US, GB, DE...). Match it to your target location. Empty = automatic.",
                        "default": "US"
                    },
                    "debug": {
                        "title": "Debug probe",
                        "type": "boolean",
                        "description": "Diagnostic: when a search/category page yields no listings, emit a probe record with HTML markers instead of staying silent.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
