For Developers: Query data through REST API
The CalHeatScore API is a public ArcGIS Feature Service. No API key, token, or account is required — start making requests immediately.
Base URL:
https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query
Make your first request
Fetch the 7-day heat score forecast for a single ZIP code:
curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=ZIP_CODE='95814'&outFields=ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2,CHS_Day_3,CHS_Day_4,CHS_Day_5,CHS_Day_6&returnGeometry=false&f=json"
import requests
BASE_URL = (
"https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/"
"CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query"
)
params = {
"where": "ZIP_CODE='95814'",
"outFields": "ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2,CHS_Day_3,CHS_Day_4,CHS_Day_5,CHS_Day_6",
"returnGeometry": "false",
"f": "json",
}
response = requests.get(BASE_URL, params=params)
data = response.json()
# Check for API errors (ArcGIS returns HTTP 200 even for errors)
if "error" in data:
print(f"Error: {data['error']['message']}")
else:
for feature in data["features"]:
attrs = feature["attributes"]
# Scores are strings — convert to int for comparisons
score_today = int(attrs["CHS_Day_0"])
print(f"ZIP {attrs['ZIP_CODE']}: score today = {score_today}")
const baseUrl =
"https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/" +
"CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query";
const params = new URLSearchParams({
where: "ZIP_CODE='95814'",
outFields: "ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2,CHS_Day_3,CHS_Day_4,CHS_Day_5,CHS_Day_6",
returnGeometry: "false",
f: "json",
});
fetch(`${baseUrl}?${params}`)
.then((res) => res.json())
.then((data) => {
// Check for API errors (ArcGIS returns HTTP 200 even for errors)
if (data.error) {
console.error(`Error: ${data.error.message}`);
return;
}
data.features.forEach((feature) => {
const attrs = feature.attributes;
// Scores are strings — convert to number for comparisons
const scoreToday = Number(attrs.CHS_Day_0);
console.log(`ZIP ${attrs.ZIP_CODE}: score today = ${scoreToday}`);
});
})
.catch((err) => console.error("Request failed:", err));
Key things to know
- No authentication required. The API is open and read-only.
- Scores are strings. Convert
CHS_Day_0throughCHS_Day_6to integers before numeric comparisons. - Max 2,000 records per request. This shouldn't be an issue, however, given that there are fewer than 2,000 ZIP codes in California.
- Set
returnGeometry=falsewhen you only need score data. Polygon coordinates significantly increase response size. - Data updates daily. Data refreshes twice per day at 5:00AM and 8:00AM Pacific Time.
- Response formats: JSON (
f=json), GeoJSON (f=geojson), or Protocol Buffers (f=pbf).
ArcGIS Feature Services return HTTP 200 even for errors. Always check for an error property in the response body before processing results.