Australian GST Validation API: ABN and ABR Lookup

Australian GST validation is based on the Australian Business Number (ABN), an 11-digit identifier issued by the Australian Business Register (ABR). This guide covers how ABNs and GST registration work, and how Avatcado validates them for you.

What is an ABN?

An ABN (Australian Business Number) is an 11-digit unique identifier for businesses operating in Australia. It is issued by the Australian Business Register and is required for tax and business transactions. In Avatcado, Australian ABNs use the AU country prefix. Example: AU51824753556.

  • AU - country prefix (Avatcado convention)
  • 11 digits - the ABN itself (first two are check digits)

You can also pass the ABN prefix (e.g., ABN51824753556) and Avatcado normalizes it to AU51824753556 automatically. For the full format reference with a free checker, see the Australian ABN format page.

ABN vs GST registration

Having an ABN does not automatically mean the business is registered for GST (Goods and Services Tax). Businesses must register for GST separately once their annual turnover reaches AUD 75,000 (AUD 150,000 for non-profit organizations).

Avatcado checks both: valid: true means the ABN exists and the business has an active GST registration. If the ABN exists but has no GST registration, you get valid: false with the company name and address still included.

The ABR Lookup service

The Australian Business Register provides a public API for looking up ABN details. Key characteristics:

  • Protocol: JSONP (callback wrapper that needs to be stripped)
  • Authentication: requires a GUID (API key) obtained by registration
  • Returns: business name, ABN status, GST registration date, address (state + postcode)
  • Free to use

The ABR API returns GST registration as a date field. If the field contains a date, the business is currently GST-registered. If it is empty, the business is not GST-registered.

Why wrapping the ABR matters

The ABR API has several characteristics that make direct integration painful:

  • JSONP response format requires stripping the callback wrapper before parsing
  • Errors come back as a plain Message string
  • No documented rate limits or caching guidance
  • Authentication requires registering for a GUID

Avatcado wraps the ABR in the same REST API, JSON format, caching layer, and error handling you already use for EU, UK, and other validations. No additional integration work required.

ABN checksum validation

ABNs include a checksum for detecting data entry errors. The algorithm works differently from MOD11 used by Swiss and Norwegian numbers:

  1. Subtract 1 from the first digit
  2. Multiply each of the 11 digits by the weights [10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
  3. Sum all products
  4. The ABN is valid if the sum is divisible by 89

Avatcado validates this checksum before calling the ABR upstream. Invalid checksums return a 422 invalid_vat_format error immediately, saving you an unnecessary API call.

Validating with Avatcado

Pass any Australian ABN to the same endpoint you use for EU, UK, Swiss, and Norwegian numbers:

curl "https://api.avatcado.com/v1/validate?vat_number=AU51824753556" \
  -H "Authorization: Bearer avat_live_YOUR_KEY"

Response:

{
  "data": {
    "valid": true,
    "vat_number": "AU51824753556",
    "country_code": "AU",
    "company": {
      "name": "AUSTRALIAN TAXATION OFFICE",
      "address": "NSW 2640"
    },
    "requested_at": "2026-03-26T12:00:00.000Z"
  },
  "meta": {
    "request_id": "req_abc123"
  }
}

Avatcado normalizes all input formats:

  • AU51824753556, ABN51824753556, and abn51824753556 all work
  • ABN 51 824 753 556 with spaces is also accepted; spaces and dots are stripped automatically
  • The ABN prefix is converted to AU automatically, and lowercase input is uppercased
  • Checksum is validated before making the upstream call
  • Results are cached, so repeat lookups skip the upstream call

Using ABN validation in a checkout flow

For B2B transactions in Australia, collecting and verifying a customer's ABN at checkout is standard practice. Check data.valid in the response. If true, the business has an active GST registration and you can apply the appropriate tax treatment. If false, the ABN exists but the business is not GST-registered, and you should not zero-rate the transaction.

Handling edge cases

  • Invalid ABN checksum: Avatcado validates the checksum before hitting the ABR. If it fails, you get a 422 invalid_vat_format error immediately, catching typos without a network round-trip.
  • ABN exists but no GST: The response includes valid: false with company.name and company.address populated. The business exists but is not GST-registered.
  • ABN not found: The response includes valid: false with company: null. The ABN does not exist in the ABR.
  • ABR is down: Avatcado serves a cached result with meta.stale: true if one exists. Otherwise, a 503 upstream_unavailable error is returned. Implement retry logic with exponential backoff for transient failures.

Batch validation for vendor onboarding

When onboarding multiple Australian vendors, use the batch endpoint to validate up to 50 ABNs in a single request (Pro and Business plans):

curl -X POST "https://api.avatcado.com/v1/validate/batch" \
  -H "Authorization: Bearer avat_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "vat_numbers": [
      "AU51824753556",
      "AU53004085616",
      "AU33102417032"
    ]
  }'

Each item in the response has its own data and meta block, so you can see which ABNs are valid and which failed independently of the others.

SDK integration

The @avatcado/node SDK covers single and batch validation:

import Avatcado from "@avatcado/node";

const avatcado = new Avatcado("avat_live_YOUR_KEY");

const { data, error } = await avatcado.vat.validate({
  vatNumber: "AU51824753556",
});
if (error) {
  console.error(error.code, error.message);
} else {
  console.log(data.data.valid, data.data.company?.name);
}

const batch = await avatcado.vat.validateBatch({
  vatNumbers: ["AU51824753556", "AU53004085616"],
});

The avatcado Python package provides the same functionality with typed exceptions:

from avatcado import Avatcado

avatcado = Avatcado("avat_live_YOUR_KEY")

result = avatcado.vat.validate("AU51824753556")
if result.data.valid:
    print(result.data.company.name)

batch = avatcado.vat.validate_batch(["AU51824753556", "AU53004085616"])

Australian GST rates

Australia has a flat 10% GST rate with no reduced rates. GST-free items (fresh food, health, education) are zero-rated. Note that the /v1/rates endpoint also returns the current Australian GST rate alongside the other supported countries.

Test mode

Use a avat_test_ API key with any valid ABN checksum. For example:

  • AU51824753556 - returns valid with test company data

Any ABN that passes the checksum validation will return a test response in test mode. Test mode never hits the ABR, so your integration tests are fast and deterministic.

Get your API key and start validating Australian ABNs in under 2 minutes.

Frequently asked questions

What is the difference between an ABN and a GST number?

An ABN (Australian Business Number) is an 11-digit identifier issued by the Australian Business Register for businesses operating in Australia; it is required for tax and business transactions generally, not just GST. GST registration is a separate step that becomes mandatory once annual turnover reaches AUD 75,000 (AUD 150,000 for non-profit organizations), so a business can hold a perfectly valid ABN without being registered for GST, and many small businesses do. Australia has no separately formatted 'GST number': the ABN is the identifier, and GST registration is a status attached to it, which the ABR exposes as a date field (a date present means currently registered, an empty field means not). For tax treatment decisions you need both facts, which is why Avatcado checks both: valid: true means the ABN exists and carries an active GST registration, while an ABN without GST registration returns valid: false with the company details still included.

Is the ABR Lookup API free?

Yes. The ABR provides a free lookup service with no per-request charges; the only gate is registering for a GUID, which acts as your API key. What the price tag does not cover is integration friction. The API responds in JSONP, so you have to strip a callback wrapper before you can parse the payload, errors come back as a plain Message string rather than structured codes, and there are no documented rate limits or caching guidance to design around. GST status arrives as a date field you have to interpret yourself: a populated date means currently registered, an empty field means not. None of this is hard individually, but it adds up to a second bespoke integration next to whatever you built for VIES or HMRC. Avatcado wraps the ABR in the same REST endpoint, JSON envelope, caching layer, and error handling used for every other supported country, so Australian coverage costs no additional integration work.

Can a business have an ABN but not be registered for GST?

Yes. All Australian businesses need an ABN for tax and government purposes, but GST registration is only mandatory when taxable turnover exceeds AUD 75,000 (AUD 150,000 for non-profits), so the register holds plenty of valid ABNs with no GST registration behind them. This is the single most important nuance in Australian validation, because 'the ABN exists' and 'the business is GST-registered' lead to different tax treatment. Avatcado resolves it in one response with a three-way distinction: valid: true means an active GST registration; valid: false with company.name and company.address still populated means the ABN is real but carries no GST registration; and valid: false with company: null means the ABN does not exist in the ABR at all. That lets your checkout say the right thing to the customer, since 'we found your business but it has no GST registration' is a very different message from 'this ABN does not exist', without needing a second lookup.

What format should I use when validating an Australian business number?

Use the AU prefix followed by the 11 digits, for example AU51824753556; that is Avatcado's convention for Australian numbers so they fit the same vat_number parameter as every other country. You do not need to sanitize customer input first. ABN51824753556 and lowercase abn51824753556 are converted to the AU form automatically, and 'ABN 51 824 753 556' with spaces also works, since spaces and dots are stripped during normalization. Whatever shape goes in, the response echoes the normalized form (AU51824753556) in the vat_number field, so store that canonical value rather than the raw input. Before any upstream call, Avatcado also verifies the ABN checksum (subtract 1 from the first digit, weight all eleven digits, and require the sum to divide evenly by 89); a string that fails it returns a 422 invalid_vat_format error immediately, so obvious typos never reach the ABR or consume a network round trip.

How do I validate an ABN in my checkout flow?

Pass the ABN with an AU prefix to the Avatcado validate endpoint (GET /v1/validate?vat_number=AU51824753556) and branch on the response. If data.valid is true, the business has an active GST registration and you can apply the appropriate B2B tax treatment. If data.valid is false but company details are present, the ABN exists without a GST registration, so do not zero-rate. If company is null, the ABN does not exist in the ABR at all, which usually means a typo or a made-up number. Handle the 422 invalid_vat_format error to catch checksum failures before any upstream call happens, giving the customer instant feedback on transposed digits. Handle a 503 upstream_unavailable (returned only when the ABR is down and no cached result exists) by letting the customer proceed and revalidating later. In test mode any ABN with a valid checksum returns deterministic test data, so the whole flow is testable in CI.

Can I validate multiple ABNs at once?

Yes. The batch endpoint (POST /v1/validate/batch) accepts up to 50 VAT or GST numbers per request, and you can mix Australian ABNs freely with EU, UK, Swiss, and Norwegian numbers in the same call. Each item in the response carries its own data and meta block and succeeds or fails independently, so one mistyped ABN does not block the other 49; you see per-item results and can report exactly which vendors failed and why. Batch validation is available on Pro and Business plans and is the right tool for vendor onboarding, where you might receive a spreadsheet of supplier ABNs and want them verified in one round trip instead of a request loop. For backlogs larger than 50 at a time, page through your records and submit successive batches. The @avatcado/node SDK exposes this as avatcado.vat.validateBatch, and the Python package mirrors it with validate_batch.

What happens if the ABR is down?

Avatcado degrades in two stages. If the ABN has been validated before, the cached result is served, and if the entry is older than the cache window it is still served during the outage, marked with meta.stale: true so you know it is a fallback rather than a fresh lookup. Only when no cached result exists at all does the API return a 503 with the code upstream_unavailable, because guessing about a number it has never seen would be worse than an honest failure. Build for both cases: treat stale results as acceptable for routine flows, optionally flagging them for revalidation once the ABR recovers, and implement retry logic with exponential backoff for the 503 path, since ABR outages are typically transient. In a checkout, prefer letting the customer proceed with conservative tax treatment over blocking the sale. Test mode never hits the ABR, so upstream outages cannot affect your CI runs either.

Sources

Related guides