Z Zise Developers 简体中文

Bank directory search: BIC / bank name → name + address

GET /v1/remit/swift-search scope: remittances:read
Merchant account

Search and select a bank to prefill its name and address. SWIFT payees require swift_code / bank_name / bank_address; without this endpoint, users must type all three.

⚠ A single incorrect BIC character cannot be detected locally, because we only validate format. It survives until upstream rejection at dispatch, which is terminal for the payee, by which time the user’s funds are already locked. This endpoint is an inexpensive way to prevent that class of problem.

⚠ The source is a third-party bank directory, unrelated to the payout provider. Use it only for prefilling. Users can still edit, and their submitted values prevail. We neither validate against the directory nor overwrite entered values: address can be null and names may differ from statements, while the upstream ultimately determines whether payment can arrive.

⚠ unavailable: true and “no results” are different; do not display the same message. The former means no directory key is configured or the directory is unreachable. Displaying “bank not found” would misrepresent our issue as incorrect user input.

Queries shorter than 6 characters that do not resemble a BIC make no external request, because one or two characters can match thousands of banks. They return banks: [] + unavailable: false. Debounce typeahead searches on your side.

Query Parameters

FieldTypeRequiredDescription
q string Required BIC, 8 or 11 characters, or part of a bank name. Bank-name queries longer than 64 characters are truncated.
country string Optional Two-letter uppercase country code. Only applies to name searches; ignored for BIC searches.

Response

200OK
{
  "unavailable": false,
  "banks": [
    {
      "swift_code": "BUKBGB22",
      "bank_name": "BARCLAYS BANK PLC",
      "address": "1 CHURCHILL PLACE",
      "city": "LONDON",
      "country_code": "GB",
      "branch": ""
    }
  ]
}
429rate_limited: a separate limit of 300 requests/minute per merchant. The directory is a per-request paid external resource, while all your end users may be searching as they type.
Request
curl -X GET 'https://api.zinfra.vip/v1/remit/swift-search' \
  -H 'x-auth-token: Bearer $TOKEN'
const res = await fetch("https://api.zinfra.vip/v1/remit/swift-search", {
  method: "GET",
  headers: {
    "x-auth-token": "Bearer $TOKEN",
  },
});
// Keep monetary amounts as strings, never numbers.
const data = await res.json();
import requests

res = requests.get(
    "https://api.zinfra.vip/v1/remit/swift-search",
    headers={
        "x-auth-token": "Bearer $TOKEN",
    },
)
# Use Decimal(str(...)) for amounts, not float.
data = res.json()
req, _ := http.NewRequest("GET", "https://api.zinfra.vip/v1/remit/swift-search",
    nil)
req.Header.Set("x-auth-token", "Bearer $TOKEN")
res, err := http.DefaultClient.Do(req)
// Decode amount fields as string, not float64.
HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.zinfra.vip/v1/remit/swift-search"))
    .header("x-auth-token", "Bearer $TOKEN")
    .method("GET", HttpRequest.BodyPublishers.noBody())
    .build();
// Use String / BigDecimal for amounts, not double.
$ch = curl_init('https://api.zinfra.vip/v1/remit/swift-search');
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => 'GET',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    'x-auth-token: Bearer $TOKEN',
  ],
]);
$res = curl_exec($ch);
// Use bcmath / strings for amounts, not floatval.
200
{
  "unavailable": false,
  "banks": [
    {
      "swift_code": "BUKBGB22",
      "bank_name": "BARCLAYS BANK PLC",
      "address": "1 CHURCHILL PLACE",
      "city": "LONDON",
      "country_code": "GB",
      "branch": ""
    }
  ]
}