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 requests

r = requests.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"])
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.

Data Source

BSB data is sourced from the official directory and checked daily. Historical changes are preserved and available via the history endpoint.