I Built a Free BSB Validation API for Australian Devs
If you've ever built a payment form, payroll system, or anything that touches Australian bank transfers, you've probably had to deal with BSB numbers.
BSBs (Bank State Branch codes) are the 6-digit numbers that identify Australian bank branches. Every domestic transfer needs one. And yet there's no decent free API to validate them — until now.
The problem
A few months ago I was building a payment feature for a marketplace platform. Users were entering BSB numbers manually, and we had no way to validate them before submitting to Stripe.
The options were:
- AusPayNet (the official source) — provides a CSV download, no API
- Existing BSB lookup sites — no API, just UI
- Building our own — parse the CSV, host it somewhere, build an endpoint
So I built it. And then I thought, why not just make it public?
What I built
FindBSB — a free JSON API for Australian BSB lookups. No API key required. No signup. Just HTTP.
Base URL: https://findbsb.com.au/api
Single BSB lookup
curl https://findbsb.com.au/api/bsb/062-000
{
"bsb": "062-000",
"mnemonic": "CBA",
"bank": "Commonwealth Bank of Australia",
"branch": "48 Martin Place Sydney",
"address": "48 Martin Place",
"suburb": "Sydney",
"state": "NSW",
"postcode": "2000",
"payments": ["paper", "electronic", "cash"],
"closed": false
}
Filter by bank, state, suburb, postcode
curl "https://findbsb.com.au/api/bsb?bank=ANZ&state=NSW&limit=5"
Bulk validation — up to 500 BSBs per request
This is the one I'm most proud of. Paste a list, get back a clean result:
curl -X POST https://findbsb.com.au/api/validate \
-H "Content-Type: application/json" \
-d '{"bsbs": ["062-000", "012-003", "999-999"]}'
{
"total": 3,
"valid": 2,
"invalid": 1,
"closed": 1,
"results": [
{"bsb": "062-000", "valid": true, "closed": false, "bank": "Commonwealth Bank of Australia", ...},
{"bsb": "012-003", "valid": true, "closed": true, "bank": "Australia & New Zealand Banking Group", ...},
{"bsb": "999-999", "valid": false, "error": "not found"}
]
}
Python example
import requests
def validate_bsbs(bsb_list):
response = requests.post(
'https://findbsb.com.au/api/validate',
json={'bsbs': bsb_list},
headers={'User-Agent': 'MyApp/1.0'}
)
return response.json()
result = validate_bsbs(['062-000', '012-003', '999-999'])
print(f"Valid: {result['valid']}, Invalid: {result['invalid']}")
JavaScript example
const res = await fetch('https://findbsb.com.au/api/bsb/062-000');
const bsb = await res.json();
console.log(bsb.bank); // Commonwealth Bank of Australia
How it works
- Data sourced from AusPayNet (the official Australian payments body) — 18,000+ BSBs
- Updated monthly when AusPayNet publishes new data
- Built on AWS Lambda + API Gateway, proxied through Cloudflare
- Rate limited to 30 requests/minute per IP — use
/api/validatefor bulk
Also on RapidAPI
If you prefer the RapidAPI ecosystem, it's listed there too: search FindBSB — Australian BSB Lookup.
Full docs
API docs and live playground at findbsb.com.au/api/
Would love feedback — especially if there are endpoints or response fields that would make this more useful for your use case. Happy to add postcode search, SWIFT codes alongside BSBs, or anything else that's missing.
Top comments (0)