Two Endpoints. Eighteen Series.

Everything in ALM DataHub is one HTTPS call away — the same API that powers the Excel add-in, open to your scripts, notebooks, and pipelines.

$ curl -H "Authorization: Bearer $TOKEN" \
      "https://almdatahub.com/api/v1/range/sonia?from=2026-08-01&to=2026-08-24"

{"rows": [{"date": "2026-08-03", "value": 3.7311}, …]}

Two shapes cover everything

Point lookups and bulk pulls. No per-series URL zoo to memorise.

POST /api/v1/lookup

Up to 500 scalar values in a single round-trip — mix series freely. Each item carries your own id, echoed back; one bad item doesn't fail the batch. Whole batch counts as one request against your rate limit.

{
  "requests": [
    {"id": "a", "fn": "SONIA", "args": {"date": "2026-08-24"}},
    {"id": "b", "fn": "GILT",  "args": {"tenor": 10, "date": "2026-08-24"}},
    {"id": "c", "fn": "PRA_FS", "args": {"rating": 2, "tenor": 10,
      "currency": "GBP", "sector": "FINANCIAL", "date": "2026-07-31"}}
  ]
}
GET /api/v1/range/{series}

A whole time-series or cross-section in one call — a year of SONIA, a full yield curve, a complete life table. Append ?format=csv for CSV instead of JSON.

GET /api/v1/range/sonia?from=2026-01-01&to=2026-08-24
GET /api/v1/range/gilt?tenor=10&from=2020-01-01&to=2026-08-24
GET /api/v1/range/sw_curve?curve_type=GILT_NOMINAL&curve_date=2026-08-24
GET /api/v1/range/mortality?sex=male&period=2022-2024

Authentication in one line

Generate a personal token from your account page and pass it as a bearer header. Tokens can be revoked at any time and expire automatically after six months unused.

Authorization: Bearer alm_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Whatever you script in

The same one-year SONIA pull, four ways.

Python
import pandas as pd, requests

resp = requests.get(
    "https://almdatahub.com/api/v1/range/sonia",
    params={"from": "2025-08-24", "to": "2026-08-24"},
    headers={"Authorization": f"Bearer {token}"},
)
df = pd.DataFrame(resp.json()["rows"])
R
library(httr); library(jsonlite)

resp <- GET(
  "https://almdatahub.com/api/v1/range/sonia",
  query = list(`from` = "2025-08-24", `to` = "2026-08-24"),
  add_headers(Authorization = paste("Bearer", token)))
rows <- fromJSON(content(resp, "text"))$rows
Power Query
let
  Source = Json.Document(Web.Contents(
    "https://almdatahub.com/api/v1/range/sonia?from=2025-08-24&to=2026-08-24",
    [Headers = [Authorization = "Bearer " & Token]])),
  Table = Table.FromRecords(Source[rows])
in
  Table
curl
curl -H "Authorization: Bearer $TOKEN" \
  "https://almdatahub.com/api/v1/range/sonia?from=2025-08-24&to=2026-08-24&format=csv" \
  -o sonia.csv

Paste-ready Power Query templates for every series live at /docs/templates.

Fair limits, sensible caching

Rate limits
60 requests per minute, 5,000 per day by default — and a 500-item batch counts as one. Higher limits available on corporate plans.
Caching
Historical data never changes, so past-dated responses are served as permanently cacheable — your client or proxy can keep them forever. Current-day responses refresh hourly.
Versioning
Everything lives under /api/v1. Breaking changes mean a new version, not a changed response.

Ready to look deeper?

The full reference documents every function, argument, and unit.