# NSW Real Estate Agent Licence Check — Fair Trading Register (`malekh/nsw-property-agent-licence-check-fair-trading`) Actor

Check names and companies against the live NSW Fair Trading public register. Every licence is labelled with its real status — 79 of a 100-record Property sample were expired, only 18 current — and carries the disciplinary actions, prosecutions and public warnings Fair Trading records against it.

- **URL**: https://apify.com/malekh/nsw-property-agent-licence-check-fair-trading.md
- **Developed by:** [Malek H](https://apify.com/malekh) (community)
- **Categories:** Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## NSW Real Estate Agent Licence Check — NSW Fair Trading register

A bulk **NSW property agent licence check** against the **live NSW Fair Trading
public register**. Feed it a list of people and companies; get back, for every
licence record:

- the register's own **status** — Current, Expired, Surrendered, Cancelled,
  Suspended, Refused, Lapsed, Cease to trade
- the **compliance record** Fair Trading holds against that licence —
  **Disciplinary Action, Prosecution, Suspension, Cancellation, Public Warning,
  Compensation Fund Claim** — with the statutory reference, the date, the action
  taken and the penalty amount

Covers NSW **real estate agents, assistant agents, stock and station agents,
strata managing agents, auctioneers** and their corporations, plus every other
NSW public register the same service answers for (trades, motor dealers,
conveyancers, security, charities, pharmacies and more).

Background-screening vendors sell this exact lookup as a per-name SKU with a
multi-day turnaround. This runs it in seconds, in bulk, from your own system.

***

### The problem it solves

**"Is this agent licensed?" is not the same question as "does the register
return a record for this name?"** On this register those two answers disagree
most of the time.

Search the live register for **Alison Louise Smith** and you get three Property
records for that one person: one **Current**, one **Expired**, one
**Surrendered**. Across a 100-record sample of Property licences matching
"smith", **79 were Expired, 3 Surrendered and only 18 Current.**

So this Actor answers the question you actually have — `holdsCurrentLicence` —
as a field of its own, separate from "we found something", and labels every
individual record with its own status.

### Why not just use the spreadsheets?

NSW Fair Trading publishes bulk **"Current Licence Extract"** spreadsheets at
`onegov.nsw.gov.au` and links them from its open-data listing. They are the
obvious source and they will quietly give you the wrong answer:

| | |
|---|---|
| Cover line inside both Property files | *"The information in this report is correct as at … Monday, 04 December 2023"* |
| HTTP `Last-Modified` | `Sun, 03 Dec 2023 18:01:45 GMT` |
| Status column | **none** |
| Individual rows whose expiry date has already passed | **29,248 of 34,436 — 84%** |
| Oldest already-expired row | 2021-11-06 |

A file titled *Current Licence Extract* that is years stale and carries no way
to tell a live licence from a dead one is worse than no data, because it looks
authoritative. **This Actor never reads those files.** It queries the same live
service the public register website queries.

### What it will not do

Stated plainly, because a screening tool that overstates itself does real harm
to the person being screened:

- **The register holds no date of birth.** A name match is a **possible** match,
  never a determination. Confirm identity at
  <https://verify.licence.nsw.gov.au/> before taking adverse action.
- **The register's search matches substrings**, so it returns other entities.
  Searching `AR & A Investments Pty Ltd` also returns `Tym-Ark Investments Pty
  Ltd`. Those rows are still shown to you, but they are counted as
  `namesakeRecordCount` and are **excluded from every entity-level answer** —
  a stranger's live licence must never make your subject look licensed.
- **The register caps a result set at 200.** When that happens
  `resultsTruncated` is `true` and the guidance text says so. A truncated
  search is never presented as a complete one.
- **NSW only.** It does not cover other states, ASIC, or the courts.

### Input

```json
{
  "records": [
    { "referenceId": "AGENT-001", "firstName": "Alison", "lastName": "Smith" },
    { "referenceId": "AGENCY-002", "organisationName": "AR & A Investments Pty Ltd" },
    { "referenceId": "AGENT-003", "fullName": "Jane Example" }
  ],
  "licenceGroup": "Property",
  "includeCompliance": true,
  "statusFilter": "all"
}
```

| Field | Meaning |
|---|---|
| `records` | People (`firstName`/`lastName`, or `fullName`) and companies (`organisationName`). Extra fields such as `referenceId` are echoed back. |
| `licenceGroup` | `Property` by default. Any of the 23 NSW register groups. |
| `includeCompliance` | Retrieve the disciplinary / prosecution record per licence. On by default. |
| `statusFilter` | `all` (default), `current`, or `ended`. |

### Output

One dataset item per input record:

```json
{
  "referenceId": "AGENCY-002",
  "searchedName": "AR & A Investments Pty Ltd",
  "holdsCurrentLicence": false,
  "hasComplianceFinding": true,
  "complianceFindingCount": 2,
  "sameEntityRecordCount": 1,
  "namesakeRecordCount": 8,
  "resultsTruncated": false,
  "guidance": "All 1 licence record(s) in this name have ENDED …",
  "matches": [
    {
      "licenceNumber": "…",
      "licenceType": "Property - Corporation",
      "licensee": "AR & A Investments Pty Ltd",
      "status": "Expired",
      "isCurrent": false,
      "isSameEntity": true,
      "grantedDate": "…",
      "expiryDate": "…",
      "complianceRecordCount": 2,
      "complianceSummary": { "Disciplinary Action": 2, "Prosecution": 0, "…": 0 },
      "complianceRecords": [
        {
          "type": "Disciplinary Action",
          "issueDate": "2022-09-08",
          "action": "Monetary penalty - licensee",
          "amount": "$5,500.00",
          "reference": "192(1)(d) Property and Stock Agents Act 2002"
        }
      ]
    }
  ]
}
```

`guidance` is a plain-English sentence you can paste into a file note.

### It fails loudly, on purpose

The register's search endpoint answers **HTTP 200 with an empty result set**
when it does not understand a request — there is no error. For a screening tool
that is the worst possible failure mode, because "no results" reads as "this
person is clean".

So before it checks anybody, every run proves the register is answering: it
loads the licence-class catalogue for the group **and** runs a canary search
whose answer is known to be large. If either comes back empty the run **fails**
rather than clearing everyone on the list. If an individual name's search
errors, that record is returned with `searchSucceeded: false` and an explicit
"this is NOT a clean result" — never as a no-match.

### Pricing

Pay per event. A run costs one `screening-run` event plus one `name-checked`
event per record. The run event is charged **only after** the register has been
proven reachable, so a run that aborts on an unreachable source costs you
nothing.

### Source and attribution

NSW Fair Trading / NSW Department of Customer Service public registers,
<https://verify.licence.nsw.gov.au/>. Public data — no key, no login, no
CAPTCHA. Not endorsed by NSW Fair Trading. Licence status and compliance
history are as recorded by Fair Trading at the time of the query.

# Actor input Schema

## `records` (type: `array`):

People: firstName + lastName (or fullName). Companies: organisationName. Any extra fields, such as your own referenceId, are echoed back with the result so it reconciles with your ATS, CRM or onboarding system.

## `licenceGroup` (type: `string`):

Property covers real estate agents, assistant agents, stock and station agents, strata managing agents, auctioneers and their corporations — the register the per-name background-check vendors sell against. The same service answers for every other NSW public register, so they are offered here too.

## `includeCompliance` (type: `boolean`):

On by default, and it is the point of this tool. For every matching licence it retrieves what NSW Fair Trading records against it — disciplinary actions, prosecutions, suspensions, cancellations, public warnings and compensation fund claims — with the statutory reference, date and penalty amount. Turning it off makes a run faster and cheaper but leaves you with a licence lookup only.

## `statusFilter` (type: `string`):

Across a 100-record sample of Property licences, 79 were expired, 3 surrendered and only 18 current — this register is mostly history. Every record is labelled with its status either way; this only controls which are listed. 'All' is the default so nothing is hidden from you.

## Actor input object example

```json
{
  "records": [
    {
      "referenceId": "AGENT-001",
      "firstName": "Alison",
      "lastName": "Smith"
    },
    {
      "referenceId": "AGENCY-002",
      "organisationName": "AR & A Investments Pty Ltd"
    },
    {
      "referenceId": "AGENT-003",
      "fullName": "Jane Example"
    }
  ],
  "licenceGroup": "Property",
  "includeCompliance": true,
  "statusFilter": "all"
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "records": [
        {
            "referenceId": "AGENT-001",
            "firstName": "Alison",
            "lastName": "Smith"
        },
        {
            "referenceId": "AGENCY-002",
            "organisationName": "AR & A Investments Pty Ltd"
        },
        {
            "referenceId": "AGENT-003",
            "fullName": "Jane Example"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malekh/nsw-property-agent-licence-check-fair-trading").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "records": [
        {
            "referenceId": "AGENT-001",
            "firstName": "Alison",
            "lastName": "Smith",
        },
        {
            "referenceId": "AGENCY-002",
            "organisationName": "AR & A Investments Pty Ltd",
        },
        {
            "referenceId": "AGENT-003",
            "fullName": "Jane Example",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("malekh/nsw-property-agent-licence-check-fair-trading").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "records": [
    {
      "referenceId": "AGENT-001",
      "firstName": "Alison",
      "lastName": "Smith"
    },
    {
      "referenceId": "AGENCY-002",
      "organisationName": "AR & A Investments Pty Ltd"
    },
    {
      "referenceId": "AGENT-003",
      "fullName": "Jane Example"
    }
  ]
}' |
apify call malekh/nsw-property-agent-licence-check-fair-trading --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malekh/nsw-property-agent-licence-check-fair-trading",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ztF9NumTI1prtQD8C/builds/VUMnJIwYRdxTNiVMN/openapi.json
