API DOCUMENTATION

REST API Reference

Account info, subscription status, identifier validation, and full read/write access to your monitored entities.

Base URL: https://monitorhq.com.au Download Postman collection OpenAPI spec

Authentication

Every request must include an Authorization header with a personal access token: Bearer {YOUR_AUTH_TOKEN}.

  1. Log in and go to Team Settings → API Tokens
  2. Create a token with the abilities you need (read, create, update, delete)
  3. Copy it immediately - it's only ever shown once

API access is scoped to your team's active subscription and rate-limited per token.

Account

APIs for account information

Get account information

Get detailed information about the authenticated user's account including team membership.

GET /api/v1/account requires authentication
curl --request GET \
    "https://monitorhq.com.au/api/v1/account" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json"
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/account", {
    method: "GET",
    headers,
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->get('https://monitorhq.com.au/api/v1/account');
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.get("https://monitorhq.com.au/api/v1/account", headers=headers)

Example response (200)

{
  "name": "John Doe",
  "email": "admin@example.com",
  "account_type": "admin",
  "current_team": {
    "name": "John's Team",
    "personal_team": true,
    "is_parent_team": true
  },
  "owned_teams": [
    {
      "name": "John's Team",
      "personal_team": true,
      "is_parent_team": true
    }
  ],
  "member_of_teams": [
    {
      "id": 2,
      "name": "Another Team",
      "role": "editor"
    }
  ]
}

Subscription

APIs for subscription status and usage

Get subscription status

Get the current team's subscription status and usage information.

GET /api/v1/subscription requires authentication
curl --request GET \
    "https://monitorhq.com.au/api/v1/subscription" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json"
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/subscription", {
    method: "GET",
    headers,
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->get('https://monitorhq.com.au/api/v1/subscription');
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.get("https://monitorhq.com.au/api/v1/subscription", headers=headers)

Example response (200)

{
  "has_subscription": true,
  "subscription": {
    "plan": "Professional",
    "status": "active",
    "subscribed_at": "2026-01-15 10:00:00",
    "expires_at": "2026-02-15 10:00:00",
    "max_entities": 50,
    "max_high_risk_entities": 10
  },
  "usage": {
    "total": 25,
    "high": 5,
    "standard": 15,
    "low": 5
  },
  "remaining": {
    "slots": 25,
    "high_risk_slots": 5
  }
}

Returns {"has_subscription": false, "message": "No active subscription found"} when the team has no subscription.

Identifier Validation

APIs for validating and formatting ACN/ABN identifiers

Check identifier

Validate and format an ACN or ABN identifier. This endpoint determines the type of identifier and formats it correctly.

POST /api/v1/identifier/check requires authentication

Body Parameters

identifier string
The ACN or ABN to validate.
curl --request POST \
    "https://monitorhq.com.au/api/v1/identifier/check" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --data '{
    "identifier": "123456789"
}'
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/identifier/check", {
    method: "POST",
    headers,
    body: JSON.stringify({
        "identifier": "123456789"
}),
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->post('https://monitorhq.com.au/api/v1/identifier/check', [
            'identifier' => '123456789',
        ]);
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.post(
    "https://monitorhq.com.au/api/v1/identifier/check",
    headers=headers,
    json={
        "identifier": "123456789"
}
)

Example response (200)

{
  "valid": true,
  "type": "acn",
  "formatted": "123 456 789",
  "number": "123456789"
}

Returns 422 with {"valid": false, "message": "...", "errors": [...]} when neither a valid ACN nor ABN.

Monitoring

APIs for managing monitored entities

List monitorings

Get a list of all monitorings for the current team. By default, only active monitorings are returned. last_checked_at and consecutive_failures cover the entity's checks across ASIC and the ABR; the acn_ and abn_ prefixed fields report each register separately, so a failing ASIC check is visible even while ABR checks succeed. A stopped monitoring returns null for last_checked_at, consecutive_failures, entity_state and the four per-register fields. If an ABN-only monitoring is merged into the company's ACN monitoring and your team watched both, the duplicate uuid is retired and returns 404 monitoring_not_found; look the entity up again with the acn filter to get the uuid that was kept.

GET /api/v1/monitorings requires authentication

Query Parameters

page integer (optional)
Page number for pagination.
per_page integer (optional)
Number of items per page.
risk_level string (optional)
Filter by risk level (high, standard, low).
is_active boolean (optional)
Filter by active status (default: true). Set to false to see stopped monitorings.
acn string (optional)
Filter to the team's monitoring of this exact ACN, if any.
abn string (optional)
Filter to the team's monitoring of this exact ABN, if any.
curl --request GET \
    "https://monitorhq.com.au/api/v1/monitorings?page=1&per_page=15&risk_level=high&is_active=true&acn=123456789&abn=12345678901" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json"
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/monitorings?page=1&per_page=15&risk_level=high&is_active=true&acn=123456789&abn=12345678901", {
    method: "GET",
    headers,
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->get('https://monitorhq.com.au/api/v1/monitorings?page=1&per_page=15&risk_level=high&is_active=true&acn=123456789&abn=12345678901');
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.get("https://monitorhq.com.au/api/v1/monitorings?page=1&per_page=15&risk_level=high&is_active=true&acn=123456789&abn=12345678901", headers=headers)

Example response (200)

{
  "data": [
    {
      "uuid": "123e4567-e89b-12d3-a456-426614174000",
      "entity_name": "Example Pty Ltd",
      "entity_type": "company",
      "acn": "123456789",
      "abn": "12345678901",
      "risk_level": "high",
      "added_at": "2026-01-15T10:00:00Z",
      "last_checked_at": "2026-01-16T03:12:00+00:00",
      "consecutive_failures": 0,
      "acn_last_checked_at": "2026-01-16T03:12:00+00:00",
      "abn_last_checked_at": "2026-01-14T22:05:00+00:00",
      "acn_consecutive_failures": 0,
      "abn_consecutive_failures": 0,
      "entity_state": {
        "entity_type": "PRV",
        "acn_status": "REGD",
        "abn_status": "Active",
        "gst_registered": true,
        "gst_date": "2020-01-15",
        "business_names": [],
        "is_terminal": false
      }
    }
  ],
  "links": {
    "first": "https://monitorhq.com.au/api/v1/monitorings?page=1",
    "last": null,
    "prev": null,
    "next": "https://monitorhq.com.au/api/v1/monitorings?page=2"
  },
  "meta": {
    "current_page": 1,
    "current_page_url": "https://monitorhq.com.au/api/v1/monitorings?page=1",
    "from": 1,
    "path": "https://monitorhq.com.au/api/v1/monitorings",
    "per_page": 15,
    "to": 1
  }
}

Add monitoring

Add an entity to your monitoring list. The entity will be fetched and monitored automatically. Either acn or abn is required.

POST /api/v1/monitorings requires authentication

Body Parameters

acn string (optional)
The ACN number (9 digits).
abn string (optional)
The ABN number (11 digits).
risk_level string
The risk level (high, standard, low).
curl --request POST \
    "https://monitorhq.com.au/api/v1/monitorings" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --data '{
    "acn": "123456789",
    "abn": "12345678901",
    "risk_level": "high"
}'
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/monitorings", {
    method: "POST",
    headers,
    body: JSON.stringify({
        "acn": "123456789",
        "abn": "12345678901",
        "risk_level": "high"
}),
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->post('https://monitorhq.com.au/api/v1/monitorings', [
            'acn' => '123456789',
            'abn' => '12345678901',
            'risk_level' => 'high',
        ]);
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.post(
    "https://monitorhq.com.au/api/v1/monitorings",
    headers=headers,
    json={
        "acn": "123456789",
        "abn": "12345678901",
        "risk_level": "high"
}
)

Example response (201)

{
  "message": "Monitoring added successfully",
  "data": {
    "uuid": "123e4567-e89b-12d3-a456-426614174000",
    "entity_name": "Example Pty Ltd",
    "entity_type": "APTY",
    "acn": "123456789",
    "abn": "12345678901",
    "risk_level": "high",
    "added_at": "2026-01-15T10:00:00Z"
  }
}

Returns 422 with {"message": "...", "code": "already_monitored", "uuid": "..."} when your team already monitors this entity, or {"message": "...", "code": "capacity_exceeded"} when your plan limit is reached. Adding an entity your team previously stopped restarts it and returns 201 with the same uuid.

Bulk add monitorings

Add up to 100 entities to your monitoring list in a single request. Available only on plans with bulk import enabled. Each entity is processed independently - one duplicate, invalid, or over-capacity row does not prevent the others in the same request from being added.

POST /api/v1/monitorings/bulk requires authentication

Body Parameters

entities array
The entities to add (max 100, min 1).
entities.*.acn string (optional)
The ACN number (9 digits). Either acn or abn is required per entity.
entities.*.abn string (optional)
The ABN number (11 digits). Either acn or abn is required per entity.
entities.*.risk_level string
The risk level (high, standard, low).
curl --request POST \
    "https://monitorhq.com.au/api/v1/monitorings/bulk" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --data '{
    "entities": "[{\"acn\": \"123456789\", \"risk_level\": \"standard\"}]",
    "entities.*.acn": "123456789",
    "entities.*.abn": "12345678901",
    "entities.*.risk_level": "standard"
}'
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/monitorings/bulk", {
    method: "POST",
    headers,
    body: JSON.stringify({
        "entities": "[{\"acn\": \"123456789\", \"risk_level\": \"standard\"}]",
        "entities.*.acn": "123456789",
        "entities.*.abn": "12345678901",
        "entities.*.risk_level": "standard"
}),
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->post('https://monitorhq.com.au/api/v1/monitorings/bulk', [
            'entities' => '[{"acn": "123456789", "risk_level": "standard"}]',
            'entities.*.acn' => '123456789',
            'entities.*.abn' => '12345678901',
            'entities.*.risk_level' => 'standard',
        ]);
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.post(
    "https://monitorhq.com.au/api/v1/monitorings/bulk",
    headers=headers,
    json={
        "entities": "[{\"acn\": \"123456789\", \"risk_level\": \"standard\"}]",
        "entities.*.acn": "123456789",
        "entities.*.abn": "12345678901",
        "entities.*.risk_level": "standard"
}
)

Example response (200)

{
  "message": "Bulk import processed",
  "summary": {
    "total": 2,
    "succeeded": 1,
    "failed": 1
  },
  "results": [
    {
      "index": 0,
      "success": true,
      "uuid": "123e4567-e89b-12d3-a456-426614174000",
      "error": null
    },
    {
      "index": 1,
      "success": false,
      "uuid": null,
      "error": "This entity is already in your portfolio"
    }
  ]
}

Get monitoring details

Get detailed information about a specific monitoring by UUID. Check health and entity_state follow the same rules as the list endpoint, including nulls for a stopped monitoring.

GET /api/v1/monitorings/{uuid} requires authentication

URL Parameters

uuid string
The monitoring UUID.
curl --request GET \
    "https://monitorhq.com.au/api/v1/monitorings/{uuid}" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json"
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/monitorings/{uuid}", {
    method: "GET",
    headers,
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->get('https://monitorhq.com.au/api/v1/monitorings/{uuid}');
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.get("https://monitorhq.com.au/api/v1/monitorings/{uuid}", headers=headers)

Example response (200)

{
  "uuid": "123e4567-e89b-12d3-a456-426614174000",
  "risk_level": "high",
  "added_at": "2026-01-15T10:00:00Z",
  "last_checked_at": "2026-01-16T03:12:00+00:00",
  "consecutive_failures": 0,
  "acn_last_checked_at": "2026-01-16T03:12:00+00:00",
  "abn_last_checked_at": "2026-01-14T22:05:00+00:00",
  "acn_consecutive_failures": 0,
  "abn_consecutive_failures": 0,
  "entity_state": {
    "entity_type": "PRV",
    "acn_status": "REGD",
    "abn_status": "Active",
    "gst_registered": true,
    "gst_date": "2020-01-15",
    "business_names": [],
    "is_terminal": false
  },
  "entity_details": {
    "entity_name": "Example Pty Ltd",
    "entity_type": "APTY",
    "acn": "123456789",
    "abn": "12345678901",
    "state": "VIC",
    "acn_status": "REGD",
    "acn_registration_date": "2020-01-15T00:00:00Z",
    "acn_review_date": "2026-01-15T00:00:00Z",
    "abn_status": "Active",
    "abn_registration_date": "2020-01-15T00:00:00Z",
    "gst_date": "2020-01-15T00:00:00Z",
    "primary_address": {
      "type": "RG",
      "state": "VIC",
      "locality": "MELBOURNE",
      "postCode": "3000",
      "addressLine": "123 Example St"
    },
    "secondary_address": {},
    "business_names": [],
    "former_names": []
  },
  "recent_history": [
    {
      "history_id": 1042,
      "type": "abn_registration",
      "source": "abr",
      "initial": true,
      "effective_date": "2020-01-15T00:00:00Z",
      "detected_at": "2026-01-15T10:00:00+00:00",
      "title": "ABN Registered",
      "description": "Australian Business Number registered",
      "metadata": []
    }
  ]
}

Get monitoring history

Get paginated check results history for a specific monitoring. initial is true for rows describing the entity's past (written when monitoring starts) and false for changes detected since; webhooks only ever carry the latter. A gst_registration row for a cancelled GST registration carries metadata.gst_cancelled = true.

GET /api/v1/monitorings/{uuid}/history requires authentication

URL Parameters

uuid string
The monitoring UUID.

Query Parameters

page integer (optional)
Page number for pagination.
per_page integer (optional)
Number of items per page (max 100).
event_type string (optional)
Filter by event type (company_registration, abn_registration, gst_registration, etc).
detected_since string (optional)
Only rows detected at or after this ISO 8601 moment, oldest first (by history_id). URL-encode the value.
curl --request GET \
    "https://monitorhq.com.au/api/v1/monitorings/{uuid}/history?page=1&per_page=15&event_type=abn_registration&detected_since=2026-10-12T00%3A00%3A00Z" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json"
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/monitorings/{uuid}/history?page=1&per_page=15&event_type=abn_registration&detected_since=2026-10-12T00%3A00%3A00Z", {
    method: "GET",
    headers,
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->get('https://monitorhq.com.au/api/v1/monitorings/{uuid}/history?page=1&per_page=15&event_type=abn_registration&detected_since=2026-10-12T00%3A00%3A00Z');
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.get("https://monitorhq.com.au/api/v1/monitorings/{uuid}/history?page=1&per_page=15&event_type=abn_registration&detected_since=2026-10-12T00%3A00%3A00Z", headers=headers)

Example response (200)

{
  "data": [
    {
      "history_id": 1042,
      "type": "abn_registration",
      "source": "abr",
      "initial": true,
      "effective_date": "2020-01-15T00:00:00Z",
      "detected_at": "2026-01-15T10:00:00+00:00",
      "title": "ABN Registered",
      "description": "Australian Business Number registered",
      "metadata": []
    }
  ],
  "links": {
    "first": "https://monitorhq.com.au/api/v1/monitorings/{uuid}/history?page=1",
    "last": null,
    "prev": null,
    "next": "https://monitorhq.com.au/api/v1/monitorings/{uuid}/history?page=2"
  },
  "meta": {
    "current_page": 1,
    "current_page_url": "https://monitorhq.com.au/api/v1/monitorings/{uuid}/history?page=1",
    "from": 1,
    "path": "https://monitorhq.com.au/api/v1/monitorings/{uuid}/history",
    "per_page": 15,
    "to": 3
  }
}

Update monitoring

Update a monitoring's risk level.

PUT /api/v1/monitorings/{uuid} requires authentication

URL Parameters

uuid string
The monitoring UUID.

Body Parameters

risk_level string
The risk level (high, standard, low).
curl --request PUT \
    "https://monitorhq.com.au/api/v1/monitorings/{uuid}" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --data '{
    "risk_level": "standard"
}'
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/monitorings/{uuid}", {
    method: "PUT",
    headers,
    body: JSON.stringify({
        "risk_level": "standard"
}),
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->put('https://monitorhq.com.au/api/v1/monitorings/{uuid}', [
            'risk_level' => 'standard',
        ]);
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.put(
    "https://monitorhq.com.au/api/v1/monitorings/{uuid}",
    headers=headers,
    json={
        "risk_level": "standard"
}
)

Example response (200)

{
  "message": "Monitoring updated successfully",
  "data": {
    "uuid": "123e4567-e89b-12d3-a456-426614174000",
    "entity_name": "Example Pty Ltd",
    "entity_type": "company",
    "acn": "123456789",
    "abn": "12345678901",
    "risk_level": "standard",
    "added_at": "2026-01-15T10:00:00Z"
  }
}

Stop monitoring

Stop monitoring an entity. The entity will be removed from your monitoring list. Only team owners can stop monitorings. Stopping a monitoring that is already stopped succeeds and changes nothing. An unknown uuid, or one that belongs to another team, returns 404 with code monitoring_not_found.

DELETE /api/v1/monitorings/{uuid} requires authentication

URL Parameters

uuid string
The monitoring UUID.
curl --request DELETE \
    "https://monitorhq.com.au/api/v1/monitorings/{uuid}" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json"
const headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
};

fetch("https://monitorhq.com.au/api/v1/monitorings/{uuid}", {
    method: "DELETE",
    headers,
}).then(response => response.json());
$response = Http::withHeaders([
    'Authorization' => 'Bearer {YOUR_AUTH_TOKEN}',
])
    ->delete('https://monitorhq.com.au/api/v1/monitorings/{uuid}');
import requests

headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
}

response = requests.delete("https://monitorhq.com.au/api/v1/monitorings/{uuid}", headers=headers)

Example response (200)

{
  "message": "Monitoring stopped successfully"
}