Use case

Property managers

Build a consistent location briefing for each building, then save a Signal to follow recorded permit changes nearby.

Get an API keyEndpoint reference

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/profile
  • POST /v1/batches
  • POST /v1/signals
  • GET /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.

Address-profile request
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

Save and read a Signal
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

POST/v1/addresses/resolve
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"}'
Responsesupportedreal response, shortened
{
  "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"
}