ISO 20022 structured addresses: rules and timetables
Each payment rail sets its own timetable. SIX still publishes 14 November 2026 for Swiss payment orders when an address is used. The EPC and Swift have postponed their deadlines. This page separates those dates from the address rules checked by the API.
Checked on 10 September 2026. The EPC decision of 9 September maintains unstructured addresses beyond 15 November 2026 under all five payment schemes; the new end date is to be set in October. Swift’s announcement of 27 August defers the payments changes without a replacement address date, with an update by December at the latest. SIX still publishes its separate Swiss timetable.
The published deadlines
| Payment rail | Position checked on 10 September 2026 | Source |
|---|---|---|
| Swiss Payment Standards | 14 November 2026 remains the published date; structured or hybrid address when an address is used | SIX |
| EPC payment schemes | The 15 November 2026 end date has been postponed; replacement date to be set in October | EPC decision of 9 September |
| Swift / CBPR+ payments | November 2026 changes deferred; no new address deadline in the announcement | Swift announcement of 27 August |
These postponements do not themselves amend the Swiss rules. They do not change the fields checked by /v1/address/check either: a result describes conformity with the named document, not whether a bank must apply that rule on a given date. T2, Fedwire and CHAPS have their own timetables; see the dated source record in Which date is the date?.
The older 22 November 2026 date did appear in EPC guidance. It was replaced by 15 November 2026 in version 2.1, and that later deadline was postponed in September 2026. It is not a current deadline. The 22 November 2025 Swiss QR-bill change is a separate event.
For a whole Swiss QR-bill, POST /v1/ch/qr-bill/check checks the payload, including structured (S) or combined (K) addresses.
What the rules ask of an agent address: a town and a country
The single most useful fact about these rules, for anyone building payment software, is how little they demand of a financial institution address.
The Swiss field table for a Creditor Agent's PostalAddress offers exactly three elements: TwnNm (Must be used), Ctry (Must be used) and AdrLine (max 2). StrtNm, BldgNb and PstCd appear in that guideline only under Creditor and Ultimate Debtor — never under an agent. The Federal Reserve says the same in prose for its own rail: "require town name and country".
So: an agent address is a name, a town and a country. Not a street.
And it is often not required at all
Two of the three corpora make the agent address conditional on the BIC being absent.
Switzerland lists the ways a Creditor Agent may be identified, and a full address is one option among several — the BIC being another, and the recommended one for cross-border payments.
T2 / HVPS+ states the same mechanic as a validation rule: if BICFI is absent, then Name and PostalAddress must be present. It applies to DbtrAgt, CdtrAgt, the intermediary agents and the previous instructing agents.
The Federal Reserve does not state that trigger. Its page confirms the change reaches agents — "for all parties and agents across all message types" — which is compatible with the conditional mechanic but is not an attestation of it. Two rails state it; one does not; this page does not say that all three agree.
The reversal — and it is the real point of this page
Read the Swiss business rules once more: "depending on the payment type, it remains also possible to replace the address with another element like the BIC."
That sentence turns the whole problem around. If you hold a clearing code and no BIC, you are in the branch of the rule that demands a name and a full address. If you hold the BIC, that obligation does not apply to you at all.
Which means the useful question in November 2026 is often not "how do I structure this agent's address?" but "how do I get this agent's BIC so I never have to?" — and resolving a national clearing code into a BIC is what this API has always done:
- Swiss IID / BC-Nummer →
GET /v1/ch/clearing/:iid - German Bankleitzahl →
bank_code_checkon a validated IBAN - Austrian bank code → same block
- Any IBAN →
POST /v1/iban/validateresolves the BIC
No new code, no new endpoint, no new subscription. If the BIC resolves, the address requirement on that agent goes away.
postal_address — the seat in ISO 20022 vocabulary
Every answer that already carries an institution address now also carries it as an ISO 20022 PostalAddress, in the tag names of the standard, so you can map it into a pain.001 or a pacs.008 without a translation table.
It is additive. The existing address block is untouched and remains the full, untruncated record.
A Swiss institution: structured
curl https://api.ibanforge.com/v1/bic/POFICHBE{
"postal_address": {
"strt_nm": "Mingerstrasse",
"bldg_nb": "20",
"pst_cd": "3030",
"twn_nm": "Bern",
"ctry": "CH",
"format": "structured",
"source": "SIX BankMaster (Swiss IID register)",
"as_of": "2026-08-03"
}
}StrtNm and BldgNb are filled here because the SIX BankMaster register publishes them as two separate columns. It is the only source in this database that does.
A GLEIF-sourced institution: hybrid
curl https://api.ibanforge.com/v1/bic/BUKBGB22{
"postal_address": {
"pst_cd": "E14 5HP",
"twn_nm": "LONDON",
"ctry": "GB",
"adr_line": ["1 CHURCHILL PLACE"],
"format": "hybrid",
"source": "GLEIF",
"as_of": "2026-04-13"
}
}No strt_nm — and this is the design decision to understand before you consume the field.
GLEIF publishes an address as a list of lines that we store joined into one string. House number, floor, building name and district can all be in there together. Splitting that into StrtNm and BldgNb would be a guess, and a guess is exactly what a payment rail bounces. So the line goes out as AdrLine, which is the hybrid format the rules explicitly allow, and format tells you which of the two you got.
Read an absent strt_nm as "the source published one concatenated line", never as "this institution has no street".
A town and a country alone: complete, not degraded
{
"postal_address": {
"twn_nm": "ZURICH",
"ctry": "CH",
"format": "structured",
"source": "Redistributed SWIFT BIC directory (PeterNotenboom/SwiftCodes, MIT)",
"as_of": null
}
}This is the shape most of the directory takes, and — per the section above — it is exactly what the rules ask of an agent address. A town and a country is not a partial answer here. It is the answer.
Measured over the shipped database on 26 August 2026: 99.3% of directory rows carry a city, while only about 30% carry any street at all. Re-measure before quoting it — the database is refreshed monthly and the figure drifts.
Two provenance rules that will not change
source names the dataset the address came from, and it can legitimately differ from address.source: a Swiss institution is served from the SIX register while the legacy block stays GLEIF. When the two registers disagree — both may publish a real, different seat for the same institution — you can see both and decide.
as_of is the date the source last stated the address. It is null when the dataset publishes none. It is never the date our database was refreshed, and it is never a clock read: an address stamped today from a file filed last year would be a false statement about the register.
The same block appears on the bic object of POST /v1/iban/validate, built by the same code, so the two endpoints cannot disagree about the same row.
POST /v1/address/check — free conformity check
The other half. You have structured an address; this tells you whether it satisfies a given rail's rules, rule by rule, with the document each rule comes from.
It reads no database of ours. That is why it is free.
curl -X POST https://api.ibanforge.com/v1/address/check \
-H "Content-Type: application/json" \
-d '{
"scheme": "sps",
"address": {
"twn_nm": "Zurich",
"ctry": "ch",
"pst_cd": "8001",
"adr_tp": "ADDR",
"adr_line": ["Bahnhofstrasse 45", "8001 Zurich"]
}
}'{
"scheme": "sps",
"conforms": false,
"findings": [
{ "rule": "twn_nm_required", "verdict": "pass", "detail": "TwnNm is present (\"Zurich\")." },
{ "rule": "ctry_required", "verdict": "pass", "detail": "Ctry is present (\"ch\")." },
{ "rule": "ctry_iso3166", "verdict": "fail", "detail": "Ctry \"ch\" is not two uppercase letters." },
{ "rule": "adr_tp_forbidden", "verdict": "fail", "detail": "AdrTp \"ADDR\" was supplied. SPS marks Address Type \"N — Must not be sent\"." },
{ "rule": "adr_line_max_2", "verdict": "pass", "detail": "2 AdrLine supplied, within the maximum of 2." },
{ "rule": "adr_line_max_length_70", "verdict": "pass", "detail": "Every AdrLine is at most 70 characters." },
{ "rule": "adr_line_no_repeat", "verdict": "fail", "detail": "\"8001 Zurich\" repeats PstCd + TwnNm. SPS: \"Data already provided in another element must not be repeated.\"" }
]
}Each finding also carries a source field, elided above for width — it names the document and its date, so you can forward the verdict to whoever produced the address.
The rules, and which rail each one belongs to
| Rule | sps | hvps_plus | fedwire |
|---|---|---|---|
twn_nm_required — unconditional | yes | — | yes |
ctry_required — unconditional | yes | — | yes |
twn_nm_ctry_required_if_no_adr_line — conditional | — | yes | — |
ctry_iso3166 — two uppercase letters, assigned | yes | yes | yes |
adr_tp_forbidden — Address Type "Must not be sent" | yes | — | — |
adr_line_max_2 | yes | — | yes |
adr_line_max_length_70 | yes | — | yes |
strt_nm_max_70 — ISO 20022 maximum length of the structured element (70) | yes | — | — |
bldg_nb_max_16 — ISO 20022 maximum length of the structured element (16) | yes | — | — |
pst_cd_max_16 — ISO 20022 maximum length of the structured element (16) | yes | — | — |
twn_nm_max_35 — ISO 20022 maximum length of the structured element (35) | yes | — | — |
adr_line_no_repeat | yes | — | — |
A dash means the fetched document for that rail states nothing on the subject. It does not mean the rule is inverted, and we do not import a neighbouring rail's rule to fill the gap — silence is reported as silence.
verdict has three values, not two. not_applicable marks a rule whose precondition is not met — an AdrLine rule on an address with no AdrLine. It is a real answer, not a polite pass, and conforms ignores it.
Why there is a scheme parameter and no "compliant" boolean
Because the three rails genuinely disagree, and a single boolean would have to pick one and hide it:
TwnNm+Ctryare unconditional for SPS and Fedwire, and conditional for T2 / HVPS+ — required only whenAddressLineis absent.AdrLineis capped at 2 by SPS and Fedwire, capped at nothing in the T2 validation appendix, and allowed up to 7 in base ISO 20022.AdrTpis forbidden by SPS and unmentioned by the other two.
And cbpr+ is not one of the schemes, on purpose. Its rules could not be read from any public source. Sending "scheme": "cbpr+" returns a 400 that says so rather than a verdict we would have had to invent.
What this does not do
Three limits, stated here so nobody discovers them in November.
It does not solve a customer-address migration. The bulk of the November 2026 change falls on the addresses of the parties to a payment — Dbtr, Cdtr, UltmtDbtr, UltmtCdtr. That is your own customer address book, and this API holds no data about it and makes no claim about it. If someone tells you an IBAN and BIC API will settle that migration for you, they are selling you something they do not have.
It does not parse a free-text address into a structured one. Turning "ul. Sokolska 34, 40-086 Katowice" into StrtNm / BldgNb / PstCd / TwnNm requires national postal reference data across some 250 countries. That is the trade of Loqate, Smarty and Google's Address Validation API. We hold none of it, and a checksum-free guess at a street name is worse than no answer.
It does not certify CBPR+ conformity. No public source lets anyone do that honestly today. The checker names the rail it is judging against, and every finding names its document.
What is left after those three subtractions is small, and it is real: the ISO 20022 form of an institution seat we already hold, a rule check you can run for free, and — the part worth the most — the reminder that resolving a clearing code into a BIC often removes the address obligation altogether.
The market-practice paper trail
The PMPG (Payments Market Practice Group, the independent body supporting ISO 20022 adoption) publishes a monthly Payment Insights newsletter whose August 2026 issue is squarely about this deadline — and, unlike the CBPR+ usage guidelines, it permits reproduction provided the source is acknowledged, so we can quote it. Three things in it are worth your attention: it described the then-planned November 2026 removal, a timetable superseded by the Swift and EPC postponements above; it names the hybrid postal address — the same format: "hybrid" this API serves — as the PMPG-endorsed shape for addresses that cannot be fully structured; and its gap-impact table ranks "one-off payment with incomplete creditor address data" as Limited impact, against High for missing country codes across high-volume files. Source: PMPG, Payment Insights, August 2026.
Put these checks to work
Choose a first step for your software or your supplier file.
Check a supplier file
Upload a CSV or Excel file and preview the findings for free. Purchase the annotated workbook if you need the full report. No account or subscription required.
Explore the file auditIntegrate IBAN checks into your software
Try a validation, inspect the response, then connect your application through the API or an existing integration.
Explore the API workflowAvailable bank information varies by country and source. These checks do not confirm the account holder or guarantee that a payment will succeed.