# Australian Business (ABN) Lookup & Enrichment (`luke-main/abn-lookup-enrichment`) Actor

Bulk-check ABNs, ACNs and business names against the official Australian Business Register. Clean CRM and supplier lists: ABN status, cancelled date, entity name and type, GST, state, postcode, business names, ACN and a fuzzy match score. CSV in, enriched rows out.

- **URL**: https://apify.com/luke-main/abn-lookup-enrichment.md
- **Developed by:** [Luke Main](https://apify.com/luke-main) (community)
- **Categories:** Lead generation, Business
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 business record returneds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Australian Business (ABN) Lookup & Enrichment

**Bulk ABN lookup, ACN lookup and business-name matching against the official Australian Business Register (ABR).** Paste a list, or point it at a CSV of suppliers, customers or leads, and get back one clean, CRM-ready row per input:

ABN · ABN status (Active / Cancelled) and **cancelled date** · entity name · entity type · **GST registered and from-date** · main business **state and postcode** · registered **business names** and trading names · **ACN** · DGR and ACNC flags · a **match score** for name searches · link to the ABR record.

Use it to **validate ABNs before paying invoices**, **check GST registration** on suppliers, **clean a CRM or lead list**, **find the ABN for a list of company names**, or keep stored ABN details up to date.

### Why this one

- **CSV in, enriched CSV out.** Give it a CSV URL (Google Sheets "publish to web as CSV" works). It finds the ABN / ACN / name column itself, and every original column comes back in `sourceRow`, so the output lines up with your list.
- **Mixed input, auto-detected.** One list can hold `51 824 753 556`, `004 085 616` and `Woolworths Group Ltd`. ABNs and ACNs go straight to the register; names are searched.
- **Fuzzy name matching you can trust.** Each candidate gets ABR's own relevance score *and* our own name similarity (ignores Pty Ltd / Limited / punctuation / word order), combined into a 0-100 `matchScore` with a `matchConfidence` of high / medium / low. Pick **best match only** for enrichment, or **top matches** for research.
- **State, postcode and active-only filters** to stop "Smith Plumbing" matching the wrong state. Per-row state and postcode columns are supported for CSVs.
- **Check digits validated offline first.** Typos and invalid ABNs/ACNs are flagged with a reason without querying the register.
- **You only pay for matches.** Not-found and invalid rows are still returned (so your list stays aligned) but are **free**.
- **Official data only.** Uses the ABR's own ABN Lookup web services (XML API), not page scraping.

### Pricing

Pay per result: **US$2.00 per 1,000 business records returned** (US$0.002 per matched row). Not-found and invalid inputs cost nothing. Apify platform compute is small (a few cents per thousand lookups).

### Input examples

**Quick list**

```json
{
  "queries": ["51 824 753 556", "Woolworths Group Limited", "004 085 616", "Bunnings"],
  "nameMatchMode": "best"
}
```

**Enrich a supplier CSV, NSW only, active ABNs only**

```json
{
  "csvUrl": "https://docs.google.com/spreadsheets/d/e/.../pub?output=csv",
  "csvColumn": "Supplier",
  "states": ["NSW"],
  "activeOnly": true
}
```

**Research: top 10 businesses matching a name in one postcode**

```json
{ "queries": ["coffee"], "nameMatchMode": "all", "maxMatchesPerName": 10, "postcode": "2000" }
```

### Output

One row per ABN/ACN input; one row per name (best mode) or up to *n* rows per name (top matches mode).

```json
{
  "input": "Woolworths Group Limited",
  "inputType": "name",
  "found": true,
  "message": null,
  "matchRank": 1,
  "abn": "88000014675",
  "abnFormatted": "88 000 014 675",
  "abnStatus": "Active",
  "abnStatusFrom": "1999-11-01",
  "abnCancelledDate": null,
  "entityName": "WOOLWORTHS GROUP LIMITED",
  "entityTypeCode": "PUB",
  "entityType": "Australian Public Company",
  "gstRegistered": true,
  "gstRegisteredFrom": "2000-07-01",
  "gstCancelledDate": null,
  "state": "NSW",
  "postcode": "2153",
  "acn": "000014675",
  "businessNames": [
    "Woolworths Business",
    "The Business Grocer",
    "Everyday Gifting",
    "Everyday Internet",
    "... 44 more"
  ],
  "tradingNames": [
    "WOOLWORTHS",
    "DICK SMITH ELECTRONICS",
    "BWS-BEER WINE SPIRITS",
    "... more"
  ],
  "matchedName": "WOOLWORTHS GROUP LIMITED",
  "matchedNameType": "mainName",
  "abrScore": 99,
  "nameSimilarity": 100,
  "matchScore": 100,
  "matchConfidence": "high",
  "dgrEndorsed": false,
  "acncRegistrationStatus": null,
  "recordLastUpdated": "2026-09-15",
  "abrUrl": "https://abr.business.gov.au/ABN/View?id=88000014675",
  "checkedAt": "2026-11-13T07:43:00+00:00",
  "replacedAbn": null
}
```

*(Real row from a live run on 13 Nov 2026, name lists shortened. Values come live from the ABR on each run.)*

| Field | Meaning |
|---|---|
| `found` | `false` when there was no match or the number failed its check digit; `message` says why. |
| `abnStatus`, `abnStatusFrom`, `abnCancelledDate` | Current ABN status, since when, and the cancellation date if cancelled. |
| `gstRegistered`, `gstRegisteredFrom`, `gstCancelledDate` | Current GST registration and dates. |
| `entityTypeCode`, `entityType` | E.g. PRV / Australian Private Company, IND / Individual/Sole Trader, TRT / trust. |
| `state`, `postcode` | Main business location as held by the ABR (no street address: the ABR does not publish it). |
| `businessNames`, `tradingNames` | Current registered business names and legacy trading names. |
| `matchScore`, `matchConfidence`, `abrScore`, `nameSimilarity` | Name searches only. Review `low` confidence rows by hand. |
| `sourceRow` | Your original CSV row, when the input came from a CSV. |

A `RUN_SUMMARY` record in the key-value store counts inputs, matches, not-found, invalid and service errors.

### Your own GUID (optional)

The ABR gives free web services access keys (a "GUID"). The Actor has one built in, so you don't need your own. If you have one, paste it into **ABN Lookup GUID**; it's stored as a secret input.

### Integrations

Schedule it monthly against your supplier sheet and send cancelled ABNs or lapsed GST registrations to email, Slack or Google Sheets with Apify integrations, Zapier or Make. Call it from code with the Apify API or the `apify-client` package.

### FAQ

**Is this official?** The data comes from the ABR's public ABN Lookup web services. This tool is independent: it is **not endorsed by, approved by or affiliated with the Commonwealth, the ABR, the ATO or ASIC.**

**How fresh is the data?** Each run queries the register live. ABN Lookup is updated regularly, but the ABR doesn't guarantee it is complete or current; verify anything important at abr.business.gov.au.

**Why no street address, phone or email?** The ABR doesn't publish them. Only state and postcode of the main business location are public.

**Personal information.** Sole traders' ABN records include their name. Use the results only for legitimate purposes (e.g. invoice and supplier checks) and in line with the Australian Privacy Act. If the ABR withdraws a record, delete your copies too.

### Data source and attribution

Data source: **ABN Lookup, Australian Business Register** (https://abr.business.gov.au), accessed through the ABN Lookup web services under the ABN Lookup Web Services Agreement. © Commonwealth of Australia. The Registrar of the ABR does not guarantee that the information is accurate, up to date or complete, and accepts no liability for its use.

### About

Built with AI and maintained by Luke Main (Cessnock, NSW). Questions or a field you need? Open an issue on the Actor's Issues tab.

# Actor input Schema

## `queries` (type: `array`):

One per line. Mix freely: 11-digit ABNs, 9-digit ACNs (spaces OK) and business or company names. Each is detected automatically.

## `csvUrl` (type: `string`):

Public URL of a CSV to enrich (e.g. a Google Sheet published as CSV, Dropbox or Apify key-value store link). Every original column is kept in `sourceRow`.

## `csvColumn` (type: `string`):

Header name. Leave empty to auto-detect (abn, acn, company, business name, name...).

## `csvStateColumn` (type: `string`):

Per-row state (NSW, VIC...) used to narrow name searches.

## `csvPostcodeColumn` (type: `string`):

Per-row postcode used to narrow name searches.

## `states` (type: `array`):

Limit name searches (and filter results) to these states. Empty = all of Australia.

## `postcode` (type: `string`):

Limit name searches to one postcode (main business location).

## `activeOnly` (type: `boolean`):

Ignore cancelled ABNs in name searches and filter them from results.

## `nameMatchMode` (type: `string`):

Best match = one row per name, ideal for enriching a list. Top matches = several candidate rows per name, for research.

## `maxMatchesPerName` (type: `integer`):

How many candidates to return per name in top matches mode.

## `minimumScore` (type: `integer`):

ABR's own relevance score cut-off (0-100) for name searches. Lower = more, looser candidates.

## `enrichNameMatches` (type: `boolean`):

Fetch the full ABN record (GST, entity type, ACN, business names) for every name match. Turn off for a faster, lighter search.

## `includeNotFound` (type: `boolean`):

Output a row (found = false, with a reason) for inputs with no match or a bad check digit, so your list stays aligned. These rows are free.

## `abrGuid` (type: `string`):

Your own free ABN Lookup web services GUID (register at abr.business.gov.au/Tools/WebServices). Leave empty to use the Actor's built-in key.

## `maxItems` (type: `integer`):

0 = no limit.

## `maxConcurrency` (type: `integer`):

How many ABR requests run at once. Keep it modest to be polite to the register.

## Actor input object example

```json
{
  "queries": [
    "51 824 753 556",
    "Woolworths Group Limited",
    "004 085 616"
  ],
  "activeOnly": false,
  "nameMatchMode": "best",
  "maxMatchesPerName": 5,
  "minimumScore": 70,
  "enrichNameMatches": true,
  "includeNotFound": true,
  "maxItems": 0,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `gst` (type: `string`):

No description

## `summary` (type: `string`):

No description

# 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 = {
    "queries": [
        "51 824 753 556",
        "Woolworths Group Limited",
        "004 085 616"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("luke-main/abn-lookup-enrichment").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 = { "queries": [
        "51 824 753 556",
        "Woolworths Group Limited",
        "004 085 616",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("luke-main/abn-lookup-enrichment").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "51 824 753 556",
    "Woolworths Group Limited",
    "004 085 616"
  ]
}' |
apify call luke-main/abn-lookup-enrichment --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,luke-main/abn-lookup-enrichment"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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