{
  "openapi": "3.1.0",
  "info": {
    "title": "UrbanKit Studio Parcel API",
    "version": "1.0.0",
    "summary": "Verified US county parcel data over a single HTTP contract.",
    "description": "Address to owner of record, parcel number (APN), and mailing address, drawn from each county's own published GIS layer.\n\nCounty assessors publish parcel data through hundreds of separately-shaped ArcGIS endpoints, each with its own field names, quirks and outages. This API is one interface over the verified subset: 155 counties, re-probed every two hours.\n\n**Coverage is bounded and matches are not guaranteed.** An address outside the indexed footprint, or one whose county publishes no owner field, returns `matched: false` or an empty owner. That is a normal outcome, not an error, and it is never billed as a match.",
    "contact": {
      "name": "UrbanKit Studio",
      "url": "https://urbankitstudio.com/contact"
    },
    "license": {
      "name": "Terms of use",
      "url": "https://urbankitstudio.com/terms"
    }
  },
  "servers": [
    {
      "url": "https://urbankitstudio.com",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Developer guide, SDK and MCP server",
    "url": "https://urbankitstudio.com/developers"
  },
  "tags": [
    {
      "name": "Lookup",
      "description": "Resolve a single address to its parcel record."
    },
    {
      "name": "Atlas",
      "description": "Which counties are indexed, and what each publishes."
    },
    {
      "name": "Batch",
      "description": "Paid endpoints that return many parcels per call."
    },
    {
      "name": "Health",
      "description": "Whether the indexed endpoints are actually answering right now."
    }
  ],
  "security": [
    {
      "ApiKey": []
    }
  ],
  "paths": {
    "/api/atlas/lookup": {
      "get": {
        "tags": [
          "Lookup"
        ],
        "operationId": "lookupAddress",
        "summary": "Resolve one address to its parcel record",
        "description": "Geocodes the address, routes it to the county that owns it, and queries that county's parcel layer.\n\nUsable without a key at a lower IP-based rate limit; a free key raises it to 500/day. Bills one lookup unit per keyed call on metered plans.",
        "security": [
          {
            "ApiKey": []
          },
          {}
        ],
        "parameters": [
          {
            "name": "address",
            "in": "query",
            "required": true,
            "description": "Full street address including city and state. A partial address will usually fail to geocode.",
            "schema": {
              "type": "string",
              "minLength": 3
            },
            "example": "1200 Market St, Philadelphia, PA"
          },
          {
            "name": "op",
            "in": "query",
            "required": false,
            "description": "Idempotency token for a retry. Reusing it on an identical request reuses the reservation instead of billing again.",
            "schema": {
              "type": "string",
              "pattern": "^uklk[|][0-9a-fA-F-]{20,80}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The lookup ran. Check `matched` — a miss is a 200, not an error.",
            "headers": {
              "x-ratelimit-limit": {
                "$ref": "#/components/headers/RateLimitLimit"
              },
              "x-ratelimit-remaining": {
                "$ref": "#/components/headers/RateLimitRemaining"
              },
              "x-ratelimit-reset": {
                "$ref": "#/components/headers/RateLimitReset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LookupResult"
                },
                "examples": {
                  "matched": {
                    "summary": "Indexed county, parcel found",
                    "value": {
                      "ok": true,
                      "query": {
                        "address": "1200 Market St, Philadelphia, PA"
                      },
                      "matched": true,
                      "atlas_indexed": true,
                      "geocode": {
                        "lat": 39.9526,
                        "lon": -75.1652,
                        "countyName": "Philadelphia",
                        "stateAbbrev": "PA",
                        "countyFips": "42101"
                      }
                    }
                  },
                  "notIndexed": {
                    "summary": "Geocoded, but the county is not in the atlas yet",
                    "value": {
                      "ok": true,
                      "matched": true,
                      "atlas_indexed": false,
                      "fallback": "Cheboygan, MI (FIPS 26031) is not in the UrbanKit atlas yet. Try the County Assessor site directly."
                    }
                  },
                  "noGeocode": {
                    "summary": "The address could not be geocoded",
                    "value": {
                      "ok": true,
                      "query": {
                        "address": "not an address"
                      },
                      "matched": false,
                      "message": "No geocode match. Provide a full street + city + state."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/atlas/county": {
      "get": {
        "tags": [
          "Atlas"
        ],
        "operationId": "getCounty",
        "summary": "What a county publishes, and whether it is indexed",
        "description": "Atlas metadata for one county: its endpoint URL, the fields it exposes, and when that endpoint was last confirmed live. Identify the county either by `fips`, or by `state` plus `county`.",
        "security": [
          {
            "ApiKey": []
          },
          {}
        ],
        "parameters": [
          {
            "name": "fips",
            "in": "query",
            "required": false,
            "description": "5-digit county FIPS code. Takes precedence over state/county when supplied.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{5}$"
            },
            "example": "42101"
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "description": "State slug, lower-case. Required when `fips` is absent.",
            "schema": {
              "type": "string"
            },
            "example": "pennsylvania"
          },
          {
            "name": "county",
            "in": "query",
            "required": false,
            "description": "County slug, lower-case. Required when `fips` is absent.",
            "schema": {
              "type": "string"
            },
            "example": "philadelphia-county"
          }
        ],
        "responses": {
          "200": {
            "description": "County metadata.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CountyResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "description": "No such county in the atlas.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/atlas/radius": {
      "post": {
        "tags": [
          "Batch"
        ],
        "operationId": "radiusOwners",
        "summary": "Every parcel within a radius of an address",
        "description": "Returns the owner of record for each parcel whose centroid falls inside the ring. The usual case is a public-notice mailing list.\n\n**Bills one unit PER PARCEL RETURNED**, not per call, so a dense ring is an expensive request. Requires a paid plan; pay-as-you-go is excluded.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RadiusRequest"
              },
              "example": {
                "address": "1200 Market St, Philadelphia, PA",
                "radiusFeet": 500
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The ring was queried. `count` is how many parcels were returned and billed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RadiusResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/PlanRequired"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/atlas/bulk": {
      "post": {
        "tags": [
          "Batch"
        ],
        "operationId": "bulkEnrich",
        "summary": "Enrich a list of addresses in one call",
        "description": "One result row per address submitted, in submission order.\n\nAddresses are de-duplicated before billing: you are charged for UNIQUE addresses, one unit each. Requires an Individual plan or above; pay-as-you-go is excluded.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkRequest"
              },
              "example": {
                "addresses": [
                  "1200 Market St, Philadelphia, PA",
                  "400 S Hope St, Los Angeles, CA"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Every address was attempted. A row with no owner is a miss, not a failure.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/PlanRequired"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          }
        }
      }
    },
    "/api/atlas/status": {
      "get": {
        "tags": [
          "Health"
        ],
        "operationId": "atlasStatus",
        "summary": "Live health of the indexed county endpoints",
        "description": "What the liveness probe last observed, every two hours, per county.\n\nDistinct from the `status` field on an endpoint in /api/atlas/county: that one is a registry curation stamp set by a human, this one is a machine observation. Conflating them is how a county that was down got served as `\"live\"`.\n\nNo key required — whether the data is up is the question the whole verification claim rests on, so it should not sit behind one. Per-IP rate limited.\n\n`tracked` and `in_atlas` are reported separately and can differ: a county in the atlas that has never been probed is counted in `in_atlas` and `untracked`, never silently as healthy.",
        "security": [
          {}
        ],
        "parameters": [
          {
            "name": "fips",
            "in": "query",
            "required": false,
            "description": "Limit to one county. Omit for every tracked county.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{5}$"
            },
            "example": "17089"
          }
        ],
        "responses": {
          "200": {
            "description": "Observed health. Without `fips`, the whole tracked atlas (StatusResult). With `fips`, a single county (StatusOne) where `found: false` means no observation exists — which is not the same as healthy.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/StatusResult"
                    },
                    {
                      "$ref": "#/components/schemas/StatusOne"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "description": "Health could not be read. Deliberately NOT an empty atlas, which would read as everything being fine.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "Your `uk_live_` key as a bearer token: `Authorization: Bearer uk_live_…`. Create one at https://urbankitstudio.com/account. The key authenticates the API directly — a session JWT will not."
      }
    },
    "headers": {
      "RateLimitLimit": {
        "description": "Calls allowed in the current window.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimitRemaining": {
        "description": "Calls left in the current window.",
        "schema": {
          "type": "integer"
        }
      },
      "RateLimitReset": {
        "description": "Unix seconds at which the window resets.",
        "schema": {
          "type": "integer"
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait before retrying.",
        "schema": {
          "type": "integer"
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "The request was malformed — a missing parameter, or a body that is not the documented shape.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "No key, or a key that is not accepted.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "PlanRequired": {
        "description": "The key is valid but its plan does not include this endpoint.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "Wrong HTTP method for this endpoint.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Rate limit or quota exhausted.",
        "headers": {
          "retry-after": {
            "$ref": "#/components/headers/RetryAfter"
          },
          "x-ratelimit-limit": {
            "$ref": "#/components/headers/RateLimitLimit"
          },
          "x-ratelimit-remaining": {
            "$ref": "#/components/headers/RateLimitRemaining"
          },
          "x-ratelimit-reset": {
            "$ref": "#/components/headers/RateLimitReset"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Every non-2xx response uses this shape.",
        "required": [
          "ok",
          "error"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": false
          },
          "error": {
            "type": "string",
            "description": "Stable machine-readable code.",
            "examples": [
              "method-not-allowed",
              "invalid-json",
              "addresses-required"
            ]
          },
          "message": {
            "type": "string",
            "description": "Human-readable detail. May change; do not match on it."
          }
        }
      },
      "Geocode": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "countyName": {
            "type": "string"
          },
          "stateAbbrev": {
            "type": "string"
          },
          "countyFips": {
            "type": "string",
            "pattern": "^\\d{5}$"
          }
        }
      },
      "LookupResult": {
        "type": "object",
        "required": [
          "ok",
          "matched"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "query": {
            "type": "object",
            "properties": {
              "address": {
                "type": "string"
              }
            }
          },
          "matched": {
            "type": "boolean",
            "description": "False when the address could not be geocoded."
          },
          "atlas_indexed": {
            "type": "boolean",
            "description": "Whether the resolved county is in the atlas. False means we geocoded it but cannot query it."
          },
          "geocode": {
            "$ref": "#/components/schemas/Geocode"
          },
          "geocode_stale": {
            "type": "boolean",
            "description": "The geocode came from cache and could not be refreshed."
          },
          "fallback": {
            "type": "string",
            "description": "Present when the county is not indexed: where to go instead."
          },
          "message": {
            "type": "string"
          },
          "county": {
            "$ref": "#/components/schemas/County"
          }
        }
      },
      "CountyResult": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "found": {
            "type": "boolean",
            "description": "False when the county is not in the atlas. Not an error."
          },
          "county": {
            "$ref": "#/components/schemas/County"
          },
          "rate_limit": {
            "type": "object",
            "properties": {
              "limit": {
                "type": "integer"
              },
              "remaining": {
                "type": "integer"
              },
              "reset": {
                "type": "string",
                "format": "date-time"
              }
            }
          }
        },
        "required": [
          "ok",
          "found"
        ]
      },
      "Endpoint": {
        "type": "object",
        "description": "One public REST layer serving this county's parcels.",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "service_type": {
            "type": "string",
            "description": "FeatureServer or MapServer."
          },
          "layer_name": {
            "type": "string"
          },
          "searchable_fields": {
            "type": "array",
            "description": "Fields this layer exposes for querying (owner/APN where the county publishes them).",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                }
              },
              "required": [
                "name",
                "label"
              ]
            }
          },
          "sample_query": {
            "type": [
              "string",
              "null"
            ]
          },
          "license": {
            "type": [
              "string",
              "null"
            ]
          },
          "endpoint_status": {
            "type": [
              "string",
              "null"
            ],
            "description": "The registry's curated availability flag for this endpoint. A human stamp, not a probe result."
          },
          "verification": {
            "$ref": "#/components/schemas/Verification"
          }
        },
        "required": [
          "url",
          "service_type",
          "searchable_fields"
        ]
      },
      "RadiusRequest": {
        "type": "object",
        "required": [
          "address",
          "radiusFeet"
        ],
        "properties": {
          "address": {
            "type": "string",
            "description": "Centre point of the ring."
          },
          "radiusFeet": {
            "type": "number",
            "description": "Radius in feet.",
            "minimum": 1
          }
        }
      },
      "RadiusResult": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "count": {
            "type": "integer",
            "description": "Parcels returned — and the number of units billed."
          },
          "charged": {
            "type": "integer"
          },
          "parcels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ParcelRow"
            }
          }
        }
      },
      "BulkRequest": {
        "type": "object",
        "required": [
          "addresses"
        ],
        "properties": {
          "addresses": {
            "type": "array",
            "description": "Addresses to enrich. De-duplicated before billing.",
            "items": {
              "type": "string"
            },
            "minItems": 1
          }
        }
      },
      "BulkResult": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ParcelRow"
            }
          }
        }
      },
      "ParcelRow": {
        "type": "object",
        "description": "One parcel. Fields are null or absent when the county does not publish them, or when nothing matched.",
        "properties": {
          "address": {
            "type": "string",
            "description": "The address as submitted."
          },
          "matched": {
            "type": "boolean"
          },
          "owner": {
            "type": [
              "string",
              "null"
            ],
            "description": "Owner of record. Null is a legitimate result."
          },
          "parcel_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "APN / parcel number."
          },
          "mailing_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "state": {
            "type": [
              "string",
              "null"
            ]
          },
          "confidence": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "StatusResult": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "totals": {
            "type": "object",
            "properties": {
              "ok": {
                "type": "integer"
              },
              "degraded": {
                "type": "integer"
              },
              "down": {
                "type": "integer"
              },
              "other": {
                "type": "integer"
              }
            }
          },
          "tracked": {
            "type": "integer",
            "description": "Counties with a health observation."
          },
          "in_atlas": {
            "type": "integer",
            "description": "Counties in the atlas. Omitted if the index could not be read."
          },
          "untracked": {
            "type": "integer",
            "description": "In the atlas but never probed. Not a health claim."
          },
          "counties": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CountyHealth"
            }
          }
        },
        "required": [
          "ok",
          "totals",
          "tracked",
          "counties"
        ]
      },
      "CountyHealth": {
        "type": "object",
        "properties": {
          "county_fips": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "degraded",
              "down",
              "unknown"
            ],
            "description": "Observed, not the registry claim."
          },
          "consecutive_failures": {
            "type": "integer"
          },
          "last_ok_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "checked_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "county_fips",
          "status"
        ]
      },
      "StatusCountyObserved": {
        "type": "object",
        "description": "One county that the probe has observed.",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "found": {
            "type": "boolean",
            "const": true,
            "description": "An observation exists. Read `status` for what it says."
          },
          "county_fips": {
            "type": "string",
            "pattern": "^\\d{5}$"
          },
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "degraded",
              "down",
              "unknown"
            ],
            "description": "Observed by the probe, not the registry's curation stamp."
          },
          "consecutive_failures": {
            "type": "integer"
          },
          "last_ok_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "checked_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "ok",
          "found",
          "county_fips",
          "status"
        ]
      },
      "StatusCountyUnobserved": {
        "type": "object",
        "description": "No observation for this county. NOT a health claim — the county may be outside the atlas, or in it but never probed. Do not read as healthy.",
        "properties": {
          "ok": {
            "type": "boolean",
            "const": true
          },
          "found": {
            "type": "boolean",
            "const": false,
            "description": "No observation exists. This is the negative signal; it is not `status: \"down\"`."
          },
          "county_fips": {
            "type": "string",
            "pattern": "^\\d{5}$"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "ok",
          "found",
          "county_fips",
          "message"
        ]
      },
      "StatusOne": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/StatusCountyObserved"
          },
          {
            "$ref": "#/components/schemas/StatusCountyUnobserved"
          }
        ],
        "description": "The `?fips=` response. Branch on `found` before reading `status`."
      },
      "Verification": {
        "type": "object",
        "description": "The registry's curation stamp: when a human last verified this entry and what they recorded. NOT a live observation — see `observed_health`.",
        "properties": {
          "last_verified": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO date, or null when no endpoint carries one."
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "description": "Weakest-link rollup across endpoints at county level."
          }
        },
        "required": [
          "last_verified",
          "status"
        ]
      },
      "ObservedHealth": {
        "type": [
          "object",
          "null"
        ],
        "description": "What the liveness probe last observed for this county, every two hours. null means NO OBSERVATION EXISTS — the county may be untracked, or the health store may have been unreachable. null NEVER means healthy. Distinct from `verification` and `endpoint_status`, which are curated claims.",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "degraded",
              "down",
              "unknown"
            ]
          },
          "consecutive_failures": {
            "type": "integer"
          },
          "last_ok_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "checked_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "status",
          "consecutive_failures"
        ]
      },
      "County": {
        "type": "object",
        "description": "A county as served by the public API (snake_case; the registry's internal camelCase is not the wire shape).",
        "properties": {
          "state_slug": {
            "type": "string",
            "example": "illinois"
          },
          "state_name": {
            "type": "string",
            "example": "Illinois"
          },
          "county_name": {
            "type": "string",
            "example": "Kane County"
          },
          "county_slug": {
            "type": "string",
            "example": "kane-county"
          },
          "county_fips": {
            "type": "string",
            "pattern": "^\\d{5}$",
            "example": "17089"
          },
          "has_public_rest": {
            "type": "boolean"
          },
          "verification": {
            "$ref": "#/components/schemas/Verification"
          },
          "observed_health": {
            "$ref": "#/components/schemas/ObservedHealth"
          },
          "endpoints": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Endpoint"
            }
          },
          "contact": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "department": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "url": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "email": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "notes": {
            "type": [
              "string",
              "null"
            ]
          },
          "urbankit_county_page": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "state_slug",
          "state_name",
          "county_name",
          "county_slug",
          "county_fips",
          "has_public_rest",
          "verification",
          "observed_health",
          "endpoints",
          "urbankit_county_page"
        ]
      }
    }
  }
}
