{
 "openapi": "3.1.0",
 "info": {
  "title": "GovDir public API",
  "version": "1.4.0",
  "summary": "Official government offices and resources for property, land and GIS questions across the United States.",
  "description": "GovDir is a directory of official government websites and offices for property, land and map questions.\nEvery link comes from the GovDir directory and carries its verification status and date. GovDir checks\nlinks on a schedule; the office named for a function has the final say.\n\n- Base URL: https://api.govdir.com/v1\n- Anonymous use is allowed and rate limited per network address (an IPv6 /64 counts as one address), and\n  by limits shared by all callers without a key (a smaller one for place and resource lists, which also\n  has a per-address limit). Without a key a list page holds at most 50 items and a search at most 20 resources.\n  An API key raises the limits and page sizes. Keys never change what a result holds or its order.\n- Send a key as `Authorization: Bearer <key>` from a server. Browsers can call the API without a key from any\n  origin; the CORS preflight does not allow the Authorization header, so keys stay off web pages.\n- Every response uses the envelope `data, sources, as_of, request_id, notices`. Errors are RFC 9457\n  `application/problem+json` with a stable `type` under https://www.govdir.com/problems/.\n- Coordinates are WGS84. Points are GeoJSON (longitude, latitude). Times are ISO 8601 UTC.\n- Lists that can be long are paged with an opaque `cursor`; pass `next_cursor` back unchanged with the same\n  other parameters. A `Link` header with `rel=\"next\"` carries the same URL.\n- Responses carry a weak `ETag`; send it back in `If-None-Match` to get `304 Not Modified`.\n- Directory records whose origin GovDir has not yet documented are left out, and a notice gives the count.\n- Screening results (flood, wetlands, soils, elevation, shoreland, radon) are screening only, never an official\n  determination, and name the office that decides.\n- Deprecation policy: a field, parameter or endpoint is deprecated with at least 12 months' notice on\n  https://www.govdir.com/docs/api/changelog and with `Deprecation` and `Sunset` response headers before it\n  is removed. Additions (new fields, new topics, new enum values) can happen at any time; clients must ignore\n  what they do not know.\n",
  "termsOfService": "https://www.govdir.com/docs/api#terms",
  "contact": {
   "name": "GovDir",
   "url": "https://www.govdir.com/docs/api"
  },
  "license": {
   "name": "Directory data license_class open; see each source for its own terms",
   "url": "https://www.govdir.com/docs/api#terms"
  }
 },
 "servers": [
  {
   "url": "https://api.govdir.com/v1"
  }
 ],
 "security": [
  {},
  {
   "bearer": []
  }
 ],
 "tags": [
  {
   "name": "Places",
   "description": "Which government covers a point or place, and which office does each job"
  },
  {
   "name": "Resources",
   "description": "Official websites, maps and offices from the directory"
  },
  {
   "name": "Guides",
   "description": "Topics and plain-language guides"
  },
  {
   "name": "Screening",
   "description": "Point screening for flood, wetlands, soils, elevation, shoreland and radon"
  }
 ],
 "x-ok-headers": {
  "ETag": {
   "$ref": "#/components/headers/ETag"
  },
  "Cache-Control": {
   "$ref": "#/components/headers/CacheControl"
  },
  "X-Request-Id": {
   "$ref": "#/components/headers/RequestId"
  },
  "RateLimit-Policy": {
   "$ref": "#/components/headers/RateLimitPolicy"
  },
  "RateLimit": {
   "$ref": "#/components/headers/RateLimit"
  },
  "Link": {
   "$ref": "#/components/headers/Link"
  },
  "Access-Control-Allow-Origin": {
   "$ref": "#/components/headers/AllowOrigin"
  }
 },
 "paths": {
  "/jurisdictions/resolve": {
   "get": {
    "tags": [
     "Places"
    ],
    "operationId": "resolveJurisdiction",
    "summary": "Jurisdiction chain and responsible offices for a point, an address or a place",
    "description": "Give exactly one of: `lat` and `lon`; `address` (free text, geocoded by GovDir, cached for a day);\n`place` and `state` (a county, city, town or township name and a two-letter state code; add the county after\na comma to pick a town, for example `Washington, Door County`); or `jurisdiction_id`.\nReturns the state, county, county subdivision and place from largest to smallest, and for each function\n(assessment, tax_collection, recording, zoning, permits, gis) the body that performs it, its office and its\nresources. An address that matches several candidates answers 409 with candidate points in `choices`; ask\nagain with the `lat` and `lon` of one of them. A place name that matches several places answers 409 with\nchoices that carry a `jurisdiction_id`; resolve again with the `jurisdiction_id` of the one you mean.\n",
    "parameters": [
     {
      "$ref": "#/components/parameters/RequestId"
     },
     {
      "$ref": "#/components/parameters/IfNoneMatch"
     },
     {
      "name": "lat",
      "in": "query",
      "schema": {
       "type": "number",
       "minimum": -90,
       "maximum": 90
      },
      "description": "Latitude, with lon"
     },
     {
      "name": "lon",
      "in": "query",
      "schema": {
       "type": "number",
       "minimum": -180,
       "maximum": 180
      },
      "description": "Longitude, with lat"
     },
     {
      "name": "address",
      "in": "query",
      "schema": {
       "type": "string",
       "minLength": 3,
       "maxLength": 200
      },
      "description": "A street address, for example 350 S 5th St, Minneapolis, MN"
     },
     {
      "name": "place",
      "in": "query",
      "schema": {
       "type": "string",
       "minLength": 2,
       "maxLength": 100
      },
      "description": "A county, city, town or township name, with state or ending in its two-letter state (\"Washington, Door County, WI\")"
     },
     {
      "name": "state",
      "in": "query",
      "schema": {
       "$ref": "#/components/schemas/StateCode"
      },
      "description": "Two-letter state or territory code, with place"
     },
     {
      "name": "jurisdiction_id",
      "in": "query",
      "schema": {
       "$ref": "#/components/schemas/JurisdictionId"
      },
      "description": "A jurisdiction_id, for example from the choices of an ambiguous place"
     }
    ],
    "responses": {
     "200": {
      "description": "Resolved",
      "headers": {
       "ETag": {
        "$ref": "#/components/headers/ETag"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/CacheControl"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/RequestId"
       },
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimitPolicy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "Link": {
        "$ref": "#/components/headers/Link"
       },
       "Access-Control-Allow-Origin": {
        "$ref": "#/components/headers/AllowOrigin"
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "allOf": [
          {
           "$ref": "#/components/schemas/Envelope"
          },
          {
           "properties": {
            "data": {
             "$ref": "#/components/schemas/ResolveResult"
            }
           }
          }
         ]
        }
       }
      }
     },
     "304": {
      "$ref": "#/components/responses/NotModified"
     },
     "400": {
      "$ref": "#/components/responses/Problem"
     },
     "401": {
      "$ref": "#/components/responses/Problem"
     },
     "404": {
      "$ref": "#/components/responses/Problem"
     },
     "409": {
      "$ref": "#/components/responses/Problem"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     },
     "503": {
      "$ref": "#/components/responses/Problem"
     }
    }
   }
  },
  "/resources": {
   "get": {
    "tags": [
     "Resources"
    ],
    "operationId": "listResources",
    "summary": "Ranked official resources for a place or a point",
    "description": "Give `jurisdiction_id` or `lat` and `lon`. With a `topic`, returns the resources for that topic from the place\nup to its state and the national level, the place's own first. Without a topic (only with `jurisdiction_id`),\nreturns the place's own resources. The order is the same for every caller.\n",
    "parameters": [
     {
      "$ref": "#/components/parameters/RequestId"
     },
     {
      "$ref": "#/components/parameters/IfNoneMatch"
     },
     {
      "name": "jurisdiction_id",
      "in": "query",
      "schema": {
       "$ref": "#/components/schemas/JurisdictionId"
      }
     },
     {
      "name": "lat",
      "in": "query",
      "schema": {
       "type": "number",
       "minimum": -90,
       "maximum": 90
      }
     },
     {
      "name": "lon",
      "in": "query",
      "schema": {
       "type": "number",
       "minimum": -180,
       "maximum": 180
      }
     },
     {
      "name": "topic",
      "in": "query",
      "schema": {
       "$ref": "#/components/schemas/Topic"
      },
      "description": "Required with lat and lon"
     },
     {
      "$ref": "#/components/parameters/Limit"
     },
     {
      "$ref": "#/components/parameters/Cursor"
     }
    ],
    "responses": {
     "200": {
      "description": "Resources, best first",
      "headers": {
       "ETag": {
        "$ref": "#/components/headers/ETag"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/CacheControl"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/RequestId"
       },
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimitPolicy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "Link": {
        "$ref": "#/components/headers/Link"
       },
       "Access-Control-Allow-Origin": {
        "$ref": "#/components/headers/AllowOrigin"
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "allOf": [
          {
           "$ref": "#/components/schemas/Envelope"
          },
          {
           "properties": {
            "data": {
             "$ref": "#/components/schemas/ResourcePage"
            }
           }
          }
         ]
        }
       }
      }
     },
     "304": {
      "$ref": "#/components/responses/NotModified"
     },
     "400": {
      "$ref": "#/components/responses/Problem"
     },
     "401": {
      "$ref": "#/components/responses/Problem"
     },
     "404": {
      "$ref": "#/components/responses/Problem"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/places/{jurisdiction_id}": {
   "get": {
    "tags": [
     "Places"
    ],
    "operationId": "getPlace",
    "summary": "Full directory for one place",
    "description": "The place, its chain, its offices, the responsible body per function, and its own resources (paged).",
    "parameters": [
     {
      "$ref": "#/components/parameters/RequestId"
     },
     {
      "$ref": "#/components/parameters/IfNoneMatch"
     },
     {
      "name": "jurisdiction_id",
      "in": "path",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/JurisdictionId"
      }
     },
     {
      "$ref": "#/components/parameters/Limit"
     },
     {
      "$ref": "#/components/parameters/Cursor"
     }
    ],
    "responses": {
     "200": {
      "description": "The place directory",
      "headers": {
       "ETag": {
        "$ref": "#/components/headers/ETag"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/CacheControl"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/RequestId"
       },
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimitPolicy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "Link": {
        "$ref": "#/components/headers/Link"
       },
       "Access-Control-Allow-Origin": {
        "$ref": "#/components/headers/AllowOrigin"
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "allOf": [
          {
           "$ref": "#/components/schemas/Envelope"
          },
          {
           "properties": {
            "data": {
             "$ref": "#/components/schemas/PlacePage"
            }
           }
          }
         ]
        }
       }
      }
     },
     "304": {
      "$ref": "#/components/responses/NotModified"
     },
     "400": {
      "$ref": "#/components/responses/Problem"
     },
     "401": {
      "$ref": "#/components/responses/Problem"
     },
     "404": {
      "$ref": "#/components/responses/Problem"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/topics": {
   "get": {
    "tags": [
     "Guides"
    ],
    "operationId": "listTopics",
    "summary": "The topic vocabulary",
    "description": "Every topic with a plain description, the functions it belongs to, and its GovDir page. Topics are added, never renamed.",
    "parameters": [
     {
      "$ref": "#/components/parameters/RequestId"
     },
     {
      "$ref": "#/components/parameters/IfNoneMatch"
     }
    ],
    "responses": {
     "200": {
      "description": "Topics",
      "headers": {
       "ETag": {
        "$ref": "#/components/headers/ETag"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/CacheControl"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/RequestId"
       },
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimitPolicy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "Link": {
        "$ref": "#/components/headers/Link"
       },
       "Access-Control-Allow-Origin": {
        "$ref": "#/components/headers/AllowOrigin"
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "allOf": [
          {
           "$ref": "#/components/schemas/Envelope"
          },
          {
           "properties": {
            "data": {
             "$ref": "#/components/schemas/TopicList"
            }
           }
          }
         ]
        }
       }
      }
     },
     "304": {
      "$ref": "#/components/responses/NotModified"
     },
     "401": {
      "$ref": "#/components/responses/Problem"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/guides/{topic}": {
   "get": {
    "tags": [
     "Guides"
    ],
    "operationId": "getGuide",
    "summary": "Plain-language guide for a topic, with a state's rules",
    "description": "The GovDir guide text for the topic as plain text sections, and with `state` the state's own rules, for\nexample who assesses property there and at which level of government. Topics without a guide return the\ntopic description and the state's rules. Links to outside sources are on the guide page (`page_url`).\n",
    "parameters": [
     {
      "$ref": "#/components/parameters/RequestId"
     },
     {
      "$ref": "#/components/parameters/IfNoneMatch"
     },
     {
      "name": "topic",
      "in": "path",
      "required": true,
      "schema": {
       "$ref": "#/components/schemas/Topic"
      }
     },
     {
      "name": "state",
      "in": "query",
      "schema": {
       "$ref": "#/components/schemas/StateCode"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Guide",
      "headers": {
       "ETag": {
        "$ref": "#/components/headers/ETag"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/CacheControl"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/RequestId"
       },
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimitPolicy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "Link": {
        "$ref": "#/components/headers/Link"
       },
       "Access-Control-Allow-Origin": {
        "$ref": "#/components/headers/AllowOrigin"
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "allOf": [
          {
           "$ref": "#/components/schemas/Envelope"
          },
          {
           "properties": {
            "data": {
             "$ref": "#/components/schemas/Guide"
            }
           }
          }
         ]
        }
       }
      }
     },
     "304": {
      "$ref": "#/components/responses/NotModified"
     },
     "400": {
      "$ref": "#/components/responses/Problem"
     },
     "401": {
      "$ref": "#/components/responses/Problem"
     },
     "404": {
      "$ref": "#/components/responses/Problem"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/screening": {
   "get": {
    "tags": [
     "Screening"
    ],
    "operationId": "screenPoint",
    "summary": "Screening facts for a point",
    "description": "Flood zone (FEMA National Flood Hazard Layer), wetlands (USFWS National Wetlands Inventory), soil (USDA SSURGO),\nelevation (USGS 3D Elevation Program), Minnesota shoreland (DNR Public Waters Inventory, Minnesota only) and the\ncounty's EPA radon zone. Every fact is screening for the exact point only, never an official determination, and\nnames the office that decides. A fact that could not be checked has status `unknown`; try again later.\n",
    "parameters": [
     {
      "$ref": "#/components/parameters/RequestId"
     },
     {
      "$ref": "#/components/parameters/IfNoneMatch"
     },
     {
      "name": "lat",
      "in": "query",
      "required": true,
      "schema": {
       "type": "number",
       "minimum": -90,
       "maximum": 90
      }
     },
     {
      "name": "lon",
      "in": "query",
      "required": true,
      "schema": {
       "type": "number",
       "minimum": -180,
       "maximum": 180
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Screening facts",
      "headers": {
       "ETag": {
        "$ref": "#/components/headers/ETag"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/CacheControl"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/RequestId"
       },
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimitPolicy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "Link": {
        "$ref": "#/components/headers/Link"
       },
       "Access-Control-Allow-Origin": {
        "$ref": "#/components/headers/AllowOrigin"
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "allOf": [
          {
           "$ref": "#/components/schemas/Envelope"
          },
          {
           "properties": {
            "data": {
             "$ref": "#/components/schemas/Screening"
            }
           }
          }
         ]
        }
       }
      }
     },
     "304": {
      "$ref": "#/components/responses/NotModified"
     },
     "400": {
      "$ref": "#/components/responses/Problem"
     },
     "401": {
      "$ref": "#/components/responses/Problem"
     },
     "404": {
      "$ref": "#/components/responses/Problem"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     },
     "503": {
      "$ref": "#/components/responses/Problem"
     }
    }
   }
  },
  "/search": {
   "get": {
    "tags": [
     "Resources"
    ],
    "operationId": "searchDirectory",
    "summary": "Find places and resources by name",
    "description": "Matches place names (counties, cities, towns, townships) and directory resource names. It is a name lookup,\nnot a question answerer, and never searches for people.\n",
    "parameters": [
     {
      "$ref": "#/components/parameters/RequestId"
     },
     {
      "$ref": "#/components/parameters/IfNoneMatch"
     },
     {
      "name": "q",
      "in": "query",
      "required": true,
      "schema": {
       "type": "string",
       "minLength": 2,
       "maxLength": 200
      }
     },
     {
      "name": "state",
      "in": "query",
      "schema": {
       "$ref": "#/components/schemas/StateCode"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "description": "How many places and how many resources to return. Without a key at most 20 of each come back.",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50,
       "default": 10
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Matches, best first",
      "headers": {
       "ETag": {
        "$ref": "#/components/headers/ETag"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/CacheControl"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/RequestId"
       },
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimitPolicy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "Link": {
        "$ref": "#/components/headers/Link"
       },
       "Access-Control-Allow-Origin": {
        "$ref": "#/components/headers/AllowOrigin"
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "allOf": [
          {
           "$ref": "#/components/schemas/Envelope"
          },
          {
           "properties": {
            "data": {
             "$ref": "#/components/schemas/SearchResult"
            }
           }
          }
         ]
        }
       }
      }
     },
     "304": {
      "$ref": "#/components/responses/NotModified"
     },
     "400": {
      "$ref": "#/components/responses/Problem"
     },
     "401": {
      "$ref": "#/components/responses/Problem"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/county-data": {
   "get": {
    "tags": [
     "Resources"
    ],
    "operationId": "countyData",
    "summary": "County-wide parcel answers (largest, most valuable, counts, recent sales)",
    "description": "Answers a question about many parcels in one county from PublicGIS parcel data, such as the biggest or most valuable\nparcel, how many parcels are over a size, recent sales or the oldest building. Send a plain question in q, or a structured\nplan with jurisdiction_id and op. Owner names, owner rankings and owner searches are never available through the API.\nRoad, water and condominium common-element records are left out and counted in notes. Parcel maps are not surveys and\nthe county record is official. When the parcel database does not answer, the API answers 503 (busy or\nupstream-unavailable), which is never cached.\n",
    "parameters": [
     {
      "$ref": "#/components/parameters/RequestId"
     },
     {
      "$ref": "#/components/parameters/IfNoneMatch"
     },
     {
      "name": "q",
      "in": "query",
      "schema": {
       "type": "string",
       "minLength": 2,
       "maxLength": 200
      }
     },
     {
      "name": "jurisdiction_id",
      "in": "query",
      "schema": {
       "type": "string",
       "pattern": "^county:[0-9]{5}$"
      }
     },
     {
      "name": "op",
      "in": "query",
      "schema": {
       "enum": [
        "top",
        "bottom",
        "count",
        "avg",
        "median"
       ],
       "default": "top"
      }
     },
     {
      "name": "field",
      "in": "query",
      "schema": {
       "enum": [
        "acres",
        "value",
        "sale_date",
        "sale_price",
        "year_built",
        "sqft"
       ],
       "default": "acres"
      }
     },
     {
      "name": "min",
      "in": "query",
      "schema": {
       "type": "number"
      }
     },
     {
      "name": "max",
      "in": "query",
      "schema": {
       "type": "number"
      }
     },
     {
      "name": "since",
      "in": "query",
      "schema": {
       "type": "string",
       "format": "date"
      }
     },
     {
      "name": "until",
      "in": "query",
      "schema": {
       "type": "string",
       "format": "date"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 1,
       "maximum": 50,
       "default": 10
      }
     },
     {
      "name": "offset",
      "in": "query",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "maximum": 1000,
       "default": 0
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The answer, its rows and where the data came from",
      "headers": {
       "ETag": {
        "$ref": "#/components/headers/ETag"
       },
       "Cache-Control": {
        "$ref": "#/components/headers/CacheControl"
       },
       "X-Request-Id": {
        "$ref": "#/components/headers/RequestId"
       },
       "RateLimit-Policy": {
        "$ref": "#/components/headers/RateLimitPolicy"
       },
       "RateLimit": {
        "$ref": "#/components/headers/RateLimit"
       },
       "Link": {
        "$ref": "#/components/headers/Link"
       },
       "Access-Control-Allow-Origin": {
        "$ref": "#/components/headers/AllowOrigin"
       }
      },
      "content": {
       "application/json": {
        "schema": {
         "allOf": [
          {
           "$ref": "#/components/schemas/Envelope"
          },
          {
           "properties": {
            "data": {
             "$ref": "#/components/schemas/CountyData"
            }
           }
          }
         ]
        }
       }
      }
     },
     "304": {
      "$ref": "#/components/responses/NotModified"
     },
     "400": {
      "$ref": "#/components/responses/Problem"
     },
     "401": {
      "$ref": "#/components/responses/Problem"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     },
     "503": {
      "$ref": "#/components/responses/Problem"
     }
    }
   }
  },
  "/openapi.json": {
   "get": {
    "tags": [
     "Guides"
    ],
    "operationId": "getOpenApi",
    "summary": "This document as JSON",
    "security": [
     {}
    ],
    "responses": {
     "200": {
      "description": "OpenAPI 3.1 document",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     }
    }
   }
  }
 },
 "components": {
  "securitySchemes": {
   "bearer": {
    "type": "http",
    "scheme": "bearer",
    "description": "An API key issued by GovDir. Server-side use only."
   }
  },
  "headers": {
   "ETag": {
    "description": "Weak validator of the response data; send it back in If-None-Match",
    "schema": {
     "type": "string",
     "pattern": "^W/\"[0-9a-f]{32}\"$"
    }
   },
   "CacheControl": {
    "description": "public with a max-age that depends on the endpoint; errors are no-store",
    "schema": {
     "type": "string"
    }
   },
   "RequestId": {
    "description": "The request_id of this response",
    "schema": {
     "type": "string"
    }
   },
   "RateLimitPolicy": {
    "description": "IETF RateLimit-Policy, for example \"minute\";q=30;w=60, \"day\";q=1000;w=86400. Absent for service callers.",
    "schema": {
     "type": "string"
    }
   },
   "RateLimit": {
    "description": "IETF RateLimit: remaining requests (r) and seconds until reset (t) per policy, for example \"minute\";r=29;t=41, \"day\";r=990;t=50000",
    "schema": {
     "type": "string"
    }
   },
   "RetryAfter": {
    "description": "Seconds to wait before retrying",
    "schema": {
     "type": "integer",
     "minimum": 1
    }
   },
   "Link": {
    "description": "<https://api.govdir.com/v1/...&cursor=...>; rel=\"next\" when there is a next page",
    "schema": {
     "type": "string"
    }
   },
   "AllowOrigin": {
    "description": "Always *, without credentials",
    "schema": {
     "const": "*"
    }
   }
  },
  "parameters": {
   "RequestId": {
    "name": "X-Request-Id",
    "in": "header",
    "required": false,
    "description": "Echoed as request_id; 8 to 64 characters of letters, digits, dot, underscore or hyphen. Otherwise GovDir makes one.",
    "schema": {
     "type": "string",
     "pattern": "^[A-Za-z0-9._-]{8,64}$"
    }
   },
   "IfNoneMatch": {
    "name": "If-None-Match",
    "in": "header",
    "required": false,
    "description": "An ETag from an earlier response; a match answers 304 without a body",
    "schema": {
     "type": "string"
    }
   },
   "Limit": {
    "name": "limit",
    "in": "query",
    "required": false,
    "description": "Items per page. Without a key a page holds at most 50; a larger value returns 50 and a next_cursor.",
    "schema": {
     "type": "integer",
     "minimum": 1,
     "maximum": 100,
     "default": 50
    }
   },
   "Cursor": {
    "name": "cursor",
    "in": "query",
    "required": false,
    "description": "The next_cursor of the previous page, unchanged. Only valid with the same other parameters.",
    "schema": {
     "type": "string",
     "maxLength": 200
    }
   }
  },
  "responses": {
   "Problem": {
    "description": "RFC 9457 problem",
    "headers": {
     "X-Request-Id": {
      "$ref": "#/components/headers/RequestId"
     }
    },
    "content": {
     "application/problem+json": {
      "schema": {
       "$ref": "#/components/schemas/Problem"
      }
     }
    }
   },
   "RateLimited": {
    "description": "Too many requests; wait Retry-After seconds",
    "headers": {
     "Retry-After": {
      "$ref": "#/components/headers/RetryAfter"
     },
     "RateLimit-Policy": {
      "$ref": "#/components/headers/RateLimitPolicy"
     },
     "RateLimit": {
      "$ref": "#/components/headers/RateLimit"
     },
     "X-Request-Id": {
      "$ref": "#/components/headers/RequestId"
     }
    },
    "content": {
     "application/problem+json": {
      "schema": {
       "$ref": "#/components/schemas/Problem"
      }
     }
    }
   },
   "NotModified": {
    "description": "The data has not changed since the ETag in If-None-Match",
    "headers": {
     "ETag": {
      "$ref": "#/components/headers/ETag"
     }
    }
   }
  },
  "schemas": {
   "Problem": {
    "type": "object",
    "required": [
     "type",
     "title",
     "status",
     "detail",
     "request_id"
    ],
    "properties": {
     "type": {
      "type": "string",
      "format": "uri",
      "description": "Stable, one of https://www.govdir.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": {
      "type": "string"
     },
     "status": {
      "type": "integer"
     },
     "detail": {
      "type": "string"
     },
     "request_id": {
      "type": "string"
     },
     "choices": {
      "type": "array",
      "description": "With ambiguous (409), the candidates to choose from. Address candidates carry lat and lon; place candidates carry jurisdiction_id.",
      "items": {
       "$ref": "#/components/schemas/Choice"
      }
     }
    }
   },
   "Choice": {
    "type": "object",
    "required": [
     "label"
    ],
    "properties": {
     "label": {
      "type": "string"
     },
     "lat": {
      "type": "number"
     },
     "lon": {
      "type": "number"
     },
     "jurisdiction_id": {
      "$ref": "#/components/schemas/JurisdictionId"
     },
     "page_url": {
      "type": "string",
      "format": "uri"
     }
    }
   },
   "Envelope": {
    "type": "object",
    "required": [
     "data",
     "sources",
     "as_of",
     "request_id",
     "notices"
    ],
    "properties": {
     "data": {},
     "sources": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Source"
      }
     },
     "as_of": {
      "type": "string",
      "format": "date-time"
     },
     "request_id": {
      "type": "string"
     },
     "notices": {
      "type": "array",
      "items": {
       "type": "string"
      },
      "description": "Plain-language caveats"
     }
    }
   },
   "Source": {
    "type": "object",
    "required": [
     "name",
     "url",
     "publisher",
     "official",
     "retrieved_at",
     "license_class"
    ],
    "properties": {
     "name": {
      "type": "string"
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "publisher": {
      "type": [
       "string",
       "null"
      ]
     },
     "official": {
      "type": "boolean"
     },
     "retrieved_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date-time"
     },
     "license_class": {
      "enum": [
       "open",
       "public_record",
       "restricted_no_redistribution",
       "licensed_third_party",
       "unknown"
      ]
     },
     "verified_status": {
      "enum": [
       "verified",
       "not_yet_verified",
       "possibly_broken"
      ]
     },
     "verified_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     }
    }
   },
   "StateCode": {
    "type": "string",
    "pattern": "^[A-Za-z]{2}$",
    "description": "Two-letter postal code of a state, DC or territory"
   },
   "JurisdictionId": {
    "type": "string",
    "description": "Census GEOID with type prefix (state:27, county:27001, cousub:2700143000, place:2743000); district: for bodies that are not Census units; country:us",
    "pattern": "^(state:\\d{2}|county:\\d{5}|cousub:\\d{10}|place:\\d{7}|district:[a-z0-9-]+|country:us)$"
   },
   "Topic": {
    "enum": [
     "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": {
    "enum": [
     "assessment",
     "tax_collection",
     "recording",
     "zoning",
     "permits",
     "gis"
    ]
   },
   "Point": {
    "type": "object",
    "required": [
     "type",
     "coordinates"
    ],
    "properties": {
     "type": {
      "const": "Point"
     },
     "coordinates": {
      "type": "array",
      "minItems": 2,
      "maxItems": 2,
      "items": {
       "type": "number"
      },
      "description": "Longitude, latitude (WGS84)"
     }
    }
   },
   "Jurisdiction": {
    "type": "object",
    "required": [
     "jurisdiction_id",
     "type",
     "name",
     "page_url"
    ],
    "properties": {
     "jurisdiction_id": {
      "$ref": "#/components/schemas/JurisdictionId"
     },
     "type": {
      "enum": [
       "country",
       "state",
       "county",
       "cousub",
       "place",
       "district"
      ]
     },
     "name": {
      "type": "string"
     },
     "legal_type": {
      "type": [
       "string",
       "null"
      ],
      "description": "Census legal word: county, parish, borough, city, town, township, village, charter township, plantation"
     },
     "state": {
      "type": [
       "string",
       "null"
      ],
      "description": "Two-letter postal code"
     },
     "same_as": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/JurisdictionId"
      }
     },
     "ocd_id": {
      "type": [
       "string",
       "null"
      ]
     },
     "tiger_vintage": {
      "type": [
       "string",
       "null"
      ]
     },
     "page_url": {
      "type": "string",
      "format": "uri"
     }
    }
   },
   "Office": {
    "type": "object",
    "required": [
     "office_id",
     "name",
     "jurisdiction_id"
    ],
    "properties": {
     "office_id": {
      "type": "string",
      "description": "Opaque, stable, never reused"
     },
     "name": {
      "type": "string"
     },
     "kind": {
      "type": [
       "string",
       "null"
      ]
     },
     "jurisdiction_id": {
      "$ref": "#/components/schemas/JurisdictionId"
     },
     "phone": {
      "type": [
       "string",
       "null"
      ]
     },
     "email": {
      "type": [
       "string",
       "null"
      ]
     },
     "url": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     },
     "address": {
      "type": [
       "string",
       "null"
      ]
     },
     "person": {
      "type": [
       "object",
       "null"
      ],
      "properties": {
       "name": {
        "type": "string"
       },
       "title": {
        "type": "string"
       },
       "source_url": {
        "type": "string",
        "format": "uri"
       },
       "verified_at": {
        "type": "string",
        "format": "date"
       }
      }
     },
     "verified_status": {
      "enum": [
       "verified",
       "not_yet_verified",
       "possibly_broken"
      ]
     },
     "verified_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "page_url": {
      "type": "string",
      "format": "uri"
     }
    }
   },
   "Resource": {
    "type": "object",
    "required": [
     "resource_id",
     "name",
     "url",
     "topics",
     "official",
     "verified_status",
     "license_class",
     "page_url"
    ],
    "properties": {
     "resource_id": {
      "type": "string",
      "description": "Opaque, stable, never reused"
     },
     "name": {
      "type": "string"
     },
     "description": {
      "type": [
       "string",
       "null"
      ]
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "search_url_template": {
      "type": [
       "string",
       "null"
      ],
      "description": "Stored deep-link template with {pin} (parcel number), {street} (street line of an address) or {q} (any text)"
     },
     "topics": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Topic"
      }
     },
     "jurisdiction_id": {
      "$ref": "#/components/schemas/JurisdictionId"
     },
     "publisher": {
      "type": [
       "string",
       "null"
      ]
     },
     "provider": {
      "type": [
       "string",
       "null"
      ],
      "description": "Vendor that runs the page for the publisher"
     },
     "official": {
      "type": "boolean"
     },
     "verified_status": {
      "enum": [
       "verified",
       "not_yet_verified",
       "possibly_broken"
      ]
     },
     "verified_at": {
      "type": [
       "string",
       "null"
      ],
      "format": "date"
     },
     "verification_method": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "automated",
       "browser",
       "manual",
       null
      ]
     },
     "last_http_status": {
      "type": [
       "integer",
       "null"
      ]
     },
     "license_class": {
      "const": "open"
     },
     "source_kind": {
      "type": "string",
      "description": "How the record was gathered; unknown where GovDir has no saved source trail"
     },
     "page_url": {
      "type": "string",
      "format": "uri"
     }
    }
   },
   "FunctionEntry": {
    "type": "object",
    "required": [
     "function",
     "jurisdiction_id",
     "office_name",
     "resources"
    ],
    "properties": {
     "function": {
      "enum": [
       "assessment",
       "tax_collection",
       "recording",
       "zoning",
       "permits",
       "gis",
       "exemptions"
      ]
     },
     "jurisdiction_id": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/JurisdictionId"
       },
       {
        "type": "null"
       }
      ],
      "description": "Null when no body in the chain performs the function here (proposal CCP-10); basis then says who does, where known"
     },
     "office_name": {
      "type": [
       "string",
       "null"
      ]
     },
     "office": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Office"
       },
       {
        "type": "null"
       }
      ]
     },
     "resources": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Resource"
      },
      "description": "Under the function topics; for tax_collection the property_tax_payment page comes first"
     },
     "role": {
      "enum": [
       "primary",
       "secondary",
       "delinquent"
      ]
     },
     "levy_scope": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "county",
       "municipal",
       "school",
       "special",
       "all",
       null
      ]
     },
     "basis": {
      "type": [
       "string",
       "null"
      ],
      "description": "Plain-language reason this body performs the function"
     },
     "evidence_url": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     },
     "also": {
      "type": "array",
      "description": "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",
      "items": {
       "$ref": "#/components/schemas/FunctionEntry"
      }
     }
    }
   },
   "Functions": {
    "type": "object",
    "properties": {
     "assessment": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/FunctionEntry"
       },
       {
        "type": "null"
       }
      ]
     },
     "tax_collection": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/FunctionEntry"
       },
       {
        "type": "null"
       }
      ]
     },
     "recording": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/FunctionEntry"
       },
       {
        "type": "null"
       }
      ]
     },
     "zoning": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/FunctionEntry"
       },
       {
        "type": "null"
       }
      ]
     },
     "permits": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/FunctionEntry"
       },
       {
        "type": "null"
       }
      ]
     },
     "gis": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/FunctionEntry"
       },
       {
        "type": "null"
       }
      ]
     }
    }
   },
   "ResolveResult": {
    "type": "object",
    "required": [
     "match",
     "point",
     "jurisdictions",
     "functions"
    ],
    "properties": {
     "match": {
      "type": "object",
      "required": [
       "by",
       "label",
       "approximate"
      ],
      "properties": {
       "by": {
        "enum": [
         "point",
         "address",
         "place",
         "jurisdiction_id"
        ]
       },
       "label": {
        "type": [
         "string",
         "null"
        ],
        "description": "The matched address or place name"
       },
       "approximate": {
        "type": "boolean",
        "description": "True when the address matched only a street or area"
       }
      }
     },
     "point": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Point"
       },
       {
        "type": "null"
       }
      ],
      "description": "Null when resolved by place name"
     },
     "jurisdictions": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Jurisdiction"
      },
      "description": "State, county, county subdivision, place, from largest to smallest"
     },
     "functions": {
      "$ref": "#/components/schemas/Functions"
     }
    }
   },
   "ResourcePage": {
    "type": "object",
    "required": [
     "jurisdiction",
     "topic",
     "resources",
     "next_cursor"
    ],
    "properties": {
     "jurisdiction": {
      "$ref": "#/components/schemas/Jurisdiction"
     },
     "point": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Point"
       },
       {
        "type": "null"
       }
      ]
     },
     "topic": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Topic"
       },
       {
        "type": "null"
       }
      ]
     },
     "resources": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Resource"
      }
     },
     "next_cursor": {
      "type": [
       "string",
       "null"
      ]
     }
    }
   },
   "PlacePage": {
    "type": "object",
    "required": [
     "jurisdiction",
     "chain",
     "offices",
     "resources",
     "functions",
     "next_cursor"
    ],
    "properties": {
     "jurisdiction": {
      "$ref": "#/components/schemas/Jurisdiction"
     },
     "chain": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Jurisdiction"
      }
     },
     "offices": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Office"
      }
     },
     "resources": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Resource"
      },
      "description": "The place's own resources",
      "paged": null
     },
     "functions": {
      "$ref": "#/components/schemas/Functions"
     },
     "next_cursor": {
      "type": [
       "string",
       "null"
      ]
     }
    }
   },
   "TopicInfo": {
    "type": "object",
    "required": [
     "topic",
     "name",
     "description",
     "functions",
     "page_url",
     "guide_url"
    ],
    "properties": {
     "topic": {
      "$ref": "#/components/schemas/Topic"
     },
     "name": {
      "type": "string"
     },
     "description": {
      "type": "string"
     },
     "functions": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Function"
      }
     },
     "page_url": {
      "type": "string",
      "format": "uri"
     },
     "guide_url": {
      "type": [
       "string",
       "null"
      ],
      "format": "uri"
     }
    }
   },
   "TopicList": {
    "type": "object",
    "required": [
     "topics",
     "functions",
     "aliases"
    ],
    "properties": {
     "topics": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/TopicInfo"
      }
     },
     "functions": {
      "type": "object",
      "description": "Each function and the topics that serve it (contract 4.3)",
      "additionalProperties": {
       "type": "array",
       "items": {
        "$ref": "#/components/schemas/Topic"
       }
      }
     },
     "aliases": {
      "type": "object",
      "description": "Deprecated topic names and the topic that replaced each",
      "additionalProperties": {
       "$ref": "#/components/schemas/Topic"
      }
     }
    }
   },
   "Rule": {
    "type": "object",
    "required": [
     "office",
     "level",
     "where"
    ],
    "properties": {
     "office": {
      "type": [
       "string",
       "null"
      ],
      "description": "The office name used in the state"
     },
     "level": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "state",
       "county",
       "town",
       "city",
       null
      ],
      "description": "Level of government that does the job"
     },
     "where": {
      "type": [
       "string",
       "null"
      ],
      "description": "Plain words for the level, for example Each county"
     },
     "note": {
      "type": [
       "string",
       "null"
      ]
     }
    }
   },
   "StateRules": {
    "type": "object",
    "required": [
     "state",
     "name",
     "assessment",
     "tax_collection",
     "recording",
     "zoning",
     "exemptions"
    ],
    "properties": {
     "state": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "assessment": {
      "$ref": "#/components/schemas/Rule"
     },
     "tax_collection": {
      "$ref": "#/components/schemas/Rule"
     },
     "recording": {
      "$ref": "#/components/schemas/Rule"
     },
     "zoning": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Rule"
       },
       {
        "type": "null"
       }
      ]
     },
     "exemptions": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Rule"
       },
       {
        "type": "null"
       }
      ]
     },
     "page_url": {
      "type": "string",
      "format": "uri"
     }
    }
   },
   "Guide": {
    "type": "object",
    "required": [
     "topic",
     "state",
     "title",
     "summary",
     "sections",
     "page_url",
     "state_rules",
     "state_summary",
     "also"
    ],
    "properties": {
     "topic": {
      "$ref": "#/components/schemas/Topic"
     },
     "state": {
      "type": [
       "string",
       "null"
      ]
     },
     "title": {
      "type": "string"
     },
     "summary": {
      "type": "string"
     },
     "sections": {
      "type": "array",
      "items": {
       "type": "object",
       "required": [
        "heading",
        "text"
       ],
       "properties": {
        "heading": {
         "type": [
          "string",
          "null"
         ]
        },
        "text": {
         "type": "string"
        }
       }
      }
     },
     "page_url": {
      "type": "string",
      "format": "uri"
     },
     "state_rules": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/StateRules"
       },
       {
        "type": "null"
       }
      ]
     },
     "state_summary": {
      "type": [
       "string",
       "null"
      ],
      "description": "Plain sentences on who does this job in the state"
     },
     "also": {
      "type": "array",
      "description": "Other guides on the same topic",
      "items": {
       "type": "object",
       "required": [
        "title",
        "page_url"
       ],
       "properties": {
        "title": {
         "type": "string"
        },
        "page_url": {
         "type": "string",
         "format": "uri"
        }
       }
      }
     }
    }
   },
   "Decider": {
    "type": "object",
    "required": [
     "description",
     "office",
     "function"
    ],
    "properties": {
     "description": {
      "type": "string",
      "description": "Who makes the official decision"
     },
     "function": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/Function"
       },
       {
        "type": "null"
       }
      ],
      "description": "The function whose office is given"
     },
     "office": {
      "oneOf": [
       {
        "$ref": "#/components/schemas/FunctionEntry"
       },
       {
        "type": "null"
       }
      ],
      "description": "The responsible local body from the responsibility model, where one applies"
     }
    }
   },
   "Fact": {
    "type": "object",
    "required": [
     "status",
     "summary",
     "detail",
     "values",
     "dataset",
     "publisher",
     "as_of",
     "caveat",
     "decided_by",
     "resources"
    ],
    "properties": {
     "status": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "Plain-language result"
     },
     "detail": {
      "type": [
       "string",
       "null"
      ]
     },
     "values": {
      "type": "object",
      "description": "Machine values, for example zone, subtype, base_flood_elevation_ft, firm_panel, feet, map_unit"
     },
     "dataset": {
      "type": "string",
      "description": "The data the fact was read from"
     },
     "publisher": {
      "type": "string"
     },
     "as_of": {
      "type": [
       "string",
       "null"
      ],
      "description": "Source date where known: FIRM panel effective date, wetland image year, soil survey version, elevation acquisition date, radon map edition"
     },
     "caveat": {
      "type": "string"
     },
     "decided_by": {
      "$ref": "#/components/schemas/Decider"
     },
     "resources": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Resource"
      },
      "description": "Directory resources to confirm the fact"
     }
    }
   },
   "Screening": {
    "type": "object",
    "required": [
     "kind",
     "point",
     "jurisdictions",
     "facts"
    ],
    "properties": {
     "kind": {
      "const": "screening",
      "description": "Every fact here is screening",
      "never an official determination": null
     },
     "point": {
      "$ref": "#/components/schemas/Point"
     },
     "jurisdictions": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Jurisdiction"
      }
     },
     "facts": {
      "type": "object",
      "required": [
       "flood",
       "wetlands",
       "soils",
       "elevation",
       "radon"
      ],
      "properties": {
       "flood": {
        "$ref": "#/components/schemas/Fact"
       },
       "wetlands": {
        "$ref": "#/components/schemas/Fact"
       },
       "soils": {
        "$ref": "#/components/schemas/Fact"
       },
       "elevation": {
        "$ref": "#/components/schemas/Fact"
       },
       "shoreland": {
        "$ref": "#/components/schemas/Fact",
        "description": "Minnesota only"
       },
       "radon": {
        "$ref": "#/components/schemas/Fact"
       }
      }
     }
    }
   },
   "CountyData": {
    "type": "object",
    "required": [
     "question",
     "state",
     "answer",
     "notes",
     "rows",
     "source"
    ],
    "properties": {
     "question": {
      "type": "string"
     },
     "state": {
      "enum": [
       "ok",
       "no_data",
       "unavailable",
       "owners_unavailable",
       "not_cleared",
       "busy",
       "down"
      ],
      "description": "busy, down and not_cleared are no longer returned: a parcel database that does not answer gives 503, and a county whose data is not licensed for API use answers no_data, like one without data"
     },
     "answer": {
      "type": "string"
     },
     "notes": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "rows": {
      "type": "array",
      "maxItems": 50,
      "items": {
       "type": "object",
       "required": [
        "rank",
        "apn",
        "situs_address",
        "acres",
        "value",
        "value_label",
        "last_sale_date",
        "last_sale_price",
        "year_built",
        "publicgis_url",
        "lat",
        "lon"
       ],
       "properties": {
        "rank": {
         "type": "integer"
        },
        "apn": {
         "type": "string"
        },
        "situs_address": {
         "type": [
          "string",
          "null"
         ]
        },
        "acres": {
         "type": [
          "number",
          "null"
         ]
        },
        "value": {
         "type": [
          "number",
          "null"
         ]
        },
        "value_label": {
         "type": [
          "string",
          "null"
         ]
        },
        "last_sale_date": {
         "type": [
          "string",
          "null"
         ]
        },
        "last_sale_price": {
         "type": [
          "number",
          "null"
         ]
        },
        "year_built": {
         "type": [
          "integer",
          "null"
         ]
        },
        "publicgis_url": {
         "type": [
          "string",
          "null"
         ],
         "format": "uri"
        },
        "lat": {
         "type": [
          "number",
          "null"
         ]
        },
        "lon": {
         "type": [
          "number",
          "null"
         ]
        }
       },
       "additionalProperties": false
      }
     },
     "value": {
      "type": [
       "number",
       "null"
      ]
     },
     "source": {
      "type": [
       "object",
       "null"
      ],
      "required": [
       "name",
       "as_of"
      ],
      "properties": {
       "name": {
        "type": "string"
       },
       "as_of": {
        "type": [
         "string",
         "null"
        ]
       }
      },
      "additionalProperties": false
     }
    },
    "additionalProperties": false
   },
   "SearchResult": {
    "type": "object",
    "required": [
     "places",
     "resources"
    ],
    "properties": {
     "places": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Jurisdiction"
      }
     },
     "resources": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Resource"
      }
     }
    }
   }
  }
 }
}
