API documentation

All endpoints are versioned under /api/v1 and return JSON. Every endpoint except /health requires an API key.

Authentication

Pass your key as a bearer token in the Authorization header on every request.

curl "https://your-domain.com/api/v1/business-statistics?state=CA&naics=5415" \
  -H "Authorization: Bearer bi_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Endpoints

GET/api/v1/business-statistics

Establishment counts, employment, and payroll by geography, industry, and year.

Params: zip | state | county (one required), naics, year

GET/api/v1/demographics

Population, households, income, and labor-force statistics by geography.

Params: zip | state | county (one required), year

GET/api/v1/business-intelligence

Combined business + demographic snapshot for a single location, with source metadata.

Params: zip | state | county (one required), naics, year

GET/api/v1/locations/{zip}

Look up a ZIP code's geography record, including state and county context.

Params: zip (path)

GET/api/v1/industries/{naics}

Look up a NAICS industry code's title, level, and hierarchy.

Params: naics (path)

GET/api/v1/health

Unauthenticated liveness check for the API.

Params: none

Code examples

cURL
curl "https://your-domain.com/api/v1/business-statistics?state=CA&naics=5415" \
  -H "Authorization: Bearer bi_live_xxxxxxxxxxxxxxxxxxxxxxxx"
JavaScript
const res = await fetch(
  "https://your-domain.com/api/v1/business-intelligence?zip=94103",
  { headers: { Authorization: `Bearer ${process.env.BIZINTEL_API_KEY}` } }
);
const { data } = await res.json();
Python
import os, requests

res = requests.get(
    "https://your-domain.com/api/v1/demographics",
    params={"state": "NY"},
    headers={"Authorization": f"Bearer {os.environ['BIZINTEL_API_KEY']}"},
)
data = res.json()["data"]

Rate limits & quotas

Every response includes rate-limit headers:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59

Exceeding your plan's per-minute limit returns a 429 with code RATE_LIMITED. Exceeding your monthly quota returns a 403 with code QUOTA_EXCEEDED. See pricing for plan limits.

Error format

Errors always return a JSON body of the same shape, with an HTTP status matching the error code:

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Provide at least one location parameter: zip, state, or county."
  }
}
CodeStatusMeaning
VALIDATION_ERROR400Query or path parameters failed validation.
UNAUTHORIZED401Missing, malformed, or revoked API key.
FORBIDDEN403Key does not have access to this resource.
QUOTA_EXCEEDED403Monthly request quota for your plan has been used up.
NOT_FOUND404No matching geography, industry, or resource.
RATE_LIMITED429Per-minute rate limit exceeded for your plan.
INTERNAL_ERROR500Unexpected server error.