WorkClear

Australian licence compliance workflows. 779K records across building, trade, and expanding sector coverage via verification search, monitoring, reports, and API.

QLDNSWVICWAACTNTTASSA coming soon

Product

  • Search
  • Pricing
  • API Documentation
  • Coverage Status
  • Guides

Verify by State

  • Queensland (QBCC)
  • New South Wales
  • Victoria (VBA)
  • Real estate licences
  • All coverage

Legal

  • Privacy Policy
  • Terms of Service

Contact

Get in touch

© 2026 WorkClear. All rights reserved.

Data sourced from official registers. SA is coming soon and public availability varies by licence category.

WorkClear
SearchPricingVerifyDocsGuidesStatus
Loading

Getting Started

Dashboard

REST API

Reference

SDKs & Integration

Product & API Documentation

WorkClear supports both non-technical operations teams and developer integrations. Monitor licences for cancellations, suspensions, and expiry in the dashboard, or verify/search via API across 7 states with 779K licence records.

Base URLhttps://www.workclear.com.au/api

Test coverage first

Use web search and the status page to confirm the licence categories your workflow needs.

Try search

Choose an API tier

API access starts on Pro, with higher monthly call volume on Business and Enterprise.

Compare pricing

Build server-side

Keep API keys out of client code and call WorkClear from your own backend service.

Authentication

Quick Start

Get your first API response in under two minutes.

1

Create an account

Sign up at workclear.com.au/signup — API access is available on paid plans.

2

Get your API key

Generate a key from your dashboard. Keys start with wc_live_.

3

Make your first request


Authentication

All API v1 endpoints require authentication. Pass your API key via the x-api-key request header.

Header Authentication (recommended)

Security tip: Never expose your API key in client-side code. Always call the WorkClear API from your backend server.

API Key Format

PrefixDescription
wc_live_API key — requests count against your monthly quota

Unauthenticated Endpoints

The following endpoints do not require an API key:

  • GET /api/status— System health check

Dashboard Workflows

Built for operations and compliance teams who need more than one-off checks. Search current licences, move the important ones into a watchlist, review risk changes on a schedule, and export evidence when a team needs an audit trail.

Watchlist Monitoring

Monitor current licences continuously without building your own reminder workflow

The watchlist is designed for teams that need to keep checking the same set of licences over time. Instead of relying on spreadsheets or manual calendar reminders, it gives you a single place to review what changed, what is due soon, and what now needs attention.

  • Add licences from dashboard search or bulk verification results in one click.
  • Scheduled checks surface inactive, cancelled, surrendered, overdue, and expiring-soon items.
  • Filters let your team focus quickly on attention-needed items, pending first checks, overdue reviews, or healthy/current licences.
  • Email alerts and CSV exports make it easier to review changes, share evidence, and clean up the list in bulk.
Good fit for compliance teams, contractor platforms, and operations staff who need a simple way to keep checking the same licences over time.

Last checked

07 Mar, 06:04 AM

Next expected

08 Mar, 06:00 AM

Checks run

42 / 42

Bulk remove selected

8 items selected

Remove
Acme Building Co

Status changed since last check

Cancelled
Alert digest queued: 1 critical + 2 pre-expiry events.

What gets flagged

Status changes, inactive or surrendered records, upcoming expiry, overdue checks, and licences that still need their first scheduled review.

How teams review it

Use built-in filters, risk-priority ordering, selection tools, and bulk actions to work through the highest-risk records first.

How you share it

Export filtered watchlist data to CSV with status, monitoring categories, attention reason, expiry timing, and check timestamps.

Search & Verify

Fast single-licence checks from the dashboard

  • Search by licence number, name, or ABN.
  • View status, licence class, state, and expiry in one result card.
  • Save to history or add to Watchlist directly from the result.
Search: QLD-DEMO-54898
JOHN EXAMPLE BUILDING PTY LTDActive

Licence: QLD-DEMO-54898

State: QLD

Class: Builder - Open

Expiry: 31 Jan 2028

Add to WatchlistSave result

Bulk CSV

Upload contractor lists and verify them in batches

Business +

CSV processing pipeline

1. Upload filedone
2. Parse + validate rowsdone
3. Verify licencesrunning

218 / 320 rows processed

Post-run actions

  • Filter invalid/expiring rows
  • Bulk-add selected rows to Watchlist
  • Export CSV/PDF evidence for project teams

Exports

Produce shareable CSV and PDF verification outputs

Useful for audits, onboarding packs, and internal compliance sign-off.

Alerts & Audit Trail

Who changed, what changed, and when it was checked

Watchlist events include high-risk status changes (cancelled, suspended, revoked) with check timing for incident response and evidence trails.

Try Watchlist MonitoringView Plans

Verify Licence

GET/api/v1/verify

Look up a licence by its licence number. Returns full details including holder name, status, expiry date, data source, and any published register metadata. Searches across all current coverage by default, or filter to a specific state and sector.

Canonical endpoint: /api/v1/verify. The legacy /api/verify alias remains available for compatibility.

Parameters

ParameterTypeRequiredDescription
licence_numberstringRequiredThe licence number to verify
statestringOptionalState code: QLD, NSW, VIC, SA, WA, ACT, NT, TAS. Searches all states if omitted.
sectorstringOptional"contractor" (default) or "real_estate". Real-estate is currently live for QLD and WA.

Request

Response

FieldTypeDescription
statusstring"active", "expired", "inactive", "unknown", "source_absent", or "not_found"
statestringAustralian state code (QLD, NSW, VIC, etc.)
licence_numberstringThe licence number
licensee_namestringName of the licence holder
abnstring | nullAustralian Business Number
licence_typestring | null"Individual", "Business", "Person", etc.
licence_classesarrayList of authorised work classes
issue_datestring | nullLicence issue date (YYYY-MM-DD)
expiry_datestring | nullLicence expiry date (YYYY-MM-DD)
sourcestringData source (e.g. "QBCC Licensed Contractors Register")
valid_currentlybooleanFalse when expired, inactive, unknown, or absent from the latest source refresh
source_absent_atstring | nullWhen the record was first missing from a completed source refresh

Search Licences

GET/api/v1/search

Search for licences by name, ABN, or supported sector-specific fields. Supports state filtering, sector selection, and pagination.

Canonical endpoint: /api/v1/search. The legacy /api/search alias remains available for compatibility.

Parameters

ParameterTypeRequiredDescription
qstringRequiredSearch query — name, holder name, or ABN depending on sector
statestringOptionalFilter by state (QLD, NSW, VIC, SA, WA, ACT, NT, TAS)
typestringOptional"name", "abn", or "licence_type" (auto-detected if omitted)
sectorstringOptional"contractor" (default) or "real_estate". Real-estate is currently live for QLD and WA.
limitintegerOptionalMax results to return (default: 10, max: 100)
include_absentbooleanOptionalSet to "true" to include records absent from the latest source refresh. Hidden by default.

Request

Response


Bulk Verify

POST/api/verify/bulk

Verify multiple licence numbers in one request. Supports sector-aware batches, including QLD real-estate licence lists.

Parameters

ParameterTypeRequiredDescription
licencesstring[]RequiredArray of licence numbers to verify (max 100 per request)
statestringOptionalOptional state filter. For current real-estate coverage, use QLD.
sectorstringOptional"contractor" (default) or "real_estate".

Request

Response


Data Coverage

GET/api/v1/coverage

Returns data coverage information — which states are available, record counts, data sources, and when data was last updated.

Request

Response

Current Coverage

StateRecordsSourceStatus
QLD120K+QBCCLive
NSW262K+NSW Fair TradingLive
VIC184K+VBA / ESVLive
SA—Consumer & Business ServicesComing Soon
WA96K+WA Building CommissionLive
ACT23K+ACT Construction OccupationsLive
NT13K+NT LicensingLive
TAS13K+CBOS TasmaniaLive

Health Check

GET/api/healthNo auth required

Minimal service health endpoint. Use this for uptime probes and infrastructure monitoring. This is not a licence lookup endpoint.

Request

Response


System Status

GET/api/statusNo auth required

Public system and data-status snapshot. Returns monitored state health and record coverage. No authentication required. For simple uptime checks, use /api/health.

Request

Response

See real-time status on our Status Page.


Check Licence Status

GET/api/v1/status

Quick validity check — returns whether a licence is currently valid with a simple boolean is_valid flag. Lighter response than the full verify endpoint.

Naming note: /api/status is platform status, while /api/v1/status is licence status.

Parameters

ParameterTypeRequiredDescription
licence_numberstringRequiredThe contractor licence number
statestringOptionalState code (QLD, NSW, VIC, etc.). Recommended for accuracy.

Request

Response


Rate Limits

API calls are rate-limited based on your plan. Monthly API limits reset on the 1st of each month. Web lookups on workclear.com.au are free and unlimited for all plans.

PlanAPI CallsPriceBest For
FreeWeb only (no API access)$0Manual lookups
Pro1,000 / month$29/moGrowing businesses
Business10,000 / month$99/moHigh-volume applications
EnterpriseUnlimitedCustomCustom SLAs & support

Rate Limit Headers

When you exceed your rate limit, the API returns a 429 status with these headers:

HeaderDescription
X-RateLimit-LimitYour monthly limit
X-RateLimit-RemainingRemaining calls this month
Retry-AfterSeconds until the monthly limit can be retried

Need higher limits? Compare plans or contact us for Enterprise pricing.


Error Codes

The API uses standard HTTP status codes. All error responses include a JSON body with an error field.

CodeMeaningWhat to Do
200SuccessRequest succeeded. Check the response body — a 200 with "status": "not_found" means no licence was matched.
400Bad RequestInvalid or missing parameters. Check that licence_number is provided and state is a valid code.
401UnauthorizedMissing or invalid API key. Verify your x-api-key header.
429Rate LimitedYou've hit your monthly limit. Upgrade your plan or wait for the next monthly reset.
500Server ErrorSomething went wrong on our side. Retry after a moment. If it persists, contact support.

Error Response Format

Python Integration

Use the standard requestslibrary to integrate WorkClear into any Python application. Here's a ready-to-use client class:

Official Python SDK coming soon. Install via pip install workclear — we'll announce it when it's ready.


JavaScript / Node Integration

Works with Node.js, Deno, Bun, or any runtime with fetchsupport. Here's a reusable client class:

Official npm package coming soon. Install via npm install @workclear/sdk — we'll announce it when it's ready.


Webhooks

Coming Soon

Get notified when a watched licence status changes — expiry alerts, suspension notifications, and renewal confirmations delivered to your endpoint.

Interested? Let us know and we'll notify you when it's live.

Ready to build licence checks into your workflow?

Start with free web search, then choose a paid plan when you need API access, bulk checks, monitoring, or reusable evidence.

Create Free AccountCompare PlansContact Sales
Your first API call
curl "https://www.workclear.com.au/api/v1/verify?licence_number=QLD-DEMO-54898" \
  -H "x-api-key: wc_live_your_api_key_here"
x-api-key header
curl "https://www.workclear.com.au/api/v1/verify?licence_number=QLD-DEMO-54898" \
  -H "x-api-key: wc_live_your_api_key_here"
Verify a licence
curl -X GET "https://www.workclear.com.au/api/v1/verify?licence_number=QLD-RE-DEMO-1000078&state=QLD&sector=real_estate" \
  -H "x-api-key: wc_live_your_api_key_here"
200 OK — Licence found
{
  "status": "active",
  "state": "QLD",
  "licence_number": "QLD-DEMO-54898",
  "licensee_name": "Demo Plumbing Services Pty Ltd",
  "abn": "00 000 000 000",
  "licence_type": "Business",
  "financial_category": "Self Certification - Trade",
  "issue_date": null,
  "expiry_date": null,
  "licence_classes": [
    { "class": "Gasfitting" },
    { "class": "Plumbing and Drainage" }
  ],
  "source": "QBCC Licensed Contractors Register",
  "valid_currently": true,
  "source_absent_at": null
}
200 OK — Licence not found
{
  "status": "not_found"
}
Search by name
curl -X GET "https://www.workclear.com.au/api/v1/search?q=Demo%20Property&state=QLD&type=name&sector=real_estate&limit=5" \
  -H "x-api-key: wc_live_your_api_key_here"
200 OK
{
  "count": 3,
  "results": [
    {
      "state": "QLD",
      "licence_number": "QLD-DEMO-54898",
      "licensee_name": "Demo Plumbing Services Pty Ltd",
      "abn": "00 000 000 000",
      "licence_type": "Business",
      "licence_classes": [{ "class": "Plumbing and Drainage" }],
      "expiry_date": null
    },
    {
      "state": "NSW",
      "licence_number": "NSW-DEMO-123456C",
      "licensee_name": "Harbour Electrical Group Pty Ltd",
      "abn": "11 111 111 111",
      "licence_type": "Business",
      "licence_classes": [{ "class": "Electrician" }],
      "expiry_date": "2027-03-15"
    }
  ]
}
Bulk verify real-estate licences
curl -X POST "https://www.workclear.com.au/api/verify/bulk" \
  -H "x-api-key: wc_live_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "sector": "real_estate",
    "state": "QLD",
    "licences": ["QLD-RE-DEMO-3102858", "QLD-RE-DEMO-1000078", "QLD-RE-DEMO-4906456"]
  }'
200 OK
{
  "summary": {
    "total": 3,
    "found": 3,
    "not_found": 0,
    "errors": 0,
    "processing_time_ms": 182
  },
  "results": [
    {
      "licence_number": "QLD-RE-DEMO-3102858",
      "status": "found",
      "data": {
        "status": "active",
        "sector": "real_estate",
        "state": "QLD",
        "licence_number": "QLD-RE-DEMO-3102858",
        "licensee_name": "Demo Property Salesperson",
        "licence_type": "REAL ESTATE SALESPERSON",
        "source": "QLD Office of Fair Trading Licensing Register"
      }
    }
  ]
}
Get coverage
curl -X GET "https://www.workclear.com.au/api/v1/coverage" \
  -H "x-api-key: wc_live_your_api_key_here"
200 OK
{
  "total_records": 779199,
  "states_covered": 7,
  "states": [
    {
      "state": "ACT",
      "source": "ACT Construction Occupations Registrar",
      "source_url": "https://...",
      "records": 23141,
      "last_updated": "YYYY-MM-DD",
      "data_as_of": "YYYY-MM-DD",
      "notes": null
    },
    {
      "state": "NSW",
      "source": "NSW Fair Trading",
      "records": 262526,
      "last_updated": "YYYY-MM-DD"
    },
    ...
  ]
}
Service health check
curl -X GET "https://www.workclear.com.au/api/health"
200 OK
{
  "status": "ok"
}
System health check
curl -X GET "https://www.workclear.com.au/api/status"
200 OK
{
  "status": "operational",
  "timestamp": "ISO-8601 timestamp",
  "totalLatencyMs": 45,
  "checks": [
    {
      "service": "api",
      "status": "operational",
      "latencyMs": 0,
      "message": "API server responding"
    },
    {
      "service": "database",
      "status": "operational",
      "latencyMs": 42,
      "message": "Database operational"
    }
  ]
}
Quick status check
curl -X GET "https://www.workclear.com.au/api/v1/status?licence_number=QLD-DEMO-54898&state=QLD" \
  -H "x-api-key: wc_live_your_api_key_here"
200 OK — Licence found & valid
{
  "licence_number": "QLD-DEMO-54898",
  "licensee_name": "Demo Plumbing Services Pty Ltd",
  "state": "QLD",
  "found": true,
  "is_valid": true,
  "status": "Current",
  "expiry_date": null
}
200 OK — Licence not found
{
  "licence_number": "INVALID123",
  "state": "all",
  "found": false,
  "is_valid": false,
  "message": "No licence found"
}
429 Too Many Requests
{
  "error": "Rate limit exceeded"
}
workclear_client.py
import requests

class WorkClearClient:
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://www.workclear.com.au/api/v1"
        self.headers = {"x-api-key": api_key}

    def verify(self, licence_number: str, state: str = None):
        params = {"licence_number": licence_number}
        if state:
            params["state"] = state
        r = requests.get(f"{self.base_url}/verify", params=params, headers=self.headers)
        r.raise_for_status()
        return r.json()

    def search(self, query: str, state: str = None, limit: int = 10):
        params = {"q": query, "limit": limit}
        if state:
            params["state"] = state
        r = requests.get(f"{self.base_url}/search", params=params, headers=self.headers)
        r.raise_for_status()
        return r.json()

    def coverage(self):
        r = requests.get(f"{self.base_url}/coverage", headers=self.headers)
        r.raise_for_status()
        return r.json()

# Usage
client = WorkClearClient("wc_live_your_api_key_here")
result = client.verify("QLD-DEMO-54898", state="QLD")
print(result)
workclear-client.js
class WorkClearClient {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.baseUrl = "https://www.workclear.com.au/api/v1";
  }

  async #request(endpoint, params = {}) {
    const url = new URL(`${this.baseUrl}${endpoint}`);
    Object.entries(params).forEach(([k, v]) => {
      if (v !== undefined && v !== null) url.searchParams.set(k, String(v));
    });
    const res = await fetch(url, {
      headers: { "x-api-key": this.apiKey }
    });
    if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
    return res.json();
  }

  verify(licenceNumber, state) {
    return this.#request("/verify", { licence_number: licenceNumber, state });
  }

  search(query, { state, limit } = {}) {
    return this.#request("/search", { q: query, state, limit });
  }

  coverage() {
    return this.#request("/coverage");
  }
}

// Usage
const client = new WorkClearClient("wc_live_your_api_key_here");
const result = await client.verify("QLD-DEMO-54898", "QLD");
console.log(result);