BSB Lookup API
Free REST API for Australian BSB numbers. JSON responses, no API key, no signup.
https://bsbfinder.com/api/v1
Quickstart
Look up BSB 062-000 in your language of choice:
curl https://bsbfinder.com/api/v1/bsb/062-000
import httpx # or: import requests (same .get/.json API) r = httpx.get("https://bsbfinder.com/api/v1/bsb/062-000") data = r.json() if data["success"]: branch = data["data"] print(branch["institution_name"], "-", branch["branch_name"]) else: print("Error:", data["error"]) # Prefer a ready-made helper? pip install "bsb-validate[lookup]" # from bsb_validate import lookup; lookup("062-000")
const res = await fetch("https://bsbfinder.com/api/v1/bsb/062-000"); const { success, data, error } = await res.json(); if (success) { console.log(`${data.institution_name} - ${data.branch_name}`); } else { console.error("Error:", error); }
import java.net.URI; import java.net.http.*; HttpClient client = HttpClient.newHttpClient(); HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://bsbfinder.com/api/v1/bsb/062-000")) .GET() .build(); HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString()); System.out.println(res.body()); // parse with Jackson, Gson, or org.json
package main import ( "encoding/json" "fmt" "net/http" ) func main() { res, _ := http.Get("https://bsbfinder.com/api/v1/bsb/062-000") defer res.Body.Close() var body map[string]interface{} json.NewDecoder(res.Body).Decode(&body) fmt.Println(body["data"]) }
<?php $res = file_get_contents("https://bsbfinder.com/api/v1/bsb/062-000"); $body = json_decode($res, true); if ($body["success"]) { echo $body["data"]["institution_name"]; }
require "net/http" require "json" res = Net::HTTP.get(URI("https://bsbfinder.com/api/v1/bsb/062-000")) body = JSON.parse(res) puts body["data"]["institution_name"] if body["success"]
Response Format
Every response uses the same envelope. Check success before reading data.
{
"success": true,
"data": {
"bsb": "062-000",
"institution": "CBA",
"institution_name": "Commonwealth Bank of Australia",
"branch_name": "Head Office",
"address": "48 Martin Place",
"suburb": "Sydney",
"state": "NSW",
"postcode": "2000",
"payments": { "paper": true, "electronic": true, "high_value": true }
},
"meta": { "source": "Official BSB Directory" }
}
Errors set success: false and an error string. Rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining) are returned on every response.
Endpoints
Look up a single BSB. Accepts 062-000 or 062000.
Change history for a BSB — additions, deletions, field updates with timestamps.
Validate format and existence in one call. Returns valid and exists booleans.
Search by BSB, bank name, suburb, or postcode.
q — query string (required)bank — filter by institution code (e.g. CBA)state — filter by state (NSW, VIC, …)limit — max results, default 20, cap 100Look up up to 50 BSBs in one request. Body: {"bsbs": ["062-000", "033-000"]}
List all financial institutions with BSB counts.
Aggregate stats: total BSBs, institutions, last update.
Bulk Lookup Example
curl -X POST https://bsbfinder.com/api/v1/bulk \ -H "Content-Type: application/json" \ -d '{"bsbs": ["062-000", "033-000", "082-001"]}'
import requests res = requests.post( "https://bsbfinder.com/api/v1/bulk", json={"bsbs": ["062-000", "033-000", "082-001"]}, ) for branch in res.json()["data"]["results"]: print(branch["bsb"], branch["institution_name"])
const res = await fetch("https://bsbfinder.com/api/v1/bulk", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ bsbs: ["062-000", "033-000", "082-001"] }), }); const { data } = await res.json(); data.results.forEach(b => console.log(b.bsb, b.institution_name));
Rate Limits
The free tier allows 100 requests per day per IP address. When you exceed the limit the API returns HTTP 429. Every response includes:
X-RateLimit-Limit— your daily capX-RateLimit-Remaining— requests left in the window
Need more? A paid tier with unlimited daily requests is coming soon — get in touch if you want early access.
Spreadsheets (Excel & Google Sheets)
The API returns JSON, so use a JSON-aware import. (Excel's IMPORTXML-style and Sheets' IMPORTDATA functions read XML/CSV, not JSON — the snippets below parse JSON directly.)
// Data > Get Data > From Other Sources > Blank Query, then Advanced Editor: let Source = Json.Document(Web.Contents("https://bsbfinder.com/api/v1/bsb/062-000")), Branch = Source[data] in Branch
// Extensions > Apps Script — paste, save, then use =BSB("062-000") in a cell: function BSB(bsb) { const url = "https://bsbfinder.com/api/v1/bsb/" + encodeURIComponent(bsb); const res = UrlFetchApp.fetch(url, { muteHttpExceptions: true }); const body = JSON.parse(res.getContentText()); if (!body.success) return body.error; return [[body.data.institution_name, body.data.branch_name, body.data.suburb, body.data.state]]; }
Attribution
The API is free to use. If BSBFinder powers something public, a link back helps keep it free. Drop this anywhere it fits:
<a href="https://bsbfinder.com">BSB data by BSBFinder</a>
Update cadence, uptime & versioning
- Update cadence. Data is refreshed from the official monthly register, with automated daily checks for changes. Each record keeps a dated change history (see the history endpoint).
- Uptime. The service targets best-effort high availability. It is provided free and as-is with no formal SLA; build in sensible retries and caching (responses send
Cache-Controland anETag— sendIf-None-Matchto get a cheap304). - Versioning. The
/api/v1namespace is stable — existing fields and response shapes will not change under v1. New fields may be added additively. Any breaking change ships under a new version path. - Rate limits. 100 requests/day/IP on the free tier. Need more? Get in touch for a higher limit.
Data Source
BSB data is sourced from the official directory and checked daily. Historical changes are preserved and available via the history endpoint.