Put Fair Market Rent data on your site
Developer documentation for Fair Market Rent Map — HUD Fair Market Rents and Small Area FMRs for every U.S. ZIP code, available as a drop-in widget or a JSON API.
Fair Market Rents (FMRs) are the rent standards HUD publishes each fiscal year. They drive Section 8 / Housing Choice Voucher payment standards, and they're a useful market baseline for landlords, property managers, and housing researchers. Fair Market Rent Map serves this data ZIP-by-ZIP — explore it on the interactive FMR map, or pull it into your own site with the tools below. Figures update when HUD publishes a new fiscal year and again at HUD's spring revisions, so never hard-code values.
Embed widget Free
One copy-paste snippet renders a rent table for any ZIP code. No API key, no sign-up.
Embed API Free
Keyless JSON endpoint with open CORS. Base FMR rates by bedroom count for any ZIP.
Pro API API key
Everything in the embed API plus 90% and 110% payment standards, for Pro subscribers.
Chrome extension Pro
Hover any ZIP code on any website to see rents, safety, and yield in place.
Embed widget Free
A drop-in card showing current-year Fair Market Rents for one ZIP code. Paste this anywhere in your page's HTML and swap in your ZIP:
<div data-fmr-widget data-zip="35004" data-theme="light">
<a href="https://fairmarketrentmap.com/zip/35004">Fair Market Rents for ZIP 35004 — Fair Market Rent Map</a>
</div>
<script src="https://fairmarketrentmap.com/widget.js" async></script>
Prefer to click instead of type? The widget configurator generates the snippet for any ZIP and theme, with a live preview.
Configuration
The widget mounts on any element matching [data-fmr-widget] or id="fmr-widget" and reads two attributes — that's the whole configuration surface:
| Attribute | Required | Values | Notes |
|---|---|---|---|
data-zip |
Yes | 5-digit ZIP code | If missing or invalid, the widget renders nothing and leaves your fallback link untouched. |
data-theme |
No | light (default) or dark |
Any other value falls back to light. |
The card is responsive up to a maximum width of 480px. Multiple widgets per page are fine — each element renders independently, and the script tag only needs to appear once.
Live demo — both themes
These are the real widget, running on this page against the production API:
How it behaves
- Progressive enhancement. The snippet ships a plain link to the ZIP's page. If the script is blocked, fails to load, or the data fetch fails, that link is what visitors (and search engines) see — never a broken box. On success, the card renders and the fallback link is hidden (it stays in the DOM).
- Data fetch. The widget calls the free embed API from the visitor's browser; responses are cached for an hour browser-side.
- Style isolation. It renders into your normal DOM (no iframe, no shadow DOM) protected by a scoped
all: unsetreset plus inline styles. Host rules marked!importantcan still win; the card's colors are fixed per theme and not otherwise customizable. - No tracking. The script sets no cookies and loads no third-party resources.
Attribution
The rendered card carries one small "Source: HUD, via Fair Market Rent Map" credit link, and the snippet's fallback anchor serves the same purpose when the card isn't rendered. Keeping that credit visible is the only condition of free use — a single, honest, descriptive link, consistent with Google's guidance on widget links.
Embed API Free
A keyless JSON endpoint returning current-fiscal-year Fair Market Rents for any U.S. ZIP code — the same endpoint the widget uses. No authentication, no sign-up, and CORS is open (Access-Control-Allow-Origin: *), so browser-side fetch works from any origin.
GET https://fairmarketrentmap.com/api/embed/fmr?zip={zip}
Response
{
"zipCode": "35004",
"city": "Moody",
"state": "AL",
"hudAreaName": "Birmingham-Hoover, AL HUD Metro FMR Area",
"fiscalYear": 2027,
"rates": [
{ "bedrooms": 0, "label": "Studio", "base": 1490 },
{ "bedrooms": 1, "label": "1 Bedroom", "base": 1600 },
{ "bedrooms": 2, "label": "2 Bedroom", "base": 1740 },
{ "bedrooms": 3, "label": "3 Bedroom", "base": 2190 },
{ "bedrooms": 4, "label": "4 Bedroom", "base": 2460 }
],
"attribution": {
"source": "HUD Small Area Fair Market Rents",
"url": "https://fairmarketrentmap.com/zip/35004"
}
}
rates always has five entries, bedrooms 0–4 (Studio through 4 Bedroom); base is the monthly Fair Market Rent in whole U.S. dollars. If you display the data publicly, please include the attribution.url link — it's how the free endpoint stays free.
Errors, rate limits, caching
Errors are JSON: { "error": "…" }.
| Status | When |
|---|---|
400 | zip missing or not 5 digits. |
404 | ZIP not in the current HUD dataset. |
429 | Rate limit exceeded — 100 requests per minute per IP. Includes a Retry-After header (seconds). |
Successful responses are served with Cache-Control: public, max-age=3600 plus a long stale-while-revalidate window; bulk consumers should honor these headers.
Examples
curl "https://fairmarketrentmap.com/api/embed/fmr?zip=35004"
// JavaScript (browser or Node)
const res = await fetch("https://fairmarketrentmap.com/api/embed/fmr?zip=35004");
if (!res.ok) throw new Error(`FMR lookup failed: ${res.status}`);
const data = await res.json();
const twoBr = data.rates.find(r => r.bedrooms === 2);
console.log(`FY${data.fiscalYear} 2BR FMR for ${data.city}, ${data.state}: $${twoBr.base}`);
# Python
import requests
res = requests.get(
"https://fairmarketrentmap.com/api/embed/fmr",
params={"zip": "35004"},
timeout=10,
)
res.raise_for_status()
data = res.json()
two_br = next(r for r in data["rates"] if r["bedrooms"] == 2)
print(f"FY{data['fiscalYear']} 2BR FMR for {data['city']}, {data['state']}: ${two_br['base']}")
Pro API API key
The keyed API for Pro subscribers. Same FMR data as the embed API, plus the 90% and 110% payment-standard figures for every bedroom count.
GET https://fairmarketrentmap.com/api/public/fmr?zip={zip}
x-api-key: fmr_…
Authentication
- Pass your API key in the
x-api-keyheader. Keys look likefmr_followed by 32 hex characters and are tied to an active Pro subscription. - Create and manage keys (up to five) from your account settings on fairmarketrentmap.com. Keys stop working when the subscription lapses; requests then return
403. - Treat keys as secrets: call the API from your server, not from public browser code. If you only need base rates client-side, the keyless embed API covers that.
Response
{
"zipCode": "35004",
"city": "Moody",
"state": "AL",
"hudAreaName": "Birmingham-Hoover, AL HUD Metro FMR Area",
"fiscalYear": 2027,
"rates": [
{ "bedrooms": 0, "label": "Studio", "base": 1490, "payment90pct": 1341, "payment110pct": 1639 },
{ "bedrooms": 1, "label": "1 Bedroom", "base": 1600, "payment90pct": 1440, "payment110pct": 1760 },
{ "bedrooms": 2, "label": "2 Bedroom", "base": 1740, "payment90pct": 1566, "payment110pct": 1914 },
{ "bedrooms": 3, "label": "3 Bedroom", "base": 2190, "payment90pct": 1971, "payment110pct": 2409 },
{ "bedrooms": 4, "label": "4 Bedroom", "base": 2460, "payment90pct": 2214, "payment110pct": 2706 }
],
"attribution": {
"source": "HUD Small Area Fair Market Rents",
"url": "https://fairmarketrentmap.com/zip/35004"
}
}
payment90pct / payment110pct are 90% and 110% of the FMR — the "basic range" within which public housing authorities typically set Housing Choice Voucher payment standards.
Errors, rate limits, caching
| Status | When |
|---|---|
401 | No x-api-key header. |
403 | Key is invalid, revoked, or the Pro subscription has expired. |
400 | zip missing or not 5 digits. |
404 | ZIP not in the current HUD dataset. |
429 | Rate limit exceeded — 100 requests per minute per IP. Includes a Retry-After header (seconds). |
Successful responses carry Cache-Control: public, max-age=86400. FMR data changes at most a few times a year, so caching lookups for a day on your side is safe and recommended for bulk workloads.
Examples
curl -H "x-api-key: fmr_YOUR_KEY_HERE" \
"https://fairmarketrentmap.com/api/public/fmr?zip=35004"
// JavaScript (server-side)
const res = await fetch("https://fairmarketrentmap.com/api/public/fmr?zip=35004", {
headers: { "x-api-key": process.env.FMR_API_KEY },
});
if (!res.ok) throw new Error(`FMR lookup failed: ${res.status}`);
const data = await res.json();
const twoBr = data.rates.find(r => r.bedrooms === 2);
console.log(
`2BR FMR: $${twoBr.base} ` +
`(payment standard range $${twoBr.payment90pct}–$${twoBr.payment110pct})`
);
# Python
import os
import requests
res = requests.get(
"https://fairmarketrentmap.com/api/public/fmr",
params={"zip": "35004"},
headers={"x-api-key": os.environ["FMR_API_KEY"]},
timeout=10,
)
res.raise_for_status()
data = res.json()
for rate in data["rates"]:
print(f"{rate['label']}: ${rate['base']} "
f"(90% ${rate['payment90pct']} / 110% ${rate['payment110pct']})")
Free vs. Pro at a glance
| Embed API | Pro API | |
|---|---|---|
| Endpoint | /api/embed/fmr | /api/public/fmr |
| Auth | None | x-api-key header |
| Base FMR by bedroom | Yes | Yes |
| 90% / 110% payment standards | — | Yes |
| Intended use | Widgets, client-side lookups | Server-side integrations, tools, analysis |
More on the on-site reference: fairmarketrentmap.com/api-docs.
Chrome extension Pro
Fair Market Rents on any website. With the extension installed, hovering any ZIP code — on a listing site, in a county PDF portal, in an email — shows current HUD Fair Market Rents in a hover card. Major city names written as "City, ST" work too, and each card links to the ZIP's full page for payment standards and history.
| Hover card section | Contents | Requires |
|---|---|---|
| Fair Market Rents | Current-year HUD SAFMR for the ZIP, Studio through 4 Bedroom. | Pro |
| Safety | Crime score and letter grade with a national comparison. County-level estimate. | Pro |
| Rental yield | Gross yield computed from the 2BR FMR against the area's median home value. | Landlord Pro |
Setup, access, and privacy
- Three steps: install from the Chrome Web Store, click the extension icon and choose Connect (signing in to your Pro account if needed), then hover any ZIP code on any site.
- Pro required. The extension is part of Fair Market Rent Map Pro and stays completely inactive until connected — it detects nothing and sends nothing while disconnected. The yield section additionally requires Landlord Pro.
- No API key to copy. Connecting hands the extension its own credential tied to your account; revoke the "Chrome Extension" key from your account page at any time to cut access immediately. The extension's data endpoints are not a public API — for programmatic access use the embed API or Pro API.
- Privacy. The extension talks only to fairmarketrentmap.com. ZIP codes found on a page are sent there to fetch rent data, and nothing else leaves your browser — no page content, no URLs, no browsing history. Detection happens locally against a bundled index of valid ZIP codes.