Add current mortgage rates to your product.

Call /v1/rates with product_type=mortgage. Filter by geography and loan scenario, then render the lender’s published product name, rate, APR, points, and as_of. The inventory covers US credit unions and keeps benchmark series separate.

Last updated 2026-09-05US credit unions onlyServer-side RESTOpenAPI documented

The request your backend makes

POST/v1/rates

Query a comparable mortgage cohort and sort it on the server.

$30-year conventional mortgage offers in North Carolina
curl -X POST "https://api.rateapi.dev/v1/rates" \
-H "Authorization: Bearer $RATEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_type": "mortgage",
"state": "NC",
"term_months": 360,
"loan_program": "conventional",
"occupancy": "primary",
"sort": "apr_asc",
"limit": 50
}'

Model the scenario before ranking

state
Mortgage pricing and product availability vary geographically. Query the borrower’s market.
term_months
Use 360 for a 30-year term or 180 for a 15-year term when those are the cohorts you intend to compare.
loan_program
Keep conventional, FHA, VA, jumbo, and other published programs in their own comparable cohorts.
occupancy
Primary residence, second home, and investor pricing are different products.
rate, apr, points
Return and display them separately. A low note rate with points is not equivalent to a zero-point offer.
as_of
The observation timestamp. Suppress stale inventory according to one explicit policy.
Do not fill a missing APR from the note rate or infer points from marketing copy. Missing and zero are different values.

A server-side integration

TSFetch the fields a rate card needs
const result = 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: "mortgage",
state: userState,
term_months: 360,
loan_program: "conventional",
sort: "apr_asc",
limit: 25,
}),
});
if (!result.ok) throw new Error(`RateAPI returned ${result.status}`);
const { rates } = await result.json();
return rates.map((offer) => ({
lender: offer.lender,
product: offer.product_name,
rate: offer.rate,
apr: offer.apr,
points: offer.points,
observedAt: offer.as_of,
}));
Keep the API key on the server. Send the browser only the rows and fields the page needs.

A mortgage rate card needs context

  1. State the scenario

    Term, program, occupancy, and points belong beside the number. Without them, two offers may only look comparable.

  2. Show rate and APR separately

    The note rate drives interest accrual; APR is a standardized cost measure. Preserve both fields.

  3. Show when it was observed

    Render as_of near the offer and remove rows that exceed your freshness policy.

  4. Keep approval language out

    A published offer is not a preapproval. Let the lender make underwriting claims.

Frequently asked questions