Asking-rent map embed
Paste one line. The map appears where you paste it, with the Fact Lease mark.
The script for these settings. Select the snippet, then copy.
<script src="https://factlease.com/embed/map.js" data-city="houston" data-height="480"></script>
Or use an iframe:
<iframe src="https://factlease.com/embed/map?city=houston" title="Houston asking rents, Fact Lease" width="100%" height="480" style="border:0" loading="lazy"></iframe>
September 2026
1,321 suites. 201 state a base rent and a unit. Citywide median $21 per square foot per year. n=149. As of 2026-09-27. Flex: Not published.
That line is copied from the asking-rent snapshot. A numeric base rent with no recognized unit is stored as null and is not counted as stated. A missing rent stays unknown. The median is not availability and not an offer. Hatched means unpublished, fewer than 5 converted readings.
Parameters
| Name | Where | Meaning |
|---|---|---|
city | Script data-city, script URL, or iframe URL | houston or san-antonio. Omit it, or send anything else, and the map is San Antonio, as every embed pasted before Houston was. The ZIP feed and the building points take the same city: /api/rent-map.json?city=houston. A city with nothing published draws its ZIP outlines and says so; it prints no number. |
zip | Script data-zip, script URL, or iframe URL | Five digits. Centers the map on that ZIP when this month's feed includes it. |
month | Script data-month, script URL, or iframe URL | YYYY-MM. Omit it and the map uses the newest month in the feed. |
pins | Script data-pins, script URL, or iframe URL | 0 hides the building points and shows ZIP shapes only. Any other value, or no value, keeps them on. |
class | Script data-class, script URL, or iframe URL | office, retail, or industrial. Colors each ZIP by that class's published median, hatched when that class has fewer than 5 converted readings in the ZIP, and keeps only buildings with a suite in that class. Flex and anything else are ignored and the pooled median is used. |
theme | Script data-theme, script URL, or iframe URL | light draws the map on paper with ink text for a white site; a darker blue step is a higher median there. dark, no value, or anything else keeps the default dark map. The Fact Lease mark is on both. |
data-height | Script only | Pixel height from 280 to 900. The default is 480. At 400 or less the panel shows the median only. |
data-target | Script only | Optional element id. When that element exists, the iframe is placed inside it. |
Watermark
The Fact Lease name and the link to https://factlease.com/ are part of the embed. They cannot be turned off with a query parameter, a data attribute, or a partner key. Covering, removing, or rewriting that mark violates the Fact Lease license.
Parameters named watermark, attribution, brand, logo, credit, or hide are ignored. A key parameter is accepted and ignored. It does not remove the mark. A partner key is not required.
Framing
frame-ancestors * on /embed/map is intentional. Any commercial realtor site may place that document in an iframe. The Fact Lease name and the link to https://factlease.com/ stay in the frame. /docs/embed and /for-brokers/map-api redirect here. The rest of Fact Lease sends X-Frame-Options: DENY and refuses framing.
What the colors mean
Each ZIP is colored by the median of stated public-page asking rents, in dollars per square foot per year. A null rent is left out and is not treated as zero. A published ZIP takes one of five steps of a single blue ramp; on the dark map a brighter step is a higher median, and with theme=light a darker step is. The breaks sit at the 20th, 40th, 60th, and 80th percentiles of that month's published ZIP medians and are printed in the legend, so the steps change when the readings change. With class set, the ramp and the breaks come from that class's published ZIP medians instead of the pooled ones.
Three states are drawn. Published: the ramp. Observed but not published: a ZIP with suites on public pages but fewer than 5 converted readings is hatched with a dashed outline and its n printed on the shape. No observation: a ZIP with no suite this month is an outline only. The count stays in n. The map is not an availability list and does not state that a suite is offered.
ZIP shapes are Census ZCTA outlines. The color comes from /api/rent-map.json. A ZIP in the feed with no outline is a circle at the Census internal point. That point is not a building.
Building points
Each building point is the US Census Bureau geocoder's TIGER address-range point for the stated street address. It is derived from the address the public page stated. It is not a broker confirmation, not a survey, and not a suite location inside the building. An approximate match landed on a nearby address range on the same street. Points come from /api/map-buildings.json, which takes the same month and is open cross-origin like the ZIP feed. Each point prints its suite count, how many state a rent, the stated area range, and a derived USD per square foot per year range only where the page stated enough to convert. Nothing is filled in. A point is not an availability claim. Set pins=0 to leave them off. The same rows, one per building, are a CSV for a spreadsheet at /api/map-buildings.csv?month=YYYY-MM, open cross-origin and sent as an attachment.
Access
Cross-origin GET is open for /api/rent-map.json, /api/map-buildings.json, /api/map-buildings.csv, /embed/map.js, and the embed document. No account is required.
Each network address may make 180 requests a minute and 2,000 requests an hour across the embed and the feed. That is enough for a brokerage site. Past the cap, the response is 429. When the browser sends a Referer, Fact Lease logs the site origin and path, not the query string.
Do not add async or defer on the script tag. The snippet reads the tag that loaded it.