Part of the IBAN Suite service. One request validates an IBAN in six independent checks, identifies the issuing bank and branch with its BIC and address, and reports the bank’s SEPA scheme reachability. Every check comes back as its own coded result, so your code can act on the one it needs instead of parsing messages.
https://api.iban.com/clients/api/v4/iban/https://api.iban.com/clients/api/v4/iban/?api_key=YOUR_API_KEY&format=json&iban=FR7630006000011234567890189application/x-www-form-urlencoded; GET takes the same parameters in the query string. Both methods return the same response.iban[].iban, api_key or format is missing, or format is not exactly json or xml (JSON in upper case is not accepted). Check for an empty body before parsing.Content-Type follows the format parameter.YOUR_API_KEY:curl "https://api.iban.com/clients/api/v4/iban/" -d api_key=YOUR_API_KEY -d format=json -d iban=FR7630006000011234567890189The full response to this request is in the Response section; the same request in six more languages is under Example request.
| Parameter | Required | Value | Description |
|---|---|---|---|
iban | yes | string, up to 100 characters | The IBAN to validate. Letters are upper-cased. Any character that is not A–Z or 0–9 (space, hyphen, tab, line break…) sets the chars check to 206; the characters are then removed and the remaining checks run on what is left, so FR76 3000 6000 0112 3456 7890 189 still validates and identifies the bank. Send the IBAN without separators to get 006. |
api_key | yes | string | Your personal key, shown under API Access. If you have restricted the key to certain IP addresses under Settings, requests from other addresses get error 305. |
format | yes | json or xml | Response format, lower case. Sets the response Content-Type to application/json or application/xml. |
sci | no | 1 | Adds SCI to sepa_data: whether the identified bank is reachable for SEPA Instant Credit Transfer through EBA RT1. Any other value, or the parameter missing, leaves the field out. |
sci_tips | no | 1 | Adds SCI_TIPS to sepa_data: SEPA Instant reachability through the Eurosystem TIPS service. |
translit | no | 1 | Transliterates bank, address and city to plain Latin letters (Vöckla → Vockla, Hauptstraße → Hauptstrasse) for SEPA payment files that reject local characters. |
Every example validates the same IBAN, FR7630006000011234567890189, the registry example for France; its response is shown under Response. Replace YOUR_API_KEY with the key from API Access.
curl "https://api.iban.com/clients/api/v4/iban/" \
-d api_key=YOUR_API_KEY \
-d format=json \
-d iban=FR7630006000011234567890189The same request asking for SEPA Instant reachability and transliteration:
curl "https://api.iban.com/clients/api/v4/iban/" \
-d api_key=YOUR_API_KEY \
-d format=json \
-d iban=FR7630006000011234567890189 \
-d sci=1 -d sci_tips=1 -d translit=1The response is the same as above except that sepa_data gains two members after SCT, and bank, address and city are returned in plain Latin letters (nothing changes for this French bank; an Austrian one would come back as Vockla instead of Vöckla):
"sepa_data": {
"SCT": "YES",
"SCI": "YES",
"SCI_TIPS": "YES",
"SDD": "YES",
"COR1": "YES",
"B2B": "YES",
"SCC": "NO"
}Send only the options you need: each one is 1 to switch it on; any other value or leaving it out switches it off.
Four objects, always present and always in this order: bank_data, sepa_data, validations, errors. The response to the example request:
{
"bank_data": {
"bic": "AGRIFRPPXXX",
"branch": "AG SIEGE",
"bank": "CREDIT AGRICOLE S A",
"address": "12 PL DES ETATS UNIS",
"city": "MONTROUGE CEDEX",
"state": null,
"zip": "92127",
"phone": null,
"fax": null,
"www": null,
"email": null,
"country": "France",
"country_iso": "FR",
"account": "1234567890189",
"bank_code": "30006",
"branch_code": "00001"
},
"sepa_data": {
"SCT": "YES",
"SDD": "YES",
"COR1": "YES",
"B2B": "YES",
"SCC": "NO"
},
"validations": {
"chars": {
"code": "006",
"message": "IBAN does not contain illegal characters"
},
"account": {
"code": "002",
"message": "Account Number check digit is correct"
},
"iban": {
"code": "001",
"message": "IBAN Check digit is correct"
},
"structure": {
"code": "005",
"message": "IBAN structure is correct"
},
"length": {
"code": "003",
"message": "IBAN Length is correct"
},
"country_support": {
"code": "007",
"message": "Country supports IBAN standard"
}
},
"errors": []
}The four fields marked always are read from the IBAN itself and are filled whenever the country is known and the IBAN parses, even when a check fails; branch_code is read the same way but is empty for the countries whose IBAN has no branch part. The other eleven come from the bank directory and are filled only when a bank is identified. Bank identification is attempted only when the check digits (iban 001) and the length (length 003) are correct. A field without a value is null in JSON and an empty element in XML; responses in which the bank lookup was skipped currently return an empty string instead of null, so treat both alike.
| Field | Max length | Filled | Description |
|---|---|---|---|
bic | 11 | bank identified | BIC of the issuing bank or branch. |
branch | 256 | bank identified | Branch name, when the directory has one. |
bank | 256 | bank identified | Name of the bank or institution that issued the IBAN. |
address | 128 | bank identified | Street address of the bank or branch. |
city | 128 | bank identified | City of the bank or branch. |
state | 128 | bank identified | State or region, where the country uses one. |
zip | 11 | bank identified | Postal code. |
phone | – | bank identified | Telephone number, when the directory has one. |
fax | – | bank identified | Fax number. |
www | – | bank identified | Web site. |
email | – | bank identified | Contact e-mail address. |
country | 32 | always | Country name, from the IBAN prefix (France). |
country_iso | 2 | always | ISO 3166-1 alpha-2 code, from the IBAN prefix (FR, GB, DE…). |
account | 128 | always | Domestic account number part of the BBAN, as the country defines it. May contain letters and leading zeros, so treat it as a string. |
bank_code | – | always | National bank identifier taken from the BBAN: BLZ (DE, AT), ABI (IT), four-letter code (GB, IE, NL, BG, LV, RO, MT…), entity code (ES, PT)… see Bank code. A string: leading zeros count (0800, 05428). |
branch_code | – | 28 countries | Branch identifier taken from the BBAN. Filled for the 28 countries whose IBAN carries a branch code: AD AL BA BG BR CY DJ EG ES FR GB GR IE IL IT LY MC MR MT MU PT SD SK SM ST TL TN XK; empty for the other 61 (DE, AT, NL, BE, CH, PL, SE…). |
Scheme reachability of the identified bank, YES or NO. All NO when no bank is identified. The schemes are explained in the glossary.
| Field | Present | Description |
|---|---|---|
SCT | always | SEPA Credit Transfer. |
SDD | always | SEPA Direct Debit (Core). |
COR1 | always | SEPA Direct Debit COR1 option. |
B2B | always | SEPA Direct Debit Business-to-Business. |
SCC | always | SEPA Card Clearing. |
SCI | with sci=1 | SEPA Instant Credit Transfer through EBA RT1. |
SCI_TIPS | with sci_tips=1 | SEPA Instant Credit Transfer through TIPS. |
Six members, one per check: chars, iban, length, structure, account, country_support. Each holds a code and a message. Codes are three-character strings with a leading zero ("006", not 6); compare them as strings. The order of the members differs between JSON and XML, so address them by name. All six are present whenever the request was accepted.
Empty when the request was accepted. On an account error it holds one entry with code and message, and the other three objects are empty.
The same IBAN with the check digits changed from 76 to 77. The bank identifier is read from the IBAN, but no lookup is made and the SEPA flags are NO:
{
"bank_data": {
"bic": null,
"branch": null,
"bank": null,
"address": null,
"city": null,
"state": null,
"zip": null,
"phone": null,
"fax": null,
"www": null,
"email": null,
"country": "France",
"country_iso": "FR",
"account": "1234567890189",
"bank_code": "30006",
"branch_code": "00001"
},
"sepa_data": {
"SCT": "NO",
"SDD": "NO",
"COR1": "NO",
"B2B": "NO",
"SCC": "NO"
},
"validations": {
"chars": {
"code": "006",
"message": "IBAN does not contain illegal characters"
},
"account": {
"code": "002",
"message": "Account Number check digit is correct"
},
"iban": {
"code": "202",
"message": "IBAN Check digit not correct"
},
"structure": {
"code": "005",
"message": "IBAN structure is correct"
},
"length": {
"code": "003",
"message": "IBAN Length is correct"
},
"country_support": {
"code": "007",
"message": "Country supports IBAN standard"
}
},
"errors": []
}One entry in errors, the other three objects empty:
301 – API Key is invalid
{
"bank_data": {},
"sepa_data": {},
"validations": {},
"errors": [
{
"code": "301",
"message": "API Key is invalid"
}
]
}302 – Subscription expired
{
"bank_data": {},
"sepa_data": {},
"validations": {},
"errors": [
{
"code": "302",
"message": "Subscription expired"
}
]
}303 – No queries available
{
"bank_data": {},
"sepa_data": {},
"validations": {},
"errors": [
{
"code": "303",
"message": "No queries available"
}
]
}304 – You have no access to this API
{
"bank_data": {},
"sepa_data": {},
"validations": {},
"errors": [
{
"code": "304",
"message": "You have no access to this API"
}
]
}305 – IP Address not allowed
{
"bank_data": {},
"sepa_data": {},
"validations": {},
"errors": [
{
"code": "305",
"message": "IP Address not allowed"
}
]
}XML schema of the response: iban-validation-api-v4.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="result">
<xs:complexType>
<xs:sequence>
<xs:element name="bank_data">
<xs:complexType>
<xs:sequence>
<xs:element name="bic" type="xs:string" minOccurs="0"/>
<xs:element name="branch" type="xs:string" minOccurs="0"/>
<xs:element name="bank" type="xs:string" minOccurs="0"/>
<xs:element name="address" type="xs:string" minOccurs="0"/>
<xs:element name="city" type="xs:string" minOccurs="0"/>
<xs:element name="state" type="xs:string" minOccurs="0"/>
<xs:element name="zip" type="xs:string" minOccurs="0"/>
<xs:element name="phone" type="xs:string" minOccurs="0"/>
<xs:element name="fax" type="xs:string" minOccurs="0"/>
<xs:element name="www" type="xs:string" minOccurs="0"/>
<xs:element name="email" type="xs:string" minOccurs="0"/>
<xs:element name="country" type="xs:string" minOccurs="0"/>
<xs:element name="country_iso" type="xs:string" minOccurs="0"/>
<xs:element name="account" type="xs:string" minOccurs="0"/>
<xs:element name="bank_code" type="xs:string" minOccurs="0"/>
<xs:element name="branch_code" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="sepa_data">
<xs:complexType>
<xs:sequence>
<xs:element name="SCT" type="xs:string" minOccurs="0"/>
<xs:element name="SCI" type="xs:string" minOccurs="0"/>
<xs:element name="SCI_TIPS" type="xs:string" minOccurs="0"/>
<xs:element name="SDD" type="xs:string" minOccurs="0"/>
<xs:element name="COR1" type="xs:string" minOccurs="0"/>
<xs:element name="B2B" type="xs:string" minOccurs="0"/>
<xs:element name="SCC" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="validations">
<xs:complexType>
<xs:sequence>
<xs:element name="chars" type="check" minOccurs="0"/>
<xs:element name="iban" type="check" minOccurs="0"/>
<xs:element name="account" type="check" minOccurs="0"/>
<xs:element name="structure" type="check" minOccurs="0"/>
<xs:element name="length" type="check" minOccurs="0"/>
<xs:element name="country_support" type="check" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="errors">
<xs:complexType>
<xs:sequence>
<xs:element name="error" type="check" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="check">
<xs:sequence>
<xs:element name="code" type="xs:string"/>
<xs:element name="message" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>Each check answers with one success code or one failure code. Success codes start with 0, failure codes with 2.
| Check | Success | Failure |
|---|---|---|
chars | 006 IBAN does not contain illegal characters | 206 IBAN contains illegal characters |
iban | 001 IBAN check digit is correct | 202 IBAN check digit not correct |
length | 003 IBAN length is correct | 203 IBAN length is not correct. The message names the country and the expected length: Germany IBAN must be 22 characters long. |
structure | 005 IBAN structure is correct | 205 IBAN structure is not correct |
account | 002 Account number check digit is correct 004 Account number check digit is not performed for this bank or branch | 201 Account number check digit not correct |
country_support | 007 Country supports IBAN standard | 207 Country does not support IBAN standard |
Returned in errors when the request itself is refused. No validation is performed.
| Code | Message | What to do |
|---|---|---|
| 301 | API Key is invalid | Copy the key exactly as shown under API Access. |
| 302 | Subscription expired | Renew the IBAN Suite service under My Services. |
| 303 | No queries available | Your query balance is used up; top up under Pricing. |
| 304 | You have no access to this API | The IBAN Suite service is not active on this account. |
| 305 | IP Address not allowed | The key is restricted to certain IP addresses; add the calling server's address under Settings. |
What each outcome means for your code. Validation results are deterministic for a given IBAN, so there is never a reason to resend one; bank data does change over time, so if you cache responses, give the cache a limited lifetime.
| Situation | Meaning | What to do |
|---|---|---|
| HTTP 200, empty body | The request was not understood: iban, api_key or format is missing, or format is not exactly json or xml. | Fix the request. Do not retry it unchanged. |
errors 301 or 304 | The key is wrong, or the IBAN Suite service is not on the account. | Stop sending; every request will fail the same way. Check the key under API Access, or contact support for 304. |
errors 302 or 303 | The service has expired, or the query balance is used up. | Stop sending and alert whoever handles the subscription. Poll the services endpoint to catch this before it happens. |
errors 305 | The calling address is not on the key’s IP allow-list. | Add the address under Settings, then resend. |
| HTTP 429, HTML body | More than 20 requests per second. The request was rejected by the web server before reaching the API: not processed, not charged. | Wait a moment and resend; lower the sending rate. Safe to retry. There is no Retry-After header. |
| HTTP 500, empty body | A parameter was sent in a form the API cannot read, such as iban[]. | Send plain string parameters. |
| HTTP 5xx, timeout, connection error | Temporary problem on the way to the API or on the API itself. | Retry with increasing delays (1 s, 2 s, 4 s, then give up and queue). A request that got no response may still have been processed, so a retry costs at most one extra query. |
A 2xx code in validations | The request was fine; the IBAN is not. | Do not retry: the same IBAN gives the same result. Show the user the failed check, log the code. |
iban is 001, length 003, structure 005, chars 006, country_support 007 and account is 002 or 004.bic and bank are then null and the SEPA flags are NO. Decide in your code whether that is acceptable for the payment.The services endpoint returns every service active on your account with its remaining queries and expiry date, the same information as My Services. Poll it from your monitoring to catch a low balance before the API starts answering 303. It takes the same api_key and format parameters and does not use a query.
https://api.iban.com/clients/api/v4/services/?api_key=YOUR_API_KEY&format=jsonhttps://api.iban.com/clients/api/v4/services/?api_key=YOUR_API_KEY&format=xmlThe response, shortened to the IBAN Suite entry (the endpoint lists every service on your account, one object each):
{
"services": [
{
"service_name": "IBAN SUITE (50,000)",
"credits": 19981,
"expiry_date": "2027-07-11",
"service_expired": 0
}
],
"errors": []
}Without format the body is empty. errors works as on the validation endpoint: 301 for a wrong key, with services empty.
| Field | Type | Description |
|---|---|---|
service_name | string | Name of the service as shown under My Services. The IBAN Suite entry carries the plan size in brackets: IBAN SUITE (50,000), IBAN SUITE (Unlimited). Match on the prefix IBAN SUITE. |
credits | number or string | Remaining queries. Services without a quota return the string Unlimited instead of a number, so test the type before comparing. |
expiry_date | string | Expiry date of the service, YYYY-MM-DD. Requests after this date get 302. |
service_expired | 0 or 1 | 1 when the service has expired. |
| Term | Meaning |
|---|---|
| IBAN | International Bank Account Number, ISO 13616: two-letter country code, two check digits, then the BBAN. Up to 34 characters; the length is fixed per country. |
| BBAN | Basic Bank Account Number, the national part of the IBAN: bank code, branch code where the country uses one, account number and, in some countries, a national check digit. bank_code, branch_code and account are cut from it. |
| Check digits | Positions 3 and 4 of the IBAN, computed with MOD 97-10 (ISO 7064) over the whole number. Verified by the iban check (001 / 202). The national check digit inside the BBAN is a different thing, verified by the account check (002 / 004 / 201). |
| Bank code | The national bank identifier at the start of the BBAN, returned in bank_code. Its form is set per country: an 8-digit BLZ in Germany (51210800) and a 5-digit one in Austria, a 4-letter code in the United Kingdom, Ireland, the Netherlands, Bulgaria, Latvia, Romania and Malta (BUKB, ABNA), the 5-digit ABI in Italy, a 4-digit entity code in Spain and Portugal, 3 digits in Belgium, Sweden, Luxembourg and Greece, 2 in Estonia. Always a string: 0800 and 05428 keep their leading zero. |
| Branch code | The part of the BBAN that identifies the branch, in the countries whose IBAN has one: the sort code in the United Kingdom and Ireland, the code guichet in France, the CAB in Italy, the office code in Spain and Portugal, a branch number in Greece, Cyprus, Malta, Bulgaria and Slovakia, among others. Returned in branch_code; empty for the other countries (Germany, Austria, the Netherlands, Belgium, Switzerland, Poland, the Nordics…). |
| Sort code | The six-digit bank-and-branch identifier of the United Kingdom and Ireland, written 20-20-15 and stored as 202015. In the IBAN it follows the four-letter bank code (GB33 BUKB 202015 55555555), so the API returns the letters in bank_code and the sort code in branch_code. The SortWare API and the EISCD data file cover UK sort codes in depth. |
| Account number | The domestic account number cut from the BBAN, returned in account. Leading zeros are part of it (0123456789 in the Netherlands, 0000000012345676 in Hungary), so keep it as a string. Whether national check digits are included follows the country’s own definition: the French clé RIB is the last two digits of the 13-character account, while the Spanish DC and the Italian CIN sit between bank code and account and are not returned in any field. |
| IBAN registry | The list of IBAN formats kept by SWIFT as registration authority for ISO 13616: for each country the IBAN length, the BBAN layout (bank code, branch code, account, national check) and an example. The API validates the 89 countries of the registry; the IBAN structure & examples page is built from it. |
| Country code | The two letters that open every IBAN, an ISO 3166-1 alpha-2 code returned in country_iso. Territories use the code of their parent country (Guernsey, Jersey and the Isle of Man are GB; Réunion and Martinique are FR); Kosovo uses the user-assigned code XK. The code decides the expected length and structure, so the length and structure checks depend on it. |
| BIC | Business Identifier Code, ISO 9362: 8 or 11 characters identifying a bank and optionally a branch in SWIFT and SEPA messages. Returned in bic; XXX at the end means the head office. |
| SEPA | Single Euro Payments Area: the countries whose euro payments follow the SEPA schemes below. Membership per country is marked on the IBAN structure & examples page. |
| Reachability | Whether a bank can receive payments under a given scheme. sepa_data reports it as YES or NO per scheme, for the bank identified from the IBAN; it says nothing about the individual account. For SEPA Instant it is reported per clearing system (SCI for RT1, SCI_TIPS for TIPS), because a bank may be connected to one and not the other. |
| SCT | SEPA Credit Transfer: the standard euro transfer, credited by the next business day. Flag SCT. |
| SCT Inst | SEPA Instant Credit Transfer: euro transfers credited within ten seconds, around the clock. Reachability is reported per clearing system: SCI for RT1, SCI_TIPS for TIPS. |
| RT1 | EBA Clearing’s pan-European instant payment system, in operation since November 2017. |
| TIPS | TARGET Instant Payment Settlement, the Eurosystem’s instant payment settlement service, in operation since November 2018. |
| SDD Core | SEPA Direct Debit Core: collection from consumer and business accounts under a mandate; the debtor can ask for a refund within eight weeks. Flag SDD. |
| COR1 | Former SDD Core option with a one-day presentation period; merged into SDD Core in November 2016. The flag is kept because bank directories still list it separately. |
| SDD B2B | SEPA Direct Debit Business-to-Business: the debtor must be a business, the debtor bank checks the mandate, no refund right. Flag B2B. |
| SCC | SEPA Cards Clearing: clearing of card transactions over the SEPA infrastructure, used mainly in Germany. Flag SCC. |
| Transliteration | Replacing letters outside the basic Latin alphabet with their plain equivalents: ö → o, ß → ss, é → e, ç → c. SEPA payment messages allow only a–z, A–Z, 0–9, space and / - ? : ( ) . , ' +; translit=1 returns bank, address and city within that set. A directory entry that is already in plain letters comes back unchanged. |
| Query | The billing unit of the IBAN Suite service: one query per processed request, valid or not. Account errors (301–305) and requests rejected with 429 use none. The remaining balance is in credits on the services endpoint. |
| Partial IBAN | Countries that use an IBAN-like account format without being in the ISO 13616 registry. Listed with experimental support on the IBAN structure & examples page. |