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.

Entity Monitoring

Endpoint Overview
  • Production
    /api/v2/monitoring/entities
  • Sandbox
    /api/test/v2/monitoring/entities
  • Methods
    POST , GET , DELETE
  • Data Sources
    ASIC 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_notice event.
  • 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_change event. 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/entitiesStart monitoring entities, up to 25 per request (send more requests for more). Charged
POST/monitoring/entities/renewRenew entities by id, up to 25 per request. Charged. Idempotency-Key required
POST/monitoring/entities/{id}/resumeResume a stopped entity whose paid term is still running. Free
GET/monitoring/entitiesList 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}/eventsThat entity's events, newest first
GET/monitoring/eventsAll your events, oldest first. Filter with since
GET/monitoring/events/{id}One event in full
POST/monitoring/entities/{id}/simulateSandbox 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.

/api/v2/monitoring/entities
POST
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_unavailable with Retry-After.
  • The order is one card charge for the whole batch: total is unitPrice times 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 (see Retry-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.

/api/v2/monitoring/entities/{id}
GET
{
    "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 - string
processing (payment taken or being taken, activation finishing), active, stopped or expired. The list's status filter takes the same values.
monitoringStatus - string
pending (being set up), active (being checked), degraded (setup failed and is being retried; we are aware of it) or inactive (not checked because the entity is stopped or expired).
startsAt, expiresAt - string, YYYY-MM-DD
Australia/Brisbane calendar dates. expiresAt is the first day that is not covered: 2027-10-12 means monitored through the end of 11 October 2027.
daysRemaining - integer
Days until expiresAt while 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_proposed or unknown. A company's ASIC status wins over its ABN status. unknown until 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, abn is filled in. entityName follows 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 404 after 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.

/api/v2/monitoring/entities/renew
POST
Idempotency-Key: renew-2026-10

{ "ids": [551, 552] }
  • The Idempotency-Key header is required here (400 idempotency_key_required without 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_found and nothing is charged.
/api/v2/monitoring/entities/{id}
DELETE

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.

/api/v2/monitoring/entities/{id}/resume
POST

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.

/api/v2/monitoring/events?since=9122
GET
{
    "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.

/api/v2/monitoring/events/{id}
GET
{
    "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 - string
document_lodged, name_change, address_change, status_change, type_change, gst_change, business_name_added, business_name_removed, insolvency_notice, ppsr_registration or other_change. Treat any value you don't recognise as other_change.
source - string
asic, abr, insolvency or ppsr, 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 example 484), documentNumber, documentDescription: for document_lodged.
  • businessName: for business name events.
  • previousName: for name changes.
  • noticeUrl and appointmentDate (YYYY-MM-DD): for insolvency notices.
  • gstCancelled (always true when present): for a gst_change event 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. Fetch GET /monitoring/events/{monitoringEventId} for the description and metadata.
  • monitoring.expiring: 30 and 7 days before an active entity's term ends, with the real daysRemaining. 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 (or deliveryId) 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:

/api/test/v2/monitoring/entities/{id}/simulate
POST
// 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_abnMissing identifier, or the number fails its checksum
422 (row)acn_not_found, acn_not_eligible, arbn_not_supportedNo such ACN, a company status we don't accept, or an ARBN
422 (row)abn_not_found, abn_not_active, abn_acn_mismatchNo such ABN, a cancelled ABN, or an ABN that doesn't belong to the ACN sent
422 (row)duplicate_in_requestTwo rows are the same entity
422 (row)already_monitoredYou already monitor it (see entityId). Renew it instead
422 (row)stopped_with_time_remainingIt's stopped with paid time left. Resume it instead
422 (row)renewal_in_progress, renewal_too_far_aheadAn order for it is still processing, or the renewal would pass the 2-year limit
422entity_limitThe order would pass your active entity limit (body includes limit and active)
422not_resumableOnly a stopped entity with paid time left can be resumed
422acn_not_eligible, abn_not_activeResume of a company deregistered, or an ABN cancelled, since it was stopped
422test_entity_limitSandbox only: the order would pass 1,000 sandbox entities (body includes limit and current)
400idempotency_key_required, idempotency_key_invalidRenew without an Idempotency-Key, or a key over 255 characters
402payment_method_required, payment_method_expiredLive orders, renewals and resumes need a valid card on file. Add or update your card in the dashboard
402payment_failedThe card charge failed. Nothing was created or charged
403card_billing_requiredLive orders, renewals and resumes need card billing
403monitoring_unavailableEntity monitoring isn't available on your account yet
403sandbox_onlySandbox accounts can only use test keys (returned on any live request, including the card check on live POSTs)
404not_foundNo such entity or event on your account in this environment
409order_in_progressAnother order on your account is being processed. Retry shortly
409order_processingStop was refused while the entity's order or renewal is processing
409entity_not_active, expiry_warning_not_sent, already_expiredSandbox simulate asked for something live would never send for this entity
409request_in_progress, idempotency_key_reusedThe same key is still running, or was used for a different request body
429lookup_rate_limitedToo many registry lookups. Wait for Retry-After or send fewer entities
503registry_unavailable, payment_unavailableASIC, 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.