Skip to content

PropertyData

PropertyData API

Query Victorian property-sales data, generate comparative market analyses (CMAs), manage per-organization PropertyData API credentials, and clear the regulatory deed-signing gate.

PropertyData covers Victoria only. The underlying sales data is sourced from LANDATA® via PropertyData Pty Ltd; every query response carries the required LANDATA® copyright statement.

All paths below are relative to the base URL https://api.intellia.com.au.

Authentication and gating

PropertyData endpoints fall into two groups with different authentication requirements:

  • Data endpoints (query, cma-data, entitlement, deeds, deeds/record) authenticate with a standard JWT / API key and are gated on the pdol.run_query capability.
  • Settings endpoints (usage, api-settings, api-access, regenerate-credentials, revoke-credentials) call PropertyData’s own back end on your behalf and therefore require a Hanko session token in the Authorization header — an API key alone is not sufficient. These are gated on pdol.manage_org_settings or pdol.manage_credentials.
A user must hold an active PropertyData seat (enabled by an organization admin) and the organization’s subscription must cover the relevant state before any data query returns rows. Entitlement is resolved per user, per state.
Before any PropertyData query succeeds, the calling user must have signed the required regulatory deeds (Customer Nominee Deed Poll and Confidentiality Deed) at their current version. Until then, data calls are rejected with a deed-required error. Use the deeds endpoints to render and record signatures.

Querying property data

Run an ad-hoc query

POST /orgs/{organizationId}/propertydata/query

Runs a single read-only SELECT against the safe Victorian property-sales views (pdol.v_sales_safe, pdol.v_suburb_stats). This is a metered, credit-consuming action — a zero-balance organization is refused before the query runs (internal organizations are exempt).

Capability: pdol.run_query

Request Body:

{
  "sql": "SELECT suburb, median_price FROM pdol.v_suburb_stats WHERE suburb ILIKE 'Carlton' AND property_category = 'House' AND bedrooms = 0",
  "conversationId": "conv-123"
}

Fields:

  • sql (required): A single SELECT statement. Maximum 8192 bytes. Writes, DDL, multiple statements, and write-CTEs are rejected.
  • conversationId (optional): Associates the query with a conversation for the audit trail. Malformed values are coerced to null rather than erroring.

Response:

{
  "success": true,
  "eventId": "evt-abc",
  "rows": [
    { "suburb": "Carlton", "median_price": 1250000 }
  ],
  "truncated": false,
  "copyrightStatement": "© State of Victoria, Department of Transport and Planning. Property sales data sourced from LANDATA® via PropertyData Pty Ltd."
}

Fields:

  • eventId: The audit event id for this query.
  • rows: Result rows (capped at 1000 rows; truncated is true when the cap was hit).
  • truncated: Whether the row cap was reached.
  • copyrightStatement: The LANDATA® copyright statement that must accompany any display of the data.
Only the pdol.* views are readable — the underlying raw tables are not accessible. Results are capped at 1000 rows with a 15-second statement timeout; aggregate in SQL rather than pulling raw rows. A failed query returns 400 with the Postgres error message (e.g. “column X does not exist”) so you can correct and retry; failed queries do not consume quota.

Key views:

  • pdol.v_sales_safe — individual sales. Text columns ("Street", "Suburb", "Postcode", "Municipality") are quoted and capitalised; match with ILIKE. sold_price = 0 means the price was withheld — filter sold_price > 0 before computing medians.
  • pdol.v_suburb_stats — precomputed rolling-year market stats per suburb (median_price, median_dom, clearance_rate, total_sales). bedrooms = 0 is the all-bedrooms rollup; median_price is NULL when fewer than 5 qualifying sales (small-sample suppression).

Generate CMA data

POST /orgs/{organizationId}/propertydata/cma-data

Fetches the full comparative-market-analysis dataset for a subject property — the subject sale, recent comparable sales on the same street, suburb bedroom-matched comparables, and suburb pricing stats — under a single gated, metered event.

Capability: pdol.run_query

Request Body:

{
  "addressId": 123456,
  "bedroomsTolerance": 1,
  "conversationId": "conv-123"
}

Fields:

  • addressId (required): The subject property’s address id, a positive integer. Resolve it first via a query against v_sales_safe.
  • bedroomsTolerance (optional): Bedroom range widening for suburb-matched comparables.
  • conversationId (optional): Associates the event with a conversation.

Response (subscribed):

{
  "success": true,
  "eventId": "evt-abc",
  "subscribed": true,
  "state": "VIC",
  "subject": { "address_id": 123456, "sold_price": 1200000 },
  "streetRecent": [],
  "suburbBedMatched": [],
  "stats": { "median_price": 1250000 },
  "subscriptionWarnings": []
}

Response (not subscribed):

{
  "success": true,
  "eventId": null,
  "subscribed": false,
  "state": "",
  "subject": null,
  "streetRecent": [],
  "suburbBedMatched": [],
  "stats": null,
  "blockReason": "no_pd_seat",
  "subscriptionWarnings": [
    "You don't have a PropertyData seat. Ask your organisation admin to enable PropertyData for your account."
  ]
}

Fields:

  • subscribed: Whether the caller is entitled to the subject property’s state. When false, no data is returned and no charge is incurred.
  • blockReason: Present only when subscribed is false. One of no_pd_seat (no PropertyData seat at all — an admin must enable it) or state_not_subscribed (has a seat, but the state isn’t covered). The property’s state is not disclosed on the blocked path.
  • subject, streetRecent, suburbBedMatched, stats: The CMA dataset rows.
  • eventId: The audit event id, or null when not subscribed.
If no sale is on record for the addressId within the last 10 years, the endpoint returns 404. An unknown state for the subject returns 422.

Check entitlement

GET /orgs/{organizationId}/propertydata/entitlement

Resolves the calling user’s PropertyData entitlement for a given state.

Capability: pdol.run_query

Query Parameters:

  • state (optional): State code — one of VIC, SA, TAS, NSW, NT, WA, QLD, ACT. Defaults to empty (which resolves to a 400 for an unknown state).

Response:

{
  "subscribed": true,
  "state": "VIC",
  "reiAccess": true,
  "revAccess": false,
  "vgAccess": false,
  "subscriptionWarnings": []
}

Fields:

  • subscribed: true when any of reiAccess, revAccess, or vgAccess is granted for the state.
  • reiAccess / revAccess / vgAccess: The three access sources (REI, Government revenue, Valuer-General).
  • blockReason: Present only when subscribed is false (no_pd_seat or state_not_subscribed).
  • subscriptionWarnings: Human-readable warnings for the blocked case.
When the organization has no PropertyData subscription at all, this endpoint returns a structured 402 billing-blocked error rather than a subscribed: false body.

Regulatory deeds

Before a user may run any PropertyData query, they must sign the required regulatory deeds at their current version.

List required deeds

GET /orgs/{organizationId}/propertydata/deeds

Returns the required PropertyData deeds with their current legal HTML and the calling user’s per-deed signing state. Drives the pre-access signing interstitial.

Capability: pdol.run_query

Response:

{
  "deeds": [
    {
      "consentType": "customer_deed_poll",
      "version": "2026-06-16",
      "title": "Customer Nominee Deed Poll (Schedule 4)",
      "signed": false,
      "html": "<div>…</div>"
    },
    {
      "consentType": "confidentiality_ack",
      "version": "2026-06-16",
      "title": "Confidentiality Deed (Schedule 5)",
      "signed": false,
      "html": "<div>…</div>"
    }
  ],
  "allSigned": false
}

Fields:

  • deeds[].consentType: One of customer_deed_poll or confidentiality_ack.
  • deeds[].version: The current required version of the deed.
  • deeds[].signed: true when this user already signed this deed at the current version.
  • deeds[].html: The legal document markup, rendered read-only in a sandboxed iframe.
  • allSigned: true only when every required deed is signed at its current version.

Record a signed deed

POST /orgs/{organizationId}/propertydata/deeds/record

Records that the calling user has signed a required deed. This clears the deed gate for the user in this organization. signedAt is server-attested.

Capability: pdol.run_query

Request Body:

{
  "consentType": "customer_deed_poll",
  "documentVersion": "2026-06-16",
  "licenceNumber": "REA123456",
  "signerName": "Jane Agent"
}

Fields:

  • consentType (required): One of the required deed types (customer_deed_poll, confidentiality_ack). Other values return 400.
  • documentVersion (required): Must equal the current required version for that deed, otherwise the endpoint returns 409 (“The deed has been updated; reload and sign the current version.”).
  • licenceNumber (required): The real-estate licence number the signer is acting under (their own or their licensee’s).
  • signerName (required): The signer’s name.

Response:

{
  "recorded": true,
  "consentType": "customer_deed_poll",
  "documentVersion": "2026-06-16"
}

Organization API credentials and usage

These endpoints proxy to PropertyData’s own back end and require a Hanko session token in the Authorization header — a plain API key will be rejected with 401.

Each of these endpoints requires the organization to already have PropertyData access provisioned (a pdol_id on the organization). If it does not, the endpoint returns 400 (“Organization has no PropertyData access”).

Get API settings

GET /orgs/{organizationId}/propertydata/api-settings

Returns the organization’s PropertyData API credentials and access configuration.

Capability: pdol.manage_org_settings — requires a Hanko session token.

Response:

{
  "apiKey": "pk_live_…",
  "secretKey": "sk_live_…",
  "apiUserAccessType": 1,
  "maxRecordsPerCall": 1000
}

Fields:

  • apiKey / secretKey: The PropertyData API credential pair, or null if not issued.
  • apiUserAccessType: The access-type code (0 = No Access, 1 = Internal User, etc.).
  • maxRecordsPerCall: The per-call record cap, or null if unset.
If the upstream PropertyData call fails, this endpoint returns 502 (“Failed to fetch PropertyData API settings”).

Get usage

GET /orgs/{organizationId}/propertydata/usage

Returns the organization’s PropertyData usage against its limits.

Capability: pdol.manage_org_settings — requires a Hanko session token.

Response:

{
  "seats": { "used": 3, "max": 5 },
  "lgas": { "used": 2, "max": null },
  "municipalities": { "used": 4, "max": 10 },
  "exports": { "used": 12, "max": 100, "remaining": 88, "resetDate": "2026-08-01" }
}

Fields (each used / max pair; max is null when unlimited):

  • seats: PropertyData seats used vs. available.
  • lgas: Local government areas used vs. limit.
  • municipalities: Municipalities used vs. limit.
  • exports: Exports used, the cap, remaining, and an optional resetDate.

Toggle API access

POST /orgs/{organizationId}/propertydata/api-access

Enables or disables PropertyData API access for the organization. On disable, the current access type is saved to metadata and access is set to 0 (No Access); on enable, the saved access type is restored (defaulting to 1 if none was saved).

Capability: pdol.manage_org_settings — requires a Hanko session token.

Request Body:

{
  "enabled": true
}

Response:

{
  "success": true
}

Regenerate credentials

POST /orgs/{organizationId}/propertydata/regenerate-credentials

Regenerates the organization’s PropertyData API credential pair. The request body is empty.

Capability: pdol.manage_credentials — requires a Hanko session token.

Response: Returns the regenerated credentials as issued by PropertyData.

Revoke credentials

POST /orgs/{organizationId}/propertydata/revoke-credentials

Revokes the organization’s PropertyData API credentials. The request body is empty.

Capability: pdol.manage_credentials — requires a Hanko session token.

Response: Returns the revocation result from PropertyData.

Entitlements

Get organization entitlements

GET /orgs/{organizationId}/entitlements

Returns the effective feature entitlements for the organization — the union across the organization’s subscription items (plan plus add-ons) and metadata-driven product sources. Use this to check whether an organization has PropertyData (or another product) granted.

Capability: org.read_entitlements

This endpoint bypasses the framework’s active-subscription gate, so cancelled and no-plan organizations reach the handler and receive an empty entitlements map rather than a 403.

Response:

{
  "propertydata_access": true,
  "pdol_run_query": "included"
}

The response is a flat map of feature ids to a value that is either a boolean or a string (e.g. an entitlement tier). The exact set of keys depends on the organization’s plan and add-ons.