Developer API
A stable, versioned, read-only JSON API over the New River Analytics accountability and ratio-study data — the productized version of the data for researchers, the press, and proptech. Free to use with attribution.
api_version: "v1".
Breaking changes ship under a new version.Retry-After.Access-Control-Allow-Origin: *.All endpoints live under a single versioned router:
GET api/v1.php?resource=<resource>&…
Every response uses the same envelope:
{
"api_version": "v1",
"resource": "<resource>",
"generated_at": null,
"data": …,
"meta": { … } // when useful: count, license, targets, notes
}
An unknown or missing resource returns HTTP 400 with the list of valid
resources. Bad params return 400; a missing record returns 404.
Resources
counties
Every WV county’s accountability scorecard row — median ratio, COD, PRD/PRB, reappraisal staleness, standards met, confidence, and current assessor.
api/v1.php?resource=counties
{
"api_version": "v1",
"resource": "counties",
"generated_at": null,
"data": [
{
"county": "20 - Kanawha",
"county_code": 20,
"current_assessor": "...",
"n": 4213,
"median_ratio": 0.61,
"cod": 18.4, "cod_status": "warn",
"prd": 1.02, "prd_status": "pass",
"prb": -0.031, "prb_status": "pass",
"pct_stale": 22.7, "cadence_status": "warn",
"standards_met": 2, "standards_total": 3,
"confidence": "high", "insufficient": false
}
],
"meta": { "count": 55, "license": "CC BY 4.0 — attribute New River Analytics." }
}
county
The full accountability record for one county: metrics, per-metric IAAO verdicts, reappraisal cadence, graded assessor eras, and authoritative term spans.
code |
required | County FIPS code, e.g. 20 (Kanawha), 45 (Summers). |
{
"api_version": "v1",
"resource": "county",
"generated_at": null,
"data": {
"county": "20 - Kanawha",
"county_code": 20,
"current_assessor": "...",
"metrics": { "n": 4213, "median_ratio": 0.61, "cod": 18.4, "prd": 1.02, "prb": -0.031 },
"flags": { "cod": {"status":"warn", ...}, "prd": {...}, "prb": {...}, "level": {...} },
"standards": { "met": 2, "total": 3 },
"cadence": { "pct_stale": 22.7, "flag": {...} },
"eras": [ ... ], "terms": [ ... ]
},
"meta": { "targets": { "cod": "≤ 15 (IAAO...)", ... } }
}
assessors
Graded per-assessor eras: who held office, the years covered, sample size, and the IAAO metrics. Low-sample eras are suppressed (not published).
api/v1.php?resource=assessors
{
"api_version": "v1",
"resource": "assessors",
"generated_at": null,
"data": [
{
"assessor": "...", "county": "45 - Summers", "county_code": 45,
"years": "2015–2024", "n": 612,
"median_ratio": 0.58, "cod": 14.2, "prd": 1.01, "prb": -0.012
}
],
"meta": { "count": 80, "license": "CC BY 4.0 — attribute New River Analytics." }
}
equalization
Materialized per-county, per-class IAAO ratio study over the standard sales window: sales count, median assessment ratio, COD, PRD, PRB.
api/v1.php?resource=equalization
{
"api_version": "v1",
"resource": "equalization",
"generated_at": null,
"data": [
{
"county": "20 - Kanawha", "class": "R", "years": 5,
"n_sales": 4213, "median_ratio": 0.61,
"cod": 18.4, "prd": 1.02, "prb": -0.031,
"median_appraised": 92000, "median_adj_sale": 150000, "target_year": 2025
}
],
"meta": { "count": 110, "license": "CC BY 4.0 — attribute New River Analytics." }
}
levy_rates
District levy (millage) rates by county and tax year for tax classes I, II, and III/IV — the rate applied to assessed value to compute a tax bill.
api/v1.php?resource=levy_rates
{
"api_version": "v1",
"resource": "levy_rates",
"generated_at": null,
"data": [
{
"county": "45 - Summers", "district_key": "...", "tax_year": 2025,
"class_i": 0.2295, "class_ii": 0.4590, "class_iii_iv": 0.9180, "is_base": 1
}
],
"meta": { "count": 2200, "license": "CC BY 4.0 — attribute New River Analytics." }
}
parcel
A compact factual subset for one parcel: basics + appraised value, plus AVM value and assessment ratio when available. Owner name and mailing address are intentionally omitted — this is not a bulk-PII surface.
pid |
required | Alphanumeric parcel id (pid). See a Property Report URL. |
api/v1.php?resource=parcel&pid=
{
"api_version": "v1",
"resource": "parcel",
"generated_at": null,
"data": {
"pid": "...", "parcel_id_formatted": "...",
"county": "45 - Summers", "district": "...",
"physical_address": "...",
"property_class_code": "R", "property_class_name": "Residential",
"land_use": "...", "sqft": 1840, "deeded_acres": 0.5, "calculated_acres": 0.48,
"num_buildings": 1, "flood_risk": null, "lat": 37.6, "lng": -80.9,
"appraised_value": 92000,
"avm_value": 148500, "assessment_ratio": 0.62
},
"meta": { "note": "Owner name and mailing address are intentionally omitted." }
}
The API accepts an optional key parameter
(api/v1.php?resource=…&key=…). Today it is a no-op —
everything is open at the standard limit.
soon API keys for higher rate limits arrive with accounts. Existing calls keep working unchanged; a valid key will simply raise your limit.
CC BY 4.0 Free to reuse, republish, and remix — please attribute New River Analytics and link back where practical. The API exposes aggregate accountability data and single-parcel facts only; it contains no personal information and no billed tax dollars.
Prefer files? Grab the bulk CSV datasets. To understand how the metrics are computed (COD, PRD, PRB, ratio studies, grading thresholds, confidence tiers), see the methodology.