Skip to content

Common Query Examples

Copy-paste query examples for common CalHeatScore use cases: single ZIP lookups, filtering by risk level, pagination, GeoJSON mapping, and more.

Examples on this page

Get the 7-day forecast for a ZIP code

Fetch the full 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='94612'&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='94612'",
    "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()

if "error" in data:
    print(f"Error: {data['error']['message']}")
else:
    for feature in data["features"]:
        attrs = feature["attributes"]
        print(f"ZIP {attrs['ZIP_CODE']} ({attrs['DATE']})")
        for day in range(7):
            score = attrs[f"CHS_Day_{day}"]
            print(f"  Day {day}: {score}")
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='94612'",
  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) => {
    if (data.error) {
      console.error(`Error: ${data.error.message}`);
      return;
    }
    data.features.forEach((feature) => {
      const attrs = feature.attributes;
      console.log(`ZIP ${attrs.ZIP_CODE} (${attrs.DATE})`);
      for (let day = 0; day <= 6; day++) {
        console.log(`  Day ${day}: ${attrs[`CHS_Day_${day}`]}`);
      }
    });
  })
  .catch((err) => console.error("Request failed:", err));
Example response
{
  "features": [
    {
      "attributes": {
        "ZIP_CODE": "94612",
        "DATE": "2026-02-21",
        "CHS_Day_0": "0",
        "CHS_Day_1": "0",
        "CHS_Day_2": "1",
        "CHS_Day_3": "2",
        "CHS_Day_4": "1",
        "CHS_Day_5": "0",
        "CHS_Day_6": "0"
      }
    }
  ]
}

Get forecasts for multiple ZIP codes

Use the SQL IN operator to query multiple ZIP codes in a single request.

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=ZIP_CODE+IN+('90210','90001','94102','92101')&outFields=ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2&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"
)

zip_codes = ["90210", "90001", "94102", "92101"]
where_clause = "ZIP_CODE IN (" + ",".join(f"'{z}'" for z in zip_codes) + ")"

params = {
    "where": where_clause,
    "outFields": "ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2",
    "returnGeometry": "false",
    "f": "json",
}

response = requests.get(BASE_URL, params=params)
data = response.json()

if "error" in data:
    print(f"Error: {data['error']['message']}")
else:
    for feature in data["features"]:
        attrs = feature["attributes"]
        print(f"ZIP {attrs['ZIP_CODE']}: Day 0={attrs['CHS_Day_0']}, Day 1={attrs['CHS_Day_1']}, Day 2={attrs['CHS_Day_2']}")
const baseUrl =
  "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/" +
  "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query";

const zipCodes = ["90210", "90001", "94102", "92101"];
const whereClause = `ZIP_CODE IN (${zipCodes.map((z) => `'${z}'`).join(",")})`;

const params = new URLSearchParams({
  where: whereClause,
  outFields: "ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2",
  returnGeometry: "false",
  f: "json",
});

fetch(`${baseUrl}?${params}`)
  .then((res) => res.json())
  .then((data) => {
    if (data.error) {
      console.error(`Error: ${data.error.message}`);
      return;
    }
    data.features.forEach((feature) => {
      const a = feature.attributes;
      console.log(`ZIP ${a.ZIP_CODE}: Day 0=${a.CHS_Day_0}, Day 1=${a.CHS_Day_1}, Day 2=${a.CHS_Day_2}`);
    });
  })
  .catch((err) => console.error("Request failed:", err));
Example response
{
  "features": [
    {
      "attributes": {
        "ZIP_CODE": "90001",
        "DATE": "2026-02-21",
        "CHS_Day_0": "0",
        "CHS_Day_1": "1",
        "CHS_Day_2": "2"
      }
    },
    {
      "attributes": {
        "ZIP_CODE": "90210",
        "DATE": "2026-02-21",
        "CHS_Day_0": "0",
        "CHS_Day_1": "0",
        "CHS_Day_2": "1"
      }
    },
    {
      "attributes": {
        "ZIP_CODE": "92101",
        "DATE": "2026-02-21",
        "CHS_Day_0": "0",
        "CHS_Day_1": "0",
        "CHS_Day_2": "0"
      }
    },
    {
      "attributes": {
        "ZIP_CODE": "94102",
        "DATE": "2026-02-21",
        "CHS_Day_0": "0",
        "CHS_Day_1": "0",
        "CHS_Day_2": "0"
      }
    }
  ]
}

Find ZIP codes with high or extreme heat risk today

Filter for ZIP codes where today's score (CHS_Day_0) is 3 (high) or 4 (extreme).

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=CHS_Day_0%20%3D%20'3'%20OR%20CHS_Day_0%20%3D%20'4'&outFields=ZIP_CODE,DATE,CHS_Day_0&returnGeometry=false&f=json&orderByFields=CHS_Day_0%20DESC"
import requests

BASE_URL = (
    "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/"
    "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query"
)

params = {
    "where": "CHS_Day_0='3' OR CHS_Day_0='4'",
    "outFields": "ZIP_CODE,DATE,CHS_Day_0",
    "returnGeometry": "false",
    "f": "json",
    "orderByFields": "CHS_Day_0 DESC",
}

response = requests.get(BASE_URL, params=params)
data = response.json()

if "error" in data:
    print(f"Error: {data['error']['message']}")
else:
    print(f"Found {len(data['features'])} ZIP codes with high/extreme risk")
    for feature in data["features"]:
        attrs = feature["attributes"]
        score = int(attrs["CHS_Day_0"])
        label = "EXTREME" if score == 4 else "HIGH"
        print(f"  ZIP {attrs['ZIP_CODE']}: {label} (score {score})")
const baseUrl =
  "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/" +
  "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query";

const params = new URLSearchParams({
  where: "CHS_Day_0>='3'",
  outFields: "ZIP_CODE,DATE,CHS_Day_0",
  returnGeometry: "false",
  f: "json",
  orderByFields: "CHS_Day_0 DESC",
});

fetch(`${baseUrl}?${params}`)
  .then((res) => res.json())
  .then((data) => {
    if (data.error) {
      console.error(`Error: ${data.error.message}`);
      return;
    }
    console.log(`Found ${data.features.length} ZIP codes with high/extreme risk`);
    data.features.forEach((feature) => {
      const attrs = feature.attributes;
      const score = Number(attrs.CHS_Day_0);
      const label = score === 4 ? "EXTREME" : "HIGH";
      console.log(`  ZIP ${attrs.ZIP_CODE}: ${label} (score ${score})`);
    });
  })
  .catch((err) => console.error("Request failed:", err));
Example response (during a heat event)
{
  "features": [
    {
      "attributes": {
        "ZIP_CODE": "92274",
        "DATE": "2026-07-15",
        "CHS_Day_0": "4"
      }
    },
    {
      "attributes": {
        "ZIP_CODE": "92233",
        "DATE": "2026-07-15",
        "CHS_Day_0": "4"
      }
    },
    {
      "attributes": {
        "ZIP_CODE": "93501",
        "DATE": "2026-07-15",
        "CHS_Day_0": "3"
      }
    }
  ]
}

Get ZIP code boundaries as GeoJSON

Request f=geojson to get results in GeoJSON format, which works directly with mapping libraries like Leaflet, Mapbox GL JS, and D3. Set outSR=4326 to get coordinates in latitude/longitude.

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=ZIP_CODE='90210'&outFields=ZIP_CODE,CHS_Day_0&outSR=4326&f=geojson"
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='90210'",
    "outFields": "ZIP_CODE,CHS_Day_0",
    "outSR": "4326",
    "f": "geojson",
}

response = requests.get(BASE_URL, params=params)
geojson = response.json()

if "error" in geojson:
    print(f"Error: {geojson['error']['message']}")
else:
    for feature in geojson["features"]:
        props = feature["properties"]
        num_coords = len(feature["geometry"]["coordinates"][0])
        print(f"ZIP {props['ZIP_CODE']}: score={props['CHS_Day_0']}, polygon has {num_coords} points")
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='90210'",
  outFields: "ZIP_CODE,CHS_Day_0",
  outSR: "4326",
  f: "geojson",
});

fetch(`${baseUrl}?${params}`)
  .then((res) => res.json())
  .then((geojson) => {
    if (geojson.error) {
      console.error(`Error: ${geojson.error.message}`);
      return;
    }
    geojson.features.forEach((feature) => {
      const props = feature.properties;
      const numCoords = feature.geometry.coordinates[0].length;
      console.log(`ZIP ${props.ZIP_CODE}: score=${props.CHS_Day_0}, polygon has ${numCoords} points`);
    });
  })
  .catch((err) => console.error("Request failed:", err));
Example response
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [-118.432, 34.092],
            [-118.441, 34.081],
            [-118.438, 34.069],
            [-118.413, 34.071],
            [-118.401, 34.084],
            [-118.432, 34.092]
          ]
        ]
      },
      "properties": {
        "ZIP_CODE": "90210",
        "CHS_Day_0": "0"
      }
    }
  ]
}

Get only today's score (minimal response)

If you need the smallest possible response (e.g., to display a single score in a mobile app), then request only CHS_Day_0 for one ZIP code with no geometry.

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=ZIP_CODE='96001'&outFields=ZIP_CODE,CHS_Day_0&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='96001'",
    "outFields": "ZIP_CODE,CHS_Day_0",
    "returnGeometry": "false",
    "f": "json",
}

response = requests.get(BASE_URL, params=params)
data = response.json()

if "error" in data:
    print(f"Error: {data['error']['message']}")
else:
    score = int(data["features"][0]["attributes"]["CHS_Day_0"])
    print(f"Today's score for 96001: {score}")
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='96001'",
  outFields: "ZIP_CODE,CHS_Day_0",
  returnGeometry: "false",
  f: "json",
});

fetch(`${baseUrl}?${params}`)
  .then((res) => res.json())
  .then((data) => {
    if (data.error) {
      console.error(`Error: ${data.error.message}`);
      return;
    }
    const score = Number(data.features[0].attributes.CHS_Day_0);
    console.log(`Today's score for 96001: ${score}`);
  })
  .catch((err) => console.error("Request failed:", err));
Example response
{
  "features": [
    {
      "attributes": {
        "ZIP_CODE": "96001",
        "CHS_Day_0": "0"
      }
    }
  ]
}

Count ZIP codes by score

Use returnCountOnly=true to get a count of ZIP codes matching your filter, without returning any feature data. This may be useful for dashboards or summary statistics.

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=CHS_Day_0%20%3D%20'0'&outFields=ZIP_CODE,CHS_Day_0&returnGeometry=false&returnCountOnly=true&outSR=&f=json"

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=CHS_Day_0%20%3D%20'1'&outFields=ZIP_CODE,CHS_Day_0&returnGeometry=false&returnCountOnly=true&outSR=&f=json"

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=CHS_Day_0%20%3D%20'2'&outFields=ZIP_CODE,CHS_Day_0&returnGeometry=false&returnCountOnly=true&outSR=&f=json"

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=CHS_Day_0%20%3D%20'3'&outFields=ZIP_CODE,CHS_Day_0&returnGeometry=false&returnCountOnly=true&outSR=&f=json"

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=CHS_Day_0%20%3D%20'4'&outFields=ZIP_CODE,CHS_Day_0&returnGeometry=false&returnCountOnly=true&outSR=&f=json"
import requests

BASE_URL = (
    "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/"
    "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query"
)

# Count ZIP codes at each score level
for score in range(5):
    params = {
        "where": f"CHS_Day_0='{score}'",
        "returnCountOnly": "true",
        "f": "json",
    }
    response = requests.get(BASE_URL, params=params)
    data = response.json()

    if "error" in data:
        print(f"Error: {data['error']['message']}")
        break
    print(f"Score {score}: {data['count']} ZIP codes")
const baseUrl =
  "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/" +
  "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query";

// Count ZIP codes at each score level
async function countByScore() {
  for (let score = 0; score <= 4; score++) {
    const params = new URLSearchParams({
      where: `CHS_Day_0='${score}'`,
      returnCountOnly: "true",
      f: "json",
    });

    const res = await fetch(`${baseUrl}?${params}`);
    const data = await res.json();

    if (data.error) {
      console.error(`Error: ${data.error.message}`);
      break;
    }
    console.log(`Score ${score}: ${data.count} ZIP codes`);
  }
}

countByScore();
Example response
{
  "count": 47
}