FB No-Dealer Vehicles Scraper avatar

FB No-Dealer Vehicles Scraper

Pricing

from $2.50 / 1,000 results

Go to Apify Store
FB No-Dealer Vehicles Scraper

FB No-Dealer Vehicles Scraper

Scrape Facebook Marketplace vehicle listings and skip dealer / dealership sellers. Same input and output as the full Marketplace vehicles scraper.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

Fahim Mahmud Chisti

Fahim Mahmud Chisti

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 hours ago

Last modified

Share

Facebook Marketplace No-Dealer Vehicle Scraper

Collect Facebook Marketplace vehicle listings while filtering out dealerships and dealer-like sellers, then keeping only selected AI-classified vehicle types.

The Actor checks listing text with deterministic rules first. Surviving listings get one combined OpenAI call on up to two photos for dealer evidence and vehicle-type classification. Vehicle type is photo-only (not a Facebook URL filter). It does not visit seller profiles or track seller inventory.

What you get

  • Vehicle title, price, currency, condition, location, and listing date
  • Year, make, model, mileage, VIN, transmission, fuel type, and colors when available
  • Listing URL, Facebook item ID, primary image, and image list
  • State, coordinates, sold/pending status, and other Marketplace-specific details
  • Optional Apify Task ID and Task name for downstream attribution
  • Output compatible with the other vehicle Actors in this repository

Quick start

Search one city

{
"locationScope": "location",
"locationSlug": "dallas",
"radiusMiles": "40",
"openAiApiKey": "sk-...",
"maxItems": 50,
"scrapeItemDetails": true,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "US"
}
}

Use a Marketplace URL

{
"startUrls": [
{
"url": "https://www.facebook.com/marketplace/nyc/search?minPrice=10000&maxMileage=50000&query=Vehicles"
}
],
"maxItems": 50,
"scrapeItemDetails": true
}

When startUrls is provided, the Actor uses only those URLs and ignores generated city, state, and keyword searches.

How dealer + vehicle-type filtering works

Search result
└─ Open listing detail (when enabled)
├─ Score title + description
│ └─ Clear dealer → skip (remembered when duplicateCheck is on)
└─ Not clearly a dealer
├─ OpenAI key + photos → one combined AI call
│ ├─ Dealer, high confidence → skip (remembered)
│ ├─ Vehicle type not in allowedAiVehicleTypes → skip (not remembered)
│ ├─ Missing images / AI failure / unclear type → skip (not remembered)
│ └─ Allowed high-confidence type → keep
└─ No OpenAI key → reject under strict vehicle-type policy

Text analysis

The score combines evidence such as:

  • Explicit dealer language
  • Financing, down-payment, rent-to-own, and trade-in language
  • Stock numbers, inventory wording, sales-team wording, and dealer disclaimers
  • Dealer-style prices and short inventory-feed descriptions
  • Descriptions that only repeat the year, make, and model
  • Optional phrases supplied in the input

The dealer threshold is 40. Definitive phrases score 100 immediately, strong phrases add 35, and weak phrases add 15.

Facebook's sellerType: private is not treated as proof that the seller is private because dealers and curbstoners can publish listings under that type.

AI text and image analysis (combined dealer + vehicle type)

openAiApiKey is required. The Actor exits immediately without it. The key enables the combined AI dealer + vehicle-type check.

  • Uses gpt-5-nano by default (select another compatible model from the dropdown)
  • One OpenAI call per eligible listing (dealer evidence + vehicle type together)
  • Evaluates listing title and description for dealer detection only
  • Classifies vehicle type from photos only (ignores title/description for type; ignores background vehicles)
  • Analyzes at most two distinct images (first + second; or both when only two)
  • Downloads both images concurrently through the crawler's residential proxy
  • Sends downloaded images to OpenAI as image data
  • Tier A (direct): dealership sign/logo/banner, dealer name, sales phone/"Call now!" overlay, address bar, Free Delivery / financing badges, photo watermark / stamped dealer name / dealer website overlay, stock number, dealer-branded sales sheet, or commercial automotive studio/showroom photos (reflective turntable, seamless cyclorama/backdrop, checkered showroom floor) — even without branding overlays
  • Tier B (supporting only): commercial dealer-lot inventory rows, lot-like sales yard, unlabeled sales office without studio cues, price writing, temporary tag, plate frame, branded mats/tags
  • Tier C (ignored): clean/new car, ordinary driveway/street/garage photos without dealer branding or studio cues, nearby cars on public streets/parking, plate frame alone, Carfax/factory sticker, unrelated business building
  • When many cars are visible, AI distinguishes dealer lot (Tier B supporting) vs public parking/street (Tier C, ignored)
  • Skips only high-confidence dealer results backed by direct text or Tier A photo evidence (Tier A photo alone is enough even if listing text looks private)

AI vehicle-type filter (allowedAiVehicleTypes)

This is an AI image multi-select filter, not a Facebook Marketplace URL filter.

Default selected types (four-wheel road vehicles):

  • car, suv_crossover, pickup, van_minivan, commercial_truck, rv_camper, bus

Available but unselected by default:

  • motorcycle, scooter_moped, atv_utv, bicycle_ebike, trailer, other

Strict policy: missing images, image download failure, AI failure, malformed type output, and low/medium/unclear confidence are treated as non-matching and rejected. Vehicle-type rejects are not permanently stored in duplicate storage (so changing selected types on a later run can still collect them). Confirmed dealer rejects continue to be remembered when duplicateCheck is on.

Each saved listing includes:

  • aiVehicleType
  • aiVehicleTypeConfidence
  • aiVehicleTypeReasons

Each combined AI call costs OpenAI tokens (images are the main cost driver). Bound targetCheckCount / maxItems and enable duplicate checks to control spend.

Hard listing filters

Facebook search URL filters are soft. The Actor also enforces hard post-filters for known listing fields:

  • minPrice / maxPrice
  • minMileage / maxMileage
  • minYear / maxYear

These can come from Actor input and/or Start URL query params (minPrice=10000&maxMileage=60000&minYear=1980). When both define a bound, the stricter value wins. Listings outside the bound are excluded after scrape (and on search cards when the field is already known). A listing missing a constrained price, mileage, or year is also excluded so the output cannot silently violate the requested filter.

Facebook access and cookies

Facebook frequently limits anonymous Marketplace access.

Without cookies

  • Search-card fields can usually be collected
  • Keyword searches and pagination may be limited
  • Detail pages may be login-gated
  • Description, VIN, specifications, seller fields, and additional images may be missing
  • When details are login-gated or fail after retries, the Actor still saves available search-card data (after text dealer checks) instead of dropping the listing

For a lower-cost anonymous run, leave searchKeywords empty and consider setting scrapeItemDetails to false.

With cookies

Cookies can unlock deeper pagination, keyword searches, and richer item details. Provide them through the secret cookies input.

Cookies can expire or trigger Facebook account checks. The Actor logs whether the first Marketplace page appears authenticated. Never commit cookies to source control.

Search configuration

Location mode

Set:

  • locationScope: location
  • locationSlug: Facebook Marketplace location slug, such as dallas, austin, or new-york
  • radiusMiles: one of the supported Marketplace radius values

State mode

Set:

  • locationScope: state
  • state: two-letter US state code

The Actor searches curated metro hubs for the selected state, deduplicates listing IDs, and verifies listing locations before saving.

Marketplace remains radius-based; state mode approximates statewide coverage and cannot guarantee every rural listing.

Keyword mode

Add values to searchKeywords, such as:

{
"searchKeywords": ["Honda Civic", "Toyota Camry"]
}

Each keyword creates a separate search. Keyword results usually work best with valid Facebook cookies.

Input reference

Search and limits

InputTypeDefaultPurpose
startUrlsarrayexample URLMarketplace search or item URLs; overrides generated searches
searchKeywordsstring arrayemptySeparate Marketplace keyword searches
locationScopestringlocationSearch by city slug or state metro hubs
locationSlugstringdallasMarketplace city/location slug
statestringTwo-letter US state code
radiusMilesselect40Marketplace radius (1–500 mi allow-list)
minPriceintegerHard minimum price filter
maxPriceintegerHard maximum price filter
minMileageintegerHard minimum mileage filter
maxMileageintegerHard maximum mileage filter
minYearintegerHard minimum model-year filter
maxYearintegerHard maximum model-year filter
maxItemsinteger100Max private listings to save; 0 = unlimited within target
targetCheckCountinteger50Unique search-order listings to account for (known + new)
maxPagesPerSearchinteger3Maximum scroll batches per search
maxListingAgeDaysintegerKeep only listings with a known recent date
scrapeItemDetailsbooleantrueOpen each listing for description and richer fields

Dealer filtering and AI vehicle type

InputTypeDefaultPurpose
dealerDefinitivePhrasesmulti-select arrayemptyCustom phrases that immediately reject a listing
dealerStrongPhrasesmulti-select arrayemptyCustom dealer evidence worth 35 points
dealerWeakPhrasesmulti-select arrayemptyCustom dealer evidence worth 15 points
openAiApiKeysecret stringRequired; Actor exits immediately if missing
openAiVisionModelselect/customgpt-5-nanoOpenAI combined analysis model
allowedAiVehicleTypesmulti-select arrayfour-wheel road types (see above)AI image vehicle types to keep

The three phrase fields are searchable multi-select dropdowns in the Apify Console. They contain suggestions and also accept custom phrases. allowedAiVehicleTypes is also a multi-select; leave motorcycles/scooters/ATVs unselected to exclude them by default.

Duplicate handling and access

InputTypeDefaultPurpose
duplicateCheckbooleanfalseSkip listing URLs seen in previous runs
duplicateCheckApiUrlstringemptyOptional external listing-existence endpoint
duplicateCheckStoreNamestringvehicle-listing-urlsNamed Apify KV store for known URLs
duplicateCheckLeadingStopinteger20Stop further scrolls after this many leading duplicates; current-page new URLs are still checked
cookiessecret stringFacebook cookie JSON
proxyConfigurationobjectUS residentialApify proxy settings

Custom dealer phrases

Custom phrases are case-insensitive and are merged with built-in rules.

Definitive phrases

Use only language that proves a dealership is selling the current vehicle:

  • licensed auto dealer
  • dealer inventory
  • available at our dealership
  • buy here pay here financing
  • dealer documentation fee
  • plus dealer fees

Avoid ambiguous phrases such as clean Carfax, message for details, or great deal in this category.

Strong phrases

Use clear lot, financing, inventory, or sales-team language:

  • stock #
  • financing available
  • trade-ins welcome
  • our inventory
  • sales consultant
  • rent to own

Weak phrases

Use marketing language that should combine with other evidence:

  • delivery available
  • fresh inventory
  • just arrived
  • special price
  • low down payment
  • appointment available

JSON example:

{
"dealerDefinitivePhrases": ["licensed auto dealer", "dealer inventory"],
"dealerStrongPhrases": ["stock #", "financing available", "trade-ins welcome"],
"dealerWeakPhrases": ["delivery available", "fresh inventory"]
}

Duplicate checking

Enable duplicateCheck for scheduled or repeated runs (recommended for cost savings; default remains false so existing schedules stay unchanged).

Search / start feed URLs always reopen — the same city or filter URL can show new listings. Duplicate checking applies only to individual marketplace/item/... listing URLs.

Order is fixed: Apify Key-Value store first, then the optional exists API, then scrape/dealer checks. Known item URLs are skipped before detail pages. Saved private listings and confirmed rejected dealers are stored in KNOWN_LISTING_URLS with a 30-day TTL (stale URLs can be re-checked) and a hard cap of 50,000 URLs (oldest entries are evicted first). Wrong AI vehicle-type rejects are not remembered, so changing allowedAiVehicleTypes later can still collect those listings.

targetCheckCount controls how many unique search-order listings to account for. Already-known URLs count toward that target. Example: target 50 with 30 already known checks 20 new listings.

If duplicateCheckApiUrl is configured, the Actor sends:

{
"listingUrls": ["https://www.facebook.com/marketplace/item/123/", "https://www.facebook.com/marketplace/item/456/"]
}

The endpoint must return:

{
"existing": ["https://www.facebook.com/marketplace/item/123/"],
"missing": ["https://www.facebook.com/marketplace/item/456/"]
}

If the external endpoint fails, the Actor continues and uses the Apify key-value store.

Output

Results are stored in the default dataset.

{
"itemId": "123456789012345",
"title": "2018 Ford F-150 Lariat",
"description": "Clean title and well maintained.",
"listedAt": "2026-07-21T12:26:40.000Z",
"price": "32500",
"currency": "USD",
"condition": "USED",
"location": "Dallas, TX",
"year": "2018",
"make": "Ford",
"model": "F-150 Lariat",
"mileage": "84000",
"vin": null,
"forSaleBy": "private",
"aiVehicleType": "pickup",
"aiVehicleTypeConfidence": "high",
"aiVehicleTypeReasons": ["pickup bed and cab visible as primary subject"],
"imageUrl": "https://scontent.xx.fbcdn.net/example.jpg",
"images": ["https://scontent.xx.fbcdn.net/example.jpg"],
"url": "https://www.facebook.com/marketplace/item/123456789012345/",
"taskId": null,
"taskName": null
}

Fields can be null when Facebook does not expose them. seller is commonly unavailable anonymously. Marketplace status and coordinates are stored under specifics.

Performance and cost

The Actor reduces cost and runtime by:

  • Trying HTTP/SSR detail extraction before a Playwright detail navigation
  • Downloading vision images directly first, with residential proxy fallback
  • Batching SCRAPE_STATE writes
  • Blocking browser image, media, font, and tracking requests
  • Extracting image URLs without loading images in the browser
  • Checking description text before calling OpenAI
  • Downloading selected vision images concurrently
  • Processing up to two listing detail pages concurrently
  • Skipping seller-profile navigation
  • Scrolling Facebook's actual overflow feed container in small increments (not assuming the browser window is the scroller)
  • Deduplicating known item URLs before expensive detail requests (search feed URLs always reopen)
  • Stopping further scrolls after repeated leading duplicates (current-page new listings are still checked)
  • Preserving search-card data when detail pages fail or are login-gated

For the lowest cost:

  1. Enable duplicateCheck (item URLs only; search URLs still reopen).
  2. Keep maxItems and maxPagesPerSearch bounded.
  3. Use scrapeItemDetails: false when card-level data is enough.
  4. Use one targeted city or Marketplace URL.
  5. Provide an OpenAI key — required for AI vehicle-type filtering (and dealer photo checks).

Live status and diagnostics

During a run, the Container URL exposes:

  • GET /
  • GET /status

Both return current progress. Empty, blocked, or failed pages are stored as bounded debug records in the run's key-value store.

The OUTPUT run report contains:

  • targetCheckCount / evaluatedListings
  • skippedAlreadyKnown, skippedByApifyStore, skippedByDuplicateApi
  • newListingsChecked
  • skippedDealerListings, skippedByDescription, skippedByImageAnalysis
  • skippedByFilters
  • skippedByVehicleType, skippedByVehicleTypeUnclear, skippedByInsufficientImages
  • imageAnalysisRuns, vehicleTypeAnalysisRuns
  • collectedListings / maxItems
  • duplicateCheckEnabled
  • stopReason (target_reached, max_items_saved, max_scrolls, leading_duplicates, no_more_listings, aborted)

Important limitations

  • Facebook may change markup, embedded data, authentication requirements, or blocking behavior.
  • Marketplace is radius-based; state coverage is an approximation.
  • Facebook's private seller label is not reliable proof of a private owner.
  • A single photo may not show enough context to identify a dealer or vehicle type.
  • Vision analysis is probabilistic and can produce false positives or false negatives.
  • Without an OpenAI key (or without downloadable photos), eligible listings are rejected by the strict vehicle-type policy.
  • During anonymous search scrolling, the Actor activates Facebook's hidden modal Close control so React expands the logged-out feed, then removes a leftover overlay DIV only as fallback. It never removes the root <html id="facebook" class="__fb-light-mode">. This does not bypass checkpoints, captchas, account locks, or server-side feed limits — if Facebook stops returning more cards without a session, cookies are still required.

Use this Actor only for lawful purposes. Follow applicable laws, Facebook's terms, and reasonable request rates. Do not use scraped data to harass individuals or collect private contact information.