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 thepdol.run_querycapability. - 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 theAuthorizationheader — an API key alone is not sufficient. These are gated onpdol.manage_org_settingsorpdol.manage_credentials.
Querying property data
Run an ad-hoc query
POST /orgs/{organizationId}/propertydata/queryRuns 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 singleSELECTstatement. 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;truncatedistruewhen the cap was hit).truncated: Whether the row cap was reached.copyrightStatement: The LANDATA® copyright statement that must accompany any display of the data.
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 withILIKE.sold_price = 0means the price was withheld — filtersold_price > 0before computing medians.pdol.v_suburb_stats— precomputed rolling-year market stats per suburb (median_price,median_dom,clearance_rate,total_sales).bedrooms = 0is the all-bedrooms rollup;median_priceis NULL when fewer than 5 qualifying sales (small-sample suppression).
Generate CMA data
POST /orgs/{organizationId}/propertydata/cma-dataFetches 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 aqueryagainstv_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. Whenfalse, no data is returned and no charge is incurred.blockReason: Present only whensubscribedisfalse. One ofno_pd_seat(no PropertyData seat at all — an admin must enable it) orstate_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, ornullwhen not subscribed.
addressId within the last 10 years, the endpoint returns 404. An unknown state for the subject returns 422.Check entitlement
GET /orgs/{organizationId}/propertydata/entitlementResolves the calling user’s PropertyData entitlement for a given state.
Capability: pdol.run_query
Query Parameters:
state(optional): State code — one ofVIC,SA,TAS,NSW,NT,WA,QLD,ACT. Defaults to empty (which resolves to a400for an unknown state).
Response:
{
"subscribed": true,
"state": "VIC",
"reiAccess": true,
"revAccess": false,
"vgAccess": false,
"subscriptionWarnings": []
}Fields:
subscribed:truewhen any ofreiAccess,revAccess, orvgAccessis granted for the state.reiAccess/revAccess/vgAccess: The three access sources (REI, Government revenue, Valuer-General).blockReason: Present only whensubscribedisfalse(no_pd_seatorstate_not_subscribed).subscriptionWarnings: Human-readable warnings for the blocked case.
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/deedsReturns 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 ofcustomer_deed_pollorconfidentiality_ack.deeds[].version: The current required version of the deed.deeds[].signed:truewhen this user already signed this deed at the current version.deeds[].html: The legal document markup, rendered read-only in a sandboxed iframe.allSigned:trueonly when every required deed is signed at its current version.
Record a signed deed
POST /orgs/{organizationId}/propertydata/deeds/recordRecords 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 return400.documentVersion(required): Must equal the current required version for that deed, otherwise the endpoint returns409(“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.
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-settingsReturns 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, ornullif not issued.apiUserAccessType: The access-type code (0= No Access,1= Internal User, etc.).maxRecordsPerCall: The per-call record cap, ornullif unset.
502 (“Failed to fetch PropertyData API settings”).Get usage
GET /orgs/{organizationId}/propertydata/usageReturns 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 optionalresetDate.
Toggle API access
POST /orgs/{organizationId}/propertydata/api-accessEnables 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-credentialsRegenerates 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-credentialsRevokes 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}/entitlementsReturns 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.