Use case
Property managers
Build a consistent location briefing for each building, then save a Signal to follow recorded permit changes nearby.
Brief the portfolio
Upload a CSV of building coordinates for the same profile sections across every property.
Review the local property context
Keep zoning, parcel and assessment coverage beside each result; a missing record is not a compliance clearance.
Follow nearby activity
Create a permit Signal around a building and poll matches after new snapshots are loaded. Matches describe recorded changes, not immediate construction alerts.
Triage follow-up work
Use the recorded permit and its dates to decide what to review. Public data is context for your operations, not proof of a building's condition.
Built for
- Residential property managers
- Portfolio operations teams
- Rental service platforms
Endpoints
POST /v1/address/profilePOST /v1/batchesPOST /v1/signalsGET /v1/signals/{signal_id}/matches
Start with one address
After creating a key, run this call for the captured Surrey point. The response excerpt is fixed; this page makes no data query.
curl --fail-with-body "https://api.hillbase.com/v1/address/profile" \
-H "X-API-Key: $HILLBASE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"point":{"lat":49.1416582,"lng":-122.8795092},"region":"BC","locality":"Surrey"}'Real captured response · school_assignments section excerpt. Captured values can differ from current data.
{
"schema_version": "hillbase.v0",
"quality": {
"basis": "mixed",
"effective_date": null,
"last_checked_at": null,
"limitations": [
{
"code": "absence_not_proof",
"message": "No matching record does not prove that none exists."
},
{
"code": "assessment_not_market_value",
"message": "An assessed value is not a sale price or current market value."
},
{
"code": "assignment_not_admission",
"message": "A school assignment does not guarantee admission."
}
]
},
"data": {
"point": {
"lat": 49.1416582,
"lng": -122.8795092
},
"sections": {
"school_assignments": {
"data": [
{
"school": {
"id": "sch_g2nriqq5vei4",
"name": "Strawberry Hill Elementary",
"school_type": "elementary",
"authority": {
"id": "aut_3usld4ldzlrt",
"name": "Surrey",
"authority_type": "school_district",
"external_id": "BC36"
}
},
"catchment": {
"id": "cat_fthhjbggwfj6",
"level": "elementary",
"program": "Regular",
"school_year": "2026-2027",
"grade_start": null,
"grade_end": null,
"boundary_version": "62eb312788d0d5b34c433177cd312678172ddf2a0408677a521aef9b8d9247e2",
"verification_status": "unverified"
},
"match_method": "official_boundary",
"confidence": "high",
"source": {
"id": "ca-bc-surrey-school-catchments",
"record_id": null,
"updated_at": null,
"observed_at": "2026-10-08T23:37:04.966500Z"
}
},
{
"school": {
"id": "sch_xw46knkm4azw",
"name": "Princess Margaret Secondary",
"school_type": "secondary",
"authority": {
"id": "aut_3usld4ldzlrt",
"name": "Surrey",
"authority_type": "school_district",
"external_id": "BC36"
}
},
"catchment": {
"id": "cat_ttoatnlwnxst",
"level": "secondary",
"program": "Regular",
"school_year": "2026-2027",
"grade_start": null,
"grade_end": null,
"boundary_version": "d43d656d971288cdbb153345c28c4a057d4dbe349cb51a990dc58b676856fdb9",
"verification_status": "unverified"
},
"match_method": "official_boundary",
"confidence": "high",
"source": {
"id": "ca-bc-surrey-school-catchments",
"record_id": null,
"updated_at": null,
"observed_at": "2026-10-08T23:37:04.966500Z"
}
}
],
"coverage": {
"capability": "school_assignments",
"status": "supported",
"outcome": "resolved",
"geography": "point",
"period": null,
"message": null
},
"quality": {
"basis": "derived",
"effective_date": null,
"last_checked_at": "2026-10-08T23:37:04.966500Z",
"limitations": [
{
"code": "assignment_not_admission",
"message": "A school assignment does not guarantee admission."
},
{
"code": "boundary_year_specific",
"message": "Boundaries apply to their stated year and may change."
}
]
},
"provenance": [
{
"source_id": "ca-bc-surrey-school-catchments",
"source_updated_at": null,
"observed_at": null,
"snapshot": null
}
],
"warnings": []
}
}
},
"retrieved_at": "2026-10-12T18:51:41.790023Z"
}Use each section's coverage to distinguish an empty result from missing coverage. Keep the point with the result so records from another location are not attached to your property.
Follow permit activity
curl --fail-with-body "https://api.hillbase.com/v1/signals" \
-H "X-API-Key: $HILLBASE_API_KEY" -H "Content-Type: application/json" \
-d '{"name":"Surrey permit activity","area":{"lat":49.1416582,"lng":-122.8795092,"radius_km":1}}' \
> signal.json
SIGNAL_ID=$(jq -r '.data.id' signal.json)
curl --fail-with-body -H "X-API-Key: $HILLBASE_API_KEY" \
"https://api.hillbase.com/v1/signals/$SIGNAL_ID/matches?limit=50&offset=0"
# Pause the saved search when you are done.
curl --fail-with-body -X DELETE -H "X-API-Key: $HILLBASE_API_KEY" \
"https://api.hillbase.com/v1/signals/$SIGNAL_ID"Real captured response. Captured values can differ from current data.
{
"schema_version": "hillbase.v0",
"data": {
"signal_id": "mon_wh2gyl66r5jq",
"items": [],
"total": 0,
"limit": 50,
"offset": 0,
"next_offset": null
},
"coverage": {
"capability": "signals",
"status": "supported",
"outcome": "no_match",
"geography": null,
"period": null,
"message": null
},
"provenance": [],
"warnings": [],
"retrieved_at": "2026-10-12T18:49:54.538468Z"
}See real responses
curl -X POST "https://api.hillbase.com/v1/addresses/resolve" \
-H "X-API-Key: $HILLBASE_API_KEY" -H "Content-Type: application/json" \
-d '{"line1":"100 Queen St W","city":"Toronto","region":"ON","country":"CA"}'{
"schema_version": "hillbase.v0",
"data": {
"point": {
"lat": 43.651504,
"lng": -79.382497
},
"geocode": {
"provider": "lake.address_points",
"score": null,
"precision": "civic_number",
"address": {
"line1": "100 Queen ST W",
"line2": null,
"city": "Toronto",
"region": "ON",
"postal_code": "M5H2N1",
"country": "CA"
}
}
},
"coverage": {
"capability": "address_resolution",
"status": "supported",
"outcome": "resolved",
"geography": "ON",
"period": null,
"message": "Address resolved; caller inputs are not stored."
},
"provenance": [],
"warnings": [],
"retrieved_at": "2026-10-12T18:52:01.220757Z"
}