Skip to content
API v1 · REST · JSON

API Reference

ZoneWise.AI gives you programmatic access to Florida parcel data, zoning intelligence, and AI-powered property analysis. Available on Pro and Enterprise plans.

Overview

🌐
Base URL
https://zonewise.ai/api/v1
📦
Format
JSON (application/json)
🔐
Auth
Bearer token (API key)

All API responses include standard HTTP status codes. Successful responses return 200 OK with a JSON body. Errors return 4xx or 5xx codes with a structured error body.

Authentication

All API requests must include your API key in the Authorization header as a Bearer token. Get your API key from the account dashboard.

http
Authorization: Bearer zw_live_xxxxxxxxxxxxxxxxxxxx
Keep your API key secret. Never expose it in client-side code or public repositories. Use environment variables on your server.

Endpoints

GET/api/v1/parcels/{parcel_id}

Retrieve full parcel data for a given parcel ID. Includes zoning, owner, assessed value, and land use.

parcel_id
string · required · Brevard PARCEL_ID format
county
string · optional · defaults to "brevard"
json
{
  "parcel_id": "2412345",
  "address": "123 Main St, Melbourne, FL 32901",
  "owner": "Smith, John A",
  "zoning": "RU-1-9",
  "land_use": "Single Family Residential",
  "assessed_value": 245000,
  "lot_size_sqft": 8500,
  "zip": "32901",
  "county": "brevard"
}
GET/api/v1/zoning/{zone_code}

Get zoning district definition: permitted uses, dimensional standards, setbacks.

json
{
  "zone_code": "RU-1-9",
  "name": "Single-Family Residential District",
  "county": "brevard",
  "permitted_uses": ["single_family", "accessory_structures"],
  "min_lot_size_sqft": 9000,
  "max_height_ft": 35,
  "front_setback_ft": 25,
  "rear_setback_ft": 20,
  "side_setback_ft": 7.5
}
POST/api/v1/chat

Send a natural language query to the ZoneWise AI. Returns a streaming or non-streaming response with property and zoning intelligence.

messages
array · required · OpenAI-format message array
county
string · optional · defaults to "brevard"
stream
boolean · optional · defaults to true
GET/api/v1/kpis

Returns all 298 auction KPI definitions across 17 categories. Used to power the InsightWise report.

Rate Limits

PlanRequests/minRequests/dayChat queries/day
Free3
Starter ($39/mo)301,00020
Pro ($99/mo)120UnlimitedUnlimited
EnterpriseCustomCustomCustom

When rate limited, the API returns 429 Too Many Requests with a Retry-After header.

Code Examples

cURL

bash
curl -X GET \
  "https://zonewise.ai/api/v1/parcels/2412345" \
  -H "Authorization: Bearer zw_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json"

Python

python
import requests

API_KEY = "zw_live_xxxxxxxxxxxxxxxxxxxx"
BASE_URL = "https://zonewise.ai/api/v1"

headers = {
    "Authorization": "Bearer " + API_KEY,
    "Content-Type": "application/json",
}

# Fetch parcel data
response = requests.get(BASE_URL + "/parcels/2412345", headers=headers)
parcel = response.json()
print("Zoning:", parcel["zoning"])
print("Assessed value:", parcel["assessed_value"])

# Send a chat query
chat_response = requests.post(
    BASE_URL + "/chat",
    headers=headers,
    json={
        "messages": [
            {"role": "user", "content": "What are the setbacks for RU-1-9 zoning?"}
        ],
        "stream": False
    }
)
print(chat_response.json()["content"])

JavaScript / TypeScript

typescript
const API_KEY = process.env.ZONEWISE_API_KEY!
const BASE_URL = 'https://zonewise.ai/api/v1'

// Fetch parcel data
async function getParcel(parcelId: string) {
  const res = await fetch(`${BASE_URL}/parcels/${parcelId}`, {
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      'Content-Type': 'application/json',
    },
  })
  if (!res.ok) throw new Error(`API error: ${res.status}`)
  return res.json()
}

// Chat query
async function askZoneWise(question: string) {
  const res = await fetch(`${BASE_URL}/chat`, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      messages: [{ role: 'user', content: question }],
      stream: false,
    }),
  })
  return res.json()
}

// Usage
const parcel = await getParcel('2412345')
console.log('Zoning:', parcel.zoning)

const answer = await askZoneWise('What can I build on RU-1-9 land?')
console.log(answer.content)

Error Codes

400
Bad Request
Missing or invalid parameters. Check the request body.
401
Unauthorized
API key missing or invalid. Include a valid Bearer token.
403
Forbidden
Feature not available on your current plan. Upgrade to access.
404
Not Found
Parcel or resource does not exist in the database.
429
Rate Limited
Too many requests. Check Retry-After header and back off.
500
Server Error
Internal error. Retry after a short delay. Contact support if persistent.

Ready to integrate?

Get your API key on the Pro plan. Unlimited requests, full parcel database, AI chat.

View Pricing — From $39/mo