sandbox.bankconnector.com API Reference

Canonical payment field reference

Audience: 🔌 Integration Client

The JSON shape you send to POST /api/journal/payments (and POST /api/journal/payments/preview). BankConnector converts it to the bank's ISO 20022 dialect, so one shape serves every bank.

Required below means structurally required: the structural gate rejects the request with 422 if it's missing (400 on API version 2026-06-01, and with no version header). Some fields are optional in the schema but required by a specific bank's rules (a 422 at the bank level); those are marked "bank-conditional". All text fields are ISO 20022 Max*Text; exceeding the ceiling is a 422 under the same rule (400 on 2026-06-01 or with no version header).

Amounts are decimal strings ("1500.00"), never numbers. This preserves exact minor units. See Core concepts for the amount rules.

The (PmtInf) / (CdtTrfTxInf) labels on the headings below are for cross-referencing a bank's own MIG. You send only the JSON fields.

Top level

FieldRequiredType / constraint
schemaVersionoptional"1.0" \"1.1" (defaults to 1.1; unknown value rejected)
messageIdrequired≤ 35 chars, your unique id for this instruction
creationDateTimeoptionalISO-8601 UTC (...Z); offsets are rejected
initiatingPartyrequiredobject, { name, organisationId? }
initiatingParty.namerequired≤ 140 chars
initiatingParty.organisationIdoptionalOrganisationId
initiatingParty.secondOrganisationIdoptionalOrganisationId; a second identifier for the same customer, written after organisationId (some banks, e.g. DNB, expect two). Usually filled from your saved bank settings
paymentsrequiredarray, 1–1000 items

payments[]: a payment block (PmtInf)

FieldRequiredType / constraint
paymentIdrequired≤ 35 chars
paymentTypeoptionale.g. "sepa", "international", "faster-payment"; omit (or "auto") to let the engine infer it (returned as autoSelected)
priorityoptional"normal" \"urgent"; in Finland an urgent euro payment is SEPA Instant (below)
chargeBeareroptionalwho pays the bank fees; usually leave unset (the scheme default applies). Advanced: DEBT/CRED/SHAR/SLEV (OUR/BEN/SHA aliased)
localInstrumentoptionaladvanced: normally engine-derived; only set to override. ≤ 35 chars
localInstrumentProprietaryoptionaladvanced: the proprietary form of localInstrument (ISO LclInstrm/Prtry instead of Cd). ≤ 35 chars. Set at most one of the two
categoryPurposeoptionaladvanced: normally omit. ISO category-purpose code, ≤ 4 chars
executionDaterequiredreal YYYY-MM-DD calendar date
debtorrequiredParty (who pays)
transactionsrequiredarray, 1–10000 items

Finland: urgent euro payments

At a Finnish bank, a euro payment marked priority: "urgent" is sent as SEPA Instant (paymentType becomes "sepa-instant"): it reaches the payee's bank within seconds, any day, and cannot be recalled once it is sent. It is never sent as a POPS express payment.

BankConnector sends SEPA Instant only through a Finnish bank whose own guide shows how it marks one: Danske Bank, OP, SEB, POP Pankki and Ålandsbanken. At any other Finnish bank a sepa-instant payment is refused with PAYMENT_TYPE_NOT_OFFERED, and an urgent euro payment with BANK_FI_URGENT_SEPA_INSTANT_UNAVAILABLE. Remove "urgent" to send it as a normal SEPA payment, or pay it from an account at a bank that offers SEPA Instant. At SEB, SEPA Instant payments go in an instruction of their own: one mixed with other payments is refused with BANK_SEPA_INSTANT_MIXED. An urgent salary is refused with BANK_FI_URGENT_SALARY_NOT_INSTANT: a salary is paid on its payment date and never goes instant. At Danske Bank, an urgent or sepa-instant payment whose categoryPurpose is SALA, INTC, SDVA or URGP is refused with BANK_DANSKE_SEPA_INSTANT_NOT_HONOURED: Danske sends those as ordinary SEPA payments, never as SEPA Instant.

OP rejects a SEPA Instant payment that carries invoice details, so at OP a SEPA Instant payment (an explicit "sepa-instant" or an urgent euro payment) with remittance.documents is refused with BANK_OP_SEPA_INSTANT_INVOICE_DOCUMENTS. Send it as a normal SEPA payment, or keep it instant and give the invoice's reference number (remittance.creditorReference) or a short message (remittance.unstructured) instead.

transactions[]: one credit transfer (CdtTrfTxInf)

FieldRequiredType / constraint
endToEndIdrequired≤ 35 chars, unique within the block
instructionIdoptional≤ 35 chars
amountrequireddecimal string, always exactly 2 decimals, e.g. "1500.00", for every currency. "1234.567" KWD (or any BHD, IQD, JOD, LYD, OMR, TND amount with a non-zero third decimal) is refused, never rounded
currencyrequiredISO-4217, 3 letters
creditorrequiredParty (who is paid)
remittanceoptional{ unstructured?, documents?, creditorReference?, additionalInfo? }; each additionalInfo item ≤ 140 chars
purposeCodeoptional≤ 10 chars; the purpose of payment (see below)
regulatoryReportingoptionalRegulatoryReporting object
splitPaymentconditionalPolish split payment / MPP; mandatory on the split payment type (see below)

purposeCode: one fact, many dialects

Supply the business purpose once; the engine emits it in the bank's language: ISO Purp/Cd for codes ≤ 4 chars, or a corridor-specific regulatory wrapper where the corridor demands one (e.g. PH accepts 10-digit codes; cross-border CNY is translated into its /BUSINESS/… form). This is why the ceiling is 10, not 4.

splitPayment: Polish MPP (mandatory on the split type)

A Polish split payment without its VAT amount is rejected and fined by the bank, so all three sub-fields are required when the object is present:

FieldRequiredType / constraint
splitPayment.vatAmountrequireddecimal string; must be ≤ the transaction amount
splitPayment.taxIdrequiredcreditor tax id, Polish NIP; ≤ 14 chars (longer ids are rejected)
splitPayment.invoiceRefrequiredinvoice reference, ≤ 35 chars (PRZEKAZANIE WLASNE for own-VAT moves)

remittance: what the payment is for

For almost every payment, use remittance.unstructured: up to a few free-text lines (e.g. ["Invoice 2026-0042"]). That's the friendly default.

Only reach for remittance.creditorReference when the creditor requires a specific structured reference: a Norwegian KID, a Swedish OCR, a Danish FIK, a Swiss QR reference, or the ISO 11649 cross-border reference (SCOR). It's { type, value }:

typeUse it for
scorISO 11649 "RF" structured creditor reference (generic)
kidNorway
ocrSweden
fikDenmark
qrrSwiss QR-bill reference (required by a QR-IBAN)

If you don't have one of these, you don't need this field; unstructured is fine.

Party

Used for both debtor and each creditor.

FieldRequiredType / constraint
namerequired≤ 140 chars
countryoptionalISO 3166-1 alpha-2 (UK is accepted and sent as GB); bank-conditional (e.g. CGI banks require it on the debtor: BANK_DEBTOR_COUNTRY_REQUIRED)
postalAddressoptionalPostalAddress (all sub-fields optional)
accountrequiredAccount
agentoptionalAgent
organisationIdoptionalOrganisationId

Account

Exactly one of iban or other must be present, not both, not neither.

FieldRequiredType / constraint
ibanone-ofvalid IBAN (format + mod-97 + length-registry checked)
otherone-of{ id, scheme }, a national/BBAN account
other.idrequired if other≤ 34 chars
other.schemerequired if other≤ 35 chars
currencyoptionalISO-4217; bank-conditional (some CGI banks, e.g. Nordea, require it: BANK_DEBTOR_ACCOUNT_CURRENCY_REQUIRED)

Agent

Optional on a party, but if you include a sub-object its ids are required.

FieldRequiredType / constraint
bicoptionalvalid BIC (8 or 11); bank-conditional (some banks require the creditor BIC)
clearingoptional{ system, memberId }
clearing.systemrequired if clearing≤ 35 chars
clearing.memberIdrequired if clearing≤ 35 chars
nameoptional≤ 140 chars
countryoptionalISO 3166-1 alpha-2, the agent's country. Bank-conditional: several rails require it (HSBC IT/IE priority, AE, FR non-SEPA). Only this single element is supported; FR SEPA rejects a full agent address

OrganisationId

FieldRequiredType
idrequired≤ 35 chars
schemeoptional≤ 35 chars
issueroptional≤ 35 chars

See Validation for the full rule catalog and error codes, and Submitting payments for the request/response envelope.