BYTETOOLS

Swiss National Bank Data Portal API

Free Swiss National Bank data API with no key: monthly CHF exchange rate averages back to 1999, plus the full SNB statistical cube catalogue as JSON or CSV.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the Swiss National Bank Data Portal API?

The Swiss National Bank data portal serves its published statistics as free JSON or CSV cubes at data.snb.ch, with no key or registration. The devkum cube returns monthly average CHF exchange rates going back to 1999 in one request.

The SNB models everything as a cube — a named dataset with dimensions you can slice — rather than as one endpoint per statistic. That takes a moment to get used to, but it means the same URL shape retrieves exchange rates, policy rates, monetary aggregates and balance of payments data. Swap the cube id and the rest of your code is unchanged.

Because a cube returns its full history by default, the monthly FX cube hands back more than twenty-five years of observations in a single response. That is genuinely useful for charting, and genuinely wasteful if you only wanted last month. Slice with the date parameters rather than fetching everything and discarding it, and read the `unit` in each series' metadata — the exchange rate cube is quoted at 11am Zurich time and says so.

Quick facts

Base URL
https://data.snb.ch/api/cube
Authentication
No key or registration. Published by the SNB as open statistical data.
Rate limit
No documented limit. Series update monthly or quarterly depending on the cube.
Pricing
Free.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the Swiss National Bank Data Portal API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Monthly average CHF exchange rates since 1999

GET https://data.snb.ch/api/cube/devkum/data/json/en

curl
curl 'https://data.snb.ch/api/cube/devkum/data/json/en'
JavaScript (fetch)
const res = await fetch("https://data.snb.ch/api/cube/devkum/data/json/en");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://data.snb.ch/api/cube/devkum/data/json/en", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "timeseries": [
    {
      "header": [
        {
          "dim": "Monthly average/End of month",
          "dimItem": "Monthly average"
        },
        {
          "dim": "Currency",
          "dimItem": "Europe - EUR 1"
        }
      ],
      "metadata": {
        "key": "EPB@SNB.devkum{M0,EUR1}",
        "frequency": "P1M",
        "scale": "",
        "unit": "Rates at 11 am. in CHF"
      },
      "values": [
        {
          "date": "1999-01",
          "value": 1.6052
        },
        {
          "date": "1999-02",
          "value": 1.5983
        },
        {
          "date": "1999-03",
          "value": 1.5948
        },
        {
          "date": "1999-04",
          "value": 1.6019
        },
        {
          "date": "1999-05",
          "value": 1.6028
        },
        {
          "date": "1999-06",
          "value": 1.5948
        },
        {
          "date": "1999-07",
          "value": 1.6041
        },
        {
          "date": "1999-08",
          "value": 1.6003
        },
        {
          "date": "1999-09",
          "value": 1.6016
        },
        {
          "date": "1999-10",
          "value": 1.594
        },
        {
          "date": "1999-11",
          "value": 1.6049
        },
        {
          "date": "1999-12",
          "value": 1.6012
        },
        {
          "date": "2000-01",
          "value": 1.6097
        },
        {
          "date": "2000-02",
          "value": 1.6069
        },
        {
          "date": "2000-03",
          "value": 1.6046
        },
        {
          "date": "2000

Parameters

ParameterTypeRequiredDescription
cube idpath segmentRequiredIdentifier of the SNB dataset, for example `devkum` for monthly average FX rates. devkum
formatpath segmentRequired`json` or `csv`. JSON gives typed values; CSV is easier to load into a spreadsheet. json
langpath segmentRequired`en`, `de`, `fr` or `it`, controlling dimension labels. en
fromDate / toDatequeryOptionalRestrict the returned observations. Format matches the cube frequency, so `1999-01` for a monthly cube. 2026-01
dimSelqueryOptionalSelect specific dimension members instead of the whole cube. D0(EUR1)

Response fields

timeseries[]array
One entry per dimension combination in the cube — several currencies come back as several series.
timeseries[].headerarray
The dimension members that identify this series, each as a `dim` / `dimItem` pair.
timeseries[].metadata.keystring
Canonical series key such as `EPB@SNB.devkum{M0,EUR1}`, stable enough to store as an identifier.
timeseries[].metadata.frequencystring
ISO 8601 duration for the observation interval — `P1M` for monthly.
timeseries[].metadata.unitstring
What the numbers mean, including the quotation time for FX cubes.
timeseries[].values[]array
Observations as `date` / `value` pairs, oldest first.

What you can build with the Swiss National Bank Data Portal API

  • Chart a long CHF exchange rate history without stitching together yearly files
  • Pull Swiss policy rates and monetary aggregates through the same URL shape
  • Export a cube as CSV for analysis in a spreadsheet
  • Store `metadata.key` as a stable series identifier in your own database

Common errors and how to fix them

404

Unknown cube id.

Fix: Cube ids are lowercase and short, like `devkum` or `rendoblim`. Browse the data portal to confirm the id before hard-coding it.

Huge response

No date filter was applied.

Fix: Cubes return their entire history by default. Add `fromDate` and `toDate` in the cube's own period format.

Empty values array

The dimension selection matched no data.

Fix: Check `dimSel` member codes against the `header` block of an unfiltered response.

Swiss National Bank Data Portal API — frequently asked questions

Is the Swiss National Bank data API free?

Yes. data.snb.ch needs no key or account, and the SNB publishes its statistics as open data in JSON and CSV.

Which cube holds Swiss exchange rates?

`devkum` holds monthly averages and end-of-month values; other cubes cover daily rates and different periodicities. The cube list on the data portal is the authoritative index.

Does this API return daily CHF rates?

The monthly cube used in the example does not. The SNB publishes daily FX cubes separately, and the same URL shape retrieves them once you substitute the cube id.

Can I call the SNB API from the browser?

It does not return permissive CORS headers, so a direct front-end fetch is blocked. Proxy the request through your own backend and cache the result — these series change monthly at most.

Tools that pair with this API

Swiss National Bank Data Portal is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.