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.

Last updated 2026-09-05US credit unions onlyGET or POSTOpenAPI documented

The shortest working request

GET/v1/rates

Return current auto-loan rows, filtered and sorted on the server.

$Auto rates in Texas, 60-month term
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"
{}Response shape (illustrative values)
{
"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"
}
The values above illustrate the schema. Production responses contain currently servable observations; use each row’s 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.

TSFetch, type, and freshness-filter auto rates
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

  1. Query a comparable cohort

    Fix geography, term, and vehicle condition before sorting. A global list of unlike products is not a comparison.

  2. Resolve membership eligibility

    Intersect the rate results with /v1/eligibility/search so the first offer is one the user can actually obtain.

  3. Render provenance and time

    Show product identity and as_of with the number. Freshness is part of the value, not footer metadata.

Frequently asked questions