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 Team 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 (Team), 10 active keys (Enterprise+). Revoking a key takes effect within 60 seconds.
Rate limits
Per-key sliding window:
- Team: 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": 36.9,
"grade": "B",
"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 refresh on the same automated sync cadence. 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.