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
- 7-Day Forecast: Fetch the full forecast for a single ZIP code
- Multiple ZIP Codes: Query multiple ZIP codes in a single request
- High/Extreme Risk: Filter for ZIP codes with a score of 3 or 4 today
- GeoJSON Boundaries: Get ZIP code polygons for use with mapping libraries
- Minimal Response: Request the smallest possible response for a single lookup
- Count by Score: Get counts of ZIP codes at each score level
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));
{
"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));
{
"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));
{
"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));
{
"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));
{
"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();
{
"count": 47
}