API Reference - Entity Monitoring
Entity Monitoring endpoint. The Business API suite exposes registration, lodgement, lookup and related functions that can be used for a variety of purposes. For the latest release information please check our release notes.
- General Overview
- Announcements
- Authentication
- Webhooks
- Endpoints Summary
- Expected Outcomes
- Onboarding Requirements
- Known Limitations
- Teams
Entity Monitoring
-
Production
/api/v2/monitoring/entities -
Sandbox
/api/test/v2/monitoring/entities -
MethodsPOST , GET , DELETE
-
Data SourcesASIC company register, Australian Business Register, published insolvency notices, PPSR
-
Watch Australian companies (by ACN) and ABN holders for changes on the public registers. We send you a webhook when we detect a change, and you can read every event back through the API. Each entity is monitored for a prepaid 12-month term at $18.00 per entity (GST inclusive) on the Standard and Pro plans, less your plan's volume discount. Enterprise accounts pay the same as Pro, with Pro's discount bands based on your own lodgement count. See Pricing. Live monitoring needs card billing; test keys work on every account at no charge.
What Is Monitored
- Active entities are checked against ASIC and the ABR every day. Deregistered companies and cancelled ABNs are checked weekly, so a reinstatement is still picked up.
- Changes we find are sent once detected: newly lodged ASIC documents, name, address, status and entity type changes, GST registration changes, and business names added or removed.
- Published insolvency notices and PPSR registration changes apply to companies only (entities with an ACN), not to ABN-only holders. PPSR alerts are included where available. If ASIC reissues an insolvency notice, it arrives as a second
insolvency_noticeevent. - We do not promise a delivery window, or that every change will be detected. A webhook tells you that something changed (for example, that a Form 484 was lodged). Check the official register before you act on it.
- Business names are the entity's current list. When a name is removed we can't tell whether it lapsed or was cancelled, and business name renewals are not reported.
- A company deregistered (or an ABN cancelled) during its term sends a
status_changeevent. The term keeps running and is not extended or refunded.
Endpoints
All endpoints need a secret key (sk). Use /api/v2 with a live key and /api/test/v2 with a test key. Every id belongs to one account and one environment: a live key never sees sandbox entities, and anything that isn't yours returns 404 not_found. All API requests share a global limit of 60 requests a minute per account or IP address; over it you get 429.
| Method | Path | Purpose |
|---|---|---|
| POST | /monitoring/entities | Start monitoring entities, up to 25 per request (send more requests for more). Charged |
| POST | /monitoring/entities/renew | Renew entities by id, up to 25 per request. Charged. Idempotency-Key required |
| POST | /monitoring/entities/{id}/resume | Resume a stopped entity whose paid term is still running. Free |
| GET | /monitoring/entities | List your entities. Filters: status, acn, abn, expiresBefore (YYYY-MM-DD), perPage (max 100), page |
| GET | /monitoring/entities/{id} | One entity |
| DELETE | /monitoring/entities/{id} | Stop early. Safe to repeat |
| GET | /monitoring/entities/{id}/events | That entity's events, newest first |
| GET | /monitoring/events | All your events, oldest first. Filter with since |
| GET | /monitoring/events/{id} | One event in full |
| POST | /monitoring/entities/{id}/simulate | Sandbox only. Fire a test webhook |
Reads and stop work on any account that has entities, even after your card expires or you move off card billing. The exception is Sandbox (Free) accounts, which can only use test keys. Ordering, renewing and resuming need card billing for live keys.
Start Monitoring
Send acn, abn or both for each entity, and an optional reference of your own (up to 100 characters). Send an Idempotency-Key header (up to 255 characters) so a retried request never charges twice.
Idempotency-Key: 6f1c2a4e-order-42
{
"entities": [
{ "acn": "004085616", "reference": "acme" },
{ "abn": "51824753556" }
]
}
- Companies are always keyed on their ACN. An ABN that belongs to a company is stored against that company, and the response shows both numbers. If you send both, the ABR must confirm the ABN belongs to that ACN.
- Accepted: registered companies (including strike-off action in progress and external administration) and active ABNs of any entity type. ARBNs are not accepted.
- The whole request is checked before anything is charged. One bad row rejects the request with per-row errors and nothing is charged. If ASIC or the ABR can't confirm an entity right now, you get
503 registry_unavailablewithRetry-After. - The order is one card charge for the whole batch:
totalisunitPricetimes the number of entities, in cents. - Each live order checks every identifier with ASIC or the ABR, and those checks count toward your account's monitoring lookup rate limit. This is separate from the ACN and ABN lookup endpoints' limit. Standard accounts without other recent paid orders get 60 registry lookups a minute for monitoring orders (Pro 600; Enterprise and invoice billing are not capped). Each entity in an order uses one or two lookups (two for a row with both numbers, or an ABN that belongs to a company), so large batches may need to be split or retried after a
429 lookup_rate_limited(seeRetry-After). Monitoring orders don't count as other paid orders. - Each request can carry up to 25 entities, and each account can have up to 1,000 active live entities by default. Contact us if you need more.
201 Created
{
"unitPrice": 1800,
"total": 3600,
"entities": [
{
"id": 551,
"acn": "004085616",
"abn": "53004085616",
"entityName": "EXAMPLE PTY LTD",
"reference": "acme",
"status": "active",
"monitoringStatus": "pending",
"startsAt": "2026-10-12",
"expiresAt": "2027-10-12",
"daysRemaining": 365,
"lastEventAt": null,
"entityStatus": "unknown",
"entityType": null,
"gstRegistered": null,
"gstDate": null,
"businessNames": []
},
{
"id": 552,
"acn": null,
"abn": "51824753556",
"entityName": "JANE CITIZEN",
"reference": null,
"status": "active",
"monitoringStatus": "pending",
"startsAt": "2026-10-12",
"expiresAt": "2027-10-12",
"daysRemaining": 365,
"lastEventAt": null,
"entityStatus": "unknown",
"entityType": null,
"gstRegistered": null,
"gstDate": null,
"businessNames": []
}
]
}
A 202 Accepted response (same body plus "status": "processing") means payment went through or may have, and activation is finishing. Retry with the same Idempotency-Key to get the final answer; you are never charged twice for it.
422 Unprocessable Content (row errors)
{
"error": "validation_failed",
"message": "One or more rows can't be accepted. Nothing was charged.",
"errors": {
"entities.0": [
{
"code": "already_monitored",
"message": "Already monitored as entity 551. Renew it with POST /monitoring/entities/renew.",
"entityId": 551
}
]
}
}
Entity Object
Every entity response, list item and webhook carries the same entity object.
{
"id": 551,
"acn": "004085616",
"abn": "53004085616",
"entityName": "EXAMPLE PTY LTD",
"reference": "acme",
"status": "active",
"monitoringStatus": "active",
"startsAt": "2026-10-12",
"expiresAt": "2027-10-12",
"daysRemaining": 365,
"lastEventAt": "2026-10-12T22:34:24+10:00",
"entityStatus": "registered",
"entityType": "Australian proprietary company",
"gstRegistered": true,
"gstDate": "2015-07-01",
"businessNames": [
"EXAMPLE TRADING"
]
}
The list endpoint returns data (entity objects) and meta (currentPage, perPage, total, lastPage).
status- stringprocessing(payment taken or being taken, activation finishing),active,stoppedorexpired. The list'sstatusfilter takes the same values.
monitoringStatus- stringpending(being set up),active(being checked),degraded(setup failed and is being retried; we are aware of it) orinactive(not checked because the entity is stopped or expired).
startsAt,expiresAt- string, YYYY-MM-DD- Australia/Brisbane calendar dates.
expiresAtis the first day that is not covered:2027-10-12means monitored through the end of 11 October 2027.
daysRemaining- integer- Days until
expiresAtwhile the entity is active, otherwise 0.
lastEventAt- string or null, ISO 8601- When we last detected a change for this entity, null until the first one since your first paid term began (always null in the sandbox). Null while the entity is not active. It is not a check timestamp; a quiet company can go months without a change.
entityStatus- string- The entity's register status:
registered,deregistered,cancelled,external_administration,strike_off_proposedorunknown. A company's ASIC status wins over its ABN status.unknownuntil the first check completes, and while the entity is not active.
entityType- string or null- A readable entity type, for example
Australian proprietary company. A type we don't recognise is returned as the register's own code.
gstRegistered- boolean or null,gstDate- string or null, YYYY-MM-DD- Whether a current GST registration exists, and its date. Null when not known.
businessNames- array of strings- The entity's current business names,
[]when none or not yet known.
Register details (entityStatus, entityType, gstRegistered, gstDate, businessNames) are only shown while the entity is active. A stopped, expired or processing entity returns unknown, null and [].
- If a company you monitor by ACN gets an ABN later,
abnis filled in.entityNamefollows the register when the name changes. - In rare cases we find that an ABN entity and an ACN entity on your account are the same company. We merge them into the ACN entity and add the ABN entity's remaining paid days to it (up to 2 years ahead). The ABN entity's id returns
404after that, so re-read your list if a stored id starts returning 404.
Renew, Stop and Resume
Monitoring does not renew automatically. Renew through the API before expiresAt to keep receiving changes.
Idempotency-Key: renew-2026-10
{ "ids": [551, 552] }
- The Idempotency-Key header is required here (
400 idempotency_key_requiredwithout it), so a timed-out retry never buys a second year. - An active entity's new term starts when its current one ends. An expired entity's new term starts today. The response has the same shape as an order (
unitPrice,total,entities). - Expiry can't be more than 2 years ahead (
renewal_too_far_ahead). A company deregistered or an ABN cancelled since its last term can't be renewed. A stopped entity with paid time left is resumed, not renewed (stopped_with_time_remaining). - Renewals use the same monitoring lookup rate limit as new orders.
- If any id isn't one of your entities in this environment, the whole renewal returns a top-level
404 not_foundand nothing is charged.
Stops webhooks for the entity straight away and returns the entity with status: stopped. Your paid term keeps running, so you can resume free until it ends; stopped time is not added back. Stopping an entity that is already stopped or expired returns it unchanged. While an order or renewal for the entity is still being processed you get 409 order_processing; try again in a few minutes.
Free while paid time is left, and returns the entity. Changes that happened while it was stopped are not sent. An entity that is already active is returned unchanged. A stopped entity whose term has ended returns 422 not_resumable: renew it instead. Resume checks the entity with ASIC or the ABR again, which counts toward your monitoring lookup rate limit. A company deregistered since it was stopped returns a top-level 422 acn_not_eligible, and a cancelled ABN 422 abn_not_active (not keyed by row).
Events
Every change we send you is stored as an event. List endpoints return the summary form; GET /monitoring/events/{id} returns the full event.
{
"data": [
{
"monitoringEventId": 9123,
"entityId": 551,
"eventType": "document_lodged",
"title": "Form 484 lodged",
"detectedAt": "2026-10-12T22:34:24+10:00",
"simulated": false
}
],
"meta": {
"currentPage": 1,
"perPage": 25,
"total": 1,
"lastPage": 1
}
}
since is either an event id (returns events after it) or an ISO 8601 date-time (returns events detected at or after it). Store the last monitoringEventId you processed and use it to catch up after your webhook endpoint was down. perPage goes up to 100.
{
"monitoringEventId": 9124,
"entityId": 551,
"eventType": "address_change",
"title": "Address changed",
"detectedAt": "2026-10-12T22:34:24+10:00",
"simulated": false,
"description": "Registered office address changed",
"effectiveDate": "2026-10-12",
"source": "asic",
"metadata": {
"field": "Registered office address",
"oldValue": "1 OLD ST, SYDNEY NSW 2000",
"newValue": "LEVEL 2 10 NEW ST, MELBOURNE VIC 3000"
},
"entity": {
"id": 551,
"acn": "004085616",
"abn": "53004085616",
"entityName": "EXAMPLE PTY LTD",
"reference": "acme",
"status": "active",
"monitoringStatus": "active",
"startsAt": "2026-10-12",
"expiresAt": "2027-10-12",
"daysRemaining": 365,
"lastEventAt": "2026-10-12T22:34:24+10:00",
"entityStatus": "registered",
"entityType": "Australian proprietary company",
"gstRegistered": true,
"gstDate": "2015-07-01",
"businessNames": [
"EXAMPLE TRADING"
]
}
}
eventType- stringdocument_lodged,name_change,address_change,status_change,type_change,gst_change,business_name_added,business_name_removed,insolvency_notice,ppsr_registrationorother_change. Treat any value you don't recognise asother_change.
source- stringasic,abr,insolvencyorppsr, or null when the provider gives a source we don't recognise.
effectiveDate- string or null, YYYY-MM-DD- The date the register gives for the change, when it gives one.
metadata- object- Only the keys that apply are present, and it can be empty (
{}):field,oldValue,newValue: the field that changed and its readable before and after values (status, type and class codes become words, addresses become one line).documentType(ASIC form code, for example484),documentNumber,documentDescription: fordocument_lodged.businessName: for business name events.previousName: for name changes.noticeUrlandappointmentDate(YYYY-MM-DD): for insolvency notices.gstCancelled(alwaystruewhen present): for agst_changeevent that is a GST cancellation.
Webhooks
Subscribe your webhook endpoints to monitoring.change_detected, monitoring.expiring and monitoring.expired. Live entities send to subscribed endpoints on your live API keys; sandbox entities send only to endpoints on test keys. Signing and retries work as described on the Webhooks page.
monitoring.change_detected: one per change. FetchGET /monitoring/events/{monitoringEventId}for the description and metadata.monitoring.expiring: 30 and 7 days before an active entity's term ends, with the realdaysRemaining. For live entities we also email the account owner. No warning is sent for a deregistered company or cancelled ABN, or to a locked account.monitoring.expired: when an active entity's term ends. A stopped entity reaching its end date sends nothing.- Deliveries can arrive more than once or out of order. Use
monitoringEventId(ordeliveryId) to avoid processing one twice.
monitoring.change_detected
{
"event": "monitoring.change_detected",
"monitoringEventId": 9123,
"eventType": "document_lodged",
"title": "Form 484 lodged",
"detectedAt": "2026-10-12T22:34:24+10:00",
"entity": {
"id": 551,
"acn": "004085616",
"abn": "53004085616",
"entityName": "EXAMPLE PTY LTD",
"reference": "acme",
"status": "active",
"monitoringStatus": "active",
"startsAt": "2026-10-12",
"expiresAt": "2027-10-12",
"daysRemaining": 365,
"lastEventAt": "2026-10-12T22:34:24+10:00",
"entityStatus": "registered",
"entityType": "Australian proprietary company",
"gstRegistered": true,
"gstDate": "2015-07-01",
"businessNames": [
"EXAMPLE TRADING"
]
},
"timestamp": "2026-10-12T22:34:24+10:00",
"deliveryId": "wd_1"
}
monitoring.expiring
{
"event": "monitoring.expiring",
"entity": { "id": 551, "acn": "004085616", "status": "active", "expiresAt": "2027-10-12", "daysRemaining": 30, ... },
"daysRemaining": 30,
"timestamp": "2027-09-12T00:15:02+10:00",
"deliveryId": "wd_2"
}
monitoring.expired has the same shape without daysRemaining. Simulated deliveries from the sandbox also carry "simulated": true. A simulated expiring_30 or expiring_7 sets the top-level daysRemaining to 30 or 7, while entity.daysRemaining stays the entity's real value:
{
"event": "monitoring.expiring",
"entity": { "id": 551, "status": "active", "expiresAt": "2027-10-12", "daysRemaining": 365, ... },
"daysRemaining": 30,
"simulated": true,
"timestamp": "2026-10-12T10:15:02+10:00",
"deliveryId": "wd_3"
}
Sandbox
Test keys get the same validation and responses at no charge (unitPrice is 0). Registry checks use cached or snapshot data, and an identifier we have no record of is accepted on its checksum. An ACN and ABN sent together are only rejected when our cached data shows the ABN belongs to a different ACN; otherwise the pair is not confirmed with the ABR. Sandbox entities are active straight away and are never really monitored, so entityStatus stays unknown unless you simulate a deregistration. As with live entities, a stopped or expired sandbox entity shows unknown even after a simulated deregistration. Each account can hold up to 1,000 sandbox entities (422 test_entity_limit past that); renew or reuse existing ones instead of ordering new ones. Use simulate to receive test webhooks:
// A change event of any eventType: returns the event (201)
{ "eventType": "document_lodged" }
// A lifecycle webhook: expiring_30, expiring_7 or expired (200)
// Returns { "simulated": "expiring_30", "entity": { ... } }
{ "simulate": "expiring_30" }
// Deregister the test company (or cancel a test ABN): status_change event,
// entityStatus stays deregistered (cancelled) from then on, and renew or
// resume is refused as it would be live (200)
// Returns { "simulated": "deregistered", "entity": { ... }, "event": { ... } }
{ "simulate": "deregistered" }
Simulated events show "simulated": true and appear in the sandbox events list. Simulate is not available on live keys (404). It follows the same rules as live: change events (including deregistered) need an active entity (409 entity_not_active), expiry warnings need an active entity that isn't a deregistered company or cancelled ABN (409 expiry_warning_not_sent), and an entity that has already expired can't send expired again (409 already_expired).
Errors
Monitoring errors return error (a code) and message. Row errors come back as validation_failed with errors keyed by row (entities.0, ids.1) and a 422. A malformed body or query (for example, more than 25 entities, a missing entities array or a perPage over 100) is also a 422 validation_failed, with errors keyed by field. Nothing is charged when any of these is returned. Errors from authentication, the API key checks and the global rate limit happen before monitoring runs and use the shared API shape instead, {"errors": ["..."]}.
| Status | Code | Meaning |
|---|---|---|
| 422 (row) | identifier_required, invalid_acn, invalid_abn | Missing identifier, or the number fails its checksum |
| 422 (row) | acn_not_found, acn_not_eligible, arbn_not_supported | No such ACN, a company status we don't accept, or an ARBN |
| 422 (row) | abn_not_found, abn_not_active, abn_acn_mismatch | No such ABN, a cancelled ABN, or an ABN that doesn't belong to the ACN sent |
| 422 (row) | duplicate_in_request | Two rows are the same entity |
| 422 (row) | already_monitored | You already monitor it (see entityId). Renew it instead |
| 422 (row) | stopped_with_time_remaining | It's stopped with paid time left. Resume it instead |
| 422 (row) | renewal_in_progress, renewal_too_far_ahead | An order for it is still processing, or the renewal would pass the 2-year limit |
| 422 | entity_limit | The order would pass your active entity limit (body includes limit and active) |
| 422 | not_resumable | Only a stopped entity with paid time left can be resumed |
| 422 | acn_not_eligible, abn_not_active | Resume of a company deregistered, or an ABN cancelled, since it was stopped |
| 422 | test_entity_limit | Sandbox only: the order would pass 1,000 sandbox entities (body includes limit and current) |
| 400 | idempotency_key_required, idempotency_key_invalid | Renew without an Idempotency-Key, or a key over 255 characters |
| 402 | payment_method_required, payment_method_expired | Live orders, renewals and resumes need a valid card on file. Add or update your card in the dashboard |
| 402 | payment_failed | The card charge failed. Nothing was created or charged |
| 403 | card_billing_required | Live orders, renewals and resumes need card billing |
| 403 | monitoring_unavailable | Entity monitoring isn't available on your account yet |
| 403 | sandbox_only | Sandbox accounts can only use test keys (returned on any live request, including the card check on live POSTs) |
| 404 | not_found | No such entity or event on your account in this environment |
| 409 | order_in_progress | Another order on your account is being processed. Retry shortly |
| 409 | order_processing | Stop was refused while the entity's order or renewal is processing |
| 409 | entity_not_active, expiry_warning_not_sent, already_expired | Sandbox simulate asked for something live would never send for this entity |
| 409 | request_in_progress, idempotency_key_reused | The same key is still running, or was used for a different request body |
| 429 | lookup_rate_limited | Too many registry lookups. Wait for Retry-After or send fewer entities |
| 503 | registry_unavailable, payment_unavailable | ASIC, the ABR or our payment provider couldn't be reached. Retry after Retry-After |
Terms
- Entity monitoring is a notification tool. It is not part of an AML/CTF program and is not compliance advice.
- Use it only for a lawful business purpose, such as client or supplier due diligence, credit management or counterparty risk. Monitoring a sole trader means handling personal information under the Privacy Act. Using it to harass or track an individual is not allowed.
- No refund for change of mind, for stopping early, or for an entity deregistered, cancelled or merged during its term. This does not limit your rights under the Australian Consumer Law. If an entity was not monitored because of a fault on our side, we extend its term by the affected period.
- The full terms are in the Entity Monitoring section of our Terms of Service.