BSB Lookup API

Free REST API for Australian BSB numbers. JSON responses, no API key, no signup.

Rate limit
100 / day
Auth
None
Format
JSON
Version
v1
Base URL
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

GET /api/v1/bsb/{bsb}

Look up a single BSB. Accepts 062-000 or 062000.

GET /api/v1/bsb/{bsb}/history

Change history for a BSB — additions, deletions, field updates with timestamps.

GET /api/v1/validate/{bsb}

Validate format and existence in one call. Returns valid and exists booleans.

GET /api/v1/search?q={query}

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 100
POST /api/v1/bulk

Look up up to 50 BSBs in one request. Body: {"bsbs": ["062-000", "033-000"]}

GET /api/v1/institutions

List all financial institutions with BSB counts.

GET /api/v1/stats

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 cap
  • X-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-Control and an ETag — send If-None-Match to get a cheap 304).
  • Versioning. The /api/v1 namespace 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.