FB No-Dealer Vehicles Scraper
Pricing
from $2.50 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
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-nanoby 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:
aiVehicleTypeaiVehicleTypeConfidenceaiVehicleTypeReasons
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/maxPriceminMileage/maxMileageminYear/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:locationlocationSlug: Facebook Marketplace location slug, such asdallas,austin, ornew-yorkradiusMiles: one of the supported Marketplace radius values
State mode
Set:
locationScope:statestate: 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
| Input | Type | Default | Purpose |
|---|---|---|---|
startUrls | array | example URL | Marketplace search or item URLs; overrides generated searches |
searchKeywords | string array | empty | Separate Marketplace keyword searches |
locationScope | string | location | Search by city slug or state metro hubs |
locationSlug | string | dallas | Marketplace city/location slug |
state | string | — | Two-letter US state code |
radiusMiles | select | 40 | Marketplace radius (1–500 mi allow-list) |
minPrice | integer | — | Hard minimum price filter |
maxPrice | integer | — | Hard maximum price filter |
minMileage | integer | — | Hard minimum mileage filter |
maxMileage | integer | — | Hard maximum mileage filter |
minYear | integer | — | Hard minimum model-year filter |
maxYear | integer | — | Hard maximum model-year filter |
maxItems | integer | 100 | Max private listings to save; 0 = unlimited within target |
targetCheckCount | integer | 50 | Unique search-order listings to account for (known + new) |
maxPagesPerSearch | integer | 3 | Maximum scroll batches per search |
maxListingAgeDays | integer | — | Keep only listings with a known recent date |
scrapeItemDetails | boolean | true | Open each listing for description and richer fields |
Dealer filtering and AI vehicle type
| Input | Type | Default | Purpose |
|---|---|---|---|
dealerDefinitivePhrases | multi-select array | empty | Custom phrases that immediately reject a listing |
dealerStrongPhrases | multi-select array | empty | Custom dealer evidence worth 35 points |
dealerWeakPhrases | multi-select array | empty | Custom dealer evidence worth 15 points |
openAiApiKey | secret string | — | Required; Actor exits immediately if missing |
openAiVisionModel | select/custom | gpt-5-nano | OpenAI combined analysis model |
allowedAiVehicleTypes | multi-select array | four-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
| Input | Type | Default | Purpose |
|---|---|---|---|
duplicateCheck | boolean | false | Skip listing URLs seen in previous runs |
duplicateCheckApiUrl | string | empty | Optional external listing-existence endpoint |
duplicateCheckStoreName | string | vehicle-listing-urls | Named Apify KV store for known URLs |
duplicateCheckLeadingStop | integer | 20 | Stop further scrolls after this many leading duplicates; current-page new URLs are still checked |
cookies | secret string | — | Facebook cookie JSON |
proxyConfiguration | object | US residential | Apify 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 dealerdealer inventoryavailable at our dealershipbuy here pay here financingdealer documentation feeplus 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 availabletrade-ins welcomeour inventorysales consultantrent to own
Weak phrases
Use marketing language that should combine with other evidence:
delivery availablefresh inventoryjust arrivedspecial pricelow down paymentappointment 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_STATEwrites - 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:
- Enable
duplicateCheck(item URLs only; search URLs still reopen). - Keep
maxItemsandmaxPagesPerSearchbounded. - Use
scrapeItemDetails: falsewhen card-level data is enough. - Use one targeted city or Marketplace URL.
- 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/evaluatedListingsskippedAlreadyKnown,skippedByApifyStore,skippedByDuplicateApinewListingsCheckedskippedDealerListings,skippedByDescription,skippedByImageAnalysisskippedByFiltersskippedByVehicleType,skippedByVehicleTypeUnclear,skippedByInsufficientImagesimageAnalysisRuns,vehicleTypeAnalysisRunscollectedListings/maxItemsduplicateCheckEnabledstopReason(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
privateseller 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.
Legal notice
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.