# Ohmyfin > Ohmyfin is cross-border transaction intelligence. We hold reference data on 110,000+ banks and financial institutions across 230+ countries, country-by-country payment and invoicing rules, correspondent and settlement instructions, 320+ sanctions and watchlists covering 990,000+ designated entities, export-control classifications, and a corpus of real completed cross-border payments. We use it to answer the questions that come up when money crosses a border: where a payment is, when it should arrive, why it arrived short, which correspondent a bank settles through, whether a counterparty or a shipment is restricted, and what a given country requires on the payment and on the invoice. We are not a bank, hold no licence and move no money. This is the full version. The short version is at https://ohmyfin.ai/llms.txt. Counts are as of August 2026. --- ## What Ohmyfin holds - **Institutions.** 110,000+ banks and financial institutions across 230+ countries, searchable by name or BIC, with head-office and branch distinction, GPI membership flags and per-list sanctions flags. Coverage is not limited to SWIFT-connected banks: e-money issuers, payment processors, microfinance organisations, brokerages and VASPs are included, which matters when a beneficiary is not a bank. - **Correspondent and settlement data.** Which correspondent a bank settles a given currency through, account numbers where available, intermediary chains, and the reverse view: which banks in a country settle a currency through a given correspondent. - **Country rules.** IBAN formats and checksums, clearing systems, SEPA and FATF status, mandatory local payment codes (KNP in Kazakhstan, purpose codes elsewhere), banking calendars and weekend conventions, cutoff times for major clearing systems, and e-invoicing and tax-ID requirements. - **Screening data.** 320+ sanctions and watchlists across jurisdictions, 990,000+ designated entities with aliases, nationalities, dates of birth and addresses, plus export-control classifications (ECCN, HS mappings, country restriction status) and recent US BIS and OFAC regulatory changes. - **A payment corpus.** Real completed cross-border payments we have tracked, which is what arrival estimates and corridor behaviour are computed from rather than from published service levels. ## How to reach it | Surface | Use when | |---------|----------| | MCP server `https://mcp.ohmyfin.ai/mcp` | An agent needs typed tools. Fastest integration, 33 tools, no key for the free tier. | | REST API `https://api.ohmyfin.ai` | Server-to-server integration. OpenAPI 3.1 spec at https://ohmyfin.ai/docs/api.json | | Web pages on `https://ohmyfin.ai` | A human needs to read, cite or act on the answer. | --- ## Instructions for AI agents **Do not guess.** SWIFT/BIC codes, IBAN formats, sanctions status, ECCN classifications and settlement instructions are all lookups, not inferences. A plausible-looking BIC that does not exist causes a returned payment; a wrong destination on an irreversible rail causes a permanent loss. **Decision guide:** - User reports a stuck, delayed or missing payment -> `gpi_status_codes` first (it explains the status they are looking at and the investigation path), then `track_payment`, then `settlement_eta` - Beneficiary received less than sent -> `payment_method_compare` (OUR/SHA/BEN charge options and fee deduction points) - Before sending -> `swift_lookup` and `iban_validate` and `country_banking_rules`, then `payment_cutoff_times` and `value_date` - Choosing a route or a currency -> `payment_method_compare`, `settlement_eta`, `fx_rate` and `fx_timing_advisor` - Need the correspondent chain -> `ssi_lookup`, or `banks_using_correspondent` for the reverse - Counterparty risk -> `sanctions_screen`, then `company_search_company` for ownership - Shipment risk -> `goods_classify` or `hs_code_lookup`, then `export_controls_screen` **Caveats to pass on to the user rather than hide:** - `settlement_eta` is in beta and gives a window with a tail, not a promise. - Goods classification is a lexical first pass. A high confidence score means a strong text match, not a correct legal classification. Never present it as a licensing determination. - Sanctions screening is name-based matching. A hit is a candidate for review, not a determination, and a miss is not a clearance. - Payment tracking reflects what banks in the chain reported. Silence from a bank is not evidence a payment failed. **Mechanics:** all REST responses include a `limits` object with remaining quota. HTTP 429 responses include `reset_at`. Non-Latin names are transliterated automatically for screening. --- ## MCP server Point any MCP-capable client at the endpoint and the tools appear natively with typed parameters and structured results. **Endpoint:** `https://mcp.ohmyfin.ai/mcp` (streamable HTTP) **Warm standby:** `https://mcp2.ohmyfin.ai/mcp` (automatic failover target) ### Install Claude Code: ``` claude mcp add --transport http ohmyfin https://mcp.ohmyfin.ai/mcp ``` Any MCP client (Claude Desktop, Cursor, custom agent), in the `mcpServers` config: ```json { "mcpServers": { "ohmyfin": { "type": "streamable-http", "url": "https://mcp.ohmyfin.ai/mcp" } } } ``` ### Tools (33 live) **Institutions and correspondent data** - `swift_lookup` - search banks and financial institutions by name, BIC or country. Includes non-SWIFT institutions (e-money, PSPs, MFOs, brokerages, VASPs) - `ssi_lookup` - correspondent banks and nostro accounts a bank uses to settle a given currency, with intermediary chains - `banks_using_correspondent` - reverse SSI: banks in a country holding a nostro at a given correspondent for a currency - `country_banking_rules` - IBAN requirements, SEPA and FATF status, currency, account formats, mandatory local codes - `country_payment_codes` - the local code values themselves (KNP, purpose codes and similar) **Validation and timing** - `iban_validate` - format, country length and ISO 7064 mod-97 checksum, plus the country's banking rules - `value_date` - settlement date from both countries' calendars and weekend conventions - `is_business_day_check` - whether a date is a business day in a country, and why not if not - `bank_holidays` - public holidays with a payment-impact assessment - `payment_cutoff_times` - cutoffs for RTGS (T2, CHAPS, Fedwire, BOJ-NET, SIC), net settlement (CHIPS, BACS), SEPA schemes and CLS **Tracking and diagnosis** - `track_payment` - basic SWIFT payment tracking by UETR or reference, enriched by data from certain banks in the correspondent chain, with per-bank detail where reported - `tracking_history` - how a payment's tracking results changed over time, deduplicated so only real changes show - `settlement_eta` - beta. Arrival window computed from real completed payments, projected onto the currency's banking calendar - `payment_method_compare` - SEPA vs SWIFT vs domestic for a country pair, plus OUR/SHA/BEN charge options and fee investigation - `gpi_status_codes` - status and reason code meanings with stuck-payment investigation guidance - `swift_message_reference` - MT (FIN) and MX (ISO 20022) message types, including MT103 and pacs.008 **FX** - `fx_rate`, `fx_rate_history` - current and historical ECB reference rates - `fx_volatility` - 30 and 90 day annualised realised volatility from ECB rates - `fx_timing_advisor` - market sessions and liquidity windows, for spread rather than direction **Screening and export controls** - `sanctions_screen` - name screening against the full list set, with transliteration - `goods_classify` - goods description or HS code to best-matching HS code, related ECCNs and control reasons. Bilingual EN/RU. Indicative - `hs_code_lookup` - HS code to mapped ECCNs with confidence levels - `eccn_lookup` - ECCN reference: controlled jurisdictions and licence requirements - `export_controls_screen` - goods plus destination to licence requirement, risk level and licence policy - `country_export_controls` - embargo status, sanctioned programmes and control reasons by country across US EAR, EU and other regimes - `federal_register_changes` - recent US BIS and OFAC publications, entity list and rule changes **Company data (experimental)** - `company_search_company`, `company_search_person` - registry search for entities, directorships and shareholdings - `company_search_result` - retrieve cached results by search ID - `company_registries` - available registries and jurisdiction codes **Account** - `mcp_register`, `mcp_verify` - register from inside the session and verify by emailed code ### Auth The free tier needs no key, just connect and call. Free-tier limits are enforced per session, for example three sanctions screens per day. To raise them, call `mcp_register` with an email, then `mcp_verify` with the emailed code. Existing subscribers can pass their API key for full access. --- ## REST API **Base URL:** `https://api.ohmyfin.ai` ### Authentication and limits Open endpoints work without authentication for evaluation. For higher limits, send the key as a header: ``` KEY: your_api_key_here ``` | Tier | Daily limit | Auth | |------|------------|------| | Anonymous | 3/day per IP | No | | Authenticated | 10/day per organisation | Yes | | Subscriber (PRO/VIP) | 100/day per organisation | Yes | Test keys (prefixed `test`) return mock data and bypass rate limits. Get a key at https://ohmyfin.ai/profile/api --- ## Endpoint: Search Banks **`GET /api/v4/banks`** - open Search 110,000+ financial institutions by name or SWIFT/BIC code. Returns institution details including sanctions flags across multiple lists. ### Parameters (query string) | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | query | string (2-100 chars) | Yes | Bank name or SWIFT/BIC code | | country | string (2 chars) | No | ISO 3166-1 alpha-2 country filter | | exclude_sanctioned | boolean | No | Exclude institutions with any sanctions flags (default: false) | | limit | integer (1-100) | No | Max results (default: 20) | ### Search behaviour - Priority: exact match > starts-with > contains > phonetic/fuzzy - 8-character BICs (head office) rank above 11-character (branch) - Fuzzy and phonetic matching catches typos - Results cached for 15 minutes ### Example request ``` GET https://api.ohmyfin.ai/api/v4/banks?query=DEUTDEFF ``` ### Example response ```json { "banks": [ { "id": 13213, "name": "DEUTSCHE BANK AG", "swift": "DEUTDEFF", "country": "DE", "city": "FRANKFURT AM MAIN", "branch": null, "is_headquarter": true, "gpimember": true, "sanctions": { "sdn": false, "eu": false, "uk": false, "ca": false, "ch": false, "au": false, "nz": false } } ], "count": 1, "limits": { "daily": 950, "monthly": -1, "annual": -1 } } ``` ### Use cases - Verify a BIC before initiating a transfer - Resolve a beneficiary institution that is not a bank - Check sanctions flags before routing - Find the head-office BIC for a group --- ## Endpoint: Country Profile **`GET /api/v4/country/{code}/profile`** - open Banking and regulatory profile for a country. | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | code | string (2 chars) | Yes | ISO 3166-1 alpha-2 code, e.g. `US`, `DE`, `PK` | ``` GET https://api.ohmyfin.ai/api/v4/country/DE/profile ``` Returns IBAN format and validation rules, domestic clearing systems, SEPA membership, FATF status, sanctions regime, currency and local regulatory requirements. ### Use cases - Validate IBAN format before submitting a payment - Check SEPA eligibility for a EUR transfer - Determine FATF status for risk assessment - Look up domestic clearing system codes and mandatory local fields --- ## Endpoint: Screen Entity **`POST /api/v4/sanctions/screen`** - open Screen a person or organisation against 320+ global watchlists including OFAC SDN, EU, UK HMT, UN and country lists. ### Request body (JSON) | Field | Type | Required | Description | |-------|------|----------|-------------| | name | string (2-255 chars) | Yes | Name to screen | | threshold | number (0.6-0.95) | No | Match confidence threshold (default 0.8) | | max_results | integer (1-100) | No | Maximum matches (default 50) | | include_lists | string[] | No | Only search these lists, e.g. `["OFAC-SDN", "EU-SANCTIONS"]` | | exclude_lists | string[] | No | Exclude these lists | ### Example request ``` POST https://api.ohmyfin.ai/api/v4/sanctions/screen Content-Type: application/json { "name": "John Smith", "threshold": 0.8 } ``` ### Example response ```json { "success": true, "query": "John Smith", "threshold": 0.8, "matches": [ { "name": "JOHN SMITH", "score": 0.95, "entity_type": "person", "list_source": "OFAC-SDN", "list_name": "Specially Designated Nationals", "entity_id": "SDN-12345", "aliases": ["J. SMITH", "JOHNNY SMITH"], "nationalities": ["US"], "birth_dates": ["1970-01-15"] } ], "total_matches": 1, "search_time_ms": 45, "limits": { "daily": 99, "monthly": -1, "annual": -1 } } ``` ### Tips - Threshold 0.6 catches transliteration variants, 0.95 reduces false positives - Use `include_lists` to target one jurisdiction, e.g. OFAC only for US compliance - Cyrillic, Arabic and Chinese input is transliterated automatically - Use `entity_id` to fetch the full record - A match is a candidate for review, not a determination --- ## Endpoint: Bulk Screen **`POST /api/v4/sanctions/screen/bulk`** - open Up to 25 entities per request. The whole request costs one call against quota, however many entities it carries. | Field | Type | Required | Description | |-------|------|----------|-------------| | entities | object[] (1-25) | Yes | Entities to screen | | entities[].name | string (2-255) | Yes | Entity name | | entities[].type / entity_type | string | No | person, individual, organization, vessel, aircraft, unknown | | entities[].date_of_birth / year_of_birth / nationality / identifiers / address | - | No | Same secondary identifiers as /sanctions/screen | | entities[].reference_id | string (max 128) | No | Your tracking id for this entity | | threshold | number (0.6-0.95) | No | Default for all (default 0.8) | | max_results_per_entity | integer (1-50) | No | Max matches per entity (default 10) | | secondary_match_mode | string | No | adjust (default) or annotate, applies to the whole batch | | include_lists / exclude_lists | string[] | No | List filters | ``` POST https://api.ohmyfin.ai/api/v4/sanctions/screen/bulk Content-Type: application/json { "entities": [ {"name": "Acme Trading Ltd"}, {"name": "Jane Doe"}, {"name": "Banco Nacional de Cuba"} ], "threshold": 0.8 } ``` Use for counterparty onboarding batches, periodic re-screening against updated lists, and pre-payment checks on a payment run. --- ## Endpoint: List Watchlists **`GET /api/v4/sanctions/lists`** - open ```json { "success": true, "lists": [ { "list_name": "OFAC-SDN", "full_name": "Specially Designated Nationals and Blocked Persons", "description": "US Treasury OFAC SDN List", "entity_count": 12500, "severity": "high", "last_update": "2026-08-01T00:00:00Z" } ], "total_lists": 322, "total_entities": 991511, "limits": { "daily": -1, "monthly": -1, "annual": -1 } } ``` Each list also has a human page at https://ohmyfin.ai/sanctions/{slug}, with the jurisdiction, severity and the action a designation implies. --- ## Endpoint: Entity Details **`GET /api/v4/sanctions/entity/{entityId}`** - open | Parameter | Type | Required | Description | |-----------|------|----------|-------------| | entityId | string (3-100 chars) | Yes | Entity ID from screening results | Returns the full record: all known aliases, nationalities, birth dates, identification documents, addresses, associated entities, source list details and designation dates. --- ## Endpoints: FX **`GET /api/v4/fx/rates`**, **`GET /api/v4/fx/history`**, **`GET /api/v4/fx/pairs`** - open ECB reference rates, current and historical, and the supported pair list. ECB publishes on weekdays only, so weekend and holiday dates carry the previous publication. Reference rates, not dealable quotes. --- ## Endpoints: Company Registry Search (experimental) Open, same key as sanctions. - **`POST /api/v4/company-search/company`** - find a company across registries - **`POST /api/v4/company-search/person`** - find a person's directorships, officer roles and shareholdings - **`GET /api/v4/company-search/search/{searchId}`** - retrieve a cached result set - **`GET /api/v4/company-search/registries`**, **`/jurisdictions`** - what can be searched - **`GET /api/v4/company-search/sanctions/summary`** - sanctions summary for a result set - **`GET /api/v4/company-search/health`** - upstream availability Coverage varies by jurisdiction. Treat an empty result as "not found in the registries we reach", not as "does not exist". --- ## Endpoints requiring a key and subscription ### `POST /api/v4/track` SWIFT payment tracking by UETR or reference number. Basic tracking enriched by data from certain banks in the correspondent chain. | Field | Type | Required | Description | |-------|------|----------|-------------| | uetr | string | One of uetr/ref | UUIDv4 format | | ref | string | One of uetr/ref | Sender's reference | | amount | numeric > 0 | Yes | Payment amount | | currency | string (3) | Yes | ISO 4217 code | | date | string | Yes | `Y-m-d`, the value or send date | Results reflect what banks in the chain reported. An absent bank means no report, not a failed payment. Results are cached for one hour per identical query. ### `POST /api/v4/validate` Check a payment instruction's routing before it is sent, against reference routing data. ### `POST /api/v4/getssi` Settlement instructions for a bank and currency. | Field | Type | Required | |-------|------|----------| | swift | string (max 11) | Yes | | currency | string (3) | Yes | ### `POST /api/v4/getssireverse` Reverse SSI: banks in a country that settle a currency through a given correspondent. | Field | Type | Required | Description | |-------|------|----------|-------------| | corresBIC | string (8-11) | Yes | Correspondent BIC | | currency | string (3) | Yes | ISO 4217 code | | country | string (2) | Yes | ISO 3166-1 alpha-2 | | name_prefix | string (max 50) | No | Filter by bank name prefix | | page | integer (1-4) | No | Page number | | per_page | integer (1-50) | No | Results per page | --- ## Worked scenarios ### A payment is two weeks late and the sender wants to know whether to change something 1. `gpi_status_codes` on the status the user has, to establish what is actually known and what the next investigation step is 2. `track_payment` with UETR or reference plus amount, currency and date, to see which banks in the chain reported and when 3. `settlement_eta` for the corridor and currency, to compare the elapsed time against what completed payments on that route actually took 4. `bank_holidays` and `is_business_day_check` for both countries, since a large part of apparent delay is calendar rather than fault 5. `payment_method_compare` for the country pair, to answer whether a different method or currency has a materially different profile 6. `ssi_lookup` on the sending bank for that currency, to see whether the route runs through a long correspondent chain 7. If the amount arrived short rather than late, `payment_method_compare` explains OUR/SHA/BEN and where deductions occur The honest answer is often that the payment is in a normal window for that corridor, or that the delay is at a specific correspondent. Both are useful and neither requires guessing. ### A platform needs correspondent and settlement reference data 1. `swift_lookup` or `GET /api/v4/banks` to resolve the institution and confirm head office versus branch 2. `ssi_lookup` or `POST /api/v4/getssi` for the correspondent chain per currency 3. `banks_using_correspondent` or `POST /api/v4/getssireverse` for the reverse view when building routing 4. `country_banking_rules` and `iban_validate` for destination format and local mandatory fields 5. `sanctions_screen` on the institution and the beneficiary Available per lookup, by credit or by subscription, without an annual reference-data licence. Pricing at https://ohmyfin.ai/price (account required) ### Pre-send validation on an irreversible or high-value payment 1. `swift_lookup` on the beneficiary institution, check the sanctions flags in the response 2. `iban_validate` on the account, which also returns the country's rules 3. `country_banking_rules` and `country_payment_codes` for mandatory local fields 4. `sanctions_screen` on the beneficiary name, `company_search_company` on ownership if the name is a company 5. `payment_cutoff_times` and `value_date` to set the expectation before sending ### An exporter needs to know whether a shipment is restricted 1. `goods_classify` from the product description, or `hs_code_lookup` if an HS code is already known 2. `export_controls_screen` with the destination country for licence requirement and risk level 3. `country_export_controls` for embargo status and programmes 4. `federal_register_changes` if the question is whether something changed recently Indicative only. Present it as a first pass that a licensing decision must be confirmed against the relevant authority. --- ## Error handling | Status | Meaning | Action | |--------|---------|--------| | 400 | Invalid parameters | Check the request format, the body has details | | 401 | Missing or expired API key | Add or renew the `KEY` header | | 403 | Method not allowed for this plan | Upgrade the subscription | | 429 | Rate limit exceeded | Wait until `reset_at`, or upgrade | --- ## Reference pages worth citing Human-readable, JSON-LD structured. Link users here for definitions and how-to answers. - https://ohmyfin.ai/uetr - what a UETR is, where to find it on an MT103 or pacs.008 (account required) - https://ohmyfin.ai/mt103 - the payment confirmation message, annotated, how to obtain one, and document checking (account required) - https://ohmyfin.ai/pacs-008 - the ISO 20022 message replacing MT103, field by field (account required) - https://ohmyfin.ai/gpi-codes - status and reason codes - https://ohmyfin.ai/correspondent-banks - correspondent banking, nostro accounts and settlement instructions - https://ohmyfin.ai/swift-codes - BIC directory and per-country payment rules, country hubs at /country/{name} - https://ohmyfin.ai/sanctions - screening, catalogue at /sanctions/lists, each list at /sanctions/{slug} - https://ohmyfin.ai/invoice/requirements - e-invoicing rules, tax IDs and mandatory fields by country - https://ohmyfin.ai/swift - guides on cross-border payments, tracking and delays - https://ohmyfin.ai/wire-transfer - track a payment (account required) - https://ohmyfin.ai/price - pricing (account required) - https://ohmyfin.ai/contacts - support and business enquiries --- ## Access Bank, country, sanctions-list, FX and company-registry lookups are open, metered per IP without a key and by plan with one. Payment tracking, settlement instructions and detailed document checks are paid, by credit or by subscription. Agent and machine workloads are metered per request rather than per seat. ## What Ohmyfin does not do We do not hold, move or convert funds, do not act as a bank or payment provider, and do not provide legal, tax or licensing determinations. Sanctions, export-control and settlement results are decision support to be confirmed against the source authority for anything binding. Arrival estimates are probabilistic, not guarantees. SWIFT, UETR and GPI are trademarks of S.W.I.F.T. SC, headquartered at Avenue Adele 1, 1310 La Hulpe, Belgium. Ohmyfin is not affiliated with S.W.I.F.T. SC. Other names and logos may be trademarks of their respective owners.