The dataset
Where the register comes from, how often it changes, and how to pin it.
Source
Bits AS publishes the Norwegian BIC-IBAN table — an Excel sheet mapping each four digit bank identifier to a BIC and bank name. It is the authoritative source for deriving a BIC from a Norwegian IBAN, and it is what this API serves.
- Source: bits.no/en/iban
- File: bits.no/document/iban
- Shape: 2 306 identifiers across 98 banks
Bits republishes the file without notice and without a version number; the sheet’s own title carries the publication date.
Provenance on every deployment
curl https://api.kontosjekker.asamsig.com/v1/dataset
{
"version": "2026-06-22.3d073ac8",
"source": {
"name": "Bits AS — Norwegian BIC-IBAN table",
"url": "https://bits.no/document/iban/",
"sheet": "Norwegian BIC Table (22.06.26)",
"retrievedAt": "2026-06-22T09:12:04.221Z"
},
"sourceHash": "3d073ac8…",
"contentHash": "c46fc68e…",
"counts": { "banks": 98, "clearingCodes": 2306, "logos": 40 }
}
version is YYYY-MM-DD.<short source hash> and sorts chronologically.
sourceHash is over the raw spreadsheet, contentHash over the normalised
dataset — a Bits re-publication with no substantive change moves the first and
leaves the second alone.
Bank list responses carry meta.datasetVersion, so any cached answer can be
traced to the publication it came from.
Ingestion
A daily job downloads the sheet, parses it, and diffs it against the
version being served. When something changed it stores the new version with a
changelog of additions, removals and moved identifiers, and the service starts
answering from it without a restart. GET /v1/dataset always reports the version in use.
A silently mangled register would misroute payments, so a sheet that doesn’t parse cleanly is rejected, and so is one that drops more than a fifth of its banks or identifiers. The service then keeps answering from the last good version.
Normalisation is deliberately conservative:
- Names are trimmed and whitespace-collapsed; where the sheet spells one BIC’s name two ways, the most frequent spelling wins, and shouty all-caps loses ties.
- Identifiers are grouped by BIC, so one bank is one object.
- Rows failing the BIC format check abort the build rather than being skipped.
Pinning
Bundle the dataset instead of calling the API and you pin it by version:
@kontosjekker/data ships the same banks.json the service runs on. Upgrade the
package when you want the newer register.