# Cycle Trader Scraper: Motorcycle Listings & Filters (`getascraper/cycletrader-listings-scraper`) Actor

Scrape CycleTrader.com motorcycle listings with real search filters: zip/radius, make, price, year, mileage, condition, seller type, and keyword. Optional detail mode adds horsepower, days listed, views, saves, stock number, and photos. US residential proxy required.

- **URL**: https://apify.com/getascraper/cycletrader-listings-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.81 / 1,000 motorcycle listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## 🏍️ Cycle Trader Scraper: Motorcycle Listings & Filters

<table width="100%" style="width:100%;border-collapse:collapse">
<tr style="width:100%">
<td style="background:#8b1e1e;border-radius:10px;padding:28px;text-align:center" colspan="1">
<span style="color:#ffffff;font-size:22px;font-weight:700">Real Cycle Trader listings, filtered your way</span><br/>
<span style="color:#f5d9d9;font-size:15px">Search by zip code, make, price, year, mileage, condition, and seller type, right in the form. No CycleTrader search URL to build by hand.</span>
</td>
</tr>
</table>

<table width="100%" style="width:100%;border-collapse:collapse;margin-top:16px">
<tr style="width:100%">
<td width="25%" style="background:#fbeaea;border:1px solid #edcccc;border-radius:8px;padding:16px;text-align:center;vertical-align:top">
<strong style="color:#5c1414">🎯 Real search filters</strong><br/>
<span style="color:#333">Location, make, price, year, mileage, condition, and seller type, set directly in the Console.</span>
</td>
<td width="25%" style="background:#fbeaea;border:1px solid #edcccc;border-radius:8px;padding:16px;text-align:center;vertical-align:top">
<strong style="color:#5c1414">🔗 No URL building</strong><br/>
<span style="color:#333">Never learn CycleTrader's search syntax or paste a hand-built link.</span>
</td>
<td width="25%" style="background:#fbeaea;border:1px solid #edcccc;border-radius:8px;padding:16px;text-align:center;vertical-align:top">
<strong style="color:#5c1414">🔧 Deep listing data on demand</strong><br/>
<span style="color:#333">Optional detail mode adds horsepower, color, days listed, views, saves, and dealer phone.</span>
</td>
<td width="25%" style="background:#fbeaea;border:1px solid #edcccc;border-radius:8px;padding:16px;text-align:center;vertical-align:top">
<strong style="color:#5c1414">🧹 Clean, honest data</strong><br/>
<span style="color:#333">Only real fields get filled in. Nothing fake ever pads out your dataset.</span>
</td>
</tr>
</table>

### 🔍 What does Cycle Trader Scraper do?

**Cycle Trader Scraper reads live motorcycle listings from [CycleTrader.com](https://www.cycletrader.com/)**, the largest US motorcycle marketplace, and turns them into structured, downloadable data: year, make, model, price, mileage, dealer name, and distance from your search location on every run.

Search nationwide or near a zip code, and narrow results by make, keyword, price range, model year, mileage, condition, and seller type, all set directly in the Console form. Turn on detail mode to also collect horsepower, primary color, category, stock number, listing code, days on market, page views and saves, dealer phone number, full description, and photo count for every listing.

### 🤔 Why use Cycle Trader Scraper?

The only other Cycle Trader scraper on the Apify Store accepts a single raw start URL and nothing else. To search by price, year, or location, you have to know CycleTrader's own search page well enough to build that URL yourself first. This Actor puts every one of those filters directly in the input form.

- **"I need to know what every dealer within 100 miles is asking for a used Sportster this week."** Dealers and resellers pull competitor pricing by zip code and radius on a schedule, without opening a browser.
- **"I'm tracking average resale price by make and model year for a market report."** Researchers and data teams filter by year range and mileage to build clean price comparisons across makes.
- **"My sales team needs a fresh list of private-seller listings in our region every morning."** Lead-gen agencies filter by seller type and location to turn listings into a workable contact list.

### 🚀 How to use Cycle Trader Scraper

<table width="100%" style="width:100%;border-collapse:collapse;margin:12px 0">
<tr style="width:100%">
<td width="33%" style="background:#fdf5f5;border:1px solid #edcccc;border-radius:8px;padding:14px;text-align:center;vertical-align:top">
<strong style="color:#5c1414">1. Set your search</strong><br/>
<span style="color:#333">Pick a zip code and radius, or search nationwide. Add make, price, or year filters if you want them.</span>
</td>
<td width="33%" style="background:#fdf5f5;border:1px solid #edcccc;border-radius:8px;padding:14px;text-align:center;vertical-align:top">
<strong style="color:#5c1414">2. Run the Actor</strong><br/>
<span style="color:#333">It reads CycleTrader's real listings directly. Turn on detail mode for the full spec sheet per listing.</span>
</td>
<td width="33%" style="background:#fdf5f5;border:1px solid #edcccc;border-radius:8px;padding:14px;text-align:center;vertical-align:top">
<strong style="color:#5c1414">3. Export your data</strong><br/>
<span style="color:#333">Download as JSON, CSV, or Excel, or connect it to your own pipeline.</span>
</td>
</tr>
</table>

1. Click **Try for free** and open the Input tab.
2. Set a **Zip Code** and **Radius**, or leave both blank to search nationwide.
3. Optionally add a **Make**, **Keyword**, price range, model year range, maximum mileage, **Condition**, or **Seller Type**.
4. Turn on **Scrape Detail Pages** if you want horsepower, color, days listed, views, saves, and dealer phone too.
5. Set **Max Listings** and click **Start**. Results land in the Output tab as they're collected.

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `startUrls` | array of URLs | No | Paste direct CycleTrader search or category URLs to scrape exactly those pages. Overrides every filter below when set. |
| `zipCode` | string | No | US zip code to center the search on. Leave blank to search nationwide. |
| `radius` | integer | No | Search radius in miles from the zip code. Only used when Zip Code is set. |
| `keyword` | string | No | Free-text keyword, matched the same way CycleTrader's own keyword search box works. |
| `make` | string | No | Motorcycle make to filter by, e.g. "Honda" or "Harley-Davidson". Matched live against CycleTrader's own current make list. |
| `minPrice` / `maxPrice` | integer | No | Minimum and maximum listing price in USD. |
| `minYear` / `maxYear` | integer | No | Minimum and maximum model year. |
| `maxMileage` | integer | No | Maximum odometer reading, in miles. |
| `condition` | enum | No | `any`, `new`, or `used`. |
| `sellerType` | enum | No | `any`, `dealer`, or `private`. |
| `scrapeDetails` | boolean | No | When on, visits each listing's own page for horsepower, color, category, stock number, listing code, days listed, views, saves, dealer phone, description, and photo count. Adds time and cost per listing. |
| `maxItems` | integer | No | Maximum number of listings to scrape in this run. |
| `proxyConfiguration` | object | No | Proxy settings. Defaults to US residential proxy, which this target requires. |

### 📤 Output

Each item in the dataset looks like this:

```json
{
  "listingId": "5042089359",
  "url": "https://www.cycletrader.com/listing/2027-Moto+Guzzi-V85+Strada+base-5042089359",
  "year": 2027,
  "make": "Moto Guzzi",
  "model": "V85 Strada Base",
  "title": "New 2027 Moto Guzzi V85 Base Strada For Sale in Los Angeles, CA",
  "price": 12390,
  "condition": "New",
  "category": "Dual Sport",
  "vehicleType": "Motorcycle",
  "location": "Los Angeles, CA",
  "horsePower": 80,
  "stockNumber": "MG37707",
  "primaryColor": "Nero Isola",
  "daysListed": 17,
  "views": 10,
  "saves": 0,
  "willingToNegotiate": false,
  "dealerPhone": "1-951-416-3714",
  "photoCount": 4
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### 📊 Data table

| Field | Type | Description |
|---|---|---|
| `listingId` | string | CycleTrader's internal listing ID. |
| `url` | string | Link to the listing on cycletrader.com. |
| `year` / `make` / `model` | number / string | Model year, make, and model. |
| `title` | string | The listing's full title as shown on CycleTrader. |
| `price` | number | Asking price in USD. |
| `mileage` | number | Odometer reading, when the seller discloses it. |
| `dealerName` | string | Dealer or "Private Seller" name shown on the listing card. *(search results only)* |
| `distanceMiles` | number | Distance from your search zip code, when a zip code is set. |
| `featured` | boolean | Whether CycleTrader marks the listing as a featured/promoted result. |
| `condition` | string | `New` or `Used`. *(detail fetch only)* |
| `category` / `vehicleType` | string | CycleTrader's own category (e.g. "Sport Touring", "Cruiser") and vehicle type. *(detail fetch only)* |
| `location` | string | City and state where the motorcycle is located. *(detail fetch only)* |
| `horsePower` | number | Manufacturer horsepower rating, when published. *(detail fetch only)* |
| `stockNumber` / `listingCode` | string | Dealer stock number and CycleTrader's own listing code, when shown. *(detail fetch only)* |
| `primaryColor` | string | Listed primary color. *(detail fetch only)* |
| `daysListed` | number | Days the listing has been live on CycleTrader. *(detail fetch only)* |
| `views` / `saves` | number | Page views and save count shown on the listing. *(detail fetch only)* |
| `willingToNegotiate` | boolean | Whether the seller has marked the price negotiable. *(detail fetch only)* |
| `dealerPhone` | string | Dealer contact number, when published. *(detail fetch only)* |
| `description` | string | Full listing description text. *(detail fetch only)* |
| `photoCount` | number | Number of photos on the listing. *(detail fetch only)* |
| `images` | array | Photo URLs, when available. *(detail fetch only)* |

### 💰 Pricing

Cycle Trader Scraper uses Apify's pay-per-event pricing. You only pay for the listings actually returned, an empty run costs nothing, and there's no subscription to manage.

- **Search-results mode** (default): **$3.75 per 1,000 listings**.
- **Detail mode** (`scrapeDetails: true`): an additional **$28.25 per 1,000 listings**, on top of the base price, for a combined **$32.00 per 1,000 listings**. Detail mode visits each listing's own page for horsepower, days listed, views, saves, and photos, and that page takes real time and cost to fetch on this anti-bot-protected site, which the two-tier price reflects.

Free plan runs are limited to 25 listings per run, 3 runs per day, and a short wait between runs. Upgrade to a paid Apify plan to remove these limits.

### ⭐ Enjoying Cycle Trader Scraper?

<table width="100%" style="display:table;width:100%;border-collapse:collapse">
<tr>
<td style="background:#fbeaea;border:1px solid #edcccc;border-radius:8px;padding:16px;text-align:center">
<span style="color:#5c1414;font-size:15px">If this Actor helped you find the right bikes faster, a quick rating helps other buyers find it too. ⭐⭐⭐⭐⭐</span>
</td>
</tr>
</table>

### 🛠️ Tips or advanced options

- Leave **Zip Code** blank to search nationwide across CycleTrader's full inventory.
- Combine **Make** with a **Model Year** range to build a clean, single-model comparison sheet in one run.
- Keep **Scrape Detail Pages** off for a fast price-and-mileage sweep; turn it on only when you need horsepower, color, or dealer phone data, since it adds one request per listing.
- Use **Seller Type** set to Private to pull only owner-listed bikes when building a lead list, skipping dealer inventory entirely.
- Schedule this Actor to run daily against the same search to track new listings and price changes in your area over time.

### ❓ FAQ

**Do I need to know CycleTrader's search URL format?**
No. Set your filters in the Input tab and this Actor builds the search for you. Advanced users can still paste their own CycleTrader URLs directly if they prefer.

**Does this need a CycleTrader account or login?**
No. It reads CycleTrader's own public listing pages. No account, login, or API key needed.

**Why does detail mode cost more?**
Detail mode visits each listing's own page for fields the search results page doesn't show, like horsepower, dealer phone, and days on market. That's one extra request per listing.

**Is this legal?**
This Actor reads publicly available listing pages that require no login. It does not access any private, paywalled, or authenticated data. Always review the target site's terms before large-scale or commercial use, and reach out via the Issues tab with any questions.

### 🔗 Other actors

- [Car & Classic Scraper: Sold Prices & Listings](https://apify.com/getascraper/carandclassic-scraper) ↗ - tracks classic and collector vehicle listings and sold prices.
- [Carsales.com.au Cars Scraper: Used car listings](https://apify.com/getascraper/carsales-au-cars-scraper) ↗ - pulls used car listings from Australia's largest car marketplace.
- [AutoTrader South Africa Cars Scraper](https://apify.com/getascraper/autotrader-za-cars-scraper) ↗ - extracts car listings from South Africa's AutoTrader.
- [Cars24 Cars Scraper: India Used Car Listings](https://apify.com/getascraper/cars24-scraper) ↗ - scrapes used car listings and pricing from Cars24 India.
- [CarParts.com Scraper: Prices, Stock & Specs](https://apify.com/getascraper/carparts-com-scraper) ↗ - tracks auto parts pricing, stock, and specs.

# Changelog

This Actor's version history is a separate document: https://apify.com/getascraper/cycletrader-listings-scraper/changelog.md

# Actor input Schema

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

Optional. Paste direct CycleTrader.com search or category page URLs to scrape exactly those pages. When set, this overrides every filter below, so leave it empty to use the structured filters instead.

## `zipCode` (type: `string`):

US zip code to search near. Maps directly to CycleTrader's own location filter. Leave empty to search nationwide.

## `radius` (type: `integer`):

How far from the zip code to search, in miles. Only used when Zip Code is set. CycleTrader's own presets are 25, 50, 100, 200, and 500 miles.

## `keyword` (type: `string`):

Free-text keyword search, matched the same way CycleTrader's own "Keyword" filter box works (e.g. a trim name or feature). Applied through CycleTrader's live filter panel at run time, so the run log will warn if the control can't be found rather than silently ignoring it. The incumbent CycleTrader scraper on Apify has no keyword filter at all, only a raw start-URL field.

## `make` (type: `string`):

Motorcycle make to filter by, e.g. "Honda" or "Harley-Davidson". Matched live against CycleTrader's own current make list at run time (not a hardcoded list that can go stale), so use the exact name shown on cycletrader.com. Leave empty to include all makes.

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

Only include listings priced at or above this amount. Leave empty for no minimum.

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

Only include listings priced at or below this amount. Leave at 0 for no maximum.

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

Only include motorcycles from this model year or newer. Leave at 0 for no minimum.

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

Only include motorcycles from this model year or older. Leave at 0 for no maximum.

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

Only include listings with at most this many miles on the odometer. Leave at 0 for no limit.

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

Filter by whether the listing is for a new or used motorcycle.

## `sellerType` (type: `string`):

Filter by whether the listing comes from a dealer or a private seller.

## `scrapeDetails` (type: `boolean`):

Visit each listing's own detail page to also collect horsepower, days listed, page views, saves, stock number, listing code, primary color, full description, and photo URLs. Off by default because it roughly doubles requests per item; the search results page alone already gives you price, mileage, year, make, model, and dealer name.

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

Maximum number of motorcycle listings to scrape in this run. Keep this modest for a first test; raise it once you've checked the output looks right.

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

CycleTrader.com is protected by DataDome bot detection. A datacenter proxy is blocked outright at the CDN level, and even a residential IP without a real browser only gets a DataDome challenge page instead of data (both confirmed by live testing). US residential proxy is required for reliable access.

## Actor input object example

```json
{
  "startUrls": [],
  "zipCode": "90210",
  "radius": 100,
  "keyword": "",
  "make": "",
  "minPrice": 0,
  "maxPrice": 0,
  "minYear": 0,
  "maxYear": 0,
  "maxMileage": 0,
  "condition": "any",
  "sellerType": "any",
  "scrapeDetails": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "startUrls": [],
    "zipCode": "90210",
    "radius": 100,
    "keyword": "",
    "make": "",
    "minPrice": 0,
    "maxPrice": 0,
    "minYear": 0,
    "maxYear": 0,
    "maxMileage": 0,
    "condition": "any",
    "sellerType": "any",
    "scrapeDetails": false,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/cycletrader-listings-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 = {
    "startUrls": [],
    "zipCode": "90210",
    "radius": 100,
    "keyword": "",
    "make": "",
    "minPrice": 0,
    "maxPrice": 0,
    "minYear": 0,
    "maxYear": 0,
    "maxMileage": 0,
    "condition": "any",
    "sellerType": "any",
    "scrapeDetails": False,
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/cycletrader-listings-scraper").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 '{
  "startUrls": [],
  "zipCode": "90210",
  "radius": 100,
  "keyword": "",
  "make": "",
  "minPrice": 0,
  "maxPrice": 0,
  "minYear": 0,
  "maxYear": 0,
  "maxMileage": 0,
  "condition": "any",
  "sellerType": "any",
  "scrapeDetails": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call getascraper/cycletrader-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/cycletrader-listings-scraper"
        }
    }
}
```

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/k0DazEaHfQbPVkDcI/builds/soWkboFo2sdTDrEnj/openapi.json
