Mortgage and Loan Rate Tracking
Watch published mortgage, auto, and personal loan rates and fire an alert when they move enough to be worth refinancing or locking in.
The scenario
You're shopping for a mortgage or thinking about refinancing. Daily rate sheets shift in fractions of a percent that matter a lot on a 30-year loan. The bank's web page updates whenever their treasury desk does, often without warning. Manually checking three lenders' rate pages every morning is the kind of task that gets dropped after the first week.
The same pattern fits auto loan rate shopping, personal loan APR comparison, and HELOC rate watching.
The problem
Lender rate pages are designed for humans browsing once. They aren't APIs. The rates themselves are sometimes plain numbers ("6.875%"), sometimes embedded inside marketing copy ("as low as 6.875%"), sometimes loaded via JavaScript from a backend that varies by ZIP code.
Aggregators like Bankrate exist, but their displayed rates are advertised - not necessarily the rates you'll actually get. To make a real refi decision you want to watch the lenders you'd actually borrow from.
How Verid solves it
For a lender whose rate page has a clean DOM structure, CSS selectors do the job. For lender pages where the rate is buried in prose ("today's 30-year fixed APR is around 6.5%"), Verid's prompt extractor reads the rendered page with an LLM and returns a numeric rate matching your schema.
Then a percent-decrease predicate fires when the rate drops by enough to matter - say, 0.25 percentage points.
Build the monitor
Extraction config - CSS for structured pages
{
"method": "css",
"fields": {
"rate_30yr_fixed": ".rate-table tr[data-product='30-year-fixed'] .rate-apr",
"rate_15yr_fixed": ".rate-table tr[data-product='15-year-fixed'] .rate-apr"
}
}
Extraction config - Prompt for prose-style pages
{
"method": "prompt",
"prompt": "Extract today's 30-year fixed mortgage APR from this lender page. Return only the numeric percent without the % sign (e.g. 6.875).",
"schema": { "rate_30yr_fixed": "number" }
}
Predicate
A 0.25 absolute percent-point drop is meaningful on a 30-year mortgage:
{ "type": "field_decreases_by_absolute", "field": "rate_30yr_fixed", "threshold": 0.25 }
Create the monitor
curl -X POST https://api.verid.dev/v1/monitors \
-H "Authorization: Bearer vrd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Lender - 30yr fixed APR",
"url": "https://www.lender.example.com/mortgage/rates",
"schedule_interval_seconds": 14400,
"extract_config": {
"method": "prompt",
"prompt": "Extract today's 30-year fixed mortgage APR from this lender page. Return only the numeric percent without the % sign (e.g. 6.875).",
"schema": { "rate_30yr_fixed": "number" }
},
"diff_predicate": { "type": "field_decreases_by_absolute", "field": "rate_30yr_fixed", "threshold": 0.25 },
"deliveries": [
{ "type": "email", "to": "you@example.com" }
]
}'
SDK:
import { VeridClient } from '@verid.dev/sdk';
const client = new VeridClient({ apiKey: 'vrd_your_api_key' });
await client.monitors.create({
name: 'Lender - 30yr fixed APR',
url: 'https://www.lender.example.com/mortgage/rates',
schedule_interval_seconds: 14400,
extract_config: {
method: 'prompt',
prompt:
"Extract today's 30-year fixed mortgage APR from this lender page. Return only the numeric percent without the % sign (e.g. 6.875).",
schema: { rate_30yr_fixed: 'number' },
},
diff_predicate: {
type: 'field_decreases_by_absolute',
field: 'rate_30yr_fixed',
threshold: 0.25,
},
deliveries: [{ type: 'email', to: 'you@example.com' }],
});
What the webhook delivers
{
"id": "del_01H...",
"fired_at": "2026-05-08T11:00:00Z",
"diff": {
"fields_changed": ["rate_30yr_fixed"],
"before": { "rate_30yr_fixed": 6.875 },
"after": { "rate_30yr_fixed": 6.5 }
}
}
Caveats & tips
- ZIP-code-aware rate pages. Some lenders show different rates per region inferred from your IP. Verid's IP will not match yours, so the page may render the lender's national-average view rather than your local view. Confirm by visiting the same URL from a server.
- Four-hour interval is usually enough. Lender rates move once or twice during a business day. Hammering the page every minute wastes runs without surfacing more signal.
- Use absolute, not percent, predicates for rates. "0.25 percentage points" is meaningful in a way that "5% relative drop" isn't - a drop from 6.5% to 6.18% is a 5% relative drop, but only 0.32 points absolute, which actually does matter on a mortgage.
Related use cases
For FX moves, see currency / FX rate monitoring. For stock prices, see stock price drop alerts. For regulatory pages that affect lending compliance, see regulatory filings & policy pages.
Related use cases
Ship this monitor today
5 monitors free, no credit card. Set up takes about a minute.
Get started free