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"
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.
Errors
Errors return JSON in a consistent shape:
{
"error": "Human-readable message.",
"code": "machine_readable_code"
}
Codes you might see:
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_key | No Authorization header. |
| 401 | invalid_key | Key didn't match. Could be revoked or typo'd. |
| 403 | plan_required | Plan doesn't include API access. |
| 404 | not_found / county_not_found | Unknown endpoint or FIPS. |
| 405 | method_not_allowed | Only GET is supported. |
| 429 | rate_limited | Slow down. See Retry-After. |
| 503 | data_unavailable | The dataset isn't loaded on this deploy. Retry shortly. |
Health check
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
Returns the public summary record for every U.S. county. Pageable.
Query parameters
| Name | Type | Description |
|---|---|---|
state | string | Filter by 2-letter state code (case-insensitive), e.g. TX. |
grade | string | Filter by letter grade A, B, C, D, or F. |
limit | integer | Page size. Default 250, max 1000. |
cursor | integer | Offset 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
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
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
| Name | Type | Description |
|---|---|---|
state | string | Filter by 2-letter state code. |
since | string | Only return entries with runDate >= since. Format YYYY-MM-DD. |
limit | integer | Page size. Default 100, max 1000. |
BESS dataset
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
Full Data Center Intel dataset — county-level moratoria, bans, restrictions, emerging markets, water / power / opposition flags, top developers, and news-source attribution.
Project pipeline
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
| Level | What it means |
|---|---|
per-project | A direct URL pointing at this specific filing / docket / record. |
category | A 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. |
narrative | A 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. |
none | Reserved for any record that loses its source attribution (currently 0 records). |
Query parameters
| Name | Type | Description |
|---|---|---|
state | string | Filter by 2-letter state code. |
status | string | approved, denied, under-construction, announced, operating. |
technology | string | solar, bess, or data-center. |
verificationLevel | string | per-project, category, narrative, or none. Filter to a specific evidence tier. |
minMw | number | Capacity floor. Records without a recorded capacity are excluded — they aren't inferred as zero. |
sourced | 1 / true | Only return records with verified source attribution (today: all records, since 100% are sourced). |
limit | integer | Default 100, max 500. |
cursor | integer | Offset 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.