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.
/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"}}
]
}
/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.
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"])
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
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 -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.