# ASIC Banned & Disqualified Persons + Undertakings + APRA (`malekh/asic-banned-disqualified-persons-check`) Actor

Screen names and companies against three Australian financial-regulatory registers at once: ASIC Banned & Disqualified Persons and Organisations, the ASIC Court Enforceable Undertakings Register, and APRA's Disqualified Individuals Register. Matches labelled current, expired or revoked.

- **URL**: https://apify.com/malekh/asic-banned-disqualified-persons-check.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

## ASIC Banned & Disqualified Persons Check

Screen a list of names and companies against **ASIC's Banned and Disqualified
Persons register** and **Banned and Disqualified Organisations register** — the
official Australian Securities and Investments Commission records of people
banned from providing financial services, disqualified from managing
corporations, banned under the credit legislation, or disqualified as an SMSF
auditor.

Feed it a batch of candidates, directors, responsible managers, authorised
representatives or supplier companies. Get back one result per name, with every
matching register entry labelled **current or expired**, plus the ban type, the
ASIC document number, the start and end dates, the recorded locality, and
ASIC's own comments.

It also screens the same names against the **ASIC Court Enforceable
Undertakings Register** (498 undertakings accepted since 1998) and the **APRA
Disqualified Individuals Register** (178 individuals disqualified from roles in
APRA-regulated banks, insurers and superannuation funds) — so a person who
carries an undertaking or an APRA disqualification but no ASIC ban is flagged
rather than returned clear.

Background-screening vendors sell this exact lookup one name at a time —
CVCheck at AU$36.18 per name, WorkerChecks at AU$49.00 per name, and Equifax
fit2work and Checkmate as named check types. CVCheck's "Australia: Financial
Regulatory" check covers all three of these register families; so does this
Actor, over a whole list, for a fraction of one name's price.

***

### Three registers, one screen

| Register | Records | What a match means |
|---|---|---|
| ASIC Banned & Disqualified Persons / Organisations | ~7,200 | A ban or disqualification, labelled **current** or **expired** |
| ASIC Court Enforceable Undertakings | 498 | A binding agreement given to ASIC. The register records **no expiry**, so `isInForce` is `null`, never guessed |
| APRA Disqualified Individuals | 178 | Disqualification from an APRA-regulated role, labelled **in force**, **expired** or **revoked** |

`hasCurrentBan` keeps its original meaning — a current *ASIC ban* — so existing
integrations are unaffected. The new headline field is **`hasAdverseFinding`**:
true if there is a current ASIC ban, an enforceable undertaking, or an APRA
disqualification still in force.

The two ASIC/APRA register pages are HTML, not open-data files, so each is
checked on every run against its expected columns and record count. **If a page
has been restructured or is unreachable, that register is dropped and the
result says so** — `sourcesUnavailable` names it, `requiresManualVerification`
becomes true, and the guidance text spells out which register was not screened.
A partial answer that admits it is partial; never a quiet "no match".

***

### What it does that a plain name search does not

**1. It tells you whether the ban is still in force.**

This is the thing that matters, and it is the thing a naive name match gets
wrong. ASIC's register is *historical*, not current-only: of the 7,202 person
records in the July 2026 release, **5,251 — 73% — are bans that have already
ended**. The very first row in the file is a securities banning that expired in
1999\. Report that as a hit and you have just failed a candidate over a
twenty-seven-year-old spent order.

Every match here carries a `banStatus`:

| `banStatus` | Meaning |
|---|---|
| `in_force` | End date recorded, still in the future |
| `no_end_date` | ASIC records no end date for this ban |
| `expired` | End date recorded, already passed |

and an `isCurrent` boolean, and each result counts
`currentBanMatchCount` against `expiredBanMatchCount` so you can route only the
live ones for review.

A blank end date is reported as **current** — 1,234 person records have one, and
blank means ASIC recorded no expiry rather than that the data is missing. Where
ASIC writes the words itself, as with the organisations register's literal
`Permanent banning`, that text is passed straight through in `banEndDateRaw`
rather than being reinterpreted.

**2. It does not overclaim on identity.**

The persons register has **no date of birth and no identifier of any kind** —
just an uppercase `SURNAME, GIVEN NAMES` string. ASIC's own help file states:

> There may be multiple instances of identical or similar names in the dataset,
> with slight differences in address, place of birth, and other details. The
> data is recorded as it was reported to ASIC and we cannot confirm if these
> similar records are/are not the same person.

So a person match is reported as a **possible** match, always, with
`requiresManualVerification: true` and a link to ASIC Connect. The only
identifier-grade result this Actor will assert is an **ACN match** against the
organisations register, because an ACN uniquely identifies a company. Matches
are graded so you can triage them:

`acn_exact` › `organisation_exact` › `name_exact` › `name_partial` ›
`organisation_fuzzy` › `name_fuzzy` › `surname_only`

**3. It survives ASIC's release cycle.**

The download filename embeds the release month (`bd_per_202607.csv`), so any
hardcoded URL breaks at the next publication. This Actor resolves the current
resource through the data.gov.au CKAN API on every run, sniffs the delimiter
from the header rather than trusting the file extension (the persons `.csv` is
comma-separated, the organisations `.csv` is genuinely tab-separated), checks
the column names, and **fails the run loudly** if the register looks truncated
or frozen. It will never quietly report "no bans found" because the source was
unreachable.

***

### Input

```json
{
  "records": [
    { "referenceId": "CAND-001", "firstName": "Bruce", "middleName": "Ronald", "lastName": "Clark" },
    { "referenceId": "CAND-002", "fullName": "Jane Example" },
    { "referenceId": "SUPPLIER-88", "organisationName": "M.A.I Pacific Pty Ltd", "acn": "095 393 007" }
  ],
  "banStatusFilter": "all",
  "fuzzyThreshold": 0.85
}
```

| Field | Notes |
|---|---|
| `firstName`, `middleName`, `lastName` | Preferred for individuals |
| `fullName` | Accepted as an alternative; both `SURNAME, GIVEN NAMES` and `Given Names Surname` are understood, and the reading used is echoed back in `nameInterpretation` |
| `organisationName` | Legal suffixes (`Pty Ltd`) are ignored for scoring, so the trading name alone still matches |
| `acn` | Nine digits, spaces and hyphens fine. An eleven-digit ABN is rejected rather than silently truncated |
| `referenceId` | Any extra fields you include are echoed back with the result |
| `banStatusFilter` | `all` (default), `current`, or `expired` |
| `fuzzyThreshold` | 0–1, default 0.85 |

### Output

One dataset item per input record:

```json
{
  "referenceId": "CAND-001",
  "matchCount": 1,
  "currentBanMatchCount": 1,
  "expiredBanMatchCount": 0,
  "highestConfidence": "name_exact",
  "hasCurrentBan": true,
  "identifierGradeMatch": false,
  "requiresManualVerification": true,
  "guidance": "POSSIBLE match on name only. This register carries no date of birth ...",
  "matches": [
    {
      "register": "Banned and Disqualified Persons",
      "entityType": "person",
      "matchedName": "CLARK, BRUCE RONALD",
      "matchType": "name_exact",
      "matchScore": 1.0,
      "banType": "Disq. Director",
      "documentNumber": "000087047",
      "banStartDate": "1987-10-29",
      "banEndDate": "",
      "banEndDateRaw": "",
      "banStatus": "no_end_date",
      "isCurrent": true,
      "locality": "GISBORNE",
      "state": "VIC",
      "postcode": "3437",
      "country": "AUSTRALIA",
      "comments": null,
      "verifyAt": "https://connectonline.asic.gov.au/RegistrySearch/"
    }
  ],
  "registerAsAt": { "personRecordCount": 7202, "organisationRecordCount": 15, "newestBanStartDate": "2026-07-17" }
}
```

Organisation matches additionally carry `acn` and, where ASIC publishes one, a
`noticeUrl` pointing at the PDF of the banning order itself.

### Ban types covered

From ASIC's data dictionary: `AFS Banned & Disqualified` (s922A(2)
Corporations Act), `Disq. Director` (s1274AA), `Credit Banned & Disqualified`
(Part 2-4 NCCP Act), `Disqualified SMSF` (s130F SIS Act), and the historical
`Banned Securities` and `Banned Futures` representative registers.

### What this does NOT cover

Stated plainly, because a screening tool that implies coverage it does not have
is worse than no tool:

- **APRA's Enforceable Undertakings register** — APRA publishes undertakings
  separately from its disqualifications; the disqualifications are covered
  (below), the undertakings are not.
- **ASIC's banned-credit-activity and banned-bodies-corporate sub-registers** —
  separate ASIC registers, not included.
- **Real-time data.** ASIC publishes weekly. Each result carries
  `registerAsAt.personsPublishedAt` so you always know the vintage you screened
  against.
- **An identity determination on a person.** There is no date of birth in the
  source. Confirm any hit at
  [ASIC Connect](https://connectonline.asic.gov.au/RegistrySearch/) before
  taking action that affects someone.

### Source and licence

Australian Securities and Investments Commission — *Banned and Disqualified
Persons Dataset* and *Banned and Disqualified Organisations Dataset*, published
on [data.gov.au](https://data.gov.au/data/dataset/asic-banned-disqualified-per)
under [CC BY 3.0 AU](http://creativecommons.org/licenses/by/3.0/au/). Public
data, redistributed with attribution. This Actor is not affiliated with or
endorsed by ASIC.

# Actor input Schema

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

Individuals: firstName + lastName (add middleName to sharpen the match). Companies: organisationName and, ideally, acn — an ACN is the only identifier on either register that confirms an entity, everything else is a possible match. You can also pass fullName instead of first/last. Any extra fields, such as your own referenceId, are echoed back with the result so it reconciles with your ATS or onboarding system.

## `banStatusFilter` (type: `string`):

73% of the records on ASIC's persons register are bans that have already ended — the register is historical, not current-only. Every match is labelled with banStatus (in\_force / no\_end\_date / expired) either way; this only controls which ones are listed. 'All' is the default so nothing is hidden from you.

## `fuzzyThreshold` (type: `number`):

0 to 1. How close a non-exact name has to be before it is reported as a possible match. Lower catches more spelling variants and produces more to review. 0.85 is a sensible default.

## Actor input object example

```json
{
  "records": [
    {
      "referenceId": "CAND-001",
      "firstName": "Bruce",
      "middleName": "Ronald",
      "lastName": "Clark"
    },
    {
      "referenceId": "CAND-002",
      "fullName": "Jane Example"
    },
    {
      "referenceId": "SUPPLIER-88",
      "organisationName": "M.A.I Pacific Pty Ltd",
      "acn": "095 393 007"
    }
  ],
  "banStatusFilter": "all",
  "fuzzyThreshold": 0.85
}
```

# 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": "CAND-001",
            "firstName": "Bruce",
            "middleName": "Ronald",
            "lastName": "Clark"
        },
        {
            "referenceId": "CAND-002",
            "fullName": "Jane Example"
        },
        {
            "referenceId": "SUPPLIER-88",
            "organisationName": "M.A.I Pacific Pty Ltd",
            "acn": "095 393 007"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("malekh/asic-banned-disqualified-persons-check").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": "CAND-001",
            "firstName": "Bruce",
            "middleName": "Ronald",
            "lastName": "Clark",
        },
        {
            "referenceId": "CAND-002",
            "fullName": "Jane Example",
        },
        {
            "referenceId": "SUPPLIER-88",
            "organisationName": "M.A.I Pacific Pty Ltd",
            "acn": "095 393 007",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("malekh/asic-banned-disqualified-persons-check").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": "CAND-001",
      "firstName": "Bruce",
      "middleName": "Ronald",
      "lastName": "Clark"
    },
    {
      "referenceId": "CAND-002",
      "fullName": "Jane Example"
    },
    {
      "referenceId": "SUPPLIER-88",
      "organisationName": "M.A.I Pacific Pty Ltd",
      "acn": "095 393 007"
    }
  ]
}' |
apify call malekh/asic-banned-disqualified-persons-check --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=malekh/asic-banned-disqualified-persons-check",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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