RV Chooser Marketplace API
Unified search over used RVs listings with model-level specs, market comparison, de-duplication, anonymous personalization and buyer lead capture.
RV-readable spec: /api/openapi
Try it
- GET /api/inventory?sort=price_asc
- GET /api/inventory?maxPrice=80000&hasPrice=1
- GET /api/market
- GET /api/recommendations?limit=6
Endpoints
Search listings (de-duplicated by default) with filters, sorting, pagination and facet counts
| q | string | Full-text search (make, model, category, location, description) |
| category | string | Normalized category; repeat or comma-separate |
| make | string | Make; multi |
| model | string | Normalized model key; multi |
| state | string | US state code; multi |
| location | string | City; multi |
| minPrice | number | USD |
| maxPrice | number | USD |
| year | integer | |
| minYear | integer | |
| maxYear | integer | |
| minHours | integer | |
| maxHours | integer | |
| hasPrice | string | 1 = only priced listings |
| sort | string | (relevance, price_asc, price_desc, year_desc, year_asc, hours_asc, hours_desc, newest) |
| page | integer | 1-based |
| pageSize | integer | 1-100 (default 24) |
| track | string | 0 = don't record as a personalization signal |
200 { total, page, pageSize, totalPages, items[], facets{category,make,model,state,location}, ranges }
default Error
One listing with model specs and price history
| id | string |
200 Listing
404 Not found
default Error
Side-by-side comparison: specs, market median for comparable listings, deal score, similar listings
| ids | string | Comma-separated listing ids (max 4) |
200 { spec_keys[], items[{...listing, model_specs, market{n,median,p25,p75,med_hours,basis}, deal{score,label,price_vs_market_pct}, similar[]}] }
default Error
Recommendations for the current visitor (uid cookie or X-User-Id header)
| limit | integer | max 24 |
| similarTo | string | seed listing id |
200 { strategy, profile, items[] with score & reasons }
default Error
Submit a buyer request (availability, quote, financing, inspection) for a listing or in general
201 { ok, leadId }
400 validation error
default Error
Public market aggregates (index, or ?category=<slug> / ?model=<make-model slug>) with as_of date and attribution
| category | string | Category slug |
| model | string | Model slug |
200 { type, as_of, stats{n,median,p25,p75,min,max,med_hours}, price_by_year[], hours_distribution[], ... }
404 { error{code,message,resolution} }
default Error
List favorites
200 { items[] }
default Error
Add/remove favorite
200 ok
default Error
Record an interaction signal
200 ok
default Error
Personalization, comparison and leads
A uid cookie is set on first visit (API clients may send X-User-Id). Views, favorites, searches, filters, comparisons and inquiries drive a content-based profile (category, make, model, price, year, mileage; 30-day decay). Cold start ranks by price vs. category median plus popularity. /api/compare returns reference model specs, the market median of comparable active listings (same model family ±2 years, else same category), a 0-100 deal score and similar listings. POST /api/leads records a buyer request (availability, quote, financing or inspection) that the RV Chooser team follows up on.