Stop hard-coding holiday lists.
One API for Fedwire, FedACH, FedNow, T2, CHAPS and public holidays. 10,000 calls a day per key, free in the beta. Every answer names its sources and carries a signed receipt.
Make your first call
Every call needs a key. Create one for free in the app; it takes a minute.
curl https://api.zeitwide.com/v1/calendars/GB-CHAPS/days/2026-12-28 \
-H "Authorization: Bearer zw_live_…"
curl -X POST https://api.zeitwide.com/v1/business-days/add \
-H "Authorization: Bearer zw_live_…" -H "Content-Type: application/json" \
-d '{"calendars":["US-FEDWIRE","GB-CHAPS"],"date":"2026-12-24","days":2}'What every answer carries
sources
The official pages behind each closure, with the hash of the copy we read.
dataset_release
The same request against the same release always gives the same answer.
receipt
An Ed25519-signed record of the question and answer. Check it with POST /v1/receipts/verify or offline with our public keys.
Connect an agent
{ "mcpServers": { "zeitwide": { "url": "https://zeitwide-api-dev-g4msrgbhra-uc.a.run.app/mcp" } } }
uvx zeitwide-mcp --offlineSix tools with the same answers as the API. MCP setup
Get told when a date changes
Subscribe a webhook to closure changes. Check the signature before you act on it:
import crypto from "node:crypto";
// Zeitwide-Signature: t=<unix seconds>,v1=<hex HMAC-SHA256 of "t.body">
export function verify(header, body, secret) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${body}`).digest();
return crypto.timingSafeEqual(expected, Buffer.from(parts.v1, "hex"));
}