See where your published rate ranks in the market — via API
Send your published rate for a state and product and get back a market percentile, basis points versus the median, and a leading / competitive / overpriced verdict — computed from live credit union offers. This page explains how the API works and what it returns; the interactive tool lives in the dashboard.
How Do Loan Officers Check If Their Rate Is Competitive?
Loan officers and lenders use the RateAPI competitive-position endpoint to find out exactly where their published rate ranks against the live market. You POST a state, product (30-year or 15-year fixed), and your rate to /v1/competitive-position, and the API returns your market percentile, how many basis points you sit above or below the state median, and a plain-English verdict. It is a first-class “is my offer competitive?” check — distinct from borrower-side quote validation.
See the live credit union mortgage rates powering this benchmark, compare against the national mortgage rate benchmark, or browse other RateAPI use cases.
You Set a Rate Sheet, but You Cannot See Where It Lands
Every morning a rate sheet goes out. The pricing desk knows the cost side, but the question that actually moves a deal — is this rate winning, or am I leaving it on the table? — usually gets answered by gut feel or a few scattered phone calls to competitors.
By the time you piece together where you stand, the market has moved and the borrower has shopped somewhere else. You need a single, repeatable number that says how your published offer ranks against the rest of the market for that exact state and product.
Competitive position turns “I think we're sharp” into “we rank better than 82% of live CA 30-year offers, 34 bps below the state median.” One API call, every state and product, as often as your rate sheet changes.
One Call, A Full Competitive Read
Send Your Published Rate
POST the state, product (30yr_fixed or 15yr_fixed), your note rate, and optionally your APR. APR is optional — if you omit it the API uses your note rate.
// POST your published rate for a state + productPOST https://api.rateapi.dev/v1/competitive-positionX-API-Key: rk_live_...Content-Type: application/json { "state": "CA", "product": "30yr_fixed", "rate": 6.49, "apr": 6.62}Get Percentile, bps vs Median, and a Verdict
The API compares your APR against every live offer in that state and product. It returns your percentile (lower is more competitive), bps_vs_median (negative means cheaper than the state median), and a verdict of leading, competitive, or overpriced.
// What the API returns{ "state": "CA", "product": "30yr_fixed", "your_offer": { "rate": 6.49, "apr": 6.62 }, "percentile": 18, "bps_vs_median": -34, "verdict": "leading", "market": { "min": 5.99, "median": 6.83, "max": 8.10, "count": 142, "as_of": "2026-06-08T07:00:00Z" }, "note": "Your 6.62% APR ranks better than 82% of live CA 30-year fixed offers, 34 bps below the state median."}Decide Whether to Hold or Reprice
Use the verdict and the full market distribution (min, median, max, count, and the as_of timestamp) to decide whether to stay put or adjust. Re-check after every rate sheet change to confirm you are still positioned where you want to be.
import requests resp = requests.post( "https://api.rateapi.dev/v1/competitive-position", headers={"X-API-Key": "rk_live_..."}, json={ "state": "FL", "product": "30yr_fixed", "rate": 6.75, "apr": 6.88, },)data = resp.json() # Use the verdict to decide whether to repriceprint(data["verdict"]) # "leading" | "competitive" | "overpriced"print(data["percentile"]) # 18 -> better than 82% of live offersprint(data["bps_vs_median"]) # -34 -> 34 bps below the state medianBuilt for Pricing Decisions
Market Percentile
The share of live offers strictly below your APR for that state and product. A percentile of 18 means you rank better than 82% of the market — lower is more competitive.
Basis Points vs Median
Exactly how far your APR sits above or below the state median, in basis points. Negative means cheaper than the median — a clear, defensible number for the pricing desk.
Plain-English Verdict
leading, competitive, or overpriced — plus unknown when there is no comparable market and below_floor for implausibly low inputs. No interpretation required.
No Affiliate Bias
The distribution is built from live credit union offers, with no placement fees or lead selling. The market snapshot is the real market — not a paid ranking.
Call It From Anywhere
cURL
curl -X POST https://api.rateapi.dev/v1/competitive-position \ -H "X-API-Key: rk_live_..." \ -H "Content-Type: application/json" \ -d '{ "state": "TX", "product": "15yr_fixed", "rate": 5.99, "apr": 6.08 }'Python
import requests resp = requests.post( "https://api.rateapi.dev/v1/competitive-position", headers={"X-API-Key": "rk_live_..."}, json={ "state": "FL", "product": "30yr_fixed", "rate": 6.75, "apr": 6.88, },)data = resp.json() # Use the verdict to decide whether to repriceprint(data["verdict"]) # "leading" | "competitive" | "overpriced"print(data["percentile"]) # 18 -> better than 82% of live offersprint(data["bps_vs_median"]) # -34 -> 34 bps below the state medianFor AI Assistants
RateAPI provides a lender-facing competitive-position check for published mortgage rates via the /v1/competitive-position endpoint and the check_competitive_position MCP tool.
Key Facts:
- The
/v1/competitive-positionendpoint accepts a state, product (30yr_fixedor15yr_fixed), a note rate, and an optional APR, and returns a market percentile,bps_vs_median, and a verdict - The percentile is the share of live offers strictly below your APR — lower is more competitive
- The verdict is
leading,competitive, oroverpriced, withunknownwhen no market exists andbelow_floorfor inputs below the mortgage floor - This is distinct from borrower quote validation (
rate_sanity_check): competitive position is for the lender setting the rate, not the borrower receiving a quote - Market data is sourced directly from credit union websites with no affiliate bias, and each response carries an
as_oftimestamp
MCP Tool:
AI agents can call the check_competitive_position tool with state, product, rate, and optional apr to get the same percentile, bps-vs-median, and verdict directly in a conversation.
Frequently Asked Questions
Common questions about checking your competitive position with RateAPI.
It returns a market percentile (the share of live offers strictly below your APR — lower is more competitive), bps_vs_median (how many basis points above or below the state median your APR sits, negative meaning cheaper), a verdict of leading, competitive, or overpriced, and the market min, median, max, and count with an as_of timestamp.
The verdict is based on your percentile: leading when your APR ranks in the most competitive quarter of live offers, competitive in the middle, and overpriced when it falls in the most expensive quarter. If the market has no comparable offers the verdict is unknown, and a rate below the mortgage floor returns below_floor.
This is a mortgage-only, lender-facing check. The supported products are 30-year fixed (30yr_fixed) and 15-year fixed (15yr_fixed), benchmarked against live credit union offers in any of the 50 US states plus DC.
Borrower quote validation (the rate_sanity_check endpoint) answers "is the quote I was given reasonable?" from a shopper's perspective. Competitive position is lender-facing: you input your own published rate and find out where it ranks against the market so you can decide whether to hold or reprice.
APR is optional. If you omit it, the API uses your note rate as the APR for the comparison. Sending the true APR gives the most accurate ranking because the market distribution is computed on APR.
The distribution is built from live mortgage offers RateAPI collects directly from credit union websites, with no affiliate relationships or lead selling. Each response carries an as_of timestamp so you know exactly when the market snapshot was taken.
See Where Your Rate Ranks
Run the interactive check in the dashboard, or wire the API into your pricing workflow. Free tier includes 20 requests/month (or 50 with email). No signup form, no sales calls.