curl --request GET \
--url https://api.investorlift.com/v1/coverage \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/coverage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.investorlift.com/v1/coverage"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)Read which data is available where
The coverage matrix of every loaded market, a place lookup by point, county, ZIP or market code, and the planned markets.
curl --request GET \
--url https://api.investorlift.com/v1/coverage \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.investorlift.com/v1/coverage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.investorlift.com/v1/coverage"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)meta.coverage[] and runs no query. Zero credits, any key.
The same facts, recorded from production, are the Coverage pages and
coverage.json. This route is the live answer for the host you call.
Use it when
- Before a data call. Ask if a point, a county or a ZIP is covered. Then you spend no metered call on a
422 outside_coverage. Passlatandlng,county,zipormarket. Pass at most one of the four. - To gate a screen per dataset. A partner map or the Investorlift app reads
datasets.<key>.place_statusfor the place. It then shows or hides the listing, short-term rental or lender panel. - To say “planned” and not “not covered”.
data.planned[]lists the markets under construction, as labelled intent.
The vocabulary
The keys ofdatasets are the datasets a market can lack. They are deeds, listings, agents, wholesale,
auction, str, parcels, financing, permits, owner_profile, history, cash_sale, lenders and
addresses. Each cell carries these fields.
| Field | Meaning |
|---|---|
status | served: the API publishes the dataset for the whole market, or for every item of its scope that it can serve. partial: the API serves some items of the scope and not every item it can serve. not_measured: the build ran and the delivery cannot measure the fact. No build fixes it, so do not wait. not_published: the tables are absent or unbuilt. A later build fixes it, so wait. |
dated | The dataset is a snapshot valued at as_of. Every response that carries a value from it stamps meta.dated[]. The financing slice is dated, and so is the lender registry built from it. Independent of status: a dataset can be partial and dated at once. With require_current, a dated dataset answers 422 dated_refused. |
stale | The as-of date failed its freshness rule against the clock of the request. Deeds follow the 45-day rule. Short-term rentals are stale when the feed of a served jurisdiction is stale this week. null where no rule exists, because a false reads as fresh. A dated set never refreshes. A stale one is late. |
as_of | The own date of the dataset. null where not published. Also null for the auction counts, which carry no date of their own. |
gate | For not_published and not_measured, the error a call meets when it needs the dataset. null for served and partial. Each scope item then carries its own code. |
granularity | The grain of the dataset: market, county (deeds, lenders), jurisdiction (short-term rentals, permits) or zip (the history lake). |
scope | The list of items at that grain, with a status per item. Deeds: the counties with their deed ends. Lenders: every county and if the registry covers it. Short-term rentals: every jurisdiction with its reason. Permits: every issuer. History: every ZIP the lake covers. null for a market-grain dataset. |
features | Lenders only: the per-market *_measured flags of the registry. They are features of one dataset, not statuses. |
place_status | Present only when you gave a place. served or outside for the place at the grain of the dataset. null when the input cannot decide the grain. Examples: a lender or short-term rental answer from a bare point, or a jurisdiction from a ZIP or a county. |
partial until a roster says how many ZIP codes a market has. A short-term rental jurisdiction
that requires no licence reads not_applicable in the scope. It counts on neither side of the roll-up.
The place lookup
- A point (
lat,lng). The API applies the bounding-box-and-tolerance rule of every data route (bboxandpoint_tolerance_mileson the row), so the two never disagree. - A county (
county=04021orcounty=Pinal). The API matches it against the counties of the loaded markets. It then decides deeds and the lender registry at county grain. Pinal reads deedsservedand lendersoutsidewhile the registry covers Maricopa alone. - A ZIP (
zip=85142). The API resolves it to every county it touches, largest land share first (place.counties). The source is a committed copy of the public ZIP-to-county relationship file of the Census Bureau. The API then decides at county grain, and decides the history lake against its own ZIP set. A ZIP-universe market covers only its own ZIP codes. - A market code (
market=phx). The API answers that row alone. An unknown code isoutside, never400.
200 with data.markets: [] and place.status: outside, never 422. This is the one
route that answers the question the data routes refuse. With a place, meta.coverage[] names the covering markets
alone. A response outside every market carries an empty coverage list and no X-Dataset-Version header.
Planned markets
data.planned[] lists the markets Investorlift intends to serve and this host does not serve yet. Each row carries
label_kind: "intent". Intent, not a commitment: a market is covered when it appears in data.markets[] and in
meta.coverage[] on your responses. The Developer Agreement promises no refresh cadence and no
continuity, and the list can change without notice. A code the host has loaded is never in this list.
Gotchas
- The
ETagcomes from the dataset versions of the markets in the answer, not from the query. Cache by URL. SendIf-None-Matchfor a304when nothing moved. - Two place groups at once (
zipbesidemarket, for example) are400 geometry_conflict. So islatwithoutlng. - The concise MCP format of
godmode_coveragecaps the jurisdiction, issuer and ZIP lists at ten items. This route carries them whole.
Related
GET /v1/dataset is the freshness probe: did the version move? This route answers
what is covered where. Coverage and freshness explains meta.coverage[], the block both
routes read. The Coverage pages state the answer as recorded from production.Authorizations
API key from the developer console (starts with zpka_). Create one at https://developers.investorlift.com/get-a-key.
Query Parameters
With lng: the point to look up. The API decides the covering markets with the bounding-box-and-tolerance rule the data routes apply (meta.coverage[].bbox and point_tolerance_miles), so the two never disagree.
-90 <= x <= 90With lat: the point's longitude.
-180 <= x <= 180A county to look up: a 5-digit FIPS ("04021") or a name ("Pinal", "Pinal County", any case). The API matches it against the counties of the loaded markets and the states of the public ZIP-to-county crosswalk. Not with lat, lng, zip or market.
1 - 64A ZIP to look up. The API resolves it to every county it touches through the public ZIP-to-county crosswalk, largest land share first, then decides at county grain. A ZIP-universe market covers only its own ZIP codes. Not with lat, lng, county or market.
^\d{5}$A market code to look up: its row alone. An unknown code answers place.status outside with markets [], never 400. Not with lat, lng, county or zip.
1 - 16Response
The coverage matrix, the place lookup and the planned markets.
The coverage matrix, the place lookup and the planned markets.
Which data is available where: the coverage matrix of every loaded market, the place lookup when you asked one, and the planned markets.
Show child attributes
Show child attributes
Response metadata: when the API produced it, which markets it covers, and how fresh they are.
Show child attributes
Show child attributes
Was this page helpful?