get_sold_summary
Monthly sold-vehicle statistics for US franchise and independent dealers: how many
sold, at what advertised prices, how fast, where, ranked however you ask.
A "sale" is inferred (a listing left a dealer site and met MarketCheck's sold rules);
prices are advertised asking prices, not transaction prices. History starts
January 2021 and runs through the last complete month. No auction, private-party,
UK or Canada data.
Required:
- inventory_type: new, used, certified, or all (all pools new and used into one row;
add inventory_type to ranking_dimensions to split them). There is no default.
Dates:
- date_from / date_to: YYYY-MM-DD; date_from is the first day of a month, date_to the
last day of a month (inclusive). Send both or neither; at most one year apart.
Omit both for the last complete month. A same-month year-over-year comparison
(e.g. July vs July) is more than a year, so make two calls.
Geography (summary_by, default state):
- summary_by=national for ONE ranking of the whole country. Use it for any
"in America"/"nationally" question. Never add up per-state rankings: a make only
appears in a state's rows when it makes that state's top_n, so the sum undercounts.
- summary_by=state or city_state for rankings within each state or city.
- state / city filters take comma-separated lists (OR). There is no ZIP or metro filter.
Filters (comma-separated lists are OR; text matching is case-insensitive):
- dealer_type: franchise, independent, or all.
- dealership_group_name: exact group name(s), e.g. "Lithia Motors Inc.". Don't guess
names: look them up with search_dealerships (field mc_dealership_group_name). An
unknown name returns a 422. One name contains a comma ("Americas Car-mart, Inc."),
so send it alone.
- source: the website the sold listing was found on, e.g. carmax.com. For one dealer
(rooftop), pass its inventory_url from search_dealerships / search_dealers.
Finding a dealer or dealership group (use the dealer directory, never guess):
- One dealer's sales: search_dealerships (or search_dealers) by name, city, state or
zip, then call this tool with source=<inventory_url>. This also works for dealers
that belong to no group, which is most sales.
- A whole group's sales: take mc_dealership_group_name from search_dealerships and
pass it as dealership_group_name. Only about 38% of sales carry a group, so
ranking by dealership_group_name leaves the rest out.
- Several rooftops at once: source takes a comma-separated list of inventory_urls.
- make, model, trim, body_type, body_subtype, powertrain_type (Combustion, HEV, MHEV,
BEV, PHEV, FCEV, EREV), drivetrain (4WD, FWD, RWD; there is no AWD),
transmission (Automatic, CVT, Manual), base_exterior_color, base_interior_color,
msrp_label, fuel_type_category (ice, ev, hybrid, unknown, other).
- year: model year(s), e.g. 2024 or 2020,2022. year_range: inclusive, e.g. 2020-2024,
2020- or -2024. Use year or year_range, not both.
- miles_range: inclusive odometer range, e.g. 0-60000, 60000-.
Ranking:
- ranking_dimensions: comma-separated fields to group and rank by (default
make,model,body_type). Valid: year, make, model, trim, body_type, body_subtype,
drivetrain, transmission, powertrain_type, fuel_type_category, base_exterior_color,
base_interior_color, msrp_label, dealership_group_name, source, inventory_type;
or none for a single market total. state is not a dimension: use summary_by.
- ranking_measure (default sold_count): sold_count, price_over_msrp_percentage,
price_over_mc_msrp_percentage, or a dotted statistic: price.mean, price.sum,
price.p50 (median price), dom_active.mean (average days on market),
dom_active.p50, dos_active.mean, miles.mean, msrp.mean, and others listed in the
valid-values error.
- ranking_order: desc (default) or asc.
- top_n: rows kept per group (per month and geography), not per response. Default 10.
- limit: total rows returned, 1 to 20000 (default 20000). Check `truncated` in the
response: true means the limit cut rows.
Measure filters remove whole groups after the statistics are computed, leaving the
numbers in the remaining rows unchanged (the vehicle filters above act on vehicles,
before statistics). Each takes a number with an optional >, <, >=, <= or = prefix,
e.g. ">=30":
- sold_count, price_over_msrp_percentage, price_over_mc_msrp_percentage.
- min_sold_count: shorthand for sold_count >= n.
- measure_filters: dotted statistics, e.g. {"price.mean": ">20000",
"dom_active.mean": "<45"}. average_sale_price is now price.mean, total_sale_price is
price.sum, average_days_on_market is dom_active.mean.
- By default measure filters apply AFTER rank and top_n (ranks can read 1, 3, 7), so
a floor with the default top_n of 10 often returns no rows. Either raise top_n
(e.g. 100000) or set rank_after_filters=true to filter first.
- Ascending rankings: ranking_order=asc alone returns thousands of ties at the minimum
(everything that sold once). Pair it with a floor, e.g. ranking_measure=dom_active.mean,
ranking_order=asc, min_sold_count=30, top_n=100000.
Response: `data` rows carry month, the grouping fields, rank, sold_count and nested
statistics (price, miles, dom_active, dos_active, msrp, mc_msrp with count, mean and
percentiles) plus price_over_msrp_percentage. `result_count`, `truncated`, `warnings`
and `applied` (the defaults and date window the API actually used) come back
unchanged. The service scales to zero when idle: the first call after a quiet period
can take about 9 seconds.
Errors: a 422 names the offending parameter and how to fix it; correct the call and
retry.