# PayOps Kit > Payment-ops utilities for people and AI agents: free, keyless checks for US routing numbers (and the bank behind one), IBAN and BIC, banking-day calendars (US Federal Reserve, TARGET2, England & Wales), US ACH settlement and return deadlines, payment codes (ACH return/NOC/SEC, ISO 20022 status reasons, ISO 4217) and finance identifiers (LEI, ISIN, CUSIP, SEDOL, Luhn), as a REST API and a remote MCP server. Deterministic and read-only; inputs are never stored or logged. Results are informational. A valid format or check digit does not prove an account, BIC or identifier is live. Bank names for routing numbers (lookup_bank_by_routing_number, and the bank field of validate_routing_number and the REST routing-number endpoints) come from primary routing numbers in FFIEC Call Reports joined to FDIC BankFind and from banks' own published routing-number pages, each with its source and as-of date; not from the Federal Reserve's E-Payments Routing Directory, so many valid numbers are missing (bank: null, bankLookup.reason "not_listed", with a link to the Fed directory). Confirm with the receiving bank or the Fed directory before sending funds. ACH timing follows FedACH and the Nacha Operating Rules but is not a substitute for them, your ACH Operator's schedule or your ODFI agreement (ODFI cutoffs are earlier). ## MCP - Endpoint: https://payopskit.com/mcp (Streamable HTTP, stateless, JSON responses, no auth) - Claude Code: `claude mcp add --transport http payops-kit https://payopskit.com/mcp` - Claude Desktop / claude.ai: Settings → Connectors → Add custom connector → https://payopskit.com/mcp - Cursor: `{"mcpServers":{"payops-kit":{"url":"https://payopskit.com/mcp"}}}` - VS Code: `{"servers":{"payops-kit":{"type":"http","url":"https://payopskit.com/mcp"}}}` ### Tools - `validate_routing_number`(routing_number): Validate a US ABA routing transit number (9 digits) with the 3-7-1 check-digit algorithm, or compute the check digit when given only the first 8 digits. Also decodes the Federal Reserve routing symbol (first two digits): 00 U.S. Government; 01–12 a Federal Reserve district (Reserve Bank and city); 21–32 thrift institutions; 61–72 electronic transactions; 80 traveler's checks; any other prefix is unassigned (invalid). For a valid number it also returns the bank (name, city/state, active or closed; a merged bank's number under the successor that holds it, the closed bank as formerly; source and as-of date) when the public data has it, else bank: null and bankLookup.reason: see lookup_bank_by_routing_number. A correct check digit does not prove the number is in use. Spaces and hyphens are ignored. The input is never stored or logged. - `lookup_bank_by_routing_number`(routing_number): Which bank a US ABA routing number belongs to: legal name, headquarters city and state, active or closed (with the closing date); a merged bank's number is named for the active successor that holds it now, with the closed bank as formerly. Also the brand and uses (wire, ACH, checks; states) the bank lists it for, and the source with its as-of date. The number is checked first (3-7-1 checksum; 8 digits complete it); an invalid one is not looked up. Data: primary routing numbers from FFIEC Call Reports joined to FDIC BankFind, plus the routing numbers banks publish on their own websites; NOT the Federal Reserve's E-Payments Routing Directory, so many valid numbers (a bank's other ACH or state numbers, acquired banks' numbers, credit unions) are missing: then bank is null and bankLookup says why (not_listed) and links the Fed directory. Confirm with the receiving bank or the Fed directory before sending funds. The input is never stored or logged. - `validate_iban`(iban): Validate an IBAN (electronic or print format; spaces allowed) against the SWIFT IBAN Registry: country code, length, BBAN structure and the ISO 7064 mod-97 check digits. Returns the electronic and print formats, the expected check digits, the country and its SEPA membership, the bank and branch codes where the registry positions are known, and every problem found. Valid means well formed — not that the account exists or can receive payments; national check digits inside the BBAN are not verified. The input is never stored or logged. - `compute_iban_check_digits`(country, bban): Compute the two IBAN check digits (ISO 7064 mod 97-10) for a country code and a BBAN — the domestic account identifier that follows the check digits — and return the complete IBAN in electronic and print formats. Reports an error when the country has no IBAN or the BBAN doesn't match the country's registry structure. - `parse_bic`(bic): Parse and format-check a BIC / SWIFT code (ISO 9362; 8 or 11 characters): institution code, ISO 3166 country, location code and branch code. Flags test & training BICs (location ends in 0), passive participants (ends in 1, not connected to the SWIFT network) and reverse billing (ends in 2); branch XXX or a BIC8 is the head office; returns both the BIC8 and BIC11 forms. Format check only: it cannot tell whether a BIC is registered (SWIFT's BIC directory is not used). - `business_day_math`(calendar, operation, date, n, end_date): Banking-day arithmetic on a bank holiday calendar. Calendars: us-fed (Federal Reserve Banks — FedACH and Fedwire; a Sunday holiday is observed Monday, a Saturday holiday is NOT observed), target2 (ECB TARGET closing days for EUR: Jan 1, Good Friday, Easter Monday, May 1, Dec 25, Dec 26), uk-ew (England & Wales bank holidays with substitute days). Operations: is-business-day; next / previous = the first business day strictly after / before date; add / subtract = move n business days (n 0–2000; add from Friday by 1 gives Monday); count = business days in (date, end_date], negative when end_date is earlier. Returns the answer, a one-line explanation and the holidays in range (the first 100; holidaysInRangeTotal counts them all). Unscheduled closures and future one-off proclamations are not known. - `list_bank_holidays`(calendar, year): List the holidays (weekdays the calendar is closed) of a banking calendar for one year, with observed and substitute days, the holidays that close no weekday (for example a Fed holiday on a Saturday: the Federal Reserve Banks are open the Friday before) and the calendar caveats. Calendars: us-fed (years 1990–2099), target2 (2002–2099), uk-ew (1995–2099, with the known one-off proclamations). - `ach_settlement_date`(submitted_at, effective_date, amount, sec_code): When a US ACH entry settles on FedACH, from its submission time (Eastern Time wall clock; omitted = the current time in New York) and Effective Entry Date (default: the submission date). Applies the Same Day ACH windows (deposit deadlines 10:30 a.m., 2:45 p.m. and 4:45 p.m. ET; settlement 1:00, 5:00 and 6:00 p.m. ET), IAT ineligibility (sec_code) and the per-payment limit (amount): $1,000,000 per payment (rising to $10,000,000 for entries submitted on or after September 17, 2027). Earlier submission dates get the rules then in force: no Same Day ACH before September 23, 2016, two windows before March 19, 2021, a $25,000 limit before March 20, 2020 and $100,000 before March 18, 2022. Otherwise next-day or future-dated settlement at 8:30 a.m. ET, on the Federal Reserve banking calendar. Returns the settlement date and time, the window used, the state of each window, the limit applied and an explanation. Informational: ODFIs set earlier cutoffs; not a substitute for the Nacha Operating Rules, your ACH Operator schedule or your ODFI agreement. - `ach_return_deadline`(settlement_date, code): ACH deadlines counted from a settlement date on the Federal Reserve banking calendar. With a return reason code (R01–R85): its return deadline — generally 2 banking days; 60 calendar days for extended returns (unauthorized consumer debits R05, R07, R10, R11, R37, R51, R53, and R33, R38, R52). With a NOC code (C01–C14, refused C61–C69): the NOC timing. Always also returns the standard return, extended return, NOC and reversal (5 banking days after settlement, Nacha Rules §2.8/§2.9) windows. For dishonored (R61, R62, R67–R70) and contested (R71–R77) codes pass the return's or dishonored return's settlement date: the four windows count from an original entry's, so windowsApply is then false. Informational, not a substitute for the Nacha Operating Rules or your ODFI agreement. - `lookup_payment_code`(code, query, set, limit): Look up or search payment codes: ACH return reason codes (R01–R85, with return timeframe and consumer/corporate notes), ACH NOC codes (C01–C14 and refused C61–C69), ACH SEC codes, ISO 20022 ExternalStatusReason1Code (a common set, e.g. AC01, AC04, AM04, MS03, RR04) and ISO 4217 currencies with minor units (alphabetic or numeric code). Pass code for an exact lookup, or query for a ranked text search ("insufficient funds"); set narrows either, and set alone lists the whole set (or its first limit rows when limit is given). limit caps search results (1–100, default 20). - `validate_identifier`(value, type): Check the structure and check digit of a finance identifier: LEI (ISO 17442, mod 97-10), ISIN (ISO 6166, including the embedded CUSIP or SEDOL of US, CA, GB and IE ISINs), CUSIP, SEDOL, or a Luhn number such as a payment card number. type defaults to auto-detection by shape. Card numbers are masked in the result (first 6 and last 4 digits) and never stored or logged — still, use test numbers, not live cards. Check digits only: it does not confirm that an identifier has been allocated. - `amount_to_words`(amount, words): Write a US dollar amount in words for the legal line of a check — 1234.56 gives "One thousand two hundred thirty-four and 56/100 dollars" — and optionally cross-check words someone wrote against the figure (valid is false when they differ). Amounts from 0 to 999,999,999,999,999.99 with at most 2 decimals; never rounds. Send 10,000,000,000,000 or more as a string: a JSON number that large cannot carry its cents exactly. ## REST Base URL https://payopskit.com/api/v1. GET with a path segment or query parameters checks one value; POST {"values": [...]} checks up to 500. Invalid values answer 200 with "valid": false; errors are {"error":{"code","message","param"}} with 400, 404, 405, 413 or 429. - GET /api/v1/routing-number/{value}: Validate a routing number — e.g. https://payopskit.com/api/v1/routing-number/021000021 - POST /api/v1/routing-number: Validate routing numbers (batch) - GET /api/v1/iban/check-digits: Compute IBAN check digits — e.g. https://payopskit.com/api/v1/iban/check-digits?country=DE&bban=370400440532013000 - GET /api/v1/iban/countries: IBAN country table — e.g. https://payopskit.com/api/v1/iban/countries - GET /api/v1/iban/{value}: Validate an IBAN — e.g. https://payopskit.com/api/v1/iban/DE89370400440532013000 - POST /api/v1/iban: Validate IBANs (batch) - GET /api/v1/bic/{value}: Parse a BIC — e.g. https://payopskit.com/api/v1/bic/DEUTDEFF500 - POST /api/v1/bic: Parse BICs (batch) - GET /api/v1/business-days: Business-day arithmetic — e.g. https://payopskit.com/api/v1/business-days?calendar=us-fed&op=add&date=2026-07-02&n=1 - GET /api/v1/holidays: Bank holidays for a year — e.g. https://payopskit.com/api/v1/holidays?calendar=us-fed&year=2026 - GET /api/v1/calendars: Supported calendars — e.g. https://payopskit.com/api/v1/calendars - GET /api/v1/ach/settlement: ACH settlement date — e.g. https://payopskit.com/api/v1/ach/settlement?submitted_at=2026-10-29T10%3A15&effective_date=2026-10-29&amount=2500.00&sec_code=PPD - GET /api/v1/ach/return-deadline: ACH return, NOC and reversal deadlines — e.g. https://payopskit.com/api/v1/ach/return-deadline?settlement_date=2026-10-29&code=R10 - GET /api/v1/codes: Search payment codes — e.g. https://payopskit.com/api/v1/codes?q=insufficient - GET /api/v1/codes/{code}: Look up a payment code — e.g. https://payopskit.com/api/v1/codes/R01 - GET /api/v1/identifier/{value}: Validate a finance identifier — e.g. https://payopskit.com/api/v1/identifier/US0378331005 - POST /api/v1/identifier: Validate identifiers (batch) - GET /api/v1/check-amount: Amount in words — e.g. https://payopskit.com/api/v1/check-amount?amount=1234.56 Example: ```sh curl -s 'https://payopskit.com/api/v1/iban/DE89370400440532013000' curl -s 'https://payopskit.com/api/v1/business-days?calendar=us-fed&op=add&date=2026-07-02&n=1' ``` ## Limits and privacy - About 120 requests a minute per visitor (REST and MCP together); 429 with Retry-After beyond that. - Request bodies up to 64 KB; batches up to 500 values. - Bank names are looked up for at most 40 different routing symbols (first four digits) per request; the rest answer bankLookup.reason "limit_reached". - MCP batches: at most 10 messages, none under protocol 2025-06-18; each tools/call counts toward the rate limit. - No API key, no account. CORS is open on the API, MCP, OpenAPI and llms.txt paths. - Inputs are processed in memory for one response and never stored or logged; card numbers are masked in results. - Only anonymous per-tool call counters are kept. ## Docs - [API and MCP docs](https://payopskit.com/api): every endpoint and tool with examples - [OpenAPI 3.1](https://payopskit.com/openapi.json): the complete REST contract - [Privacy](https://payopskit.com/privacy) ## Pages - [Routing Number Validator](https://payopskit.com/routing-number): ABA check digit, bank name, Fed district, batch mode - [IBAN Validator](https://payopskit.com/iban): check digits, structure, bank code, print format - [BIC / SWIFT Parser](https://payopskit.com/bic): institution, country, location, branch, BIC8 ↔ BIC11 - [Business Day Calculator](https://payopskit.com/business-days): US Fed, TARGET2 and UK bank holiday calendars, .ics export - [ACH Date Calculator](https://payopskit.com/ach-dates): Same Day ACH windows, return deadlines, NOC and reversal timing - [Payment Code Lookup](https://payopskit.com/codes): ACH return/NOC/SEC codes, ISO 20022 status reasons, ISO 4217 - [Identifier Check Digits](https://payopskit.com/identifiers): LEI, ISIN, CUSIP, SEDOL, Luhn - [Check Amount in Words](https://payopskit.com/check-amount): the legal line of a check, with a cross-check