API reference
Official government offices and resources for property, land and GIS questions across the United States. Version 1.0.0, base URL https://api.gisfinder.com/v1.
Generated from the OpenAPI 3.1 document. Start with the overview for keys, limits, paging and errors.
GET /jurisdictions/resolveJurisdiction chain and responsible offices for a point, an address or a placeGET /resourcesRanked official resources for a place or a pointGET /places/{jurisdiction_id}Full directory for one placeGET /topicsThe topic vocabularyGET /guides/{topic}Plain-language guide for a topic, with a state's rulesGET /screeningScreening facts for a pointGET /searchFind places and resources by nameGET /openapi.jsonThis document as JSON
GET /jurisdictions/resolve
Jurisdiction chain and responsible offices for a point, an address or a place
Give exactly one of: lat and lon; address (free text, geocoded by GISFinder, cached for a day); or place and state (a county, city, town or township name and a two-letter state code). Returns the state, county, county subdivision and place from largest to smallest, and for each function (assessment, tax_collection, recording, zoning, permits, gis) the body that performs it, its office and its resources. An address or place name that matches several candidates answers 409 with the candidates in choices; ask again with a coordinate from the list or a more specific name.
| Parameter | In | Type | About |
|---|---|---|---|
X-Request-Id | header | string | Echoed as request_id; 8 to 64 characters of letters, digits, dot, underscore or hyphen. Otherwise GISFinder makes one. |
If-None-Match | header | string | An ETag from an earlier response; a match answers 304 without a body |
lat | query | number (from -90, to 90) | Latitude, with lon |
lon | query | number (from -180, to 180) | Longitude, with lat |
address | query | string (up to 200 characters) | A street address, for example 350 S 5th St, Minneapolis, MN |
place | query | string (up to 100 characters) | A county, city, town or township name, with state |
state | query | StateCode | Two-letter state or territory code, with place |
Responses:
200Resolved: envelope withdataResolveResult304The data has not changed since the ETag in If-None-Match400RFC 9457 problem: Problem401RFC 9457 problem: Problem404RFC 9457 problem: Problem409RFC 9457 problem: Problem429Too many requests; wait Retry-After seconds: Problem503RFC 9457 problem: Problem
GET /resources
Ranked official resources for a place or a point
Give jurisdiction_id or lat and lon. With a topic, returns the resources for that topic from the place up to its state and the national level, the place's own first. Without a topic (only with jurisdiction_id), returns the place's own resources. The order is the same for every caller.
| Parameter | In | Type | About |
|---|---|---|---|
X-Request-Id | header | string | Echoed as request_id; 8 to 64 characters of letters, digits, dot, underscore or hyphen. Otherwise GISFinder makes one. |
If-None-Match | header | string | An ETag from an earlier response; a match answers 304 without a body |
jurisdiction_id | query | JurisdictionId | |
lat | query | number (from -90, to 90) | |
lon | query | number (from -180, to 180) | |
topic | query | Topic | Required with lat and lon |
limit | query | integer (from 1, to 100, default 50) | Items per page |
cursor | query | string (up to 200 characters) | The next_cursor of the previous page, unchanged. Only valid with the same other parameters. |
Responses:
200Resources, best first: envelope withdataResourcePage304The data has not changed since the ETag in If-None-Match400RFC 9457 problem: Problem401RFC 9457 problem: Problem404RFC 9457 problem: Problem429Too many requests; wait Retry-After seconds: Problem
GET /places/{jurisdiction_id}
Full directory for one place
The place, its chain, its offices, the responsible body per function, and its own resources (paged).
| Parameter | In | Type | About |
|---|---|---|---|
X-Request-Id | header | string | Echoed as request_id; 8 to 64 characters of letters, digits, dot, underscore or hyphen. Otherwise GISFinder makes one. |
If-None-Match | header | string | An ETag from an earlier response; a match answers 304 without a body |
jurisdiction_id required | path | JurisdictionId | |
limit | query | integer (from 1, to 100, default 50) | Items per page |
cursor | query | string (up to 200 characters) | The next_cursor of the previous page, unchanged. Only valid with the same other parameters. |
Responses:
GET /topics
The topic vocabulary
Every topic with a plain description, the functions it belongs to, and its GISFinder page. Topics are added, never renamed.
| Parameter | In | Type | About |
|---|---|---|---|
X-Request-Id | header | string | Echoed as request_id; 8 to 64 characters of letters, digits, dot, underscore or hyphen. Otherwise GISFinder makes one. |
If-None-Match | header | string | An ETag from an earlier response; a match answers 304 without a body |
Responses:
GET /guides/{topic}
Plain-language guide for a topic, with a state's rules
The GISFinder guide text for the topic as plain text sections, and with state the state's own rules, for example who assesses property there and at which level of government. Topics without a guide return the topic description and the state's rules. Links to outside sources are on the guide page (page_url).
| Parameter | In | Type | About |
|---|---|---|---|
X-Request-Id | header | string | Echoed as request_id; 8 to 64 characters of letters, digits, dot, underscore or hyphen. Otherwise GISFinder makes one. |
If-None-Match | header | string | An ETag from an earlier response; a match answers 304 without a body |
topic required | path | Topic | |
state | query | StateCode |
Responses:
GET /screening
Screening facts for a point
Flood zone (FEMA National Flood Hazard Layer), wetlands (USFWS National Wetlands Inventory), soil (USDA SSURGO), elevation (USGS 3D Elevation Program), Minnesota shoreland (DNR Public Waters Inventory, Minnesota only) and the county's EPA radon zone. Every fact is screening for the exact point only, never an official determination, and names the office that decides. A fact that could not be checked has status unknown; try again later.
| Parameter | In | Type | About |
|---|---|---|---|
X-Request-Id | header | string | Echoed as request_id; 8 to 64 characters of letters, digits, dot, underscore or hyphen. Otherwise GISFinder makes one. |
If-None-Match | header | string | An ETag from an earlier response; a match answers 304 without a body |
lat required | query | number (from -90, to 90) | |
lon required | query | number (from -180, to 180) |
Responses:
GET /search
Find places and resources by name
Matches place names (counties, cities, towns, townships) and directory resource names. It is a name lookup, not a question answerer, and never searches for people.
| Parameter | In | Type | About |
|---|---|---|---|
X-Request-Id | header | string | Echoed as request_id; 8 to 64 characters of letters, digits, dot, underscore or hyphen. Otherwise GISFinder makes one. |
If-None-Match | header | string | An ETag from an earlier response; a match answers 304 without a body |
q required | query | string (up to 200 characters) | |
state | query | StateCode | |
limit | query | integer (from 1, to 50, default 10) |
Responses:
200Matches, best first: envelope withdataSearchResult304The data has not changed since the ETag in If-None-Match400RFC 9457 problem: Problem401RFC 9457 problem: Problem429Too many requests; wait Retry-After seconds: Problem
GET /openapi.json
This document as JSON
Responses:
200OpenAPI 3.1 document
Schemas
Problem
| Field | Type | About |
|---|---|---|
type always present | string | Stable, one of https://www.gisfinder.com/problems/{bad-parameter,bad-point,bad-cursor,unknown-topic,unknown-state,unknown-jurisdiction,outside-coverage,address-not-found,place-not-found,ambiguous,invalid-key,rate-limited,lookup-limit,busy,upstream-unavailable,not-found,method-not-allowed,internal-error} |
title always present | string | |
status always present | integer | |
detail always present | string | |
request_id always present | string | |
choices | array of Choice | With ambiguous (409), the candidates to choose from |
Choice
| Field | Type | About |
|---|---|---|
label always present | string | |
lat | number | |
lon | number | |
jurisdiction_id | JurisdictionId | |
page_url | string |
Envelope
| Field | Type | About |
|---|---|---|
data always present | any | |
sources always present | array of Source | |
as_of always present | string | |
request_id always present | string | |
notices always present | array of string | Plain-language caveats |
Source
| Field | Type | About |
|---|---|---|
name always present | string | |
url always present | string | |
publisher always present | string or null | |
official always present | boolean | |
retrieved_at always present | string or null | |
license_class always present | one of "open", "public_record", "restricted_no_redistribution", "licensed_third_party", "unknown" | |
verified_status | one of "verified", "not_yet_verified", "possibly_broken" | |
verified_at | string or null |
StateCode
Two-letter postal code of a state, DC or territory
string, pattern ^[A-Za-z]{2}$
JurisdictionId
Census GEOID with type prefix (state:27, county:27001, cousub:2700143000, place:2743000); district: for bodies that are not Census units; country:us
string, pattern ^(state:\d{2}|county:\d{5}|cousub:\d{10}|place:\d{7}|district:[a-z0-9-]+|country:us)$
Topic
one of "parcel_map", "county_gis", "assessor", "property_tax_payment", "tax_collector", "recorder_deeds", "plats_surveys", "zoning", "building_permits", "septic_well", "wetlands", "floodplain", "soils", "elevation", "roads_right_of_way", "public_land", "property_records_general"
Function
one of "assessment", "tax_collection", "recording", "zoning", "permits", "gis"
Point
| Field | Type | About |
|---|---|---|
type always present | "Point" | |
coordinates always present | array of number | Longitude, latitude (WGS84) |
Jurisdiction
| Field | Type | About |
|---|---|---|
jurisdiction_id always present | JurisdictionId | |
type always present | one of "country", "state", "county", "cousub", "place", "district" | |
name always present | string | |
legal_type | string or null | Census legal word: county, parish, borough, city, town, township, village, charter township, plantation |
state | string or null | Two-letter postal code |
same_as | array of JurisdictionId | |
ocd_id | string or null | |
tiger_vintage | string or null | |
page_url always present | string |
Office
| Field | Type | About |
|---|---|---|
office_id always present | string | Opaque, stable, never reused |
name always present | string | |
kind | string or null | |
jurisdiction_id always present | JurisdictionId | |
phone | string or null | |
email | string or null | |
url | string or null | |
address | string or null | |
person | object or null | |
verified_status | one of "verified", "not_yet_verified", "possibly_broken" | |
verified_at | string or null | |
page_url | string |
Resource
| Field | Type | About |
|---|---|---|
resource_id always present | string | Opaque, stable, never reused |
name always present | string | |
description | string or null | |
url always present | string | |
search_url_template | string or null | Stored deep-link template with {pin} or {q} |
topics always present | array of Topic | |
jurisdiction_id | JurisdictionId | |
publisher | string or null | |
provider | string or null | Vendor that runs the page for the publisher |
official always present | boolean | |
verified_status always present | one of "verified", "not_yet_verified", "possibly_broken" | |
verified_at | string or null | |
verification_method | one of "automated", "browser", "manual", null | |
last_http_status | integer or null | |
license_class always present | "open" | |
source_kind | string | How the record was gathered; unknown where GISFinder has no saved source trail |
page_url always present | string |
FunctionEntry
| Field | Type | About |
|---|---|---|
function always present | one of "assessment", "tax_collection", "recording", "zoning", "permits", "gis", "exemptions" | |
jurisdiction_id always present | JurisdictionId or null | Null when no body in the chain performs the function here (proposal CCP-10); basis then says who does, where known |
office_name always present | string or null | |
office | Office or null | |
resources always present | array of Resource | Under the function topics; for tax_collection the property_tax_payment page comes first |
role | one of "primary", "secondary", "delinquent" | |
levy_scope | one of "county", "municipal", "school", "special", "all", null | |
basis | string or null | Plain-language reason this body performs the function |
evidence_url | string or null | |
also | array of FunctionEntry | Further bodies that perform the same function for this point, such as a second tax bill (proposal CCP-3); the entry itself is the primary one |
Functions
| Field | Type | About |
|---|---|---|
assessment | FunctionEntry or null | |
tax_collection | FunctionEntry or null | |
recording | FunctionEntry or null | |
zoning | FunctionEntry or null | |
permits | FunctionEntry or null | |
gis | FunctionEntry or null |
ResolveResult
| Field | Type | About |
|---|---|---|
match always present | object | |
point always present | Point or null | Null when resolved by place name |
jurisdictions always present | array of Jurisdiction | State, county, county subdivision, place, from largest to smallest |
functions always present | Functions |
ResourcePage
| Field | Type | About |
|---|---|---|
jurisdiction always present | Jurisdiction | |
point | Point or null | |
topic always present | Topic or null | |
resources always present | array of Resource | |
next_cursor always present | string or null |
PlacePage
| Field | Type | About |
|---|---|---|
jurisdiction always present | Jurisdiction | |
chain always present | array of Jurisdiction | |
offices always present | array of Office | |
resources always present | array of Resource | The place's own resources |
functions always present | Functions | |
next_cursor always present | string or null |
TopicInfo
| Field | Type | About |
|---|---|---|
topic always present | Topic | |
name always present | string | |
description always present | string | |
functions always present | array of Function | |
page_url always present | string | |
guide_url always present | string or null |
TopicList
| Field | Type | About |
|---|---|---|
topics always present | array of TopicInfo | |
functions always present | object | Each function and the topics that serve it (contract 4.3) |
aliases always present | object | Deprecated topic names and the topic that replaced each |
Rule
| Field | Type | About |
|---|---|---|
office always present | string or null | The office name used in the state |
level always present | one of "state", "county", "town", "city", null | Level of government that does the job |
where always present | string or null | Plain words for the level, for example Each county |
note | string or null |
StateRules
| Field | Type | About |
|---|---|---|
state always present | string | |
name always present | string | |
assessment always present | Rule | |
tax_collection always present | Rule | |
recording always present | Rule | |
zoning always present | Rule or null | |
exemptions always present | Rule or null | |
page_url | string |
Guide
| Field | Type | About |
|---|---|---|
topic always present | Topic | |
state always present | string or null | |
title always present | string | |
summary always present | string | |
sections always present | array of object | |
page_url always present | string | |
state_rules always present | StateRules or null | |
state_summary always present | string or null | Plain sentences on who does this job in the state |
also always present | array of object | Other guides on the same topic |
Decider
| Field | Type | About |
|---|---|---|
description always present | string | Who makes the official decision |
function always present | Function or null | The function whose office is given |
office always present | FunctionEntry or null | The responsible local body from the responsibility model, where one applies |
Fact
| Field | Type | About |
|---|---|---|
status always present | string | Per fact: flood sfha, moderate, minimal, unmapped, unknown; wetlands yes, near, no, unknown; soils ok, none, unknown; elevation ok, unknown; shoreland likely, no, unknown; radon zone_1, zone_2, zone_3, not_listed |
summary always present | string | Plain-language result |
detail always present | string or null | |
values always present | object | Machine values, for example zone, subtype, base_flood_elevation_ft, firm_panel, feet, map_unit |
dataset always present | string | The data the fact was read from |
publisher always present | string | |
as_of always present | string or null | Source date where known: FIRM panel effective date, wetland image year, soil survey version, elevation acquisition date, radon map edition |
caveat always present | string | |
decided_by always present | Decider | |
resources always present | array of Resource | Directory resources to confirm the fact |
Screening
| Field | Type | About |
|---|---|---|
kind always present | "screening" | Every fact here is screening |
point always present | Point | |
jurisdictions always present | array of Jurisdiction | |
facts always present | object |
SearchResult
| Field | Type | About |
|---|---|---|
places always present | array of Jurisdiction | |
resources always present | array of Resource |