Create a new bank. The slug (id) is the public-facing identifier and
must match ^[a-z][a-z0-9_-]{1,31}$ to keep it URL- and grep-friendly.
Returns BANK_ALREADY_EXISTS if a bank with the same slug is already
onboarded.
Update mutable fields on a bank. Pass null for nullable fields to
clear them. Omitting a field leaves it untouched. The slug (id) is
not editable — references across the system store the literal slug.
Admin-tier read + write over
bank. Operators onboard new partner banks here; the DB row set is now authoritative (the historical compile-timeBankIdliteral union is retained as a string alias for self-doc, not as a constraint).Bank-shaped vendors (
dart,metcap) get special-case behavior across services — seeBankVendorindb/drizzle/schema/product_vendor.ts. New banks created here arrive without that pairing and stay non-bank from a route's perspective unless someone wires up a corresponding vendor entry separately.