CohabitDeveloper Portal
22,300 Australian strata schemes · live

Score a strata scheme,
in three lines.

Health Score and Building Info for Australia's strata schemes — financials, compliance, condition and more. One API key, any stack.

Live examples use SP00000, a synthetic sandbox scheme — the figures illustrate the response shape and are not findings about any real owners corporation.

SP00000 · NSW77% confidence
0/ 1000
Confidence77%
Financial
88
Compliance
44
Liveability
100
Condition
39
Sustainability
60

Source: document · hs-2.0 · as of 2026-01-01

The APIs

Read-only over HTTPS, JSON responses, one X-API-Key header. Pick an API to see its parameters, response, and a live request.

Core

Resolve an address to a scheme and size the dataset — the shared entry points every integration uses.

Health Score

A coverage-aware 0–1000 score with a per-category breakdown and a confidence figure.

Strata Records

Structured building and management records extracted from a scheme's own documents.

Risk & Exposure

Regulatory, defect, financial and catastrophe risk signals for a scheme.

Getting started

  1. 1

    Get an API key

    Create one yourself from your dashboard — no waiting on the team.

  2. 2

    Send it server-side

    Pass it in the X-API-Key header. It's a server-side secret.

  3. 3

    Call an endpoint

    Try any request live below — jump to the reference.

Preview
shape is final; not yet on the deployed API

Core

Resolve an address to a scheme and size the dataset — the shared entry points every integration uses.

Coverage

No key
GET/v1/coverage

Dataset summary — published so integrators can size the dataset before building against it. This is the *dataset* coverage (counts), distinct from a per-scheme `coverage_level`.

Response

{
  "data": {
    "schemes": 22300,
    "by_state": {
      "NSW": 21624,
      "WA": 50,
      "NT": 1,
      "VIC": 117,
      "ACT": 6,
      "SA": 4,
      "QLD": 498
    }
  },
  "meta": {
    "as_of": "2026-11-11T08:42:18Z"
  }
}
curl "https://sqpzgvwade.ap-southeast-2.awsapprunner.com/v1/coverage"

Public endpoint — no API key required.

Resolve

Preview
POST/v1/resolve

Map an address to the strata `scheme_id` a caller caches against a listing. The scheme_id is the *result*, not an input — if you already have it, call the scheme endpoints directly. `data.candidates` are ranked; `meta.confidence` says how sure — confirm anything below 1.0. Registry-backed across ~88k NSW schemes.

Parameters

NameInDescription
address *bodyFree-text address, e.g. "1 Example Street, Sampleton NSW 2000". Unit prefix and street-type abbreviations are normalised.
statebodyReserved; the registry is NSW today.

Response

{
  "data": {
    "scheme_id": "SP00000",
    "candidates": [
      {
        "scheme_id": "SP00000",
        "address": "1 EXAMPLE STREET SAMPLETON",
        "suburb": "SAMPLETON",
        "post_code": "2000"
      }
    ]
  },
  "meta": {
    "coverage_level": "registry_only",
    "confidence": 1,
    "as_of": "2026-01-01T00:00:00Z",
    "sources": [
      {
        "name": "NSW Strata Plan register (Spatial Services)",
        "licence": "CC BY 4.0"
      }
    ]
  }
}
curl -X POST -H "X-API-Key: $COHABIT_API_KEY" \
  -H "content-type: application/json" \
  -d '{"address": "1 Example Street, Sampleton NSW 2000"}' \
  "https://sqpzgvwade.ap-southeast-2.awsapprunner.com/v1/resolve"

Run a request to see the response.

Health Score

A coverage-aware 0–1000 score with a per-category breakdown and a confidence figure.

Health Score

GET/v1/health-score/{scheme_id}

A 0-1000 health score for a strata scheme, broken down by category, with a confidence figure. Always read `confidence` next to the score: the score is computed only over data that exists, and missing data lowers confidence rather than silently scoring zero. Below 0.40 confidence the headline is withheld -- `health_score` comes back null rather than a number the evidence can't support. There is deliberately no single-word band, which would read as a strong claim on weak data.

Parameters

NameInDescription
scheme_id *pathStrata plan number, e.g. SP00000. Case-insensitive.
statequeryNSW, QLD, VIC, WA, or NT. A filter, not a hint: a mismatch returns 404 rather than being ignored.

Response

{
  "data": {
    "health_score": 642,
    "categories": {
      "financial": 88,
      "compliance": 44,
      "liveability": 100,
      "condition": 39,
      "sustainability": 60
    }
  },
  "meta": {
    "scheme_id": "SP00000",
    "state": "NSW",
    "coverage_level": "full",
    "confidence": 0.77,
    "as_of": "2026-01-01T00:00:00Z",
    "sources": [
      {
        "name": "Cohabit strata document dataset",
        "licence": "proprietary"
      },
      {
        "name": "Cohabit Health Score v2",
        "licence": "proprietary"
      }
    ],
    "source": "document",
    "score_version": "hs-2.0"
  }
}
curl -H "X-API-Key: $COHABIT_API_KEY" \
  "https://sqpzgvwade.ap-southeast-2.awsapprunner.com/v1/health-score/SP00000?state=NSW"

Run a request to see the response.

Strata Records

Structured building and management records extracted from a scheme's own documents.

Building Info

GET/v1/buildings/{scheme_id}

Address, size, age, and management details for a strata scheme. Document-sourced schemes carry richer info than app-sourced ones. Three things to read carefully: `address` is the full formatted address and already contains suburb, state and post code -- don't concatenate them. `building_age_years` counts from `registration_date`, the date the strata scheme was registered (not when the building was built) -- these differ for older buildings converted to strata later. A null field means the source documents don't record it -- unknown, not absent.

Parameters

NameInDescription
scheme_id *pathStrata plan number, e.g. SP00000. Case-insensitive.
statequeryNSW, QLD, VIC, WA, or NT. A filter, not a hint: a mismatch returns 404 rather than being ignored.

Response

{
  "data": {
    "address": "1 Example Street, Sampleton NSW 2000",
    "suburb": "Sampleton",
    "post_code": "2000",
    "latitude": -33.8,
    "longitude": 151.2,
    "lot_count": 42,
    "building_age_years": 15,
    "levels": 8,
    "registration_date": "2010-01-01",
    "has_building_manager": true,
    "manager_name": "Example Strata Management",
    "scheme_status": "Active"
  },
  "meta": {
    "scheme_id": "SP00000",
    "state": "NSW",
    "coverage_level": "full",
    "as_of": "2026-01-01T00:00:00Z",
    "sources": [
      {
        "name": "Cohabit strata document dataset",
        "licence": "proprietary"
      }
    ],
    "source": "document"
  }
}
curl -H "X-API-Key: $COHABIT_API_KEY" \
  "https://sqpzgvwade.ap-southeast-2.awsapprunner.com/v1/buildings/SP00000?state=NSW"

Run a request to see the response.

Risk & Exposure

Regulatory, defect, financial and catastrophe risk signals for a scheme.

Alerts

Preview
GET/v1/schemes/{scheme_id}/alerts

Regulatory orders, defect/financial/compliance signals for a scheme. BC orders come from the registry-wide register, so a registry-only scheme still gets them (coverage_level="registry_only"); the rule-based signals need document data (coverage_level="full"). Each alert has a stable `id` (e.g. MISSING_AGM, NO_FIRE_CERTIFICATE) -- match on `id`, not `description`. `category` is one of compliance, financial, insurance, maintenance, or regulatory; `severity` is high, medium, or low. Only fired alerts are returned, so a scheme with no active flags returns an empty `alerts` array.

Parameters

NameInDescription
scheme_id *pathStrata plan number, e.g. SP00000. Case-insensitive.
statequeryNSW, QLD, VIC, WA, or NT. A filter, not a hint: a mismatch returns 404 rather than being ignored.

Response

{
  "data": {
    "total_alerts": 3,
    "alerts": [
      {
        "id": "BC_ORDER:demo",
        "type": "BC_ORDER",
        "category": "regulatory",
        "severity": "high",
        "description": "Building Commissioner order: Serious defect",
        "detail": "Illustrative order (synthetic)",
        "order_date": "2024-05-01",
        "triggered": true
      },
      {
        "id": "MISSING_AGM",
        "category": "compliance",
        "severity": "high",
        "description": "No AGM in the last 15 months",
        "triggered": true
      },
      {
        "id": "OPEN_DEFECTS",
        "category": "maintenance",
        "severity": "medium",
        "description": "Open defects recorded",
        "triggered": true
      }
    ]
  },
  "meta": {
    "scheme_id": "SP00000",
    "coverage_level": "full",
    "as_of": "2026-01-01T00:00:00Z",
    "sources": [
      {
        "name": "NSW Building Commissioner orders",
        "licence": "CC BY 4.0"
      },
      {
        "name": "Cohabit detection rules",
        "licence": "proprietary"
      }
    ]
  }
}
curl -H "X-API-Key: $COHABIT_API_KEY" \
  "https://sqpzgvwade.ap-southeast-2.awsapprunner.com/v1/schemes/SP00000/alerts"

Run a request to see the response.

Exposure

Preview
GET/v1/schemes/{scheme_id}/exposure

Per-peril catastrophe history and cyclone track proximity for the scheme's postcode. Location-based, so it answers across the registry (coverage_level="registry_only" when the scheme isn't document-extracted), not only the extracted set. The loss and event figures are postcode-level and industry-wide -- the exposure of the area, not this scheme's own claims history or premium.

Parameters

NameInDescription
scheme_id *pathStrata plan number, e.g. SP00000. Case-insensitive.
statequeryNSW, QLD, VIC, WA, or NT. A filter, not a hint: a mismatch returns 404 rather than being ignored.

Response

{
  "data": {
    "available": true,
    "postcode": "2000",
    "overall_risk": "moderate",
    "peril_count": 2,
    "total_events": 4,
    "active_catastrophes": 0,
    "perils": [
      {
        "type": "Flood",
        "risk": "moderate",
        "events_5yr": 2,
        "events_20yr": 4,
        "total_loss_m": 1234.5,
        "recent_events": [
          {
            "name": "Illustrative storm (synthetic)",
            "year": 2024,
            "loss_m": 120,
            "claims": 3400,
            "active": false
          }
        ]
      },
      {
        "type": "Bushfire",
        "risk": "low",
        "events_5yr": 0,
        "events_20yr": 1,
        "total_loss_m": 45,
        "recent_events": []
      }
    ],
    "cyclone_exposure": null
  },
  "meta": {
    "scheme_id": "SP00000",
    "coverage_level": "registry_only",
    "as_of": "2026-01-01T00:00:00Z",
    "sources": [
      {
        "name": "ICA catastrophe events",
        "licence": "CC BY 4.0"
      },
      {
        "name": "BOM cyclone tracks",
        "licence": "CC BY 4.0"
      },
      {
        "name": "ABS postal areas",
        "licence": "CC BY 4.0"
      }
    ],
    "catastrophe_model": "ica_peril_risk_v1",
    "data_source_rows": 6
  }
}
curl -H "X-API-Key: $COHABIT_API_KEY" \
  "https://sqpzgvwade.ap-southeast-2.awsapprunner.com/v1/schemes/SP00000/exposure"

Run a request to see the response.

Errors

Errors follow RFC 9457 (Problem Details): a application/problem+json body with type, title, status and detail, plus a stable code. Match on code, never on the prose in detail or title — they change without notice.

StatuscodeCauseRetry?
400bad_requestMalformed body, or state outside NSW/QLD/VIC/WA/NTNo
401unauthorizedMissing or invalid X-API-KeyNo
404not_foundNo such scheme, or state doesn't match itNo
429rate_limitedToo many requests from this key (or IP, if keyless)Yes — see Retry-After
500internal_errorA fault on our sideYes — retry once with jitter
503unavailableAn upstream data store is unreachableYes — exponential backoff

Rate limiting is enforced per X-API-Key (or per IP for keyless routes): 20 requests/minute, fixed window. Over the limit gets a 429 with a Retry-After header.

A 404 carries the current dataset size in a dataset extension, so a caller who misses learns the dataset is finite rather than assuming a bug. A 422 carries an errors array, each with a JSON Pointer to the offending input:

{
  "type": "https://api.cohabit.com.au/problems/not_found",
  "title": "Scheme not found",
  "status": 404,
  "detail": "No scheme matching SP99999999.",
  "code": "not_found",
  "dataset": { "schemes": 4843 }
}