Use case
Data for AI agents
Connect Claude, ChatGPT, Cursor or your own agent to Hillbase over MCP and let it answer location questions from sourced records instead of guesses.
Can the agent tell 'nothing found' from 'not covered'?
Every answer carries a coverage status and outcome, so agents do not mistake missing data for a negative fact.
Where did this come from?
Each record keeps its publisher source id, record id and observation date.
One integration or twenty?
MCP tools over the same data as the REST API, with shared account credits and coverage states.
Is it safe to show?
Personal contact details in publisher text are never returned; regional statistics are labelled as area-level.
Built for
- AI assistants for real estate, insurance and local services
- Research and due-diligence agents
- Developer tools and copilots
- Internal knowledge assistants
Endpoints
MCP https://api.hillbase.com/mcpPOST /v1/address/profileGET /v1/schoolsGET /v1/permits
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.
Choose a setup guide for your agent, then ask it to call address_profile with the point above and report each section's coverage. Use OAuth for chat apps and API keys in your own runtime.
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"
}