Korzy API

The Korzy API gives you structured land, infrastructure, energy, environmental and logistics records for the United States as JSON over HTTPS. The same operations are available to AI agents through the Korzy MCP server.

Seven operations cover it:

  • POST /v1/lookup: the parcels at an address or point, plus utilities, environment, logistics, data centers, power, grid, terrain and parcel boundary sections.
  • POST /v1/enrich: selected parcel fields, including owner fields, for a batch of addresses, points or parcel IDs.
  • GET /v1/records/{id}: one record by the ID a lookup or enrich returned.
  • POST /v1/ask and POST /v1/ask/stream: a question about a place, answered from Korzy data with citations.
  • POST /v1/support: report a data problem, request a feature or report a bug.
  • GET /v1/fields: what each operation returns and costs.

Base URL

All requests go to https://api.korzy.co, under /v1. Use HTTPS only.

OpenAPI spec

The OpenAPI 3.1 spec at https://korzy.co/openapi.json describes every route in the API reference: request bodies, response schemas, errors and what each request costs (x-korzy-credits). Load it into an API client, a code generator or an agent's tool setup.

Quickstart

  1. Create an account and choose a plan.
  2. Create an API key on your account page. Store it as a secret, for example in the KORZY_API_KEY environment variable.
  3. Call the field catalog to see what's available. It's free.
curl --fail-with-body -sS \
  -H "Authorization: Bearer $KORZY_API_KEY" \
  https://api.korzy.co/v1/fields

Then look up an address with its water and sewer service (2 credits):

curl --fail-with-body -sS \
  -H "Authorization: Bearer $KORZY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"address":"714 Mordecai Towne Pl, Raleigh, NC","sections":["utilities"]}' \
  https://api.korzy.co/v1/lookup

Python

import os, requests

session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['KORZY_API_KEY']}"

response = session.post(
    "https://api.korzy.co/v1/enrich",
    json={
        "items": [{"address": "714 Mordecai Towne Pl, Raleigh, NC"}],
        "preset": "basic",
    },
    timeout=60,
)
response.raise_for_status()
for result in response.json()["results"]:
    for record in result.get("records", []):
        print(record["korzy_id"], record.get("parceladdr"), record.get("usedesc"))

JavaScript

const id = "37183-676db8ae68362b7a3685";
const response = await fetch(`https://api.korzy.co/v1/records/${encodeURIComponent(id)}`, {
  headers: { Authorization: `Bearer ${process.env.KORZY_API_KEY}` },
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const { record } = await response.json();
console.log(record.parceladdr, record.usedesc, record.totalvalue);

Conventions

  • Coordinates are WGS 84 longitude and latitude in decimal degrees.
  • POST bodies are JSON objects of at most 64 KB. Responses are JSON, except /v1/ask/stream, which sends server-sent events.
  • Missing values are null; a null value means the source didn't publish it, not that it's zero.
  • Values keep the units and dates their sources publish. Each response carries provenance with as_of dates.
  • IDs are opaque strings. URL-encode them in paths.
  • New fields can be added to responses at any time. Ignore fields you don't recognize.

Next