Errors
Every error is JSON: { "error": { type, code, message, requestId, docUrl } }. The type sets the HTTP status; the code says exactly what went wrong, and its docUrl links to its row here. Quote the requestId if you contact us.
| Code | Status | What happened | What to do |
|---|---|---|---|
| invalid_parameter | 400 | A parameter is missing or not valid. param names it. | Correct that parameter. The reference lists each endpoint’s parameters. |
| invalid_request | 400 | The request couldn’t be read, for example a body that isn’t JSON. | Send JSON with Content-Type: application/json, as the reference shows. |
| key_in_url | 400 | An API key was sent in the URL, where logs and proxies can keep it. | Send keys only in the Authorization header. Revoke that key and make another. |
| invalid_address | 400 | The address can’t be searched, for example without a street number. | Send a full street address, or search by title. |
| not_eligible | 400 | The property's CDC report can't be unlocked with a CDC report credit yet: PropCode can't determine a fact its verdicts depend on. | Unlock it in PropCode, where you can enter the fact, or unlock it with creditType pro. |
| passage_too_broad | 400 | That passage is the whole document (its top level), which this endpoint doesn’t return. | Ask for a passage a report cites, by its contentUrl, or read the document in the Library. |
| missing_api_key | 401 | No API key was sent. | Send Authorization: Bearer pc_test_… or pc_live_… |
| invalid_api_key | 401 | The key is unknown or has been revoked. | Check the key, or make a new one in Integrations & API › Keys. |
| authentication | 401 | The request couldn’t be authenticated. message says why. | Send Authorization: Bearer with a key from Integrations & API › Keys. |
| billing_inactive | 402 | A live key was used while its organisation’s API billing isn’t active. | Add a card, or update it, in Integrations & API › Billing & limits. |
| spend_cap_reached | 402 | Checking a new property would pass the organisation’s monthly spend cap. Caps start at $0. | Raise the cap in Integrations & API › Billing & limits. Properties already checked this month still answer. |
| billing | 402 | Billing stops this request. message says why. | Check Integrations & API › Billing & limits. |
| no_credits | 402 | Unlocking the property needs a credit of the type you chose, and your team has none left. | GET /v1/credits lists what your team has. For Pro, an admin buys a single property or a Property Pack in PropCode, which can refill when it runs out: for them, choices lists both, with links. |
| max_daily_limit | 402 | Max's daily allowance is used up for today, and your team has no pack credits to fall back on. | Wait until dailyAllowance.resetsAt in GET /v1/credits (midnight in Sydney), adjust your Max seats for more each day, or have an admin buy a Property Pack. |
| not_unlocked | 403 | Your team hasn't unlocked this property as Pro. | POST /v1/unlocks with spendCredit: true unlocks it for one credit. With no credits, an admin of your team buys Pro in PropCode: for them, choices lists what they can buy, with links. The sample properties need no unlock for their Pro report. |
| key_owner_left | 403 | Unlocks and reports act as the person who made the key, and they have left your team. | Make a new key in Integrations & API. |
| account_not_set_up | 403 | You signed in to PropCode from an AI app, but your PropCode account isn't set up yet. | Open PropCode in your browser once, then connect again. |
| account_other_sign_in | 403 | You signed in from an AI app with an email that already has a PropCode account, which signs in another way, such as Google. | Disconnect PropCode in the AI app and connect again, signing in the way the message says. |
| account_email_unverified | 403 | You signed in from an AI app with an email address that isn't verified yet, and PropCode can't set up an account for this sign-in until it is. | Verify your email address with the link PropCode emailed you, then disconnect PropCode in the AI app and connect again. |
| live_key_required | 403 | Test keys can’t generate Rapid Planning Reports. | Make a live key in PropCode, under Integrations & API › Keys (anyone in your team can), unlock the property with it, then generate the report. |
| sandbox_title_only | 403 | A test key asked about a property outside the sample properties. sandboxTitles lists them. | Use one of the sample properties, whose Pro reports are free, or a live key: anyone in your team can make one in PropCode, under Integrations & API › Keys. With a live key, searches and property lookups are free, and a property’s Pro report and Rapid Planning Report need an unlock, which spends one of your team’s credits. |
| permission | 403 | This key can’t make that request. message says why. | Check which key you sent: test keys answer only for the sample properties. |
| title_not_found | 404 | No property has that title reference. | Check the title, or search by address with GET /v1/properties. |
| address_not_found | 404 | No property matches that address. | Check the address, or search by title. |
| not_found | 404 | There’s no endpoint at that path. | Check the path against the reference: every endpoint starts /api/v1/. |
| citation_not_found | 404 | The Library has no passage at that document, version, file and passage id. | Use a citation’s contentUrl as a report gives it. A report generated again may cite a newer version. |
| ambiguous_address | 409 | The address matches more than one property. candidates lists them. | Ask again by title, using one of the candidates. |
| invalid_fact_overrides | 422 | A fact in factOverrides is unknown, can’t be overridden (where the property is: its zone, LEP or maps), or its value is the wrong kind. | GET /v1/facts lists the facts and the values each takes. |
| unsupported_jurisdiction | 422 | That state isn’t covered yet. | Use nsw, vic, act or tas. Complying development (the planning report, codes and summaries) is nsw only. |
| rate_limited | 429 | The organisation’s keys sent more requests a second than its limit. | Wait the Retry-After seconds, then retry. Billing & limits shows the limits. |
| feedback_limit_reached | 429 | The organisation has sent its most feedback for the day. | Retry when Retry-After says. It resets at midnight UTC. |
| too_many_concurrent | 429 | The organisation already has its most properties being worked out at once: Pro reports, or summaries. | Wait for a request to finish, then retry. |
| daily_property_limit | 429 | The organisation has checked, or looked up, its most new properties for the day. | Retry after midnight UTC (Retry-After says when). Properties already checked or looked up in the period still answer. |
| daily_search_limit | 429 | Address searches are used up for the day: the organisation’s live keys have made their most, or the allowance all organisations share is spent. | Retry when Retry-After says, or search by point or ask by title, which aren’t limited this way. |
| daily_citation_limit | 429 | The organisation’s live keys have read their most different cited passages for the day. | Retry when Retry-After says. Passages already read today still answer. Contact us if you need more. |
| amalgamation_limit | 429 | New multi-lot titles are used up for the hour: the organisation’s live keys have made their most, or all organisations’ together have. | Retry when Retry-After says, or ask for titles that already exist. |
| sandbox_daily_limit | 429 | The organisation’s test keys have used their requests for the day. | Retry after midnight UTC, or use a live key. |
| unlock_failed | 500 | Your credit was spent, but unlocking the property didn’t finish. | Contact us with the requestId: we’ll finish the unlock or return the credit. |
| internal_error | 500 | Something went wrong on our side. | Retry. If it keeps happening, contact us with the requestId. |
| account_setup_failed | 503 | PropCode couldn't finish making your account at your first sign-in from an AI app. | Try again in a minute. |
| overloaded | 503 | PropCode is busy. | Retry in a few seconds. |
| engine_busy | 503 | PropCode is busy. | Wait the Retry-After seconds, then retry. |
