v1 Enterprise +

SitePath API

Programmatic, source-cited access to county-level solar permitting research across every U.S. county — plus data-center and BESS regulatory intel, and the live change feed. Designed for server-to-server integration with your own pipelines, GIS, or BI tooling.

Base URL: https://www.sitepathintel.com/api/v1

Authentication

Every request (except /health) must include an API key in the Authorization header.

curl https://www.sitepathintel.com/api/v1/counties \
  -H "Authorization: Bearer sp_live_xxxxxxxxxxxxxxxxxxxxxxxx"
Treat API keys like passwords. They grant full read access to data your subscription covers. We never use them from the browser — embed them only in server-side code, environment variables, or a secrets manager. We deliberately keep CORS closed on the API to discourage browser usage.

Create a key

On Enterprise or Enterprise+, open your account → API keys and click Create new key. Give it a descriptive name (e.g. "Production CRM"). The full key is shown once — copy it to a secrets manager immediately. We store only an irreversible hash; lost keys must be revoked and recreated.

Limits: 5 active keys (Enterprise), 10 active keys (Enterprise+). Revoking a key takes effect within 60 seconds.

Rate limits

Per-key sliding window:

  • Enterprise: 100 requests / minute
  • Enterprise+: 1,000 requests / minute

When you exceed the window, we return 429 Too Many Requests with a Retry-After header in seconds. Back off and retry.

Soft cap, not a billing meter. The rate limit is per-warm-instance, so spiky traffic that hits multiple instances may allow a small burst past the stated cap. We don't bill per request; the cap exists to prevent runaway scripts from degrading the API for other customers.

Errors

Errors return JSON in a consistent shape:

{
  "error": "Human-readable message.",
  "code":  "machine_readable_code"
}

Codes you might see:

StatusCodeMeaning
401missing_keyNo Authorization header.
401invalid_keyKey didn't match. Could be revoked or typo'd.
403plan_requiredPlan doesn't include API access.
404not_found / county_not_foundUnknown endpoint or FIPS.
405method_not_allowedOnly GET is supported.
429rate_limitedSlow down. See Retry-After.
503data_unavailableThe dataset isn't loaded on this deploy. Retry shortly.

Health check

GET/healthNo auth

Returns 200 with a timestamp. Use this for liveness checks. No auth, no rate limit, instant response.

{ "ok": true, "ts": "2026-05-24T13:00:00.000Z", "version": "v1" }

Counties — list

GET/countiesAPI key required

Returns the public summary record for every U.S. county. Pageable.

Query parameters

NameTypeDescription
statestringFilter by 2-letter state code (case-insensitive), e.g. TX.
gradestringFilter by letter grade A, B, C, D, or F.
limitintegerPage size. Default 250, max 1000.
cursorintegerOffset of the first record to return. Use the previous response's nextCursor.

Example

curl "https://www.sitepathintel.com/api/v1/counties?state=TX&grade=A&limit=5" \
  -H "Authorization: Bearer $SITEPATH_API_KEY"

Response

{
  "total": 14,
  "count": 5,
  "cursor": 0,
  "nextCursor": 5,
  "counties": [
    {
      "fips": "48001",
      "state": "Texas",
      "stateCode": "TX",
      "county": "Anderson",
      "score": 32.4,
      "grade": "A",
      "rank": 12,
      "population": "57735",
      "lat": 31.8133,
      "lng": -95.6526,
      "ordinanceStatus": "Y",
      "hasMoratorium": false,
      "trajectory": "stable",
      "trajectoryLabel": "Stable",
      "trajectoryDelta12mo": 0,
      "dcStatus": "no-activity",
      "dcStatusLabel": "No Specific Activity"
    }
  ]
}

Counties — detail

GET/counties/:fipsAPI key required

Returns the single-county record for a given 5-digit FIPS code. Same field shape as the list endpoint plus a couple of extra trajectory fields.

curl https://www.sitepathintel.com/api/v1/counties/51117 \
  -H "Authorization: Bearer $SITEPATH_API_KEY"

Changes feed

GET/changesAPI key required

The live change feed — every ordinance update, moratorium event, board action, and score adjustment SitePath has detected. Each entry includes the field name, old value, new value, and run date.

Query parameters

NameTypeDescription
statestringFilter by 2-letter state code.
sincestringOnly return entries with runDate >= since. Format YYYY-MM-DD.
limitintegerPage size. Default 100, max 1000.

BESS dataset

GET/bessAPI key required

Full Energy Storage Intel dataset — every county where SitePath has identified battery-storage (BESS) regulatory activity. Includes per-county ordinance flags (fire-marshal review, NFPA 855, decommissioning bonds, setbacks), status, sentiment, trajectory, and the project pipeline aggregates.

Data Centers dataset

GET/data-centersAPI key required

Full Data Center Intel dataset — county-level moratoria, bans, restrictions, emerging markets, water / power / opposition flags, top developers, and news-source attribution.

Project pipeline

GET/projectsAPI key required

Every solar, BESS, and data-center project decision SitePath has indexed, nationwide. Every record is sourced: each one resolves to a verified primary source via one of four explicit verification levels, returned as verificationLevel. The generated field in the response tells you when the underlying index was last built.

Verification levels

LevelWhat it means
per-projectA direct URL pointing at this specific filing / docket / record.
categoryA URL to the state-level or category-level source covering this project (e.g. a state PUC docket index, EIA Form 860). The source IS verified, but it's not a one-click link to this exact row.
narrativeA research note in the summary field documenting how SitePath knows about this record. Used for BESS / data-center projects sourced from news coverage or industry filings without a per-project URL.
noneReserved for any record that loses its source attribution (currently 0 records).

Query parameters

NameTypeDescription
statestringFilter by 2-letter state code.
statusstringapproved, denied, under-construction, announced, operating.
technologystringsolar, bess, or data-center.
verificationLevelstringper-project, category, narrative, or none. Filter to a specific evidence tier.
minMwnumberCapacity floor. Records without a recorded capacity are excluded — they aren't inferred as zero.
sourced1 / trueOnly return records with verified source attribution (today: all records, since 100% are sourced).
limitintegerDefault 100, max 500.
cursorintegerOffset for paging.

Example

curl "https://www.sitepathintel.com/api/v1/projects?state=TX&status=denied&minMw=50&verificationLevel=per-project" \
  -H "Authorization: Bearer $SITEPATH_API_KEY"

Field shape (one project)

{
  "projectId":         "48201-...",
  "name":              "…",
  "developer":         "",            // empty = not recorded (NEVER inferred)
  "technology":        "solar",       // solar | bess | data-center
  "capacityMw":        "260",         // string; empty = not recorded
  "capacityMwh":       "",            // BESS only
  "acres":             "",
  "status":            "approved",
  "filedDate":         "",
  "decisionDate":      "2024-12-02",
  "lastStatusCheck":   "2026-04-15",  // solar only; when the status was last reverified
  "lastStatusChange":  "2024-12-02",  // solar only; when the status last changed
  "docketNumber":      "",
  "fips":              "48201",
  "stateCode":         "TX",
  "state":             "Texas",
  "county":            "Harris",
  "summary":           "",            // narrative source text (BESS / DC) when applicable
  "verificationLevel": "category",    // see table above
  "source": {
    "id":        "tx-...",
    "title":     "Approved projects in Harris County",
    "url":       "https://www.eia.gov/electricity/data/eia860/",
    "publisher": "EIA / state PUC",
    "verified":  true
  },
  "sourceMissing": false
}

Data integrity

The API serves the same datasets the rest of SitePath uses — there's no separate "API copy" that could drift. Every field traces back to a primary government document; if a value can't be verified, it isn't published.

The county dataset (data-public.js) is regenerated on the same cadence as the website. BESS and Data Center datasets follow the monthly sync schedule documented on /methodology. The changes feed reflects whatever the last sync produced.

If you spot incorrect data, email Support@sitepathintel.com with the FIPS code and the field — we verify and correct within 48 hours, and the fix shows up in the next API response.

Changelog

v1.1 — project pipeline enrichment

The /projects endpoint now returns BESS and data-center decisions in addition to solar. New fields: verificationLevel, summary (narrative source text), lastStatusCheck, lastStatusChange, capacityMwh (BESS). New query parameter: verificationLevel for filtering by evidence tier.

v1.0 — initial release

Endpoints: /health, /counties, /counties/:fips, /changes, /bess, /data-centers, /projects. Bearer-token auth via sp_live_* keys. Per-key rate limits.