{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://webuildconsortium.eu/schemas/iban-ov-sd-jwt.json", "title": "WeBuild – IBAN Ownership Verification (IBAN-OV) – SD-JWT VC payload", "description": "Schema for the SD-JWT VC payload of an IBAN-OV attestation as defined in the IBAN-OV Rulebook (Chapter 3.2). This models the JSON claims set prior to SD-JWT disclosure/packing.", "type": "object", "version": "0.1.0", "additionalProperties": true, "properties": { "vct": { "type": "string", "description": "Verifiable Credential Type. Base type is 'eu.we-build.iban-ov.1'.", "examples": [ "eu.we-build.iban-ov.1" ] }, "iss": { "type": "string", "format": "uri", "description": "Issuer of the attestation. Identifies the financial institution (ASPSP) that issued the IBAN-OV attestation. Follows RFC 7519.", "examples": [ "https://bank.example.com" ] }, "iat": { "type": "integer", "description": "Issuance date as a Unix timestamp (seconds since epoch). Represents the date and time when the attestation was issued (ISO 8601 / RFC 7519). SHALL NOT be selectively disclosable.", "examples": [ 1736935200 ] }, "exp": { "type": "integer", "description": "Expiry date as a Unix timestamp (seconds since epoch). Represents the date and time when the attestation expires (ISO 8601 / RFC 7519). SHALL be later than 'iat'. SHALL NOT be selectively disclosable.", "examples": [ 1768471200 ] }, "attestation_legal_category": { "type": "string", "description": "The legal category of the attestation as defined by eIDAS 2. For the IBAN-OV attestation issued by the bank (ASPSP) acting as an authorized issuer, this is 'EAA'.", "enum": [ "EAA" ] }, "schema_version": { "type": "string", "description": "Version of the IBAN-OV attestation schema used.", "examples": [ "1.0", "0.1.0" ] }, "bank_account": { "type": "object", "description": "Core details of the bank account itself (the 'what'). SHALL be individually selectively disclosable as a top-level claim.", "additionalProperties": false, "properties": { "account_name": { "type": "string", "description": "Name of the account, generated by the bank or customized by the owner.", "examples": [ "Company A Main Account" ] }, "iban": { "type": "string", "description": "International Bank Account Number, as defined in ISO 13616:2020. SHALL conform to the format [A-Z]{2}[0-9A-Z]{13,30}.", "pattern": "^[A-Z]{2}[0-9A-Z]{13,30}$", "examples": [ "DE89370400440532013000" ] }, "account_type": { "type": "string", "description": "Nature of the bank account. SHOULD use one of the standardized values defined in Section 2.8.2 (e.g. CURRENT, SAVINGS, BASIC, LOAN, OTHER).", "examples": [ "CURRENT" ] }, "account_currency": { "type": "array", "description": "Currency code(s) used for the account, as defined in ISO 4217:2015. SHALL contain at least one valid ISO 4217:2015 currency code.", "minItems": 1, "items": { "type": "string", "description": "ISO 4217:2015 three-letter currency code.", "pattern": "^[A-Z]{3}$" }, "examples": [ ["EUR"] ] } }, "required": [ "account_name", "iban", "account_type", "account_currency" ] }, "account_ownership": { "type": "object", "description": "Identifies the legal owner of the account (the 'who'). The owner is either a legal person or a natural person. Required name attributes depend on owner_type. SHALL be individually selectively disclosable as a top-level claim.", "additionalProperties": false, "properties": { "owner_type": { "type": "string", "description": "Discriminator identifying whether the account owner is a legal person or a natural person. SHALL be present in all cases.", "enum": ["entity", "person"] }, "legal_person_identifiers": { "type": "array", "description": "Array of objects containing unique identification strings of the legal entity owning the account.", "minItems": 1, "items": { "type": "object", "additionalProperties": false, "properties": { "type": { "type": "string", "description": "Scheme or type of the identifier used (e.g., 'EUID', 'LEI', 'TAX').", "examples": ["EUID", "LEI", "TAX"] }, "value": { "type": "string", "description": "The actual identifier value.", "examples": ["DE-HRB-123456", "529900T8BM49AURSDO55"] } }, "required": ["type", "value"] } }, "owner_name": { "type": "string", "description": "Legal name of the legal entity owning the account. Mandatory if owner_type = 'entity'. SHALL NOT be present if owner_type = 'person'.", "examples": [ "Company A GmbH" ] }, "given_name": { "type": "string", "description": "Given name(s) of the natural person owning the account. Mandatory if owner_type = 'person'. SHALL NOT be present if owner_type = 'entity'.", "examples": [ "Maria" ] }, "surname": { "type": "string", "description": "Surname / family name of the natural person owning the account. Mandatory if owner_type = 'person'. SHALL NOT be present if owner_type = 'entity'.", "examples": [ "Müller" ] } }, "required": ["owner_type"], "allOf": [ { "if": { "properties": { "owner_type": { "const": "entity" } }, "required": ["owner_type"] }, "then": { "required": ["owner_name", "legal_person_identifiers"], "not": { "anyOf": [ { "required": ["given_name"] }, { "required": ["surname"] } ] } } }, { "if": { "properties": { "owner_type": { "const": "person" } }, "required": ["owner_type"] }, "then": { "required": ["given_name", "surname"] } } ] }, "account_provider": { "type": "object", "description": "Describes the financial institution that issued the account and related metadata (the 'where & how'). SHALL be individually selectively disclosable as a top-level claim.", "additionalProperties": false, "properties": { "provider_name": { "type": "string", "description": "Name of the financial institution providing the account.", "examples": [ "Example Bank AG" ] }, "legal_person_identifiers": { "type": "array", "description": "Array of objects containing unique identification strings of the issuing financial institution.", "minItems": 1, "items": { "type": "object", "additionalProperties": false, "properties": { "type": { "type": "string", "description": "Scheme or type of the identifier used (e.g., 'EUID', 'LEI', 'BIC').", "examples": ["EUID", "LEI", "BIC"] }, "value": { "type": "string", "description": "The actual identifier value.", "examples": ["DE12121.HRB654321", "DEUTDEDB"] } }, "required": ["type", "value"] } }, "provider_country": { "type": "string", "description": "Alpha-3 country code, as defined in ISO 3166-1, of the provider country or territory. SHALL be a valid ISO 3166-1 alpha-3 country code.", "pattern": "^[A-Z]{3}$", "examples": [ "DEU" ] }, "bic_swift": { "type": "string", "description": "International code (BIC or SWIFT code), as defined in ISO 9362, of the financial institution. SHALL conform to the ISO 9362:2022 format [A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?.", "pattern": "^[A-Z]{6}[A-Z0-9]{2}([A-Z0-9]{3})?$", "examples": [ "DEUTDEDB" ] }, "national_bank_code": { "type": "string", "description": "Country-specific code for internal routing within a specific country's clearing system. Optional attribute.", "examples": [ "37040044" ] }, "nace_code": { "type": "string", "description": "NACE code for activity specification (e.g. 64.19). Optional attribute.", "examples": [ "64.19" ] }, "clearing_number": { "type": "string", "description": "Clearing number for identification of the financial institution, used only in some countries. Optional attribute.", "examples": [ "37040044" ] } }, "required": [ "provider_name", "provider_country", "bic_swift" ] }, "status": { "type": "object", "description": "Status claim per Token Status List specification (draft-ietf-oauth-status-list). MUST be present when the technical validity period is greater than 24 hours.", "additionalProperties": false, "properties": { "status_list": { "type": "object", "description": "Reference to the Status List Token containing the revocation status of this credential.", "additionalProperties": false, "properties": { "idx": { "type": "integer", "minimum": 0, "description": "Zero-based index into the status list bitstring for this credential.", "examples": [456] }, "uri": { "type": "string", "format": "uri", "description": "URI of the Status List Token that contains the bitstring indicating revocation status.", "examples": ["https://bank.example.com/status/iban-ov/2026"] } }, "required": ["idx", "uri"] } }, "required": ["status_list"] }, "trust_anchor_url": { "type": "string", "format": "uri", "description": "URL at which a machine-readable version of the trust anchor used for verifying the IBAN-OV attestation can be found or looked up.", "examples": [ "https://trust.webuildconsortium.eu/anchors/qtsp/eidas-tl" ] }, "cnf": { "type": "object", "description": "Confirmation claims per SD-JWT VC. Holder binding via JWK is recommended. The IBAN-OV attestation SHALL be cryptographically bound to the specific Holder wallet onboarded by the issuer.", "additionalProperties": false, "properties": { "jwk": { "type": "object", "description": "Public key bound to the holder.", "additionalProperties": true, "properties": { "kty": { "type": "string" }, "crv": { "type": "string" }, "x": { "type": "string" }, "y": { "type": "string" }, "n": { "type": "string" }, "e": { "type": "string" } } } }, "required": [ "jwk" ] } }, "required": [ "vct", "iss", "iat", "exp", "attestation_legal_category", "bank_account", "account_ownership", "account_provider" ] }