---
title: The dataset
description: 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](https://bits.no/en/iban/)
- File: [bits.no/document/iban](https://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

```bash
curl https://api.kontosjekker.asamsig.com/v1/dataset
```

```json
{
  "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.
