# FB No-Dealer Vehicles Scraper (`fmchisti/fb-no-dealer-vehicles-scraper`) Actor

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

- **URL**: https://apify.com/fmchisti/fb-no-dealer-vehicles-scraper.md
- **Developed by:** [Fahim Mahmud Chisti](https://apify.com/fmchisti) (community)
- **Categories:** AI, Automation, Integrations
- **Stats:** 1 total users, 1 monthly users, 99.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 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

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

#### Use a Marketplace URL

```json
{
    "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

```text
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:

```json
{
    "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 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:

```json
{
    "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:

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

The endpoint must return:

```json
{
    "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.

```json
{
    "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.

### 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.

# Actor input Schema

## `searchKeywords` (type: `array`):

Vehicle keywords such as Toyota Camry or Ford F-150. Each keyword creates a separate Marketplace search.

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

Facebook Marketplace search or item detail URLs. When provided, the Actor crawls only these URLs and ignores locationSlug / keywords / state hubs. URL filters (minPrice, maxPrice, maxMileage, minYear, etc.) are preserved and also enforced as hard post-filters after scrape.

## `locationScope` (type: `string`):

Used only when Start URLs are empty. Marketplace is radius-based. Use a city location slug, or expand a US state across curated metro hubs with deduplication.

## `locationSlug` (type: `string`):

Used only when Start URLs are empty. Facebook Marketplace city slug when Location scope is City / location slug. Examples: dallas, austin, new-york, los-angeles.

## `state` (type: `string`):

Required when Location scope is Specific state. Results are verified against listing location before being saved.

## `radiusMiles` (type: `string`):

Marketplace search radius around each location hub (miles).

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

Hard filter. Listings below this price, or missing price, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params (stricter bound wins).

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

Hard filter. Listings above this price, or missing price, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params (stricter bound wins).

## `minMileage` (type: `integer`):

Hard filter. Listings below this mileage, or missing mileage, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params.

## `maxMileage` (type: `integer`):

Hard filter. Listings above this mileage, or missing mileage, are excluded (Facebook URL filters alone are soft). Also applied to Actor-built search URLs and merged with Start URL query params.

## `minYear` (type: `integer`):

Hard filter. Listings below this model year, or missing year, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params.

## `maxYear` (type: `integer`):

Hard filter. Listings above this model year, or missing year, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params.

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

Maximum private (non-dealer) listings to save to the dataset. Set to 0 for no save limit within the target check budget.

## `targetCheckCount` (type: `integer`):

How many unique search-order listings to account for this run (already-known duplicates + new checks). Example: target 50 with 30 already known checks 20 new listings. Default 50.

## `maxPagesPerSearch` (type: `integer`):

Scroll-depth ceiling per search. Marketplace uses infinite scroll. Raise this when Target listings to check is large so the Actor can load enough cards.

## `maxListingAgeDays` (type: `integer`):

Optional. Save only listings with a known creation time within this many days. Listings without a date are excluded.

## `scrapeItemDetails` (type: `boolean`):

Open each listing for description, VIN, mileage, specs, seller (when available), and images. Description is scored for dealer keywords before saving full data. Recommended for state filtering.

## `dealerDefinitivePhrases` (type: `array`):

Optional. Select suggestions or enter custom phrases that immediately mark a listing as a dealer (score 100). Use only unambiguous dealer language.

## `dealerStrongPhrases` (type: `array`):

Optional. Select suggestions or enter custom strong lot, financing, inventory, or sales-team phrases (+35 score).

## `dealerWeakPhrases` (type: `array`):

Optional. Select suggestions or enter custom weak marketing phrases (+15 score). Weak phrases combine with other evidence and do not block alone.

## `openAiApiKey` (type: `string`):

Required. The Actor exits immediately without this key. Used for AI vehicle-type filtering and dealer photo checks: listing title/description (dealer signals) plus up to two photos in one combined OpenAI call.

## `openAiVisionModel` (type: `string`):

Vision-capable model used for dealer evidence and AI vehicle-type classification from listing photos. Select a suggested model or enter another compatible OpenAI model ID.

## `allowedAiVehicleTypes` (type: `array`):

AI image multi-select filter (not a Facebook URL filter). After a listing survives text dealer scoring and hard price/mileage/year filters, photos are classified and only selected types are kept. Defaults to four-wheel road vehicles. Motorcycles, scooters, ATVs, bicycles, trailers, and other stay available but unselected. Requires OpenAI API key. Missing images, download failures, AI failures, and unclear/low-confidence types are rejected.

## `duplicateCheck` (type: `boolean`):

When enabled, skip detail scraping for already-known marketplace/item listing URLs (Apify Key-Value store first, then optional duplicate-check API). Search/start feed URLs always reopen so new listings can appear. Remembers confirmed dealers and saved private listings only — not wrong vehicle-type rejects. Recommended for scheduled re-runs to save proxy and compute cost. Default stays off so existing schedules are unchanged.

## `duplicateCheckApiUrl` (type: `string`):

Optional. POST endpoint that accepts { "listingUrls": string|string\[] } and returns { "existing": string\[], "missing": string\[] }. Leave empty to use Apify Key-Value store only.

## `duplicateCheckStoreName` (type: `string`):

Named Apify Key-Value store that remembers listing URLs across runs. Used whenever Skip existing listings is enabled.

## `duplicateCheckLeadingStop` (type: `integer`):

When Skip existing listings is enabled, stop further scrolls after this many consecutive known-duplicate listing URLs (in a row). New listings already loaded on the current page are still checked. Default 20.

## `cookies` (type: `array`):

Optional session cookies exported from your browser (EditThisCookie / Cookie-Editor JSON). Anonymous mode works for public listings; cookies can deepen pagination and unlock seller identity. Never share cookies publicly.

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

US residential proxies are strongly recommended. Facebook blocks many datacenter IPs.

## Actor input object example

```json
{
  "searchKeywords": [],
  "startUrls": [
    {
      "url": "https://www.facebook.com/marketplace/1312315172298841/search?minPrice=10000&maxMileage=60000&minYear=1980&sortBy=creation_time_descend&query=Vehicles&category_id=546583916084032&exact=false&referral_ui_component=category_menu_item"
    }
  ],
  "locationScope": "location",
  "locationSlug": "dallas",
  "radiusMiles": "40",
  "maxItems": 100,
  "targetCheckCount": 50,
  "maxPagesPerSearch": 3,
  "scrapeItemDetails": true,
  "dealerDefinitivePhrases": [],
  "dealerStrongPhrases": [],
  "dealerWeakPhrases": [],
  "openAiVisionModel": "gpt-5-nano",
  "allowedAiVehicleTypes": [
    "car",
    "suv_crossover",
    "pickup",
    "van_minivan",
    "commercial_truck",
    "rv_camper",
    "bus"
  ],
  "duplicateCheck": false,
  "duplicateCheckApiUrl": "https://ccscraperapi.up.railway.app/api/listings/exists",
  "duplicateCheckStoreName": "vehicle-listing-urls",
  "duplicateCheckLeadingStop": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `scrapeState` (type: `string`):

No description

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

No description

## `debugItems` (type: `string`):

No description

## `debugPages` (type: `string`):

No description

# 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 = {
    "searchKeywords": [],
    "startUrls": [
        {
            "url": "https://www.facebook.com/marketplace/1312315172298841/search?minPrice=10000&maxMileage=60000&minYear=1980&sortBy=creation_time_descend&query=Vehicles&category_id=546583916084032&exact=false&referral_ui_component=category_menu_item"
        }
    ],
    "locationSlug": "dallas",
    "dealerDefinitivePhrases": [],
    "dealerStrongPhrases": [],
    "dealerWeakPhrases": [],
    "allowedAiVehicleTypes": [
        "car",
        "suv_crossover",
        "pickup",
        "van_minivan",
        "commercial_truck",
        "rv_camper",
        "bus"
    ],
    "duplicateCheckApiUrl": "https://ccscraperapi.up.railway.app/api/listings/exists",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fmchisti/fb-no-dealer-vehicles-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 = {
    "searchKeywords": [],
    "startUrls": [{ "url": "https://www.facebook.com/marketplace/1312315172298841/search?minPrice=10000&maxMileage=60000&minYear=1980&sortBy=creation_time_descend&query=Vehicles&category_id=546583916084032&exact=false&referral_ui_component=category_menu_item" }],
    "locationSlug": "dallas",
    "dealerDefinitivePhrases": [],
    "dealerStrongPhrases": [],
    "dealerWeakPhrases": [],
    "allowedAiVehicleTypes": [
        "car",
        "suv_crossover",
        "pickup",
        "van_minivan",
        "commercial_truck",
        "rv_camper",
        "bus",
    ],
    "duplicateCheckApiUrl": "https://ccscraperapi.up.railway.app/api/listings/exists",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("fmchisti/fb-no-dealer-vehicles-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 '{
  "searchKeywords": [],
  "startUrls": [
    {
      "url": "https://www.facebook.com/marketplace/1312315172298841/search?minPrice=10000&maxMileage=60000&minYear=1980&sortBy=creation_time_descend&query=Vehicles&category_id=546583916084032&exact=false&referral_ui_component=category_menu_item"
    }
  ],
  "locationSlug": "dallas",
  "dealerDefinitivePhrases": [],
  "dealerStrongPhrases": [],
  "dealerWeakPhrases": [],
  "allowedAiVehicleTypes": [
    "car",
    "suv_crossover",
    "pickup",
    "van_minivan",
    "commercial_truck",
    "rv_camper",
    "bus"
  ],
  "duplicateCheckApiUrl": "https://ccscraperapi.up.railway.app/api/listings/exists",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call fmchisti/fb-no-dealer-vehicles-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fmchisti/fb-no-dealer-vehicles-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "FB No-Dealer Vehicles Scraper",
        "description": "Scrape Facebook Marketplace vehicle listings and skip dealer / dealership sellers. Same input and output as the full Marketplace vehicles scraper.",
        "version": "0.1",
        "x-build-id": "WKHUOQdescAnnuduf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/fmchisti~fb-no-dealer-vehicles-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-fmchisti-fb-no-dealer-vehicles-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/fmchisti~fb-no-dealer-vehicles-scraper/runs": {
            "post": {
                "operationId": "runs-sync-fmchisti-fb-no-dealer-vehicles-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/fmchisti~fb-no-dealer-vehicles-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-fmchisti-fb-no-dealer-vehicles-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",
                "required": [
                    "openAiApiKey"
                ],
                "properties": {
                    "searchKeywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Vehicle keywords such as Toyota Camry or Ford F-150. Each keyword creates a separate Marketplace search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Facebook Marketplace search or item detail URLs. When provided, the Actor crawls only these URLs and ignores locationSlug / keywords / state hubs. URL filters (minPrice, maxPrice, maxMileage, minYear, etc.) are preserved and also enforced as hard post-filters after scrape.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "locationScope": {
                        "title": "Location scope",
                        "enum": [
                            "location",
                            "state"
                        ],
                        "type": "string",
                        "description": "Used only when Start URLs are empty. Marketplace is radius-based. Use a city location slug, or expand a US state across curated metro hubs with deduplication.",
                        "default": "location"
                    },
                    "locationSlug": {
                        "title": "Location slug",
                        "type": "string",
                        "description": "Used only when Start URLs are empty. Facebook Marketplace city slug when Location scope is City / location slug. Examples: dallas, austin, new-york, los-angeles."
                    },
                    "state": {
                        "title": "State",
                        "enum": [
                            "AL",
                            "AK",
                            "AZ",
                            "AR",
                            "CA",
                            "CO",
                            "CT",
                            "DE",
                            "FL",
                            "GA",
                            "HI",
                            "ID",
                            "IL",
                            "IN",
                            "IA",
                            "KS",
                            "KY",
                            "LA",
                            "ME",
                            "MD",
                            "MA",
                            "MI",
                            "MN",
                            "MS",
                            "MO",
                            "MT",
                            "NE",
                            "NV",
                            "NH",
                            "NJ",
                            "NM",
                            "NY",
                            "NC",
                            "ND",
                            "OH",
                            "OK",
                            "OR",
                            "PA",
                            "RI",
                            "SC",
                            "SD",
                            "TN",
                            "TX",
                            "UT",
                            "VT",
                            "VA",
                            "WA",
                            "WV",
                            "WI",
                            "WY",
                            "DC"
                        ],
                        "type": "string",
                        "description": "Required when Location scope is Specific state. Results are verified against listing location before being saved."
                    },
                    "radiusMiles": {
                        "title": "Search radius (miles)",
                        "enum": [
                            "1",
                            "2",
                            "5",
                            "10",
                            "20",
                            "40",
                            "60",
                            "80",
                            "100",
                            "250",
                            "500"
                        ],
                        "type": "string",
                        "description": "Marketplace search radius around each location hub (miles).",
                        "default": "40"
                    },
                    "minPrice": {
                        "title": "Minimum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard filter. Listings below this price, or missing price, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params (stricter bound wins)."
                    },
                    "maxPrice": {
                        "title": "Maximum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard filter. Listings above this price, or missing price, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params (stricter bound wins)."
                    },
                    "minMileage": {
                        "title": "Minimum mileage",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard filter. Listings below this mileage, or missing mileage, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params."
                    },
                    "maxMileage": {
                        "title": "Maximum mileage",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard filter. Listings above this mileage, or missing mileage, are excluded (Facebook URL filters alone are soft). Also applied to Actor-built search URLs and merged with Start URL query params."
                    },
                    "minYear": {
                        "title": "Minimum year",
                        "minimum": 1980,
                        "maximum": 2100,
                        "type": "integer",
                        "description": "Hard filter. Listings below this model year, or missing year, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params."
                    },
                    "maxYear": {
                        "title": "Maximum year",
                        "minimum": 1980,
                        "maximum": 2100,
                        "type": "integer",
                        "description": "Hard filter. Listings above this model year, or missing year, are excluded. Also applied to Actor-built search URLs and merged with Start URL query params."
                    },
                    "maxItems": {
                        "title": "Max private listings to save",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum private (non-dealer) listings to save to the dataset. Set to 0 for no save limit within the target check budget.",
                        "default": 100
                    },
                    "targetCheckCount": {
                        "title": "Target listings to check",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many unique search-order listings to account for this run (already-known duplicates + new checks). Example: target 50 with 30 already known checks 20 new listings. Default 50.",
                        "default": 50
                    },
                    "maxPagesPerSearch": {
                        "title": "Max scrolls per search",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Scroll-depth ceiling per search. Marketplace uses infinite scroll. Raise this when Target listings to check is large so the Actor can load enough cards.",
                        "default": 3
                    },
                    "maxListingAgeDays": {
                        "title": "Only listings from the last (days)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Optional. Save only listings with a known creation time within this many days. Listings without a date are excluded."
                    },
                    "scrapeItemDetails": {
                        "title": "Scrape item details",
                        "type": "boolean",
                        "description": "Open each listing for description, VIN, mileage, specs, seller (when available), and images. Description is scored for dealer keywords before saving full data. Recommended for state filtering.",
                        "default": true
                    },
                    "dealerDefinitivePhrases": {
                        "title": "Extra definitive dealer phrases",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional. Select suggestions or enter custom phrases that immediately mark a listing as a dealer (score 100). Use only unambiguous dealer language.",
                        "items": {
                            "type": "string",
                            "enumSuggestedValues": [
                                "commercial seller",
                                "licensed auto dealer",
                                "dealer inventory",
                                "dealership inventory",
                                "available at our dealership",
                                "visit our car lot",
                                "dealer financing",
                                "buy here pay here financing",
                                "in-house finance available",
                                "contact our sales department",
                                "dealer documentation fee",
                                "plus dealer fees"
                            ]
                        }
                    },
                    "dealerStrongPhrases": {
                        "title": "Extra strong dealer phrases",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional. Select suggestions or enter custom strong lot, financing, inventory, or sales-team phrases (+35 score).",
                        "items": {
                            "type": "string",
                            "enumSuggestedValues": [
                                "stock #",
                                "stock number",
                                "schedule a test drive",
                                "schedule a viewing now",
                                "get pre-approved",
                                "financing available",
                                "monthly payments",
                                "trade-ins welcome",
                                "confirm availability",
                                "our inventory",
                                "sales advisor",
                                "sales consultant",
                                "motor company",
                                "auto sales",
                                "all credit types",
                                "bad credit ok",
                                "rent to own"
                            ]
                        }
                    },
                    "dealerWeakPhrases": {
                        "title": "Extra weak dealer phrases",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Optional. Select suggestions or enter custom weak marketing phrases (+15 score). Weak phrases combine with other evidence and do not block alone.",
                        "items": {
                            "type": "string",
                            "enumSuggestedValues": [
                                "message for details",
                                "call for details",
                                "available now",
                                "come see it today",
                                "ready for delivery",
                                "delivery available",
                                "warranty available",
                                "clean carfax",
                                "carfax available",
                                "fresh inventory",
                                "new arrival",
                                "just arrived",
                                "priced to sell",
                                "special price",
                                "great deal",
                                "low down payment",
                                "easy approval",
                                "appointment available",
                                "test drives available"
                            ]
                        }
                    },
                    "openAiApiKey": {
                        "title": "OpenAI API key (AI dealer + vehicle-type analysis)",
                        "type": "string",
                        "description": "Required. The Actor exits immediately without this key. Used for AI vehicle-type filtering and dealer photo checks: listing title/description (dealer signals) plus up to two photos in one combined OpenAI call."
                    },
                    "openAiVisionModel": {
                        "title": "OpenAI analysis model",
                        "type": "string",
                        "description": "Vision-capable model used for dealer evidence and AI vehicle-type classification from listing photos. Select a suggested model or enter another compatible OpenAI model ID.",
                        "default": "gpt-5-nano"
                    },
                    "allowedAiVehicleTypes": {
                        "title": "Allowed AI vehicle types (image filter)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "AI image multi-select filter (not a Facebook URL filter). After a listing survives text dealer scoring and hard price/mileage/year filters, photos are classified and only selected types are kept. Defaults to four-wheel road vehicles. Motorcycles, scooters, ATVs, bicycles, trailers, and other stay available but unselected. Requires OpenAI API key. Missing images, download failures, AI failures, and unclear/low-confidence types are rejected.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "car",
                                "suv_crossover",
                                "pickup",
                                "van_minivan",
                                "commercial_truck",
                                "rv_camper",
                                "bus",
                                "motorcycle",
                                "scooter_moped",
                                "atv_utv",
                                "bicycle_ebike",
                                "trailer",
                                "other"
                            ],
                            "enumTitles": [
                                "Car (sedan/coupe/hatchback/wagon)",
                                "SUV / crossover",
                                "Pickup truck",
                                "Van / minivan",
                                "Commercial / heavy truck",
                                "RV / camper",
                                "Bus",
                                "Motorcycle",
                                "Scooter / moped",
                                "ATV / UTV",
                                "Bicycle / e-bike",
                                "Trailer",
                                "Other"
                            ]
                        },
                        "default": [
                            "car",
                            "suv_crossover",
                            "pickup",
                            "van_minivan",
                            "commercial_truck",
                            "rv_camper",
                            "bus"
                        ]
                    },
                    "duplicateCheck": {
                        "title": "Skip existing listings",
                        "type": "boolean",
                        "description": "When enabled, skip detail scraping for already-known marketplace/item listing URLs (Apify Key-Value store first, then optional duplicate-check API). Search/start feed URLs always reopen so new listings can appear. Remembers confirmed dealers and saved private listings only — not wrong vehicle-type rejects. Recommended for scheduled re-runs to save proxy and compute cost. Default stays off so existing schedules are unchanged.",
                        "default": false
                    },
                    "duplicateCheckApiUrl": {
                        "title": "Duplicate check API URL",
                        "type": "string",
                        "description": "Optional. POST endpoint that accepts { \"listingUrls\": string|string[] } and returns { \"existing\": string[], \"missing\": string[] }. Leave empty to use Apify Key-Value store only."
                    },
                    "duplicateCheckStoreName": {
                        "title": "Duplicate check store name",
                        "type": "string",
                        "description": "Named Apify Key-Value store that remembers listing URLs across runs. Used whenever Skip existing listings is enabled.",
                        "default": "vehicle-listing-urls"
                    },
                    "duplicateCheckLeadingStop": {
                        "title": "Stop after consecutive duplicates",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "When Skip existing listings is enabled, stop further scrolls after this many consecutive known-duplicate listing URLs (in a row). New listings already loaded on the current page are still checked. Default 20.",
                        "default": 20
                    },
                    "cookies": {
                        "title": "Facebook cookies (optional)",
                        "type": "array",
                        "description": "Optional session cookies exported from your browser (EditThisCookie / Cookie-Editor JSON). Anonymous mode works for public listings; cookies can deepen pagination and unlock seller identity. Never share cookies publicly."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "US residential proxies are strongly recommended. Facebook blocks many datacenter IPs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
