Inventory Search

Search active dealer motorcycle listings currently for sale in US market with comprehensive filtering, sorting, analytics, and geographic targeting capabilities for motorcycles.
Limited Support Warning: Motorcycle APIs is maintained less frequently than our primary cars dataset, with reduced priority and support. Data quality, coverage, and feature updates may be less comprehensive and occur less often than in our core automotive offerings.

The Motorcycle Inventory Search API provides access to active motorcycle listings from dealers across the US market. This comprehensive search tool enables motorcycle dealers, marketplaces, and consumers to discover, filter, and analyze motorcycles with sophisticated filtering capabilities designed specifically for the motorcycle industry.

Whether you're building motorcycle marketplace applications, dealer inventory systems, or consumer search tools, this API delivers the specialized functionality needed for motorcycle applications with extensive parameter options covering motorcycle-specific features like engine displacement, transmission types, drivetrain configurations, and motorcycle categories.

Overview

  • Access active dealer motorcycle inventory across US markets with thousands of listings
  • Data updates published regularly for current market conditions
  • Comprehensive filtering with 50+ parameters specific to motorcycles

Units & Conventions:

Field / PatternUnitNotes
price, msrpUSD (US)Applies to all price-like currency fields
miles, radius, distMilesApplies to both markets in request as well as response
*_atUnix epoch seconds (UTC)Applies to all timestamp fields (e.g. last_seen_at)
*_at_dateISO-8601 YYYY-MM-DDThh:mm:ssZ (UTC)Same instant as the matching *_at field
engine_displacementCubic centimeters (cc)Engine displacement specifications
weightPounds (lbs)Motorcycle weight specifications

Base Path

GET https://api.marketcheck.com/v2/search/motorcycle/active

The following example demonstrates a basic search request with common parameters:

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {
api_key: 'YOUR_API_KEY',
rows: 2,
make: 'Harley-Davidson',
year: '2023',
start: '0',
facets: 'vehicle_type',
stats: 'price'
},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}

Explore the full range of parameters available for filtering, sorting, and configuring search results in the Parameters section below.

Request

The Motorcycle Inventory Search API provides extensive filtering and search capabilities for motorcycle listings. You can search by motorcycle specifications, geographic location, pricing ranges, dealer types, and numerous other criteria to find the exact motorcycles you need.

Parameters

Available parameters for filtering, sorting, and configuring search results:

39 Params
api_key
string required

Your MarketCheck API authentication key. Required for every request, unless OAuth is used.

body_type
string

Filters listings by body type (e.g., SUV, Pickup, Sedan, Hatchback, Convertible). Accepts multiple values separated by commas.

city
string

Filters listings by city name (e.g. Los Angeles, San Francisco, Houston).

cylinders
string

Filters listings by engine cylinder count (e.g., 4, 6, 8). Accepts multiple values as a comma-separated list.

dealer_id
string

Filters listings by MarketCheck dealer ID.

drivetrain
string

Filters listings by drivetrain (FWD, RWD, 4WD). Accepts multiple values separated by commas.

engine
string

Filters listings by engine designation (e.g., 2.0L I4, 3.5L V6, 2.5L H4). Accepts multiple values as comma-separated list.

facet_sort
string

Sorts facet buckets. Allowed values — count (descending count, default) or index (alphabetical).

facets
string

Field name to return bucket facets for. Accepts multiple fields as a comma-separated list.

first_seen_days
string

Filters listings by the number of days since they were first seen in MarketCheck inventory. Specify as min-max days. Alternative of first_seen_range.

first_seen_range
string

Filters listings by the first seen date. Specify as YYYYMMDD-YYYYMMDD (e.g., 20220523-20220631). Alternative of first_seen_days.

fuel_type
string

Filters listings by fuel type (e.g., Unleaded, Diesel, Electric, Premium Unleaded, Electric / Unleaded). Accepts multiple values separated by commas.

last_seen_days
string

Filters listings by the number of days since last seen. Specify as min-max days. Alternative of last_seen_at_range.

last_seen_range
string

Filters listings by last seen date. Specify as YYYYMMDD-YYYYMMDD (e.g., 20220523-20220631). Alternative of last_seen_at_days.

latitude
float

Latitude component of the search location (decimal degrees). Used for geospatial queries along with longitude and radius parameters.

longitude
float

Longitude component of the search location (decimal degrees). Used for geospatial queries along with latitude and radius parameters.

make
string

Filters listings by vehicle make (e.g., Toyota, Ford, Mercedes-Benz). Accepts multiple values as comma-separated list.

miles_range
string

Filters listings by odometer reading. Specify as min-max miles (e.g., 1000-50000).

model
string

Filters listings by specific vehicle model (e.g., Camry). Accepts multiple values separated by commas.

msa_code
string

Filters listings by Metropolitan Statistical Area (MSA) code.

msrp_range
string

Filters listings by Manufacturer's Suggested Retail Price (MSRP). Specify as min-max USD (e.g., 20000-45000).

price_range
string

Filters listings by advertised price in USD. Specify as min-max (e.g., 1000-50000).

radius
integer

Search radius around the specified location in miles. Used with zip or latitude and longitude for geospatial queries.

range_facets
string

Comma-separated list of numeric field names for which to return range facets in the response.

rows
integer

Number of results to return per request. Default — 10. Maximum — 50.

search_text
string

Text substring search within listing titles, descriptions, and other fields. Use tokenized_search_text instead for tokenized search.

sort_by
string

Field to sort results by. If omitted, defaults to distance when a location filter is used.

sort_order
string

Specifies result sort order. Allowed values — asc or desc. Default — asc.

source
string

Filters listings by source marketplace domain (e.g., autotrader.com, cars.com).

start
integer

Pagination offset (0-based). Default — 0. Maximum page is limited to 10,000/rows.

state
string

Filters listings by US or Canadian state/province code (e.g., CA, NY, ON). Accepts multiple codes separated by commas.

stats
string

Comma-separated list of numeric fields for which to return aggregate statistics (mean, max, min, count).

stock_no
string

Filters listings by dealer stock number.

transmission
string

Filters listings by transmission type (Automatic, Manual, etc.). Accepts multiple values separated by commas.

trim
string

Filters listings by vehicle trim (e.g., EX, Limited). Accepts multiple values separated by commas.

vehicle_type
string

Filters listings by vehicle type (Truck, Car). Accepts multiple values separated by commas.

vin
string

Filters listings by full 17-character Vehicle Identification Number (VIN).

year
string

Filters listings by model year (e.g., 2020). Accepts multiple years separated by commas.

zip
string

Filters listings within the specified 5-digit ZIP code.

Defaults

  • inventory_type: Returns all types (new, used) by default if not specified

Pagination

API response includes num_found property indicating the total number of motorcycle listings matching the search criteria. By default, the API returns the first page of results with 10 listings per page.

You can use start and rows parameters to iterate through search results efficiently.

Parameters:

  • start - Offset from which listings are returned (starts at 0)
  • rows - Number of listings per page (maximum 50, default 10)

Increment start proportionally to rows value for consistent pagination:

  • start=0&rows=50 - fetches listings 1-50
  • start=50&rows=50 - fetches listings 51-100
  • start=100&rows=50 - fetches listings 101-150

Limits:

  • The rows parameter accepts a maximum value of 50 (default is 10)
    • If you specify rows greater than 50, the API will automatically use the default value of 10
    • If you're on last page of results, the API will return remaining listings, which may be fewer than the requested rows
  • Your subscription package limits the total number of results you can paginate through; exceeding this limit returns an error.
Deep pagination can negatively impact performance and response times. For large-scale data extraction, consider using data feeds instead of paginating through extensive result sets.

Sorting

The Search API allows sorting results by a single numeric or date field at a time. Sorting by multiple fields simultaneously is not supported.

Sort Parameters:

  • sort_by - Field name to sort by
  • sort_order - Sort direction (asc or desc)

Default Behavior:

  • With location: sorts by distance (nearest first)
  • Without location: sorts by last_seen (desc)

Common Sort Fields

Below are the most commonly used sort fields for motorcycle searches:

Field Namesort_byData TypeDefault OrderDescription
DistancedistNumericascApplied by default for geo spatial requests
PricepriceNumericascSort listings by price
MilesmilesNumericascSort listings by mileage
YearyearNumericascSort listings by model year
MSRPmsrpNumericascSort listings by MSRP
vinvinStringascSort listings by VIN
Last Seenlast_seenDateascSort listings by last seen date
First Seenfirst_seenDateascSort listings by first seen date
Sorting fails silently with incorrect sort_by values. Results return with default sorting when invalid sort fields are specified.

Facets

The Search API supports facets for building UI filters and analyzing motorcycle inventory distribution. Use facets to get unique value counts for categorical fields and range-based counts for numeric fields.

Field Facets

Field facets return unique terms and their counts for categorical data, useful for building search filters and understanding motorcycle inventory distribution.

Parameters and Syntax

  • facets — Comma-separated list of field names to facet on. Supports pagination and minimum count:
    facets=field_name|offset|limit|min_count
    • Example: facets=make|0|60|2 returns top 60 makes with at least 2 listings each
  • facet_sort — Controls sort order of facet terms:
    • count (default): Sort by frequency (highest first)
    • index: Sort alphabetically
Properly encode facet parameters in your HTTP requests to avoid issues with the pipe (|) character, which is used to separate positional parameters. For example, use %7C for | in URLs.

Example

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {api_key: 'YOUR_API_KEY', facets: 'make,trim', facet_sort: 'count', rows: 0},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}

Response

  • Facets are returned in the facets field of the response, structured as key-value pairs
  • Keys are field names and values are arrays of objects with item and count properties
    • item is the unique term
    • count is the number of listings for that term.
{
"facets": {
    "make": [
    { "item": "Harley-Davidson", "count": 83921 },
    { "item": "Kawasaki", "count": 61173 },
    ...
    ],
    "trim": [
    { "item": "Abs", "count": 14632 },
    { "item": "Fltrx", "count": 8607 },
    ...
    ]
}
}

Available Field Facets

FieldDescription
yearMotorcycle model year
makeMotorcycle manufacturer
modelMotorcycle model name
trimMotorcycle trim level
body_typeBody style classification
vehicle_typeVehicle category (Motorcycle)
inventory_typeNew or used designation
transmissionTransmission type
fuel_typeFuel system type
engineEngine specifications
cylindersNumber of cylinders
drivetrainDrive type (Chain, Belt, Shaft)
sourceWebsite domains where listed
seller_nameDealer name (lowercase)
dealer_idMarketCheck dealer ID
cityListing city location
stateListing state location
zipListing zip code
colorColor designation

Facet Pagination

By default, facets return the top 20 terms for each field. You can control pagination using positional parameters offset, limit:

  • offset - Starting position for terms (default: 0)
  • limit - Maximum number of terms to return (default: 20, max: 1000)

Example: facets=make|20|20 returns makes 21-40

Facets Sorting

Facet terms can be sorted by count or alphabetically using the facet_sort parameter:

  • count (default) - Sort by frequency (highest first)
  • index - Sort alphabetically

Example: facets=make|0|20&facet_sort=index returns makes sorted alphabetically

Sort order is applied to all facets in the request, not individually.

Range Facets

Range facets provide statistical distribution analysis for numeric fields, creating buckets for data visualization and market insights.

Parameters and Syntax

  • range_facets — Comma-separated list of field names to facet on, with optional range and interval:
    range_facets=field_name|start|end|interval
    • start (optional): Lower bound of the range (default varies by field)
    • end (optional): Upper bound of the range (default varies by field)
    • interval (optional): Size of each bucket (default: (end - start)/20)
    • Example: range_facets=price|500|20000|1000 returns price ranges with 1000 intervals between 500 and 20000.
  • If start is specified but end is not, the API adds the default end value for that field to the start value.
  • Value of interval has to be greater than (end - start)/200, otherwise the API will return an error.
Properly encode facet parameters in your HTTP requests to avoid issues with the pipe (|) character, which is used to separate parameters. For example, use %7C for | in URLs.

Example

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {
api_key: 'YOUR_API_KEY',
make: 'Harley-Davidson',
year: '2023',
range_facets: 'price|5000|50000|5000,miles|0|50000|10000',
rows: 0
},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}

Response

  • Range facets are returned in the range_facets field of the response, structured as key-value pairs
  • Keys are field names and values are objects containing:
    • counts: Array of buckets with lower_bound, upper_bound, and count properties
    • interval: Size of each bucket
    • start: Lower bound of the range
    • end: Upper bound of the range
    • before: Count of listings below the start value
    • between: Count of listings within the range
    • after: Count of listings above the end value
  • If requested field is not allowed for range facets, it will be included in the response but with an error message indicating the field is not supported for range facets.
    {
      "range_facets": {
        "xyz": {
          "result": "Error",
          "message": "Field xyz is not allowed in range facets"
        }
      }
    }
    

Available Range Facets

FieldDescriptionDefault Range
priceMotorcycle listing price500-10500
milesMotorcycle mileage0-10000
msrpManufacturer retail price500-10000
All ranges are inclusive of lower_bound and exclusive of upper_bound. The end default value is added to your start value.

Stats

The Search API calculates comprehensive statistics for numeric fields, providing market analysis and competitive intelligence insights for motorcycle inventory.

Parameters

  • stats — Comma-separated list of fields to calculate statistics on
    • Example: stats=price,miles

Example

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {
api_key: 'YOUR_API_KEY',
year: '2023',
make: 'Harley-Davidson',
stats: 'price,miles',
rows: 0
},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}

Response

  • Statistics are returned in the stats field of the response, structured as key-value pairs
  • Keys are field names and values are objects containing:
    • min: Minimum value
    • max: Maximum value
    • count: Total number of listings with non-null values
    • missing: Number of listings with missing values
    • sum: Total sum of values
    • mean: Average value
    • stddev: Standard deviation
    • sum_of_squares: Sum of squares for variance calculation
    • median: Median value
    • percentiles: Percentile distribution (5th, 25th, 50th, 75th, 90th, 95th, 99th)
  • If requested field is not allowed for stats, it will be included in the response but with an error message indicating the field is not supported for stats
    {
      "stats": {
        "xyz": {
          "result": "Error",
          "message": "Field xyz is not allowed in stats"
        }
      }
    }
    

Available Stats Fields

Below are the available fields for statistics calculations:

FieldDescription
priceMotorcycle listing price stats
milesMotorcycle mileage statistics

Search for motorcycles available near specific locations using geographic coordinates, zip codes, or radius parameters for location-based inventory discovery.

Parameters

  • latitude and longitude - Exact coordinates
  • zip - ZIP code reference point
  • radius - Search radius in miles

You can combine location parameters with any other search filters for precise geographic targeting.

The upper limit of the radius parameter depends on your subscription package.

Example

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {api_key: 'YOUR_API_KEY', zip: '60601', radius: '50', rows: 2},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}
Radius values greater than 100 miles may slow API response times.

Response

  • Each listing includes a dist field with distance from the specified coordinates or ZIP code
  • Distance is calculated in miles and returned as a numeric value
  • Results are sorted by distance by default, with nearest listings appearing first

Response

Schema

The response includes comprehensive motorcycle listing information with nested objects for media, dealer, and motorcycle-specific build specifications.

interface MotorcycleSearchResponse {
  num_found: number; // Total number of listings matching search criteria
  listings: MotorcycleListing[]; // Array of vehicle listings
  facets?: Facets; // Field facets (when facets parameter is used)
  stats?: Stats; // Statistical data (when stats parameter is used)
  range_facets?: RangeFacets; // Range-based facets (when range_facets parameter is used)
}

interface MotorcycleListing {
  id: string; // Unique listing identifier
  heading: string; // Formatted listing title
  vin: string; // Vehicle Identification Number
  price: number; // Current listing price
  msrp: number; // Manufacturer's Suggested Retail Price (as per dealer website)
  miles: number; // Vehicle mileage
  vdp_url: string; // Vehicle detail page URL
  seller_type: string; // Type of seller (dealer, fsbo, auction)
  inventory_type: string; // Inventory classification (new, used)
  stock_no: string; // Dealer stock number
  last_seen_at: number; // Last seen timestamp (Unix Seconds), when the listing was last updated
  last_seen_at_date: string; // Last seen date (ISO format)
  scraped_at: number; // First seen timestamp (Unix Seconds), when the listing was first scraped
  scraped_at_date: string; // First seen date (ISO format)
  first_seen_at: number; // First seen timestamp (Unix Seconds), when the listing was first seen. Copy of `scraped_at` field
  first_seen_at_date: string; // First seen date (ISO format)
  source: string; // Data source website domain
  build: MotorcycleBuild; // Vehicle specifications
  dealer: MotorcycleDealer; // Dealer information
  media: MotorcycleMedia; // Photos and media content links
  vdp_url: string; // Vehicle detail page URL
  source: string; // Data source website domain
  color: string; // Exterior color description
}

interface MotorcycleMedia {
  photo_links: string[]; // Array of photo URLs from dealer website
}

interface MotorcycleDealer {
  id: string; // Unique dealer identifier
  seller_name: string; // Dealer business name
  inventory_url: string; // Dealer website URL
  data_source: string; // Original data source identifier. Mostly `mc` for MarketCheck
  status: string; // Current availability status
  listing_count: number; // Number of listings for this term
  dealer_type: string; // Dealer classification (franchise, independent)
  street: string; // Street address
  city: string; // City name
  state: string; // State or province
  country: string; // Country code
  zip: string; // Postal/ZIP code
  latitude: string; // Geographic latitude
  longitude: string; // Geographic longitude
  seller_phone: string; // Contact phone number
  seller_email?: string; // Contact email address
  created_at: string; // First seen date (ISO format)
  msa_code: string; // Metropolitan Statistical Area code
}

interface MotorcycleBuild {
  year: number; // Model year
  make: string; // Vehicle manufacturer
  model: string; // Vehicle model
  trim: string; // Trim level
  stock_no: string; // Dealer stock number
  vin: string; // Vehicle Identification Number
  mileage: number; // Vehicle mileage
  miles: number; // Vehicle mileage
  vehicle_type: string; // Vehicle category
  transmission: string; // Transmission type
  engine: string; // Engine description
  displacement: string; // Engine displacement
  drivetrain: string; // Drivetrain configuration
  engine_type: string; // Engine block configuration
  fuel_type: string; // Fuel type (gasoline, electric, hybrid, etc.)
}

interface Facets {
  [key: string]: {
    item: string; // Facet term/value
    count: number; // Number of listings for this term
  }[];
}

interface Stats {
  [key: string]: {
    min: number; // Minimum value
    max: number; // Maximum value
    count: number; // Number of values
    missing: number; // Count of missing values
    sum: number; // Sum of all values
    mean: number; // Arithmetic mean
    stddev: number; // Standard deviation
    sum_of_squares: number; // Sum of squared values
    median: number; // Median value
    percentiles: {
      [key: string]: number; // Percentile values
    };
  };
}

interface RangeFacets {
  [key: string]: {
    counts: {
      lower_bound: number; // Range lower bound
      upper_bound: number; // Range upper bound
      count: number; // Number of listings in range
    }[];
    interval: number; // Interval size
    start: number; // Starting value
    end: number; // Ending value
    before: number; // Count below start
    between: number; // Count within range
    after: number; // Count above end
  };
}

Success Response

  • 200 OK - Returns JSON object with search results
  • Always includes num_found field indicating total matching listings
  • listings array contains vehicle data (empty if no matches)
  • Optional facets, stats, and range_facets based on request parameters
  • Missing or null fields are excluded from individual listing objects

Error Response

Status CodeDescriptionCommon Causes
400Bad RequestInvalid parameter values or malformed request
401UnauthorizedMissing/invalid API key
403ForbiddenAccess denied to resource
422Unprocessable EntityPagination limits exceeded, invalid parameters
429Too Many RequestsRate limit exceeded
500Internal Server ErrorTemporary server issues
502Bad GatewayIssues with upstream services
503Service UnavailableAPI maintenance or downtime

Error Response Format

Most error responses follow this structure, except for 502 and 503 errors

{
  "code": <HTTP status code>,
  "message": "<Error message describing the issue>"
}

Use Cases & Examples

Filtering by Motorcycle Specifications

Filter listings based on specific motorcycle attributes like make, model, year, type, and motorcycle-specific features. This allows users to find motorcycles that match their exact preferences.

Example:

Here we're filtering for Sport motorcycles from 2020 to 2025 from Harley-Davidson, Honda.

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {
api_key: 'YOUR_API_KEY',
make: 'Harley-Davidson,Honda',
year_range: '2020-2025',
rows: 2
},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}

Find Motorcycle by VIN

  • Use vin parameter to search for a specific motorcycle by its VIN (Vehicle Identification Number)
  • This returns single listing (if exists) of that VIN

Example:

Here we're searching for a motorcycle by its VIN.

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {api_key: 'YOUR_API_KEY', vin: '1HD1KB4339Y654789'},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}

Range Filtering

Filter motorcycle listings within numeric ranges using the following parameters. Range values must be integers in min-max format.

ParameterTypeDefault LowerDefault UpperDescription
price_rangeinteger1000100000Filter by price range
miles_rangeinteger1000100000Filter by mileage
msrp_rangeinteger1000100000Filter by MSRP range
year_rangeinteger19812026Filter by year range

Example:

Here we're filtering for motorcycles in a specific price range.

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {api_key: 'YOUR_API_KEY', price_range: '15000-35000', rows: 5},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}

Search for specific terms across all motorcycle listing fields using the search_text parameter.

Example:

Here we're searching for motorcycles with "Sportster" mentioned anywhere in the listing.

request.js
import axios from 'axios';

const options = {
method: 'GET',
url: 'https://api.marketcheck.com/v2/search/motorcycle/active',
params: {api_key: 'YOUR_API_KEY', search_text: 'Sportster', rows: 2},
headers: {Accept: 'application/json'}
};

try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}

See Also