Bank directory search: BIC / bank name → name + address
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
| Field | Type | Required | Description |
|---|---|---|---|
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
{
"unavailable": false,
"banks": [
{
"swift_code": "BUKBGB22",
"bank_name": "BARCLAYS BANK PLC",
"address": "1 CHURCHILL PLACE",
"city": "LONDON",
"country_code": "GB",
"branch": ""
}
]
}rate_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.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.
{
"unavailable": false,
"banks": [
{
"swift_code": "BUKBGB22",
"bank_name": "BARCLAYS BANK PLC",
"address": "1 CHURCHILL PLACE",
"city": "LONDON",
"country_code": "GB",
"branch": ""
}
]
}