Put current credit-union auto loan rates in your app.
Use GET /v1/rates or POST /v1/rates with product_type=auto_loan. The response is structured for comparison: lender, source product name, rate, APR, term, vehicle condition, state, and an as_of timestamp on every row.
The shortest working request
/v1/ratesReturn current auto-loan rows, filtered and sorted on the server.
curl "https://api.rateapi.dev/v1/rates?product_type=auto_loan&state=TX&term_months=60&sort=apr_asc&limit=50" \ -H "Authorization: Bearer $RATEAPI_KEY"{ "pagination": { "limit": 50, "offset": 0, "returned": 50, "total": 184, "has_more": true }, "rates": [{ "lender": "Example Credit Union", "state": "TX", "product_type": "auto_loan", "product_name": "New Auto up to 60 Months", "rate": 5.49, "apr": 5.49, "term_months": 60, "vehicle_condition": "new", "as_of": "2026-09-05T08:15:00Z" }], "as_of": "2026-09-05T08:15:00Z"}as_of rather than copying sample numbers.Filters that matter for auto lending
- state
- One state, several comma-separated states, or a named region. Use geography to compare products the user can plausibly access.
- term_months
- Compare like with like: a 36-month rate and an 84-month rate are different products.
- vehicle_condition
- Returned when the source distinguishes new, used, refinance, or other vehicle conditions.
- rate and apr
- Keep both. Rate prices the principal; APR is the standardized cost measure when the publisher supplies it.
- product_name
- The institution’s product identity. Display it; do not rewrite it during normalization.
- as_of
- When the published row was observed. This is required for every served rate.
A production integration in TypeScript
Validate the HTTP status, type the boundary, and apply your freshness policy before rendering.
type AutoRate = Readonly<{ lender: string; state: string; product_name: string; rate: number | null; apr: number | null; term_months: number | null; vehicle_condition: string | null; as_of: string;}>; const response = await fetch("https://api.rateapi.dev/v1/rates", { method: "POST", headers: { Authorization: `Bearer ${process.env.RATEAPI_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ product_type: "auto_loan", state: "TX", term_months: 60, sort: "apr_asc", limit: 100, }),}); if (!response.ok) throw new Error(`RateAPI returned ${response.status}`);const payload = (await response.json()) as { rates: ReadonlyArray<AutoRate> };const freshRates = payload.rates.filter((row) => Date.now() - Date.parse(row.as_of) < 3 * 86_400_000);From a rate table to a useful product
Query a comparable cohort
Fix geography, term, and vehicle condition before sorting. A global list of unlike products is not a comparison.
Resolve membership eligibility
Intersect the rate results with
/v1/eligibility/searchso the first offer is one the user can actually obtain.Render provenance and time
Show product identity and
as_ofwith the number. Freshness is part of the value, not footer metadata.
Frequently asked questions
Yes. RateAPI exposes current published auto-loan rows from US credit unions through GET or POST /v1/rates. Filter product_type=auto_loan and optionally add state, lender, term_months, APR bounds, and sorting.
Returned rows carry vehicle_condition when the institution publishes it, and product_name remains the institution’s own product identity. Use those fields to distinguish new, used, and refinance products without rewriting the source product name.
Use the as_of timestamp on every row, show it near the rate, and suppress a row when it exceeds your freshness policy. Never present an undated rate as current.
No. RateAPI covers US credit unions. It does not mix banks, benchmark indices, or non-US institutions into the inventory.