One list · results for each row

Validate addresses in a batch

Upload up to 10,000 Canadian addresses or coordinates in a CSV or JSON request. Select the profile sections you need, then receive per-row results with coverage states.

Get a free API keyBatch API reference
  1. Submit your listUse street-address fields or coordinates and choose sections.
  2. Poll progressSubmission returns HTTP 202. Use its batch ID to check status.
  3. Join each resultKeep the input index and each section’s coverage. Download paginated CSV or JSONL results.

Estimate your credits

For school assignments and property values: 3 credits per coordinate row, plus 2 when an address needs resolving.

300 credits

Credits are reserved at submission. Other sections have different costs. Check your daily balance before submitting; this calculator does not upload data.

Try the captured one-row request

This public-school point in Surrey is a real captured example. Use the batch ID from your own submission; example jobs expire.

CSV upload, status and results
cat > addresses.csv <<'CSV'
lat,lng,region,locality
49.1416582,-122.8795092,BC,Surrey
CSV

curl --fail-with-body "https://api.hillbase.com/v1/batches?sections=school_assignments,property_values" \
  -H "X-API-Key: $HILLBASE_API_KEY" -H "Content-Type: text/csv" \
  --data-binary @addresses.csv > batch.json

# Requires jq. Submission returns HTTP 202; processing is asynchronous.
BATCH_ID=$(jq -r '.data.id' batch.json)
curl --fail-with-body -H "X-API-Key: $HILLBASE_API_KEY" \
  "https://api.hillbase.com/v1/batches/$BATCH_ID"

# Repeat polling until data.status is completed, cancelled or failed.
# After completion, download the first page as CSV.
curl --fail-with-body -H "X-API-Key: $HILLBASE_API_KEY" \
  "https://api.hillbase.com/v1/batches/$BATCH_ID/results?format=csv&offset=0&limit=1000" \
  -o results.csv

Submission · HTTP 202

Real captured response · 2026-10-12

{
  "schema_version": "hillbase.v0",
  "data": {
    "id": "bat_uu7tsnpefhou",
    "status": "queued",
    "total": 1,
    "processed": 0,
    "resolved": 0,
    "no_match": 0,
    "errors": 0,
    "progress": 0,
    "credits": 3,
    "sections": [
      "school_assignments",
      "property_values"
    ],
    "created_at": "2026-10-12T18:49:50.797639+00:00",
    "expires_at": "2026-10-19T18:49:50.797639+00:00"
  },
  "coverage": {
    "capability": "batch_queries",
    "status": "supported",
    "outcome": "resolved",
    "geography": null,
    "period": null,
    "message": null
  },
  "provenance": [],
  "warnings": [],
  "retrieved_at": "2026-10-12T18:49:50.811464Z"
}

Result · input index 0

Coverage excerpt from the same captured job. Record fields omitted here.

{
  "index": 0,
  "coverage": {
    "period": null,
    "status": "partial",
    "message": null,
    "outcome": "resolved",
    "geography": "point",
    "capability": "address_profile"
  },
  "sections": {
    "property_values": {
      "coverage": {
        "period": null,
        "status": "unavailable",
        "message": "Lake property values are unavailable.",
        "outcome": "no_match",
        "geography": "point",
        "capability": "property_values"
      }
    },
    "school_assignments": {
      "coverage": {
        "period": null,
        "status": "supported",
        "message": null,
        "outcome": "resolved",
        "geography": "point",
        "capability": "school_assignments"
      }
    }
  }
}