Skip to content

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_0 through CHS_Day_6 to 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=false when 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.