# Facebook Marketplace Deal Radar — Under-$X Deals (`intelscrape/facebook-marketplace-deal-radar`) Actor

Facebook Marketplace under-$X deal radar: maxPrice/minPrice packs, dealScore, multi-city alerts. Pay per listing. Lawful use only.

- **URL**: https://apify.com/intelscrape/facebook-marketplace-deal-radar.md
- **Developed by:** [IntelScrape](https://apify.com/intelscrape) (community)
- **Categories:** Social media, E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Deal Radar

**Find flip-worthy Facebook Marketplace deals before everyone else** — multi-city USA fanout + smart query expansion.

Built for resellers, phone flippers, and local arbitrage operators who need **new listings + a deal score**, not another raw scrape dump.

[![Apify](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/intelscrape/facebook-marketplace-deal-radar)

### Filters (curious\_coder / memo23 parity)

- **condition** — new / used\_like\_new / used\_good / used\_fair
- **sortBy** — newest, price, or distance on search URLs
- **deliveryMethod** — local\_pickup or shipping
- **onlyWithPhotos** — skip text-only cards
- **allPhotos** — emit `photos[]` (full gallery when available; else primary `imageUrl`)
- **categories\[]** — Marketplace category fanout (vehicles, electronics, home, …); merged + deduped
- **latitude / longitude** — optional precise pin with `radiusKm` on search URLs
- **onlyNewListings** — alias of `newOnly` (seen-ID KV)
- **proxyConfiguration** — optional Apify proxy (cookies still required for live)

### Why this Actor (not a generic Marketplace scraper)

| You get | Most scrapers |
| --- | --- |
| **Multi-city** `cities[]` / `locations[]` fanout | One city per run |
| **smartQuery** + `synonyms[]` query expansion | Type one FB search and hope |
| **dealScore 0–100** on every listing | Raw title/price only |
| **newOnly** across scheduled runs (KV seen-IDs) | Full re-dumps every time |
| **Discord + webhook** alerts for hot finds | Export CSV and hope |
| Vehicle fields parsed from titles | Manual regex later |
| Honest **demoMode** (no fake “success” without cookies) | Silent empty runs |

Live mode uses your Facebook session cookies. Anonymous Marketplace scraping does **not** work reliably — we fail clearly instead of billing empty air.

### Vehicles vertical (car / truck / SUV flippers)

Set `vertical` = `vehicles` to unlock flipper presets without changing the Greenville general schedule:

| Input | Effect |
| --- | --- |
| `vertical=vehicles` | Vehicle-tuned **dealScore** + prefer vehicle listings |
| `vehiclePresets` | `cars` / `trucks` / `suv` query expansion (defaults to all three) |
| `vehicleYearMin` / `vehicleYearMax` | Filter by year parsed from listing title/description |
| `vehicleMake` | Filter by make parsed from listing text (e.g. `Honda`) |

Example: `vertical=vehicles`, `cities=["austin","houston"]`, `vehiclePresets=["trucks","suv"]`, `vehicleYearMin=2015`.

PPE event names stay **`listing` / `listing-detail` / `actor-start`**. Store title stays **Facebook Marketplace Deal Radar**.

### Pricing (PPE)

You pay for value delivered:

| Event | What it is | Price |
| --- | --- | --- |
| `listing` | One Marketplace listing pushed | **$0.0012** (~**$1.20 / 1k**) |
| `listing-detail` | Optional detail-page enrichment | **$0.002** |
| `actor-start` | Run start | **$0.005** |

**demoMode is free of Actor charges** (sample data only).

Vs Store comps (Bronze, approx): official Apify ~$5/1k · curious\_coder ~$0.50–$1.50/1k · memo23 ~$1.50/1k · cheapest Discord scrapers ~$0.40/1k. Deal Radar sits in the **smart-middle**: cheaper than official, priced for deal intelligence (score + alerts), not race-to-bottom raw rows.

### Quick start

1. Open the Actor → **Try for free** / create a Task.
2. Set `searchQuery` (e.g. `iPhone`) and either:
   - **Multi-city:** `cities` = `["greenville","austin","houston"]`, or
   - **Single city:** `location` = `greenville` (Marketplace city slug).
3. Optional: turn on `smartQuery` and/or add `synonyms` for query expansion.
4. Paste `sessionCookies` (`c_user` + `xs` from a logged-in Chrome → Application → Cookies → `facebook.com`). Treat like a password.
5. Turn on `newOnly` + optional `discordWebhook`.
6. Schedule the Task (cloud) so deals keep flowing while your PC sleeps.

#### Input highlights

- `searchQuery` / `smartQuery` / `synonyms[]` / `startUrls`
- `location` (single) · `cities[]` / `locations[]` (multi-metro)
- `radiusKm` · `minPrice` / `maxPrice` · `daysSinceListed` · `maxResults`
- `includeDetails` · `newOnly` · `webhookUrl` · `discordWebhook`
- `vertical` · `vehiclePresets` · `vehicleYearMin`/`vehicleYearMax` · `vehicleMake`
- `demoMode` · `sessionCookies` · `storageStateJson`

### Output

Each dataset item includes title, price, location, **citySlug**, URL, image, recency signals, optional vehicle fields, **searchQuery**, and **`dealScore`**.

### Auth notes

- Cookies expire — when you hit a login wall, refresh `xs` in the Task input (Console only; never commit cookies).
- Prefer a dedicated FB account you control for scraping.

### Support

IntelScrape on Apify. Issues → Actor issues / Console support.

### License

Apache-2.0

# Actor input Schema

## `searchQuery` (type: `string`):

Marketplace search keywords (e.g. iPhone, sofa, Honda Civic).

## `smartQuery` (type: `boolean`):

When true, expand searchQuery with built-in synonyms (e.g. iPhone → iphone, iphone pro, apple iphone) and any synonyms\[]. Fanout across query variants × cities.

## `synonyms` (type: `array`):

Optional extra search variants (used when smartQuery is on, or always merged if provided). E.g. \["iphone 13", "iphone 14"].

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

Optional Marketplace search or listing URLs. If empty, built from searchQuery + location/cities.

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

Single Facebook Marketplace location slug (city). Used when cities\[]/locations\[] are empty. Kept for Greenville schedule / Task backward compatibility.

## `cities` (type: `array`):

Marketplace location slugs to fan out across (e.g. greenville, austin, houston, dallas). Prefer this for multi-city runs. Alias of locations\[].

## `locations` (type: `array`):

Optional alias for cities\[]. Same Marketplace location slugs.

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

Facebook Marketplace categories to search (memo23/blackfalcon parity). Each category is its own search; results merged+deduped. Leave empty for all. Allowed slugs: vehicles, propertyforsale, propertyrentals, apparel, electronics, entertainment, family, free, garden, hobbies, home, instruments, pets, sports, toys, classifieds.

## `vertical` (type: `string`):

Deal vertical preset. general = electronics/furniture/etc (default, Greenville schedule unchanged). vehicles = car/truck/SUV flipper mode with vehicle query presets + vehicle-tuned dealScore.

## `vehiclePresets` (type: `array`):

When vertical=vehicles (or set explicitly), expand searches for these presets: cars, trucks, suv. Empty + vertical=vehicles defaults to all three.

## `vehicleYearMin` (type: `integer`):

Optional. Keep listings whose parsed year (from title/description text) is >= this. 0 = no min. Requires scrapeable year in listing text.

## `vehicleYearMax` (type: `integer`):

Optional. Keep listings whose parsed year is <= this. 0 = no max.

## `vehicleMake` (type: `string`):

Optional. Keep listings whose parsed make (from title/description) contains this string (e.g. Honda, Toyota, Ford). Empty = no make filter.

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

Search radius in kilometers (best-effort; FB UI may use miles).

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

Optional precise pin latitude (memo23). Provide longitude too. Combined with radiusKm on search URLs.

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

Optional precise pin longitude (memo23). Provide latitude too. Combined with radiusKm on search URLs.

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

Filter out listings cheaper than this (0 = no min).

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

Filter out listings more expensive than this (0 = no max).

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

Only keep listings posted within this many days.

## `maxResults` (type: `integer`):

Maximum listings to push to the dataset (across all cities/queries).

## `includeDetails` (type: `boolean`):

Visit each listing page for description (slower; live mode only).

## `newOnly` (type: `boolean`):

Skip IDs already stored in KeyValueStore (deal-radar-seen-ids). Same as onlyNewListings.

## `webhookUrl` (type: `string`):

Optional HTTP POST of each new listing JSON.

## `discordWebhook` (type: `string`):

Optional Discord incoming webhook for new listing alerts.

## `demoMode` (type: `boolean`):

Load bundled demo listings (no cookies, no live scrape, no Actor.charge).

## `sessionCookies` (type: `string`):

REQUIRED for live mode. Paste Cookie header or c\_user=...; xs=... from a logged-in browser (Chrome DevTools → Application → Cookies → facebook.com). Anonymous scraping does not work. Not needed for demoMode.

## `storageStateJson` (type: `string`):

Optional alternative to sessionCookies: paste Playwright storageState JSON (cookies + origins) from a logged-in context.

## `condition` (type: `array`):

Item condition(s) to include (curious\_coder parity). Leave empty for any. Allowed values: new, used\_like\_new, used\_good, used\_fair.

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

Marketplace search sort (curious\_coder). Applies when building search URLs.

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

Filter by delivery (curious\_coder). Best-effort URL param.

## `onlyWithPhotos` (type: `boolean`):

Skip text-only listings without an image (memo23/curious\_coder media pattern).

## `allPhotos` (type: `boolean`):

When true, collect full photo URL arrays (photos\[]) from listing cards and detail pages when available. Always outputs photos\[] with at least the primary imageUrl when present.

## `onlyNewListings` (type: `boolean`):

Alias of New listings only — remembers scraped IDs across runs (curious\_coder onlyNewListings).

## `availability` (type: `string`):

Filter by stock status (curious\_coder / memo23). Applied as Marketplace URL param and post-filter on listing.availability / availabilityStatus / inStock. Empty = any.

## `untilDate` (type: `string`):

YYYY-MM-DD. Keep listings listed on or after this date (curious\_coder untilDate). Drops when listedAt < untilDate start-of-day UTC; when only daysSinceListed is present, approximates vs Date.now().

## `strictFiltering` (type: `boolean`):

When true, drop listings missing a location match against cities/locations OR missing required fields (title + price + url). Echoed on filtersApplied.

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

Optional Apify proxy settings. Live Marketplace still requires session cookies; proxy country can help match regional results.

## Actor input object example

```json
{
  "searchQuery": "iPhone",
  "smartQuery": false,
  "location": "austin",
  "cities": [
    "greenville",
    "austin"
  ],
  "categories": [],
  "vertical": "general",
  "vehiclePresets": [
    "cars",
    "trucks",
    "suv"
  ],
  "vehicleYearMin": 0,
  "vehicleYearMax": 0,
  "radiusKm": 40,
  "minPrice": 0,
  "maxPrice": 0,
  "daysSinceListed": 14,
  "maxResults": 50,
  "includeDetails": false,
  "newOnly": false,
  "demoMode": false,
  "condition": [],
  "sortBy": "",
  "deliveryMethod": "",
  "onlyWithPhotos": false,
  "allPhotos": false,
  "onlyNewListings": false,
  "availability": "",
  "strictFiltering": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Marketplace listings pushed to the default dataset (dealScore, price, URL, etc.).

# 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 = {
    "searchQuery": "iPhone",
    "location": "austin",
    "cities": [
        "greenville",
        "austin"
    ],
    "categories": [],
    "vertical": "general",
    "vehiclePresets": [
        "cars",
        "trucks",
        "suv"
    ],
    "condition": [],
    "untilDate": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("intelscrape/facebook-marketplace-deal-radar").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 = {
    "searchQuery": "iPhone",
    "location": "austin",
    "cities": [
        "greenville",
        "austin",
    ],
    "categories": [],
    "vertical": "general",
    "vehiclePresets": [
        "cars",
        "trucks",
        "suv",
    ],
    "condition": [],
    "untilDate": "",
}

# Run the Actor and wait for it to finish
run = client.actor("intelscrape/facebook-marketplace-deal-radar").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 '{
  "searchQuery": "iPhone",
  "location": "austin",
  "cities": [
    "greenville",
    "austin"
  ],
  "categories": [],
  "vertical": "general",
  "vehiclePresets": [
    "cars",
    "trucks",
    "suv"
  ],
  "condition": [],
  "untilDate": ""
}' |
apify call intelscrape/facebook-marketplace-deal-radar --silent --output-dataset

```

## MCP server setup

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

```

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/G2L89rWUQgQctHVmA/builds/2MsWpzeCo70rohAbg/openapi.json
