# eBay Motors Search & Listing Detail Extractor (`dataspryva/ebay-motors-search-and-listing-detail-extractor`) Actor

Search eBay Motors for vehicles or parts by keyword, type, condition, price and year, or enrich specific item URLs - returns price, mileage, specs, seller/dealer info and images per listing.

- **URL**: https://apify.com/dataspryva/ebay-motors-search-and-listing-detail-extractor.md
- **Developed by:** [Dataspryva](https://apify.com/dataspryva) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## eBay Motors Search & Listing Detail Extractor

eBay Motors lists vehicles and parts from private sellers and dealers across the US. This actor runs a vehicle or parts search, or opens specific item pages you already have, and returns structured records with pricing, vehicle identity, title status, VIN, mileage, seller details, returns and images.

### What this actor does

- Searches eBay Motors vehicle listings by keyword, vehicle category (cars & trucks, motorcycles, boats, RVs, ATVs, commercial trucks), condition, price range, model-year range, maximum mileage, transmission, fuel type, buying format, seller and ZIP-radius search
- Searches parts & accessories by keyword, parts category, condition, price and buying format
- Enriches specific item URLs, bare item IDs or saved search URLs with full listing detail instead of running a new search
- Paginates at eBay's 240-row page size through up to 200 result pages, with cross-page deduplication
- Omits empty fields from every record — a field appears only when the listing actually shows that data

### Modes

| Mode | What it returns |
|---|---|
| `searchVehicles` | Vehicle search-result records |
| `searchParts` | Parts & accessories search-result records |
| `byListingUrls` | Full detail records for item IDs/URLs; search URLs are parsed as search-result pages |

### Output per listing

Core fields:

- `listingId` — eBay item ID
- `title` — full listing title
- `url` — canonical eBay listing URL
- `price` — numeric price
- `priceFormatted` — price as displayed (e.g. `$22,500.00`)
- `currency` — currency code for `price`
- `originalPrice`, `discountPercent` — pre-discount price and markdown, when shown
- `condition` — listing condition (e.g. `Used`, `Pre-Owned`)
- `titleStatus` — vehicle title status (e.g. `Clean`, `Salvage`), when shown
- `vin` — Vehicle Identification Number (detail pages, when eBay prints it)
- `year`, `make`, `model`, `trim`, `submodel` — vehicle identity
- `bodyStyle`, `fuelType`, `transmission`, `drivetrain`, `exteriorColor`, `interiorColor`
- `engine`, `cylinders`, `doors`, `seats` — engine and body configuration
- `mileage` — odometer reading in miles
- `categoryPath` — eBay breadcrumb for the listing (`eBay > eBay Motors > …`)
- `itemSpecifics` — complete item-specifics table (detail mode, when `includeItemSpecifics` is on)
- `warranty`, `countryOfOrigin`, `forSaleBy`, `sellerNotes`
- `sellerName`, `sellerUrl`, `sellerFeedbackScore`, `sellerPositivePercent`, `sellerFeedbackPercent`, `sellerFeedbackCount`
- `dealerName`, `dealerFeedbackPercent`, `dealerFeedbackCount` — dealer block on Motors search cards
- `storeName`, `storeUrl`, `isTopRatedSeller`
- `shippingCost`, `shippingType`, `shippingEstimatedDelivery`
- `returnsAccepted`, `returnDays`, `paymentMethods`
- `location`, `deliveryOrPickupAvailable`
- `imageUrl`, `images`, `imageCount`
- `listingType` — `BuyItNow`, `Auction` or `BestOffer`
- `bestOfferEnabled`, `timeRemaining`, `bids`, `watchCount`, `viewCount`, `soldCount`
- `quantityAvailable`
- `isSponsored` — present and `true` only on sponsored search cards
- `vehicleType` — vehicle category searched (e.g. `cars-trucks`)
- `partType`, `brand`, `mpn`, `partNumber`, `placementOnVehicle` — parts fields when shown
- `isTrendingRecommendation` — present and `true` only when `searchVehicles` runs with no keyword and no filters, meaning eBay served its curated "Trending Vehicles" module
- `recordType` — always `ebayMotorsListing`
- `scrapedAt` — ISO 8601 UTC timestamp

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `searchVehicles` | `searchVehicles`, `searchParts`, or `byListingUrls` |
| `searchQuery` | string | – | Keyword(s), e.g. `honda civic`. Empty in `searchVehicles` mode browses trending vehicles for the selected category |
| `vehicleType` | string | – (defaults to `cars-trucks`) | Vehicle category for `searchVehicles` |
| `partCategory` | string | – (defaults to `car-truck-parts`) | Parts category for `searchParts` |
| `condition` | string | – (defaults to `all`) | `all`, `new`, `used`, `certified-pre-owned`, `for-parts-not-working` |
| `buyingFormat` | string | – (defaults to `all`) | `all`, `buy-it-now`, `auction` |
| `sortBy` | string | – (defaults to `best-match`) | `best-match`, `price-asc`, `price-desc`, `distance-nearest`, `newly-listed`, `ending-soonest`, `mileage-asc`, `year-newest`, `year-oldest` (last three are vehicle-mode sorts) |
| `minPrice`, `maxPrice` | integer | – | Price range in USD |
| `minYear`, `maxYear` | integer | – | Model-year range (`searchVehicles`) |
| `maxMileage` | integer | – | Maximum odometer reading in miles (`searchVehicles`) |
| `transmission` | string | – (defaults to `all`) | `all`, `automatic`, `manual` |
| `fuelType` | string | – (defaults to `all`) | `all`, `gasoline`, `diesel`, `electric`, `hybrid` |
| `sellerUsername` | string | – | Only listings from this seller/dealer |
| `postalCode` | string | – | US ZIP for local-inventory searches |
| `distanceMiles` | string | – | Radius around the ZIP: `10` … `2000` |
| `startUrls` | array | – | Item URLs, bare item IDs or search URLs for `byListingUrls` |
| `maxItems` | integer | – (defaults to `50`) | Maximum listings to return (1–10,000) |
| `maxPages` | integer | – (defaults to `200`) | Maximum result pages to request (eBay caps each query at 200) |
| `includeItemSpecifics` | boolean | `true` | Attach the full item-specifics table to detail records |

#### Example: used Honda Civics under $15,000

```json
{
  "mode": "searchVehicles",
  "searchQuery": "honda civic",
  "condition": "used",
  "maxPrice": 15000,
  "maxItems": 50
}
```

#### Example: 2015–2020 automatic trucks with under 80,000 miles

```json
{
  "mode": "searchVehicles",
  "searchQuery": "ford f-150",
  "vehicleType": "cars-trucks",
  "minYear": 2015,
  "maxYear": 2020,
  "maxMileage": 80000,
  "transmission": "automatic",
  "sortBy": "mileage-asc",
  "maxItems": 100
}
```

#### Example: motorcycle parts search

```json
{
  "mode": "searchParts",
  "partCategory": "motorcycle-parts",
  "searchQuery": "exhaust system",
  "maxItems": 100
}
```

#### Example: enrich specific listings

```json
{
  "mode": "byListingUrls",
  "startUrls": [
    "https://www.ebay.com/itm/256789012345",
    "256789012346"
  ],
  "includeItemSpecifics": true
}
```

### Use cases

- **Vehicle shopping research** — compare price, mileage, title status and VIN across every matching listing
- **Dealer inventory tracking** — re-run a seller search or ZIP-radius search to see what changed
- **Parts sourcing** — search a parts category and keyword to compare available stock and pricing
- **Auction monitoring** — track bids, time remaining and watchers on listings you are bidding on
- **Listing enrichment** — feed a list of item IDs or URLs into `byListingUrls` for full structured detail

### FAQ

**What is the difference between the three modes?** `searchVehicles` and `searchParts` run an eBay Motors search with your filters. `byListingUrls` skips search and opens exactly the item URLs or IDs you supply; search URLs passed there are parsed as search-result pages.

**Which filters actually work on eBay Motors?** Price, condition, model year, transmission, fuel type, buying format, seller, ZIP radius and sort order are eBay's own server-side parameters. There is no reliable server-side maximum-mileage parameter, so `maxMileage` is applied by the actor after parsing — a tight cap may need more pages to fill `maxItems`. Listings with no printed mileage are kept rather than dropped blindly.

**Why is VIN or title status missing on some records?** eBay prints VIN on most dealer detail pages but omits it for some private/classified listings. Title status appears on Motors cards and detail pages when the seller provides it. Both fields are omitted rather than guessed.

**What is in `itemSpecifics`?** The detail page's full `dt`/`dd` specification table (VIN, engine, colours, warranty, country of origin, and any other rows eBay prints). Turn `includeItemSpecifics` off to keep records smaller.

**Why do I get `isTrendingRecommendation: true` records?** That only happens in `searchVehicles` mode when you leave `searchQuery` empty and apply no vehicle filter — eBay shows a curated "Trending Vehicles" module instead of a real search page. Add a keyword or any filter for genuine matches.

**How many listings can one run return?** Up to `maxItems`, capped at 10,000. Pages hold up to 240 cards and eBay caps every query at 200 pages; split by category, price or mileage for larger sweeps.

**Does this include sold or ended listings?** No. Sold/completed results require an eBay sign-in, and this actor never asks for cookies or logins.

**Do I need a proxy or API key?** No. The actor tries a direct request, then a public cookieless mirror, then an Apify proxy if needed, and chooses automatically. There are no credentials to configure.

**Is this affiliated with eBay?** No. This is an independent, third-party actor that reads eBay Motors' public listing pages; it is not operated by or affiliated with eBay Inc.

# Actor input Schema

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

Search vehicle listings, search parts & accessories, or enrich specific listing IDs/URLs.

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

Keyword(s) to search for, e.g. 'toyota camry' or 'brake pads'. Leave empty in searchVehicles mode to browse eBay's trending vehicles for the selected category.

## `vehicleType` (type: `string`):

Vehicle category used in searchVehicles mode.

## `partCategory` (type: `string`):

Parts category used in searchParts mode.

## `condition` (type: `string`):

Filter listings by condition.

## `buyingFormat` (type: `string`):

Restrict results to Buy It Now or auction listings. 'All formats' applies no filter.

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

How to order the search results.

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

Minimum listing price in USD.

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

Maximum listing price in USD.

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

Oldest model year to include (searchVehicles mode).

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

Newest model year to include (searchVehicles mode).

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

Highest odometer reading to include, in miles (searchVehicles mode).

## `transmission` (type: `string`):

Filter vehicles by transmission type.

## `fuelType` (type: `string`):

Filter vehicles by fuel type.

## `sellerUsername` (type: `string`):

Only return listings sold by this eBay seller or dealer (optional).

## `postalCode` (type: `string`):

US ZIP code used with 'Distance' for local-inventory searches (optional).

## `distanceMiles` (type: `string`):

Radius around the ZIP code. Requires a ZIP code.

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

eBay item URLs, bare item IDs or eBay search URLs to scrape in byListingUrls mode.

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

Maximum number of listings to return (1–10,000).

## `maxPages` (type: `integer`):

Maximum search result pages to request. eBay caps every query at 200 pages.

## `includeItemSpecifics` (type: `boolean`):

Attach the complete item-specifics table to listing-detail records (byListingUrls mode).

## Actor input object example

```json
{
  "mode": "searchVehicles",
  "searchQuery": "honda civic",
  "vehicleType": "cars-trucks",
  "partCategory": "car-truck-parts",
  "condition": "all",
  "buyingFormat": "all",
  "sortBy": "best-match",
  "transmission": "all",
  "fuelType": "all",
  "startUrls": [],
  "maxItems": 3,
  "maxPages": 1,
  "includeItemSpecifics": true
}
```

# Actor output Schema

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

Dataset containing all scraped eBay Motors vehicle and parts listings.

# 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 = {
    "mode": "searchVehicles",
    "searchQuery": "honda civic",
    "vehicleType": "cars-trucks",
    "partCategory": "car-truck-parts",
    "condition": "all",
    "buyingFormat": "all",
    "sortBy": "best-match",
    "transmission": "all",
    "fuelType": "all",
    "startUrls": [],
    "maxItems": 3,
    "maxPages": 1,
    "includeItemSpecifics": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("dataspryva/ebay-motors-search-and-listing-detail-extractor").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 = {
    "mode": "searchVehicles",
    "searchQuery": "honda civic",
    "vehicleType": "cars-trucks",
    "partCategory": "car-truck-parts",
    "condition": "all",
    "buyingFormat": "all",
    "sortBy": "best-match",
    "transmission": "all",
    "fuelType": "all",
    "startUrls": [],
    "maxItems": 3,
    "maxPages": 1,
    "includeItemSpecifics": True,
}

# Run the Actor and wait for it to finish
run = client.actor("dataspryva/ebay-motors-search-and-listing-detail-extractor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "mode": "searchVehicles",
  "searchQuery": "honda civic",
  "vehicleType": "cars-trucks",
  "partCategory": "car-truck-parts",
  "condition": "all",
  "buyingFormat": "all",
  "sortBy": "best-match",
  "transmission": "all",
  "fuelType": "all",
  "startUrls": [],
  "maxItems": 3,
  "maxPages": 1,
  "includeItemSpecifics": true
}' |
apify call dataspryva/ebay-motors-search-and-listing-detail-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dataspryva/ebay-motors-search-and-listing-detail-extractor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/DJR9OayaE47kxYQcl/builds/Bn0UdOQIp6XVgxUMu/openapi.json
