{"openapi":"3.1.0","info":{"title":"PropCode API","version":"v1","summary":"PropCode’s property reports, for your own tools and AI agents.","description":"The reports your team reads in PropCode, from the same rules, maps and documents: find a property by address or point, unlock it as Pro with one of your team’s credits, then read its Pro report (currently NSW CDC only) and its Rapid Planning Report (NSW, VIC, ACT and TAS).\n\n## Quickstart\n\n**With a coding agent**, paste this into it:\n\n```text\nRead https://app.propcode.com.au/llms.txt, then help me integrate the PropCode API into this project. Try it first on the sample property 32 Holden Street, Maroubra (title 5008/DP752015): its Pro report is free.\n```\n\n**By hand:**\n\n1. Sign in to PropCode and open **Integrations & API**. Your organisation gets a free test key there.\n2. Read a sample property's Pro report. The samples' Pro reports are free with any key and need no unlock:\n\n```bash\ncurl \"https://app.propcode.com.au/api/v1/report?title=5008/DP752015\" \\\n  -H \"Authorization: Bearer pc_test_…\"\n```\n\n3. To check any property, make a live key in **Integrations & API** and swap it in. Unlock a property before reading its reports, which spends one of your team's credits, as unlocking in PropCode does:\n\n```bash\ncurl -X POST \"https://app.propcode.com.au/api/v1/unlocks\" \\\n  -H \"Authorization: Bearer pc_live_…\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{ \"title\": \"<title id>\", \"spendCredit\": true }'\n```\n\nNothing else in your code changes.\n\n## Keys\n\nSend your key on every request: `Authorization: Bearer <key>`. Never put a key in a URL: a request with one gets `key_in_url`.\n\n| Key | Test (`pc_test_…`) | Live (`pc_live_…`) |\n|---|---|---|\n| Who makes it | Anyone in the organisation | Anyone in the organisation |\n| Properties | The 3 samples | Any in NSW, VIC, ACT or TAS |\n| Unlocks | Free | Spend your team's credits |\n| Samples' Pro reports | Free, no unlock | Free, no unlock |\n| Rapid Planning Reports | Not generated | Generated and read |\n| Shown | Any time, in Integrations & API | Once, when it's made |\n\nA key acts as the person who made it. Its unlocks and reports are theirs, as if they'd made them in PropCode, and on Max it holds their seat. If they leave your team, its unlocks and reports stop with `key_owner_left`; make a new key. A live key is revoked by the person who made it, or by an owner or admin.\n\nRevoke a key in **Integrations & API › Keys**. It stops working at once.\n\n## Title ids\n\nEvery answer names its property by its title id and its `jurisdiction` (`nsw`, `vic`, `act` or `tas`): together, the key to use in your own records, since the same id can name a property in two states. Find one with `GET /v1/properties`, by address or by point, and pass both back. `jurisdiction` is `nsw` when you leave it out.\n\n| State | Form | Example |\n|---|---|---|\n| NSW | Lot and plan | `5008/DP752015` |\n| NSW | Lot, section and plan | `10/10/DP979849` |\n| NSW | A whole strata plan | `SP58841` |\n| NSW | Several lots, joined with + | `10/DP503890+11/DP503890` |\n| VIC | Lot and plan | `1001\\PS340516` |\n| ACT | Suburb, block and section | `ACTON Block 11 Section 67` |\n| TAS | Volume and folio, or CID or PID | `Volume 100007 Folio 1` |\n\nNSW plans are `DP` (deposited) or `SP` (strata), and each lot appears once in an id. A VIC id's backslash is `\\\\` in JSON, and a query string encodes it as `%5C`.\n\nAsk for several NSW lots in any order. If PropCode hasn't seen that combination, a live key's first ask combines them into one property, and the lots must lie within 10 km of each other. The answer's `title` is the id to keep, with its lots in PropCode's order.\n\n## Sample properties\n\nTest keys answer for these properties, with real answers:\n\n- `5008/DP752015`: 32 Holden Street, Maroubra. The property in our sample reports: about half the codes eligible.\n- `10/10/DP979849`: 24 Hercules Street, Goulburn. Rural, under the Inland Code: no code eligible.\n- `10/DP503890+11/DP503890`: 80 Showground Road, Gosford. Two lots in a business zone, zoned by a SEPP: few codes eligible.\n\n## Credits\n\n- Unlocking a property spends one of your team's credits, as unlocking it in PropCode does. It takes `spendCredit: true`, so nothing spends by accident: an AI agent should ask its user first.\n- An unlock names the property by its title id. Look the address up with `GET /v1/properties` first, so a credit is never spent on the wrong match.\n- `creditType` picks the credit. `pro`, the default, is Pro, as in PropCode: a deep dive into the granular planning rules per land use and approval pathway. Through the API, that's the property's Pro report (currently NSW CDC only) and its Rapid Planning Report.\n- `cdc` and `rpr` spend the credits of a plan from before Core and Pro: a CDC report credit unlocks the property's CDC report, and a Rapid Planning Report credit its Rapid Planning Report.\n- Once your team has unlocked a property, it's unlocked for everyone in the team, in PropCode too. Unlocking it again is free, and so are its reports: reading them, and generating its Rapid Planning Reports, of every kind and for every land use.\n- Pro credits are your team's Property Packs and Max, bought in PropCode by an admin. With Max, an unlock comes from its daily allowance first (`dailyAllowance`, shared by the team's seats and starting again at `resetsAt`), then from packs. A pack set to auto-refill when it runs out refills the same way when the API spends its last credit.\n- `GET /v1/credits` says what's left of each type, and so does every unlock.\n- `GET /v1/unlocks` lists the properties your team has unlocked, newest first: what each is unlocked as, who unlocked it and when, and its Rapid Planning Reports' ids and share links, so a property or a report is never lost with its id.\n- The sample properties' Pro reports and map measures (such as height limits) are free with any key, test or live, and need no unlock. Their Rapid Planning Reports need a live key and an unlock, as any property's do.\n- A Rapid Planning Report citation's `contentUrl` gives the text it points to, from the version the report read (`GET /v1/citations/…`). Reading it is free.\n- Property lookups, searches and the lists of land uses and codes are free.\n\n## Limits\n\nLimits are per organisation, shared by all its live keys:\n\n| Limit | Live keys |\n|---|---|\n| Requests a second | 10 |\n| Pro reports being worked out at once | 4 |\n| Different properties looked up a day (GET /v1/property) | 2,000 |\n| Address searches a day | 300 |\n| New multi-lot titles an hour | 60, joining 100 lots at most |\n| Different cited passages read a day (GET /v1/citations) | 2,000 |\n\nAddress searches also share a daily allowance across every organisation, and test keys a smaller share of it. Once it's spent, they get 429 until midnight US Pacific. New multi-lot titles share an hourly allowance across every organisation too. Looking a property up by title id or by point is never limited this way.\n\nOver a limit, a request gets 429 with a `Retry-After` header saying when to retry. Need more? Ask us.\n\nTest keys are for trying the API on the samples: 5 requests a second and 100 a day, across the organisation's test keys.\n\n## Errors\n\nEvery error is JSON with one shape:\n\n```json\n{\n  \"error\": {\n    \"type\": \"billing\",\n    \"code\": \"no_credits\",\n    \"message\": \"…\",\n    \"requestId\": \"req_…\",\n    \"docUrl\": \"https://app.propcode.com.au/developers/errors#no_credits\"\n  }\n}\n```\n\n`type` sets the HTTP status; `code` says exactly what went wrong. [Every code](https://app.propcode.com.au/developers/errors), with what to do about it. Quote `requestId`, also sent as the `Request-Id` header, if you contact us.\n\nWhen your team has nothing to unlock a property with, `not_unlocked`, `no_credits` and `max_daily_limit` say who buys credits. For your team's owner or an admin they add `choices`: what they can buy in PropCode, each with its price and a checkout link. Show the person the links; they buy there. `GET /v1/credits` gives the same, as `choices` and `note`, when your team has nothing left.\n\n## Feedback\n\nFound a bug, need something PropCode doesn't do, or have anything else to tell us? `POST /v1/feedback` (MCP: `send_feedback`) with a `kind` (`bug`, `feature_request` or `feedback`) and a one-line `summary`. Add `details`, the `requestId` of the request it's about, and the property or report, when there is one. A person at PropCode reads every one, and the answer is always \"Feedback logged.\". It's free, with test and live keys alike, up to 50 a day per organisation.\n\n## MCP\n\nAI tools that take an MCP server can use the API directly: Claude Code, Codex, Cursor, VS Code and agent frameworks. The server is at `https://app.propcode.com.au/api/v1/mcp` (streamable HTTP) and takes your key in the same header. Its tools mirror the endpoints, one each: `search_properties`, `get_property`, `get_credits`, `unlock_property`, `read_report`, `generate_rpr`, `read_rpr`, `read_citation`, `list_unlocked_properties`, `list_land_uses`, `list_codes` and `send_feedback`. A tool call is limited, and spends credits, exactly as the request it makes. `unlock_property` takes `spendCredit` too, so an agent asks its user before spending.\n\n```bash\nclaude mcp add --scope user --transport http propcode https://app.propcode.com.au/api/v1/mcp \\\n  --header \"Authorization: Bearer pc_test_…\"\n```\n\nCodex reads the key from an environment variable, so restart Codex, or the editor you use it in, after setting it:\n\n```bash\nexport PROPCODE_API_KEY=\"pc_test_…\"\ncodex mcp add propcode --url https://app.propcode.com.au/api/v1/mcp \\\n  --bearer-token-env-var PROPCODE_API_KEY\n```\n\nFor a client configured in JSON:\n\n```json\n{ \"mcpServers\": { \"propcode\": { \"type\": \"http\", \"url\": \"https://app.propcode.com.au/api/v1/mcp\", \"headers\": { \"Authorization\": \"Bearer pc_test_…\" } } } }\n```\n\n**Sign in with PropCode instead of a key.** Claude, ChatGPT, Claude Code, Codex, Cursor and VS Code can take the server's address alone and open PropCode's sign-in, so there's no key to copy. Signed in, the tools act for you in your current PropCode team, with its credits. In Claude, open PropCode in [Claude's connector directory](https://claude.ai/directory/connectors/propcode), click **Connect** and sign in. Integrations & API › MCP has the steps for each app, and one-click installs for Claude, Cursor and VS Code.\n\n`unlock_property` is the only tool that spends anything: one credit your team already has, and only with `spendCredit`, so the agent asks you first. Credits are bought in PropCode, never through the API or MCP.\n\n## Versions\n\nThe API is versioned in its path: `/api/v1`. Within v1 we only add: new endpoints, new fields and new error codes, so ignore fields you don't know. Lists of values grow too, such as the report's pathways and verdicts: read a value you don't know as its field says, and treat a land use or pathway the report leaves out as unanswered, never as a no. A rename or removal would be `/v2`, announced first.\n\nReports come from PropCode's current rules, maps and planning documents, as in PropCode itself. When those change, a report can change too.\n\n**Deprecated:** `GET /v1/reports`, the first name of `GET /v1/unlocks`, answers the same until 30 November 2026, then goes. Its MCP tool `list_reports` is gone: call `list_unlocked_properties`.","contact":{"name":"PropCode","url":"https://propcode.com.au"}},"servers":[{"url":"https://app.propcode.com.au/api","description":"PropCode"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Property lookup","description":"Find a property’s title id, by address or by point. Every answer names its property by title id."},{"name":"Unlocks and reports","description":"Unlock a property by its title id with one of your team’s credits, then read its reports. Credits are the same as in PropCode: Pro from Property Packs and Max, and the CDC report and Rapid Planning Report credits of a plan from before Core and Pro."},{"name":"Dictionaries","description":"The complying development codes the Pro report answers for. Free."},{"name":"Feedback","description":"Tell PropCode about a bug, a feature you need, or anything else. Free."}],"paths":{"/v1/properties":{"get":{"tags":["Property lookup"],"operationId":"searchProperties","summary":"Search properties","description":"Finds properties in NSW, VIC, ACT and TAS by street address, or by the point at lat and lng. Each has its title id and its jurisdiction, which the other endpoints take together. Free: it isn’t billed.","parameters":[{"name":"address","in":"query","required":false,"description":"A street address, e.g. 32 Holden Street, Maroubra NSW. It must match one property: otherwise the answer is 409 with candidates.","schema":{"type":"string","minLength":3,"maxLength":300}},{"name":"lat","in":"query","required":false,"description":"Latitude, with lng: the property at this point.","schema":{"type":"number","minimum":-90,"maximum":90}},{"name":"lng","in":"query","required":false,"description":"Longitude, with lat.","schema":{"type":"number","minimum":-180,"maximum":180}}],"responses":{"200":{"description":"The properties found, best first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyList"}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`, `invalid_address`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. Codes: `address_not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`, `daily_search_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/property":{"get":{"tags":["Property lookup"],"operationId":"getProperty","summary":"Get a property's zones and overlays","description":"One property's planning maps: its zone, controls and overlays, as PropCode's property page lists them. No analysis. Their measures, such as height and floor space ratio limits, come once your team has unlocked the property as Pro. Not billed.","parameters":[{"name":"title","in":"query","required":true,"description":"The title id, e.g. 5008/DP752015. Find one with GET /v1/properties.","schema":{"type":"string","minLength":3,"maxLength":400}},{"name":"jurisdiction","in":"query","required":false,"description":"The state: nsw (the default), vic, act or tas. Complying development answers are NSW only.","schema":{"default":"nsw","type":"string"}}],"responses":{"200":{"description":"The property and its maps.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyMaps"},"example":{"object":"property","title":"5008/DP752015","jurisdiction":"nsw","address":"32 Holden Street, Maroubra NSW 2035","lga":"Randwick","lotAreaM2":651.3,"unlocked":true,"access":"free_sample","maps":[{"name":"Land Zoning Map","features":[{"coverage":1,"attributes":[{"label":"Instrument","value":"Randwick LEP 2012"},{"label":"Zone","value":"R2 - Low Density Residential"}]}]},{"name":"Height of Buildings Map","features":[{"coverage":1,"attributes":[{"label":"Maximum Building Height (m)","value":"9.5 m"}]}]}]}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key can’t ask that. Codes: `sandbox_title_only`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. Codes: `title_not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/credits":{"get":{"tags":["Unlocks and reports"],"operationId":"getCredits","summary":"Get your credits","description":"What your team has to unlock properties with, by credit type: Pro credits from Property Packs, Max's daily allowance (dailyAllowance) when it has Max, and the CDC report and Rapid Planning Report credits of a plan from before Core and Pro. Free.","responses":{"200":{"description":"Your team's credits.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credits"},"example":{"object":"credits","pro":{"remaining":3},"dailyAllowance":{"limit":40,"used":12,"remaining":28,"resetsAt":"2026-10-27T13:00:00.000Z"},"cdc":{"remaining":0},"rpr":{"remaining":0}}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key can’t ask that. Codes: `key_owner_left`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/unlocks":{"post":{"tags":["Unlocks and reports"],"operationId":"unlockProperty","summary":"Unlock a property","description":"Unlocks a property for your team, as unlocking it in PropCode does, by its title id: look the address up with GET /v1/properties first, so a credit is never spent on the wrong match. creditType picks the credit: pro (the default) gives the Pro report (currently NSW CDC only) and the Rapid Planning Report (outside NSW, the Rapid Planning Report alone), spending Max's daily allowance first, then your Property Packs; cdc and rpr spend the credits of a plan from before Core and Pro, for the CDC report (NSW) or the Rapid Planning Report. It spends one credit, and only spendCredit: true lets it. A property your team has already unlocked costs nothing. Test keys unlock the samples without spending.","requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Unlock one property for your team by its title id, spending one credit of the type you choose.","type":"object","properties":{"title":{"description":"The title id, from GET /v1/properties. Look the address up first, so a credit is never spent on the wrong match.","type":"string","minLength":3,"maxLength":400},"jurisdiction":{"description":"The state: nsw (the default), vic, act or tas. Complying development answers are NSW only.","default":"nsw","type":"string"},"creditType":{"description":"The credit to spend, from GET /v1/credits. pro (the default): the Pro report (currently NSW CDC only) and the Rapid Planning Report. cdc: the CDC report, with a CDC report credit from a plan from before Core and Pro. rpr: the Rapid Planning Report, with a Rapid Planning Report credit from such a plan.","default":"pro","enum":["pro","cdc","rpr"]},"spendCredit":{"description":"true: you agree to spend one credit on this property if your team hasn't unlocked it yet. An agent asks its user first.","const":true}},"required":["title","spendCredit"]},"example":{"title":"5008/DP752015","spendCredit":true}}}},"responses":{"200":{"description":"The property, unlocked.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Unlock"},"example":{"object":"unlock","property":{"title":"5008/DP752015","jurisdiction":"nsw"},"product":"pro","spent":true,"paidWith":"daily_allowance","credits":{"object":"credits","pro":{"remaining":3},"dailyAllowance":{"limit":40,"used":13,"remaining":27,"resetsAt":"2026-10-27T13:00:00.000Z"},"cdc":{"remaining":0},"rpr":{"remaining":0}}}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`, `not_eligible`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Billing stops this answer. Codes: `no_credits`, `max_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key can’t ask that. Codes: `sandbox_title_only`, `key_owner_left`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. Codes: `title_not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`, `unlock_failed`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"get":{"tags":["Unlocks and reports"],"operationId":"listUnlockedProperties","summary":"List unlocked properties","description":"The properties your team has unlocked, newest first, as PropCode's report history lists them: what each is unlocked as, who unlocked it and when, and its Rapid Planning Reports with their ids and share links. How to find a property or a report again without its id. Filter by address or title id, by what it was unlocked as, or to the properties the key's owner unlocked (mine). Test keys list nothing. Free.","parameters":[{"name":"address","in":"query","required":false,"description":"Only properties whose address or title id contains this.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"product","in":"query","required":false,"description":"Only properties your team unlocked as this: pro, or the cdc or rpr credits of a plan from before Core and Pro.","schema":{"enum":["pro","cdc","rpr"]}},{"name":"mine","in":"query","required":false,"description":"true: only properties the key's owner unlocked. Otherwise every property your team unlocked. Either way, each property shows everything your team holds on it: its products, who last unlocked it, and all its Rapid Planning Reports.","schema":{"type":"boolean"}},{"name":"page","in":"query","required":false,"description":"From 1.","schema":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991}},{"name":"limit","in":"query","required":false,"description":"Properties a page, up to 100.","schema":{"default":20,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Your team's unlocked properties, a page at a time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockedPropertyList"},"example":{"object":"list","data":[{"object":"unlocked_property","property":{"title":"5008/DP752015","jurisdiction":"nsw","address":"32 Holden Street, Maroubra NSW 2035"},"products":["pro"],"unlockedAt":"2026-10-26T01:52:40.000Z","unlockedBy":"sam@example.com","shareUrl":"https://app.propcode.com.au/share/m3n7b1v5c8x2","rprs":[{"id":"7c1d0f9e-2b54-4c1a-9a63-5f0e8d2b4a71","reportType":"multiple_land_uses","createdAt":"2026-10-26T01:55:10.000Z","status":"ready","generatedAt":"2026-10-26T01:58:02.000Z","createdBy":"sam@example.com","shareUrl":"https://app.propcode.com.au/share/q4w8e2r6t9y3"}]}],"page":1,"limit":20,"total":1}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key can’t ask that. Codes: `key_owner_left`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/reports":{"get":{"tags":["Unlocks and reports"],"operationId":"listReports","summary":"List unlocked properties (old name)","description":"Deprecated: the first name of GET /v1/unlocks, which answers the same. It's removed after 30 November 2026.","parameters":[{"name":"address","in":"query","required":false,"description":"Only properties whose address or title id contains this.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"product","in":"query","required":false,"description":"Only properties your team unlocked as this: pro, or the cdc or rpr credits of a plan from before Core and Pro.","schema":{"enum":["pro","cdc","rpr"]}},{"name":"mine","in":"query","required":false,"description":"true: only properties the key's owner unlocked. Otherwise every property your team unlocked. Either way, each property shows everything your team holds on it: its products, who last unlocked it, and all its Rapid Planning Reports.","schema":{"type":"boolean"}},{"name":"page","in":"query","required":false,"description":"From 1.","schema":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991}},{"name":"limit","in":"query","required":false,"description":"Properties a page, up to 100.","schema":{"default":20,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Your team's unlocked properties, a page at a time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnlockedPropertyList"},"example":{"object":"list","data":[{"object":"unlocked_property","property":{"title":"5008/DP752015","jurisdiction":"nsw","address":"32 Holden Street, Maroubra NSW 2035"},"products":["pro"],"unlockedAt":"2026-10-26T01:52:40.000Z","unlockedBy":"sam@example.com","shareUrl":"https://app.propcode.com.au/share/m3n7b1v5c8x2","rprs":[{"id":"7c1d0f9e-2b54-4c1a-9a63-5f0e8d2b4a71","reportType":"multiple_land_uses","createdAt":"2026-10-26T01:55:10.000Z","status":"ready","generatedAt":"2026-10-26T01:58:02.000Z","createdBy":"sam@example.com","shareUrl":"https://app.propcode.com.au/share/q4w8e2r6t9y3"}]}],"page":1,"limit":20,"total":1}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key can’t ask that. Codes: `key_owner_left`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"deprecated":true}},"/v1/report":{"get":{"tags":["Unlocks and reports"],"operationId":"readReport","summary":"Read the planning report","description":"An unlocked property's planning report (in PropCode, the Pro report): for each land use, whether it can be built under each pathway and by which way, each pathway's rules, and, on a property your team holds Pro on, how sure each answer is. It covers complying development in NSW (nsw-cdc) for now, so another state's jurisdiction answers unsupported_jurisdiction, and new pathways arrive as new entries in the same shape. Give landUse to narrow it to one land use and its rules. A rule's contentUrl gives its clause's text (GET /v1/citations/…). A Pro or a CDC report unlock reads it. Free once the property is unlocked.","parameters":[{"name":"title","in":"query","required":true,"description":"The property's title id, as GET /v1/properties gives it, with its jurisdiction. NSW: lot/plan (5008/DP752015), lot/section/plan (10/10/DP979849) or a strata plan (SP58841); for several lots, join their ids with +: 10/DP503890+11/DP503890. VIC: lot\\plan (1001\\PS340516). ACT: suburb, block and section (ACTON Block 11 Section 67). TAS: volume and folio (Volume 100007 Folio 1), or CID or PID.","schema":{"type":"string","minLength":3,"maxLength":400}},{"name":"jurisdiction","in":"query","required":false,"description":"The state: nsw (the default), vic, act or tas. Complying development answers are NSW only.","schema":{"default":"nsw","type":"string"}},{"name":"landUse","in":"query","required":false,"description":"A land use's id, or up to 10 separated by commas, from GET /v1/land-uses, each one a pathway can deliver: the report narrows to them, their answers and the rules behind them.","schema":{"type":"string","minLength":1,"maxLength":1000}},{"name":"view","in":"query","required":false,"description":"summary: each land use's verdict, with only its eligible ways and alterations and their figures, and no rules unless rules is true: about a quarter of the full report. full, the default: every way and alteration, with the rules.","schema":{"enum":["full","summary"]}},{"name":"rules","in":"query","required":false,"description":"false: leave out each pathway's rules, for the answers alone, a much smaller report. Rules come unless false; with view=summary, only when true.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"The report.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"},"example":{"object":"report","property":{"title":"5008/DP752015","jurisdiction":"nsw","address":"32 Holden Street, Maroubra NSW 2035","lga":"Randwick","lotAreaM2":651.3},"evaluatedAt":"2026-10-28T02:11:16.147Z","pathways":[{"id":"nsw-cdc","name":"Complying development","rules":[{"id":"cdc-1-18-1-b","ways":["dual-occupancy-detached"],"reference":"1.18(1)(b)","instrument":"State Environmental Planning Policy (Exempt and Complying Development Codes) 2008","description":"Has permissibility with consent for dual occupancy (detached)?","result":"met","certainty":"best_guess"},{"id":"cdc-3b-2-d","ways":["dual-occupancy-detached"],"reference":"3B.2(d)","instrument":"State Environmental Planning Policy (Exempt and Complying Development Codes) 2008","description":"Does not currently have a secondary dwelling or group home?","result":"unknown","certainty":"not_known"}]}],"landUses":[{"id":"dual-occupancy-detached","name":"Dual occupancy (detached)","pathways":[{"pathway":"nsw-cdc","verdict":"eligible","ways":[{"id":"dual-occupancy-detached","name":"Dual occupancy (detached)","group":"Low Rise Housing Diversity Code","verdict":"eligible","applies":true,"conclusions":{"dwellings":{"min":2,"max":2},"maxGfaM2":462.825,"maxHeightM":8.5,"minSubdivisionLotM2":225}}],"alterations":[{"id":"housing-alterations-code","name":"Minor residential alterations","group":"Housing Alterations Code","verdict":"not_eligible","applies":true}]}]}],"keyControls":[{"name":"landZone","title":"Land Zone","value":"R2"},{"name":"heightOfBuildingsEPI","title":"Max Height (EPI)","value":9.5,"unit":"m"},{"name":"floorSpaceRatioEPI","title":"Max FSR (EPI)","value":0.5,"unit":":1"},{"name":"minimumLotSizeEPI","title":"Min. Lot Size (EPI)","value":275,"unit":"m²"},{"name":"lotArea","title":"Total Lot Area","value":651.3,"unit":"m²"},{"name":"inBushFireProneLand","title":"In Bushfire Prone Land?","value":false},{"name":"isFloodControlLot","title":"Is Flood Control Lot?","value":null}],"unknownCriticalFacts":[],"reportUrl":"https://app.propcode.com.au/cdc/nsw/5008%2FDP752015"}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key can’t ask that. Codes: `sandbox_title_only`, `key_owner_left`, `not_unlocked`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. Codes: `title_not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Facts or jurisdiction not accepted. Codes: `unsupported_jurisdiction`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Busy: retry after Retry-After. Codes: `engine_busy`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/reports/rpr":{"post":{"tags":["Unlocks and reports"],"operationId":"generateRpr","summary":"Generate the Rapid Planning Report","parameters":[{"name":"section","in":"query","required":false,"description":"One section, by its number in outline, or none for the outline alone. Every section unless given.","schema":{"anyOf":[{"const":"none"},{"type":"integer","minimum":1,"maximum":9007199254740991}]}}],"description":"Starts generating an unlocked property's Rapid Planning Report, of the kind reportType names: every land use, one land use (landUse), or subdivision. It's generated from the property's planning documents, in NSW, VIC, ACT and TAS, and takes a few minutes, so this answers at once with its id; read GET /v1/reports/rpr/{id} until it's ready. Once the property is unlocked (Pro, or a Rapid Planning Report credit), its Rapid Planning Reports cost nothing more: every kind, for every land use. Your team holds one report of each kind on a property, and one for each land use, generated the first time anyone in the team asks for it. Asking again, with any of the team's keys or in PropCode, answers with that report (alreadyGenerated: true), unless it's incomplete or failed, which generates it again (once a day at most). Live keys only.","requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Generate the property's Rapid Planning Report: its planning rules by land use and approval pathway, from its planning documents.","type":"object","properties":{"title":{"description":"The property's title id, as GET /v1/properties gives it, with its jurisdiction. NSW: lot/plan (5008/DP752015), lot/section/plan (10/10/DP979849) or a strata plan (SP58841); for several lots, join their ids with +: 10/DP503890+11/DP503890. VIC: lot\\plan (1001\\PS340516). ACT: suburb, block and section (ACTON Block 11 Section 67). TAS: volume and folio (Volume 100007 Folio 1), or CID or PID.","type":"string","minLength":3,"maxLength":400},"jurisdiction":{"description":"The state: nsw (the default), vic, act or tas. Complying development answers are NSW only.","default":"nsw","type":"string"},"reportType":{"description":"multiple_land_uses (the default): the rules for every land use. single_land_use: the rules for one land use, named by landUse. subdivision: the rules for subdividing the lot.","default":"multiple_land_uses","enum":["multiple_land_uses","single_land_use","subdivision"]},"landUse":{"description":"A land use's id, from GET /v1/land-uses: required for single_land_use, and taken by no other type.","type":"string","minLength":1,"maxLength":100}},"required":["title"]},"example":{"title":"5008/DP752015","reportType":"single_land_use","landUse":"secondary-dwelling"}}}},"responses":{"200":{"description":"The report, generating or ready.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rpr"},"example":{"object":"rpr","id":"7c1d0f9e-2b54-4c1a-9a63-5f0e8d2b4a71","property":{"title":"5008/DP752015","jurisdiction":"nsw","address":"32 Holden Street, Maroubra NSW 2035"},"reportType":"multiple_land_uses","status":"generating","createdAt":"2026-10-26T01:55:10.000Z","reportUrl":"https://app.propcode.com.au/g-report/q4w8e2r6t9y3","shareUrl":"https://app.propcode.com.au/share/q4w8e2r6t9y3"}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key can’t ask that. Codes: `sandbox_title_only`, `key_owner_left`, `not_unlocked`, `live_key_required`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. Codes: `title_not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/reports/rpr/{id}":{"get":{"tags":["Unlocks and reports"],"operationId":"readRpr","summary":"Read a Rapid Planning Report","description":"A Rapid Planning Report your team started: generating, ready, incomplete or failed, with its outline and sections once it has them. A whole report runs to tens of thousands of characters, so read the outline (section=none), then a section at a time (section=2). An incomplete or failed report is generated again by POST /v1/reports/rpr, once a day at most.","parameters":[{"name":"id","in":"path","required":true,"description":"The id POST /v1/reports/rpr answered with.","schema":{"type":"string"}},{"name":"section","in":"query","required":false,"description":"One section, by its number in outline, or none for the outline alone. Every section unless given.","schema":{"anyOf":[{"const":"none"},{"type":"integer","minimum":1,"maximum":9007199254740991}]}}],"responses":{"200":{"description":"The report.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rpr"},"example":{"object":"rpr","id":"7c1d0f9e-2b54-4c1a-9a63-5f0e8d2b4a71","property":{"title":"5008/DP752015","jurisdiction":"nsw","address":"32 Holden Street, Maroubra NSW 2035"},"reportType":"multiple_land_uses","status":"ready","createdAt":"2026-10-26T01:55:10.000Z","reportUrl":"https://app.propcode.com.au/g-report/q4w8e2r6t9y3","shareUrl":"https://app.propcode.com.au/share/q4w8e2r6t9y3","outline":[{"section":1,"title":"Maximum Building Height","characters":184}],"sections":[{"title":"Maximum Building Height","html":"<p>The maximum building height for this property is <strong>9.5 m</strong> under clause 4.3 of the Randwick Local Environmental Plan 2012 [1], shown on its Height of Buildings Map.</p>","citations":[{"n":1,"document":"Randwick Local Environmental Plan 2012","location":"Part 4 Principal development standards › 4.3 Height of buildings","libraryUrl":"https://app.propcode.com.au/library/document/nsw/epi-2013-0036?version=2026-07-01#idx-1309","contentUrl":"https://app.propcode.com.au/api/v1/citations/nsw/epi-2013-0036/2026-07-01/0/1309"}]}]}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"This key can’t ask that. Codes: `key_owner_left`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. Codes: `not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/citations/{jurisdiction}/{document}/{version}/{file}/{passageId}":{"get":{"tags":["Unlocks and reports"],"operationId":"readCitation","summary":"Read a citation","description":"The text a Rapid Planning Report citation points to, from the version the report read: GET its contentUrl. It answers with the cited passage, its text stopping at 10,000 characters (truncated says so). With includeParentSection=true it answers with the section the passage is in instead, with all its subclauses and the passage in <mark>, as the Library shows a citation; parentSection says which you got, since it's the passage alone where the section would be the whole document, runs past 20,000 characters, or is the passage itself. Each comes as HTML and as plain text. A report cites 50 to 100 passages, so read the ones you need. Any key reads them; a live key's team reads up to 2,000 different passages a day, and repeats are free. Legislation's text is the published legislation's; a development control plan's is read from the council's PDF, which libraryUrl opens.","parameters":[{"name":"jurisdiction","in":"path","required":true,"description":"The state the document is in: nsw, vic, act or tas.","schema":{"type":"string"}},{"name":"document","in":"path","required":true,"description":"The document's id in PropCode's Library.","schema":{"type":"string"}},{"name":"version","in":"path","required":true,"description":"The document's version the report read, e.g. 2026-07-01.","schema":{"type":"string"}},{"name":"file","in":"path","required":true,"description":"The document's file: 0 for most legislation; a DCP has several.","schema":{"type":"integer"}},{"name":"passageId","in":"path","required":true,"description":"The cited passage's id within the file, as a citation's contentUrl gives it: PropCode's own, not a clause number.","schema":{"type":"integer"}},{"name":"includeParentSection","in":"query","required":false,"description":"true: the section the passage is in, with all its subclauses and the passage in <mark>, as the Library shows a citation, in place of the passage alone. parentSection says which you got: it's the passage alone where the section would be the whole document, runs past 20,000 characters, or is the passage itself.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"The cited text.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Citation"},"examples":{"passage":{"summary":"the passage (the default)","value":{"object":"citation","document":{"id":"epi-2013-0036","name":"Randwick Local Environmental Plan 2012","jurisdiction":"nsw"},"version":"2026-07-01","file":0,"passageId":1309,"location":"Part 4 Principal development standards › 4.3 Height of buildings","parentSection":false,"html":"<div><span class=\"identifier\">(2)</span> The height of a building on any land is not to exceed the maximum height shown for the land on the <em>Height of Buildings Map</em>.</div>","text":"(2) The height of a building on any land is not to exceed the maximum height shown for the land on the Height of Buildings Map.","libraryUrl":"https://app.propcode.com.au/library/document/nsw/epi-2013-0036?version=2026-07-01#idx-1309"}},"parentSection":{"summary":"with includeParentSection=true","value":{"object":"citation","document":{"id":"epi-2013-0036","name":"Randwick Local Environmental Plan 2012","jurisdiction":"nsw"},"version":"2026-07-01","file":0,"passageId":1309,"location":"Part 4 Principal development standards › 4.3 Height of buildings","parentSection":true,"html":"<div><h3><span class=\"identifier\">4.3</span> Height of buildings</h3><div><span class=\"identifier\">(1)</span> <p>The objectives of this clause are as follows—</p><ol><li><span class=\"identifier\">(a)</span> to ensure that the size and scale of development is compatible with the desired future character of the locality,</li><li><span class=\"identifier\">(b)</span> to ensure that development is compatible with the scale and character of contributory buildings in a conservation area or near a heritage item,</li><li><span class=\"identifier\">(c)</span> to ensure that development does not adversely impact on the amenity of adjoining and neighbouring land in terms of visual bulk, loss of privacy, overshadowing and views.</li></ol></div><mark><div><span class=\"identifier\">(2)</span> The height of a building on any land is not to exceed the maximum height shown for the land on the <em>Height of Buildings Map</em>.</div></mark><div><span class=\"identifier\">(2A)</span> Despite subclause (2), the maximum height of a dwelling house or semi-detached dwelling on land in Zone R3 Medium Density Residential is 9.5 metres.</div></div>","text":"4.3 Height of buildings\n(1) The objectives of this clause are as follows—\n(a) to ensure that the size and scale of development is compatible with the desired future character of the locality,\n(b) to ensure that development is compatible with the scale and character of contributory buildings in a conservation area or near a heritage item,\n(c) to ensure that development does not adversely impact on the amenity of adjoining and neighbouring land in terms of visual bulk, loss of privacy, overshadowing and views.\n(2) The height of a building on any land is not to exceed the maximum height shown for the land on the Height of Buildings Map.\n(2A) Despite subclause (2), the maximum height of a dwelling house or semi-detached dwelling on land in Zone R3 Medium Density Residential is 9.5 metres.","libraryUrl":"https://app.propcode.com.au/library/document/nsw/epi-2013-0036?version=2026-07-01#idx-1309"}}}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`, `passage_too_broad`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found. Codes: `citation_not_found`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Facts or jurisdiction not accepted. Codes: `unsupported_jurisdiction`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`, `daily_citation_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/land-uses":{"get":{"tags":["Dictionaries"],"operationId":"listLandUses","summary":"List the land uses","description":"Every land use in a state, as Rapid Planning Reports cover them, with its id: the landUse of a single land use’s Rapid Planning Report, and of the planning report where a pathway can deliver it. Ids are stable: they never change, and no id is used for another land use. pathways lists the pathways that can deliver each, with the ids of their ways: for nsw-cdc, the complying development codes (NSW only). Free.","parameters":[{"name":"jurisdiction","in":"query","required":false,"description":"The state whose land uses to list, such as nsw or vic.","schema":{"default":"nsw","type":"string"}}],"responses":{"200":{"description":"The land uses.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandUseList"},"example":{"object":"list","data":[{"id":"secondary-dwelling","name":"Secondary dwelling","category":"Residential & Accommodation","popular":true,"pathways":[{"pathway":"nsw-cdc","wayIds":["secondary-dwelling","housing-alterations-code"]}]},{"id":"agritourism","name":"Agritourism","category":"Agriculture & Resources","popular":false,"pathways":[]}]}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/codes":{"get":{"tags":["Dictionaries"],"operationId":"listCodes","summary":"List the codes","description":"The complying development codes the Pro report answers for, in the report’s order. Complying development is NSW only.","responses":{"200":{"description":"The codes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeList"}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/feedback":{"post":{"tags":["Feedback"],"operationId":"sendFeedback","summary":"Send feedback","description":"Tells PropCode about a bug, a feature you or your user need, or anything else, such as an answer that looks wrong. A person at PropCode reads every one; the answer is always \"Feedback logged.\", with no reply through the API. Send one whenever something doesn't work as you expected. Include the requestId of the request it's about, from its error or its Request-Id header. Anything shaped like an API key is removed before it's stored. Test and live keys alike, up to 50 a day per organisation. Free.","requestBody":{"required":true,"content":{"application/json":{"schema":{"description":"Tell PropCode about a bug, a feature you need, or anything else. Free; a person at PropCode reads every one.","type":"object","properties":{"kind":{"description":"bug: something that doesn't work. feature_request: something you or your user need that PropCode doesn't do. feedback: anything else, such as an answer that looks wrong, or what worked.","enum":["bug","feature_request","feedback"]},"summary":{"description":"One line, up to 120 characters.","type":"string","minLength":1,"maxLength":120},"details":{"description":"Optional. Up to 4,000 characters of plain text: the steps, what you expected and what happened.","type":"string","maxLength":4000},"requestId":{"description":"Optional. The id of the request it's about, from an error's requestId or a Request-Id header.","type":"string","format":"regex","pattern":"^req_[0-9A-Za-z]{16}$"},"property":{"description":"Optional. The property it's about.","type":"object","properties":{"title":{"description":"The property's title id, as GET /v1/properties gives it, with its jurisdiction. NSW: lot/plan (5008/DP752015), lot/section/plan (10/10/DP979849) or a strata plan (SP58841); for several lots, join their ids with +: 10/DP503890+11/DP503890. VIC: lot\\plan (1001\\PS340516). ACT: suburb, block and section (ACTON Block 11 Section 67). TAS: volume and folio (Volume 100007 Folio 1), or CID or PID.","type":"string","minLength":3,"maxLength":400},"jurisdiction":{"description":"The state: nsw (the default), vic, act or tas. Complying development answers are NSW only.","default":"nsw","type":"string"}},"required":["title"]},"reportId":{"description":"Optional. The id of the report or Rapid Planning Report it's about.","type":"string","maxLength":64},"client":{"description":"Optional. Your app's name and version, e.g. acme-planner 2.3.0.","type":"string","maxLength":200}},"required":["kind","summary"]},"example":{"kind":"bug","summary":"read_rpr fails with 500 for a VIC title","details":"Twice in a row, 10 minutes apart. Other VIC titles work.","requestId":"req_8f3K2pQx7LmN0aZc","property":{"title":"1\\TP618311","jurisdiction":"vic"}}}}},"responses":{"201":{"description":"Logged.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Feedback"},"example":{"object":"feedback","message":"Feedback logged."}}}},"400":{"description":"The request isn’t valid. Codes: `key_in_url`, `invalid_parameter`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid key. Codes: `missing_api_key`, `invalid_api_key`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Facts or jurisdiction not accepted. Codes: `unsupported_jurisdiction`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Over a limit: retry after Retry-After. Codes: `rate_limited`, `sandbox_daily_limit`, `feedback_limit_reached`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Our error. Codes: `internal_error`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Your API key from Integrations & API: pc_test_… for the sample properties, pc_live_… for any."}},"schemas":{"Property":{"description":"A property: a title, and where it is.","type":"object","properties":{"title":{"description":"The title reference.","type":"string"},"jurisdiction":{"description":"The state: nsw, vic, act or tas.","type":"string"},"address":{"description":"The property's street address.","type":"string"},"lga":{"description":"The local government area.","type":"string"},"lotAreaM2":{"description":"The lot's area, in m².","type":"number"}},"required":["title","jurisdiction","address"]},"PropertyMatch":{"description":"A property a search found.","type":"object","properties":{"title":{"description":"The title reference.","type":"string"},"jurisdiction":{"description":"The state: nsw, vic, act or tas.","type":"string"},"address":{"description":"The property's street address.","type":"string"},"lga":{"description":"The local government area.","type":"string"},"lotAreaM2":{"description":"The lot's area, in m².","type":"number"},"match":{"description":"How the search found this property.","type":"object","properties":{"kind":{"description":"How it was found: the lot contains the point, carries the address, or is the nearest.","enum":["contains","address","nearest"]},"distanceM":{"description":"How far the lot is from the point, in m.","type":"number"}},"required":["kind","distanceM"]},"confidence":{"description":"Address searches: how sure the address match is.","enum":["high","medium","low"]}},"required":["title","jurisdiction","address","match"]},"PropertyList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/PropertyMatch"}}},"required":["object","data"]},"MapFeature":{"description":"One feature of a map that touches the lot.","type":"object","properties":{"coverage":{"description":"How much of the lot it covers, from 0 to 1, when known. Null until your team has unlocked the property as Pro.","anyOf":[{"type":"number"},{"type":"null"}]},"attributes":{"description":"What the map says here, as the map labels it, e.g. Zone: R2 - Low Density Residential.","type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"]}}},"required":["coverage","attributes"]},"Map":{"description":"A planning map, with its features that touch the lot.","type":"object","properties":{"name":{"description":"The map, e.g. Land Zoning Map.","type":"string"},"features":{"type":"array","items":{"$ref":"#/components/schemas/MapFeature"}}},"required":["name","features"]},"PropertyMaps":{"description":"A property with its zones and overlays.","type":"object","properties":{"title":{"description":"The title reference.","type":"string"},"jurisdiction":{"description":"The state: nsw, vic, act or tas.","type":"string"},"address":{"description":"The property's street address.","type":"string"},"lga":{"description":"The local government area.","type":"string"},"lotAreaM2":{"description":"The lot's area, in m².","type":"number"},"object":{"const":"property"},"unlocked":{"description":"Whether your team has unlocked the property as Pro, or it is one of the sample properties, whose measures and Pro report are free with any key. Until then, the maps leave out their measures, such as height and floor space ratio limits and minimum lot sizes, and how much of the lot each feature covers. access says which.","type":"boolean"},"access":{"description":"How your team reads the property's measures and Pro report: unlocked, where it holds the property as Pro; free_sample, for one of the sample properties, free with any key and never among your unlocked properties; locked until a Pro unlock.","enum":["unlocked","free_sample","locked"]},"maps":{"description":"The planning maps with a feature on the lot, as PropCode's property page lists them: its zone, its controls and its overlays.","type":"array","items":{"$ref":"#/components/schemas/Map"}}},"required":["title","jurisdiction","address","object","unlocked","access","maps"]},"Verdict":{"description":"The answer, in its pathway's words. For complying development (nsw-cdc): eligible: on the facts PropCode holds, the development meets this code's requirements as complying development, and any rule waiting on a fact it can't settle shows as unknown. not_eligible: it fails a requirement of this code. no_conclusion: a fact PropCode can't determine decides it; see unknownCriticalFacts. Other pathways may add their own values: read one you don't know as no_conclusion.","type":"string","x-extensible-enum":["eligible","not_eligible","no_conclusion"]},"SummaryConclusions":{"description":"What the code allows on this lot, where it says.","type":"object","properties":{"dwellings":{"description":"How many dwellings the code allows.","anyOf":[{"type":"number"},{"type":"string"}]},"maxGfaM2":{"description":"The largest gross floor area allowed, in m².","type":"number"},"maxHeightM":{"description":"The greatest height, in m.","type":"number"},"minSubdivisionLotM2":{"description":"The smallest lot a subdivision may make, in m²; null when the lot can't be subdivided under this code.","anyOf":[{"type":"number"},{"type":"null"}]}},"required":[]},"SummaryWay":{"description":"One way to deliver a land use: a code's answer for it.","type":"object","properties":{"code":{"description":"The complying development code.","type":"object","properties":{"id":{"description":"The code's id, as GET /v1/codes lists it.","type":"string"},"name":{"description":"The code's name.","type":"string"},"group":{"description":"The group the code belongs to.","type":"string"}},"required":["id","name","group"]},"verdict":{"$ref":"#/components/schemas/Verdict"},"applies":{"description":"Whether the code applies to this lot; null while a critical fact is unknown.","anyOf":[{"type":"boolean"},{"type":"null"}]},"conclusions":{"$ref":"#/components/schemas/SummaryConclusions"}},"required":["code","verdict","applies"]},"SummaryLandUseAnswer":{"description":"One land use's answer: can it be built, and by which codes.","type":"object","properties":{"id":{"description":"The land use's id, as GET /v1/land-uses lists it.","type":"string"},"name":{"description":"The land use's name.","type":"string"},"verdict":{"description":"The best of its ways to build it new; null when only alterations deliver it.","anyOf":[{"$ref":"#/components/schemas/Verdict"},{"type":"null"}]},"ways":{"description":"The codes that deliver it as new building work.","type":"array","items":{"$ref":"#/components/schemas/SummaryWay"}},"alterations":{"description":"The codes for altering an existing building for it. They don't count toward its verdict.","type":"array","items":{"$ref":"#/components/schemas/SummaryWay"}}},"required":["id","name","verdict","ways","alterations"]},"CdcAnswer":{"description":"Complying development (CDC): what can be built on the property, by land use.","type":"object","properties":{"ruleset":{"description":"The ruleset the answer came from. Answers can change when it does.","type":"string"},"landUses":{"description":"Each land use asked about, or every one, with its answer.","type":"array","items":{"$ref":"#/components/schemas/SummaryLandUseAnswer"}},"unknownCriticalFacts":{"description":"Facts PropCode couldn't determine that decide an answer. Supply them in factOverrides.","type":"array","items":{"type":"string"}},"reportUrl":{"description":"The property's CDC report in the PropCode app.","type":"string"}},"required":["ruleset","landUses","unknownCriticalFacts","reportUrl"]},"Summary":{"description":"What can be built on one property, by pathway: complying development (cdc) for now.","type":"object","properties":{"object":{"const":"summary"},"property":{"$ref":"#/components/schemas/Property"},"evaluatedAt":{"description":"When the answer was worked out (ISO 8601).","type":"string"},"cdc":{"$ref":"#/components/schemas/CdcAnswer"},"usage":{"description":"What this answer cost.","type":"object","properties":{"billed":{"description":"Whether this answer was billed: the first for the property this month, with a live key.","type":"boolean"},"period":{"description":"The billing month, YYYY-MM (UTC).","type":"string"},"sample":{"description":"Present on a sample property, whose answers are free with any key.","const":true}},"required":["billed","period"]}},"required":["object","property","evaluatedAt","cdc","usage"]},"CodeGroup":{"description":"A group of codes.","type":"object","properties":{"id":{"description":"The group's id: a stable slug, such as housing-code.","type":"string"},"name":{"type":"string"}},"required":["id","name"]},"Code":{"description":"A complying development code the summary answers for.","type":"object","properties":{"id":{"description":"The code's id.","type":"string"},"name":{"description":"The code's name.","type":"string"},"group":{"$ref":"#/components/schemas/CodeGroup"},"position":{"description":"Its place in the report's order.","type":"number"}},"required":["id","name","group","position"]},"CodeList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Code"}}},"required":["object","data"]},"LandUse":{"description":"A land use, as Rapid Planning Reports and PropCode list them.","type":"object","properties":{"id":{"description":"The id to send as landUse: stable, it never changes or names another land use.","type":"string"},"name":{"description":"The land use's name.","type":"string"},"category":{"description":"The kind of land use it is.","type":"string"},"popular":{"description":"One of the land uses most asked about.","type":"boolean"},"pathways":{"description":"The pathways that can deliver it, which the report answers it by; none when no pathway PropCode covers can. nsw-cdc covers NSW only.","type":"array","items":{"type":"object","properties":{"pathway":{"description":"The pathway's id, such as nsw-cdc.","type":"string"},"wayIds":{"description":"The ids of the ways that can deliver it under that pathway: for nsw-cdc, the codes.","type":"array","items":{"type":"string"}}},"required":["pathway","wayIds"]}}},"required":["id","name","category","popular","pathways"]},"LandUseList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/LandUse"}}},"required":["object","data"]},"Fact":{"description":"A fact you can override in POST /v1/summary.","type":"object","properties":{"name":{"description":"The name to use in factOverrides.","type":"string"},"title":{"description":"What the fact is.","type":"string"},"type":{"description":"The kind of value it takes.","enum":["numeric","text","boolean"]},"unit":{"description":"Numeric facts: the unit.","type":"string"},"allowedValues":{"description":"Text facts: the values it takes.","type":"array","items":{"type":"string"}},"question":{"description":"The question the web report asks for it.","type":"string"}},"required":["name","title","type"]},"FactList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Fact"}}},"required":["object","data"]},"PurchaseChoice":{"description":"Something your team can buy in PropCode to unlock properties with: Pro, for one property or as a Property Pack.","type":"object","properties":{"name":{"description":"What it buys: \"Just this property\" or \"Property Pack\".","type":"string"},"price":{"description":"Its price with GST, from PropCode's live catalog: e.g. A$82.50, or from A$27.50 a property for a pack. Left out when the catalog can't be read.","type":"string"},"url":{"description":"PropCode's checkout, opened on this choice. The person buys there; an agent never buys.","type":"string"}},"required":["name","url"]},"Credits":{"description":"What your team has to unlock properties with, by credit type.","type":"object","properties":{"object":{"const":"credits"},"pro":{"description":"Pro credits from Property Packs, shared by your team.","type":"object","properties":{"remaining":{"description":"Pro credits left in your team's Property Packs.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["remaining"]},"dailyAllowance":{"description":"Max Pro's unlocks for today, shared by your team's seats and spent before any pack; null without Max.","anyOf":[{"type":"object","properties":{"limit":{"description":"Today's unlocks: 20 for each Max seat.","type":"integer","minimum":0,"maximum":9007199254740991},"used":{"description":"Unlocks used today.","type":"integer","minimum":0,"maximum":9007199254740991},"remaining":{"description":"Unlocks left today.","type":"integer","minimum":0,"maximum":9007199254740991},"resetsAt":{"description":"When the allowance starts again in full: the next midnight in Sydney (ISO 8601).","type":"string"}},"required":["limit","used","remaining","resetsAt"]},{"type":"null"}]},"cdc":{"description":"CDC report credits from a plan from before Core and Pro: each unlocks a property's CDC report (creditType cdc).","type":"object","properties":{"remaining":{"description":"CDC report credits left; 0 when your team has none.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["remaining"]},"rpr":{"description":"Rapid Planning Report credits from a plan from before Core and Pro: each unlocks a property's Rapid Planning Report (creditType rpr).","type":"object","properties":{"remaining":{"description":"Rapid Planning Report credits left; 0 when your team has none.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["remaining"]},"choices":{"description":"When your team has nothing to unlock a property with, and you're its owner or an admin: what you can buy in PropCode, with links.","type":"array","items":{"$ref":"#/components/schemas/PurchaseChoice"}},"note":{"description":"When your team has nothing to unlock a property with: who buys credits, in a sentence or two to pass on to the person.","type":"string"}},"required":["object","pro","dailyAllowance","cdc","rpr"]},"Unlock":{"description":"A property your team has unlocked.","type":"object","properties":{"object":{"const":"unlock"},"property":{"type":"object","properties":{"title":{"type":"string"},"jurisdiction":{"type":"string"}},"required":["title","jurisdiction"]},"product":{"description":"What the team holds the property as: the creditType spent.","enum":["pro","cdc","rpr"]},"spent":{"description":"Whether this request spent a credit: false when your team had already unlocked the property, and for a sample property's CDC report, which is free.","type":"boolean"},"paidWith":{"description":"What a Pro credit came from, when one was spent: Max's daily allowance or a pack.","enum":["daily_allowance","pack"]},"sample":{"description":"Present on a sample property, whose Pro report is free with any key and needs no unlock, so nothing was spent. Its Rapid Planning Report is still paid: unlock it with creditType rpr, or in PropCode.","const":true},"shareUrl":{"description":"On a Pro unlock in NSW, the Pro report's share link: anyone who has it can read the report, without signing in. Elsewhere, share the Rapid Planning Report's own.","type":"string"},"credits":{"$ref":"#/components/schemas/Credits"}},"required":["object","property","product","spent","credits"]},"Conclusions":{"description":"What it allows on this lot, where it says. More limits may come.","type":"object","properties":{"dwellings":{"description":"How many dwellings it allows: min and max are the same unless it allows a range, such as 3 to 4.","type":"object","properties":{"min":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"max":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["min","max"]},"maxGfaM2":{"description":"The largest gross floor area allowed, in m².","type":"number"},"maxHeightM":{"description":"The greatest height, in m.","type":"number"},"minSubdivisionLotM2":{"description":"The smallest lot a subdivision may make, in m²; null when the lot can't be subdivided this way.","anyOf":[{"type":"number"},{"type":"null"}]}},"required":[]},"Way":{"description":"One way to deliver a land use under a pathway, and its answer: for nsw-cdc, a complying development code.","type":"object","properties":{"id":{"description":"The way's id: for nsw-cdc, a code's id, as GET /v1/codes lists it.","type":"string"},"name":{"description":"The way's name.","type":"string"},"group":{"description":"The group it belongs to: for nsw-cdc, the code's group, such as Low Rise Housing Diversity Code.","type":"string"},"verdict":{"$ref":"#/components/schemas/Verdict"},"applies":{"description":"Whether it applies to this lot; null when a fact PropCode can’t determine decides it.","anyOf":[{"type":"boolean"},{"type":"null"}]},"conclusions":{"$ref":"#/components/schemas/Conclusions"}},"required":["id","name","group","verdict","applies"]},"PathwayAnswer":{"description":"A land use's answer under one pathway.","type":"object","properties":{"pathway":{"description":"The pathway's id, as pathways lists it, such as nsw-cdc.","type":"string"},"verdict":{"description":"The land use's answer under this pathway: for nsw-cdc, the best of its ways to build it new; null when only alterations deliver it.","anyOf":[{"$ref":"#/components/schemas/Verdict"},{"type":"null"}]},"ways":{"description":"The ways to build it new under this pathway. With view=summary, only the eligible ones, and left out when none is.","type":"array","items":{"$ref":"#/components/schemas/Way"}},"alterations":{"description":"The ways to alter an existing building for it. They don't count toward its verdict. With view=summary, only the eligible ones, and left out when none is.","type":"array","items":{"$ref":"#/components/schemas/Way"}}},"required":["pathway","verdict"]},"ReportLandUse":{"description":"One land use's answers: can it be built, and by which pathway.","type":"object","properties":{"id":{"description":"The land use's id, as GET /v1/land-uses lists it.","type":"string"},"name":{"description":"The land use's name.","type":"string"},"pathways":{"description":"Its answer under each pathway the report answers it by.","type":"array","items":{"$ref":"#/components/schemas/PathwayAnswer"}}},"required":["id","name","pathways"]},"Rule":{"description":"One rule, and how the property fares against it.","type":"object","properties":{"id":{"description":"The rule's id, where it has one.","type":"string"},"ways":{"description":"The ids of the ways in this report that the rule belongs to.","type":"array","items":{"type":"string"}},"reference":{"description":"The clause it comes from, e.g. 3.9(1).","type":"string"},"instrument":{"description":"The instrument the clause belongs to, by name.","type":"string"},"contentUrl":{"description":"The clause's text (GET /v1/citations/…, or read_citation over MCP), at the instrument's version the rule was reviewed against, where PropCode has the clause in its Library.","type":"string"},"description":{"description":"What the rule requires, as the report words it.","type":"string"},"result":{"description":"met or not_met on this lot; unknown when a fact it reads isn't known. Read a value you don't know as unknown.","type":"string","x-extensible-enum":["met","not_met","unknown"]},"message":{"description":"Why, where the report says.","type":"string"},"certainty":{"description":"How certain PropCode is of this answer, as the report marks it. Given on a property your team holds Pro on, and on the sample properties. Read a value you don't know as not_known.","type":"string","x-extensible-enum":["guaranteed","best_guess","not_known"]}},"required":["ways","reference","description","result"]},"Pathway":{"description":"A planning pathway the report answers by.","type":"object","properties":{"id":{"description":"Its id: the state, then the pathway, such as nsw-cdc. A new pathway adds a new id.","type":"string"},"name":{"description":"Its name, such as Complying development.","type":"string"},"rules":{"description":"The rules behind its answers, each once, as the report's Pro detail lists them. With landUse, only the rules of that land use's ways.","type":"array","items":{"$ref":"#/components/schemas/Rule"}}},"required":["id","name"]},"KeyControl":{"description":"One of the property's key planning controls or constraints.","type":"object","properties":{"name":{"description":"The fact's name, e.g. heightOfBuildingsEPI.","type":"string"},"title":{"description":"What it is, as PropCode words it.","type":"string"},"value":{"description":"Its value on this property, typed by the control: a number for a numeric control (its unit is in unit), text, or true or false. null when PropCode has none.","anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"null"}]},"unit":{"description":"Its unit, e.g. m or m².","type":"string"}},"required":["name","title","value"]},"Report":{"description":"One property's planning report: what can be built, by land use and pathway, and the rules behind each answer.","type":"object","properties":{"object":{"const":"report"},"property":{"$ref":"#/components/schemas/Property"},"evaluatedAt":{"description":"When the report was worked out (ISO 8601).","type":"string"},"pathways":{"description":"The pathways the report answers by: nsw-cdc, complying development in NSW, for now.","type":"array","items":{"$ref":"#/components/schemas/Pathway"}},"landUses":{"description":"Each land use the report answers, with its answer under each pathway; with landUse, just that one. A land use or a pathway left out is unanswered, never a no.","type":"array","items":{"$ref":"#/components/schemas/ReportLandUse"}},"keyControls":{"description":"The property's key planning controls and constraints, as the report reads them from PropCode's maps: its zone, height and floor space ratio limits, minimum lot size, lot area, and heritage, bush fire and flood control flags.","type":"array","items":{"$ref":"#/components/schemas/KeyControl"}},"unknownCriticalFacts":{"description":"Facts PropCode can’t determine that leave some answers with no_conclusion.","type":"array","items":{"type":"string"}},"reportUrl":{"description":"The report on PropCode, for your team.","type":"string"},"shareUrl":{"description":"The report's share link, where your team holds Pro on the property: anyone who has it can read the report, without signing in.","type":"string"}},"required":["object","property","evaluatedAt","pathways","landUses","unknownCriticalFacts","reportUrl"]},"RprSection":{"description":"One section of the report.","type":"object","properties":{"title":{"type":"string"},"html":{"description":"The section, as HTML as PropCode writes it. Each citation is its document's name and a [n] that citations explains.","type":"string"},"citations":{"type":"array","items":{"$ref":"#/components/schemas/RprCitation"}}},"required":["title","html","citations"]},"RprCitation":{"description":"A source the section cites.","type":"object","properties":{"n":{"description":"Its number, as [n] in the section.","type":"integer","minimum":1,"maximum":9007199254740991},"document":{"description":"The planning document, e.g. a local environmental plan.","type":"string"},"version":{"description":"The document's version the report read, e.g. 2026-07-01.","type":"string"},"location":{"description":"Where in it, by its headings, e.g. Part 4 › 4.3 Height of buildings.","type":"string"},"fileName":{"description":"For a document published as PDFs, the name of the PDF the passage is in. Left out for legislation.","type":"string"},"page":{"description":"The page of that PDF the passage starts on, counting from 1, where the document records it.","type":"integer","minimum":1,"maximum":9007199254740991},"pdfUrl":{"description":"PropCode's copy of the council's PDF, opened at the page (#page=…). It stops working if PropCode removes that copy.","type":"string"},"libraryUrl":{"description":"The passage in PropCode's Library: the document at the version the report read, its file, and the place in it.","type":"string"},"contentUrl":{"description":"The cited passage’s text, from the version the report read: GET it with your key (GET /v1/citations/…), or give it to read_citation over MCP.","type":"string"}},"required":["n","document"]},"Citation":{"description":"The text a Rapid Planning Report citation points to, from the version the report read: the passage, or with includeParentSection, the section it is in.","type":"object","properties":{"object":{"const":"citation"},"document":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"jurisdiction":{"type":"string"}},"required":["id","name","jurisdiction"]},"version":{"description":"The document's version, e.g. 2026-07-01.","type":"string"},"file":{"description":"The document's file, by number, as the path names it.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passageId":{"description":"The passage, as the path names it (a text within an element reads as the element).","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"location":{"description":"Where the passage is in the document, by its headings, e.g. Part 4 › 4.3 Height of buildings.","type":"string"},"fileName":{"description":"For a document published as PDFs, the name of the PDF the passage is in. Left out for legislation.","type":"string"},"page":{"description":"The page of that PDF the passage starts on, counting from 1, where the document records it.","type":"integer","minimum":1,"maximum":9007199254740991},"pdfUrl":{"description":"PropCode's copy of the council's PDF, opened at the page (#page=…). It stops working if PropCode removes that copy.","type":"string"},"parentSection":{"description":"true: html and text are the passage's parent section, the passage in <mark>. false: they're the passage alone.","type":"boolean"},"html":{"description":"The text as HTML.","type":"string"},"text":{"description":"The same, plain: a line for each paragraph, list item or table row, with its number, e.g. (a).","type":"string"},"truncated":{"description":"The passage runs past 10,000 characters, so its text stops there: libraryUrl has the rest.","const":true},"libraryUrl":{"description":"The passage in PropCode's Library, at this version.","type":"string"}},"required":["object","document","version","file","passageId","parentSection","html","text","libraryUrl"]},"Rpr":{"description":"A property's Rapid Planning Report.","type":"object","properties":{"object":{"const":"rpr"},"id":{"description":"The report's id, for GET /v1/reports/rpr/{id}.","type":"string"},"property":{"type":"object","properties":{"title":{"type":"string"},"jurisdiction":{"type":"string"},"address":{"type":"string"}},"required":["title","jurisdiction","address"]},"reportType":{"enum":["multiple_land_uses","single_land_use","subdivision"]},"landUse":{"description":"The land use's name, for single_land_use.","type":"string"},"status":{"description":"generating: in progress, usually 2–5 minutes; read it again. ready: generated, with its sections. incomplete: generated with sections missing (missing lists them), and the ones it has. failed: not generated (error says why). For incomplete or failed, POST /v1/reports/rpr again generates it again, once a day at most.","enum":["generating","ready","incomplete","failed"]},"alreadyGenerated":{"description":"POST only. true: your team already had this report (one of each type, and one for each land use, per property), so this request generated nothing new. false: this request started generating it.","type":"boolean"},"createdAt":{"description":"When it was started (ISO 8601).","type":"string"},"reportUrl":{"description":"The report on PropCode.","type":"string"},"shareUrl":{"description":"The report's share link, as PropCode's Share copies it: anyone who has it can read the report, without signing in.","type":"string"},"outline":{"description":"Every section the report has, in order, once ready or incomplete.","type":"array","items":{"type":"object","properties":{"section":{"description":"Its number, for ?section=","type":"integer","minimum":1,"maximum":9007199254740991},"title":{"type":"string"},"characters":{"description":"Its HTML's length, for deciding what to read.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["section","title","characters"]}},"sections":{"description":"The report, once ready or incomplete: every section, or the one ?section= asked for, or none with ?section=none.","type":"array","items":{"$ref":"#/components/schemas/RprSection"}},"missing":{"description":"The sections that weren't generated, or came out cut short, when incomplete.","type":"array","items":{"type":"string"}},"error":{"description":"What went wrong, when incomplete or failed.","type":"string"}},"required":["object","id","property","reportType","status","createdAt","reportUrl","shareUrl"]},"UnlockedProperty":{"description":"A property your team has unlocked, with its Rapid Planning Reports.","type":"object","properties":{"object":{"const":"unlocked_property"},"property":{"type":"object","properties":{"title":{"type":"string"},"jurisdiction":{"type":"string"},"address":{"type":"string"}},"required":["title","jurisdiction","address"]},"products":{"description":"What your team holds it as: pro, core, or what a plan from before Core and Pro opened it with: cdc, cdc_preview (its CDC answers) or rpr.","type":"array","items":{"enum":["pro","core","cdc","cdc_preview","rpr"]}},"unlockedAt":{"description":"When your team last unlocked something new on it (ISO 8601): the latest of its products’ first unlocks.","type":"string"},"unlockedBy":{"description":"Who made that unlock: their email.","type":"string"},"shareUrl":{"description":"Its Pro report's share link, where your team holds Pro on it in NSW: anyone who has it can read the report, without signing in.","type":"string"},"rprs":{"description":"Its Rapid Planning Reports, newest first.","type":"array","items":{"description":"One of a property's Rapid Planning Reports.","type":"object","properties":{"id":{"description":"The report's id, for GET /v1/reports/rpr/{id}.","type":"string"},"reportType":{"enum":["multiple_land_uses","single_land_use","subdivision"]},"landUse":{"description":"The land use's name, for single_land_use.","type":"string"},"createdAt":{"description":"When it was first generated (ISO 8601).","type":"string"},"status":{"description":"generating, ready or failed. GET /v1/reports/rpr/{id} says whether a ready one is incomplete.","enum":["generating","ready","failed"]},"generatedAt":{"description":"When its latest generation finished (ISO 8601); absent while it generates, or when it failed.","type":"string"},"createdBy":{"description":"Who generated it: their email.","type":"string"},"shareUrl":{"description":"Its share link: anyone who has it can read the report, without signing in.","type":"string"}},"required":["id","reportType","createdAt","status","createdBy","shareUrl"]}}},"required":["object","property","products","unlockedAt","unlockedBy","rprs"]},"UnlockedPropertyList":{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/UnlockedProperty"}},"page":{"type":"number"},"limit":{"type":"number"},"total":{"description":"How many properties match, across every page.","type":"number"}},"required":["object","data","page","limit","total"]},"Feedback":{"type":"object","properties":{"object":{"const":"feedback"},"message":{"const":"Feedback logged."}},"required":["object","message"]},"ErrorType":{"description":"The kind of error. Each has one HTTP status.","enum":["invalid_request","authentication","billing","permission","not_found","ambiguous_address","invalid_fact_overrides","unsupported_jurisdiction","rate_limited","overloaded","internal"]},"Error":{"description":"Every error has this shape, whatever its status.","type":"object","properties":{"error":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/ErrorType"},"code":{"description":"What went wrong, e.g. spend_cap_reached. The errors page lists every code.","type":"string"},"message":{"description":"What went wrong, in a sentence.","type":"string"},"param":{"description":"The parameter at fault, when there is one.","type":"string"},"requestId":{"description":"The request's id, also sent as Request-Id. Quote it if you contact us.","type":"string"},"docUrl":{"description":"This error code's entry on the errors page.","type":"string"},"candidates":{"description":"ambiguous_address: the properties the address could be.","type":"array","items":{"$ref":"#/components/schemas/PropertyMatch"}},"sandboxTitles":{"description":"sandbox_title_only: the titles a test key may ask about.","type":"array","items":{"type":"string"}},"choices":{"description":"not_unlocked, no_credits and max_daily_limit, for your team's owner or an admin: what they can buy in PropCode, with links. A member gets none: the message says their team's admin buys.","type":"array","items":{"$ref":"#/components/schemas/PurchaseChoice"}}},"required":["type","code","message","requestId","docUrl"]}},"required":["error"]}}}}