Skip to content
Zeitwide

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 --offline

Six 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"));
}