Measure · for agents

Give your agent a tape measure for the physical world.

Your agent knows what a building is. It doesn't know that this building is 1,157 sqft, flat, 24 ft tall, with a 42 ft tree leaning over it — or that a 40 ft pad will not fit anywhere on the lot. The six flagship tools below answer that from 3D measurement — and they are the front of a catalog of 132 measurement endpoints, every one explicit about its limits.

How to get access

The tools

The six flagship tools, each with its measured accuracy. Each returns one kind of physical fact, and each is explicit about its limits — because an agent can't see our validation history and will otherwise use a number for something it won't support.

resolve_building

Which structure actually stands at an address — footprint outline, area, height. Call this first; the others take the structure_id it returns, so identity is decided once instead of re-guessed on every call.

Identity is decided by three independent signals, checked in order of strength. Where none of the three is present the address is refused rather than matched to the nearest roof, and the refusal names what was missing. Small outbuildings are the failure mode that survives: query a shed and you can get the neighboring house. The ~400 sqft floor below is a working threshold we have not measured, not a finding.

roof_summary

Total roof area, pitch, flat vs pitched, complexity, penetrations. Pass verify: true and it takes an independent second measurement of the same surface, then tells you how far the two passes disagreed.

No per-facet breakdown, deliberately. That decomposition isn't reproducible on our own data, so per-panel solar layout cannot be derived from this. We'd rather withhold it than sell a number that changes when you ask twice.

site_context

What stands around the structure — cover percentage and heights in 5–30 ft and 30–100 ft rings, plus slope. Wildfire defensible space, solar shading, access planning.

Measures anything standing above the ground, so trees, poles and fences are counted together — it is not botanically classified vegetation. The 0–5 ft zone is not reported: a 1.5 m ring is below our measurement resolution, and we won't guess.

clearance

Height of anything standing above ground near a point — canopy, wires, poles, structures. The primitive under "does this truck, crane or ladder fit?"

Heights are above local ground, not sea level. Obstruction types are not distinguished from one another.

site_fit

Where a rectangle of a given size can physically sit on a property — a pad, a shed, a container, an equipment laydown area. Ranked placements with position, bearing, slope and overhead clearance.

Every other tool that answers "what can I build here" computes a zoning envelope: the parcel minus its setbacks, in two dimensions. This one ignores zoning entirely and asks whether the ground is flat enough, clear enough and well enough observed. The two questions have different answers, and only one of them currently costs a site visit.

Expect "nothing fits" often. On real ground many sites return no placement at the default grade, and the count rises as you loosen it. Real ground is not flat. The threshold is yours to set, and the refusals are reported rather than quietly dropped. When slope is the blocker the response carries the grade that would have worked, plus a screening estimate of the cut and fill to get there.

It does not know soil bearing capacity, setbacks or buried services. It can point at ground worth surveying; it can never approve a crane or a foundation.

site_fit_check

The same question once a spot is already chosen: does this rectangle work there, at that bearing? Answers with the reasons — how much of the footprint is obstructed, the slope against your limit, the overhead clearance, the measurement coverage.

Built for the moment a plan exists and someone needs a yes or no. A bare "no" is useless at that point; the reasons are what tell you whether to shift the pad three meters or give up on the corner.

site_grade

Does the ground fall away from a foundation? This is the one tool here measured against somebody else's published threshold rather than one we invented: IRC R401.3 requires grade to fall 6 inches within the first 10 feet of a foundation wall. It walks the perimeter station by station and reports where it doesn't.

Read the verdicts, not the percentage. Fall is measured to ±6.4 in against independent federal elevation benchmarks over 605 stations, which is about the size of the 6-inch threshold itself — so stations near the line come back too_close_to_call instead of guessed at. Verdicts are checked against those same benchmarks, and the stations inside the ambiguous band are reported as ambiguous rather than folded into a score. Most perimeters meet the rule at only a minority of stations, so a low score is the norm and means little alone; the finding worth acting on is stations_draining_toward_building, where the ground runs back at the house by more than the measurement error. The number is about the foundation and not just the hillside: across 22 buildings, perimeter ground falls away 1.8 in more than generic ground on the same lot (positive in 20 of 22, sign test p=0.0001). Note the size of that — builders really do grade away from foundations, but by inches, not by the 6 in the code asks for. It cannot see under decks or porches, doesn't know where downspouts discharge, and reads the ground as of the day it was measured. A failing station is a place to send someone, never a code violation.

site_flood

How far the ground around a building sits above or below FEMA's mapped Base Flood Elevation — flood zone, SFHA status, published BFE, measured lowest adjacent grade, and the freeboard between them, in feet on NAVD88. For flood triage and deciding which properties justify paying a surveyor.

It measures the lowest adjacent grade, not the lowest floor. An Elevation Certificate reports the floor, which for anything with a basement sits below what can be measured from outside — and that is the elevation flood rating turns on. This is not an Elevation Certificate and no lender or insurer will accept it as one. The datum is verified rather than assumed: our elevations match independent federal elevation benchmarks published on NAVD88 to a 0.02 m mean bias over 521 samples. FEMA publishes BFE to the whole foot, so freeboard within about a foot of zero is undecidable and says so. Where FEMA publishes no elevation the call still succeeds, free, with an assessment instead of a freeboard: 8 of 10 ordinary addresses are zone X, and being outside the mapped floodplain is the answer, not a failure — though zone X is not zero risk, since roughly a quarter of NFIP claims come from outside the SFHA. Zone A is the opposite: mapped risk with no elevation ever studied, which needs a surveyor.

site_airspace

Does a structure or crane boom of a given height here need FAA notice? Screens 14 CFR 77.9: over 200 ft above ground always requires Form 7460-1, and below that it depends on a 100:1, 50:1 or 25:1 surface sloping up from the nearest runway. Returns whether notice is required and why, the height the surface allows at that spot, the margin, and the nearest airport, runway and FAA-verified obstacles.

Notice is due 45 days ahead and a boom that penetrates a surface without a filed 7460-1 stops the job — this answers it from a desk. It screens whether notice is required; it is not an FAA determination, evaluates neither the Part 77.17 obstruction standards nor TERPS, and only a filed 7460-1 produces a determination. The slope ratio is taken from the longest runway in range, so it can over-trigger but never under-trigger. Airport and runway geometry is a local extract of the FAA dataset, because their live service degrades to empty responses under load and an empty answer would read as “no notice required”. Private and unmapped airstrips are absent from FAA data and cannot trigger it.

site_defensible

Standing fuel around a house by California PRC 4291 defensible-space zone — Zone 1 (5–30 ft) and Zone 2 (30–100 ft), measured outward from the building footprint rather than from a point. Returns fuel cover, max and p95 height, and CAL FIRE's Fire Hazard Severity Zone so you know whether 4291 legally applies. Built for wildfire underwriting and renewal triage.

It does not predict which houses burn. Against CAL FIRE's per-structure damage inspections for the January 2025 Eaton and Palisades fires — pre-fire 2016 measurements against post-fire outcome, 28 destroyed and 25 undamaged homes — the houses that were destroyed carried less measured fuel than the survivors (Zone 2: 25.1% vs 38.9%). Both were wind-driven conflagrations that spread structure to structure. Use it for 4291 compliance screening, not for rating or underwriting loss. Zone 0 (0–5 ft) is not measured. AB 3074 added it and it decides most structure ignitions, but 5 ft is at or below our measurement resolution — the response says so rather than starting at 5 ft and letting you assume the gap was found clear. Fuel is class-agnostic, because classifying fuel by type is only dependable in a minority of the country and we will not ship a field that works sometimes; the cost is that a woodpile, a parked boat and a live oak are indistinguishable. Mapped buildings are excluded and reported separately — without that, neighbors' roofs counted as fuel and produced 146–203 ft “vegetation”. Vegetation also grows: this reads the site as of the day it was measured, and Los Angeles County's measurement dates to 2016. It is not a compliance determination — it cannot see limbing height, canopy separation or vent construction. An inspector decides; this shows where to look.

Every measurement — 132 endpoints

The six tools above are the flagships with their measured accuracy stated. The full catalog below is generated from the same registry the API serves. The machine-readable version — inputs, guaranteed outputs, per-endpoint limits — is GET /v1/tools, free and unmetered; an agent should read that, not this page.

hazard (22)

environment (12)

water (11)

site (11)

energy (9)

weather (7)

land (7)

transport (6)

use (6)

climate (5)

geography (4)

infrastructure (4)

health (4)

housing (3)

emergency (3)

education (3)

demographics (2)

geology (2)

vegetation (2)

terrain (1)

structure (1)

measure (1)

roof (1)

building (1)

clearance (1)

preflight (1)

buildings (1)

airspace (1)

Every answer is dated

Each measurement returns a survey object stating the vintage of the data behind it. It matters more than it sounds: Denver reads 2013, Los Angeles 2016, Charleston 2016, Austin 2017, Seattle 2021. Ground and buildings move slowly, so that is usually fine — vegetation does not, so site_defensible also says in plain text when its data is five or more years old.

The year is a publication year rather than the exact day of measurement, and the two differ, so the field is called earliest_year_in_name and should be read as a lower bound on the age.

The part nobody else ships

Every measurement API returns a number. Ours returns a number and how much it trusts itself. Ask roof_summary to verify, and it measures the same surface twice, independently:

"confidence": {
  "grade": "A",
  "self_consistency_pct": 0.7,
  "basis": "two independent measurements of the same surface differed by 0.7%"
}

And when they don't agree:

"confidence": {
  "grade": "D",
  "self_consistency_pct": 22.4,
  "basis": "two independent measurements differed by 22.4% — this measurement is not reliable"
},
"recommendation": "do_not_quote_from_this"

What the grades mean, and why density caps them. A is dense measurement across the whole area; B is good measurement over the answer itself; C means treat the position as approximate. From August 2026 the grade is also capped by how densely the site was actually measured: only the densest tier can reach A, the middle tier caps at B, and the sparsest caps at C.

That change lowered grades on real data — sites that could all previously reach A no longer can, and the grade now says which tier it was capped by. Nothing about the measurement got worse. Coverage is not scale-free: sparse data always looks better covered than it is, and grading on coverage alone let thin data claim a confidence it had not earned.

About one building in five is genuinely hard — multi-level roofs, thin data, buildings that touch. Everyone's numbers are shaky on those. We're just the ones who say so, which matters when an agent is about to put the figure in front of a customer.

Getting access

1. The API is arranged, not self-served

API keys are issued by arrangement. Tell us what you are building and roughly how many addresses a month it will ask about, and we size it with you.

Email keys@measure.so

Once you hold a key, the console is where you watch usage, name a separate key per integration, and revoke one that has leaked.

You probably do not need the API. If what you want is measurements of specific properties rather than software that calls us, the console does that today and needs no key at all: type an address and it measures the building. The first few are free previews, and there is a one-off report if you only ever need one. Open the console · See what it costs

Whichever door you come in by, accepting the terms records your agreement to the Terms of Service — including the accuracy disclaimer below — against your email, the terms version and the time.

$0.05 per unit, billed weekly. Most calls are one unit. A clearance query is 0.5 because it skips the roof model; roof_summary with verify: true is 2.0 because it measures the building twice. GET /v1/usage shows your consumption any time and is never itself billed.

Calls are charged on attempt, not on success. Every endpoint measures the building before it can discover there is nothing to report, so a failed lookup has already cost the compute.

These are computed estimates, not a survey. Accuracy varies by location, structure size and data age, and some buildings cannot be measured reliably at all. Check the confidence field on every response and verify on site before ordering materials or committing money.

2. Try it with curl

curl -s https://span-api.onrender.com/v1/building/resolve \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $MEASURE_API_KEY" \
  -d '{"address": "1600 Pennsylvania Ave NW, Washington, DC"}'

3. Add the MCP server

Clone the repo, then add this to your Claude Desktop or Claude Code MCP config:

{
  "mcpServers": {
    "measure": {
      "command": "python",
      "args": ["/absolute/path/to/mcp/measure_mcp.py"],
      "env": { "MEASURE_API_KEY": "sk_your_key_here" }
    }
  }
}

Restart your client and the 15 tools appear — the flagship measurements, not the whole catalog: an agent picking from 132 near-identical entries chooses worse than one picking from 15. The rest stay reachable over HTTP, and GET /v1/tools describes every one of them. No dependencies beyond the Python standard library — the server is a thin proxy, so all the measurement logic stays server-side and you never run a stale copy.

4. Ask your agent something physical

"I'm quoting solar for 1247 Pine St, Boulder CO.
 Is this roof worth a site visit?"

The agent resolves the building, pulls the roof summary, checks what's growing around it, and answers — including the bit where the measurement is six years old and the trees have kept growing.

"Can a 12 x 24 ft shed go in the back yard
 at 1247 Pine St, and how level is the ground?"

Different question, different tool. site_fit searches the lot for somewhere that size will actually sit, and more often than not the answer is no — at which point it reports the grade that would have worked and roughly how much dirt that means.

Specifications and boundaries

ThingWhere it stands
CoverageUnited States. Every response carries the capture year for the data it used, so the age is never a guess.
LatencyRoughly 30–90 s per building. It measures the building on demand; it is not a database lookup.
Small structuresBelow ~400 sqft the engine refuses rather than guesses, so a shed does not come back as a house. The threshold is a working one.
Per-facet roofThe roof is measured as a whole - area, height, pitch and orientation. Per-facet breakdown is not part of the API.
VegetationMeasured as anything standing above the bare ground: height, extent and distance to the structure. Species are not identified.
Data ageEvery response carries the capture year. Buildings change slowly; trees don't.
Pads that fitAt a 5% grade many real sites have no conforming pad at all. The search reports the grade that would have worked and roughly how much earthwork that means.
Soil bearingNot measurable from above. The search returns flat, clear, reachable ground; a geotechnical sign-off is a separate exercise.
Measurement densityReported on every fit response, and it caps the confidence grade.

If a tool can't answer, it returns an error saying why rather than a confident guess. That's the whole design.