Changelog
All notable changes to the Lunar Open Banking API are documented here, organized by API spec version.
Account Information and Payment Initiation API
0.8.0-beta
Account usage field
usage— a new optional field on theAccountobject indicating whether the account is owned by a private individual (PRIVATE) or an organisation (ORGANISATION). Omitted when the owner type cannot be determined. Signing baskets and drafts remain in beta and carry over unchanged from0.7.0-beta.
0.7.0-beta
Transaction enrichment — message, debtor/creditor, account balance, additional information
This release enriches the Transaction object with several new optional fields that bring the Lunar API closer to the NextGen Berlin Group standard and address integration requests from partners.
message— a free-text payment message associated with the transaction. Sourced per transaction type: the sender note on a domestic credit transfer, the message on a payment or direct debit, the receiver message on an international payment, or the description on Swedish giro/Swish flows. Present when available; omitted otherwise.debtor/creditor— structuredTransactionPartyobjects (name,address,account,bic) identifying who funds are debited from and credited to. The nestedaccountcarriesscheme(IBAN,BBAN, orACCOUNT_NUMBER) andidentification. Direction is determined by the sign ofbillingAmount: incoming transfers have the counterparty asdebtorand the account holder ascreditor; outgoing transfers reverse this. Aligns with Berlin Group’sdebtorAccount/creditorAccount/debtorName/creditorNameshape.accountBalanceAfterTransaction— anAmountobject with the booked account balance after this transaction settled. Populated for settled transactions; omitted otherwise. Inspired by Berlin Group’sbalanceAfterTransaction.additionalInformation— a free-form string map for transaction identifiers that don’t fit structured fields. Currently emitted keys:bgNumber,pgNumber,giroNumber,bgIssuer,ocr,swishId. Consumers should treat unrecognized keys as opaque — new keys may be added without a version bump. Modeled after UK OBIE’sSupplementaryData/ Berlin Group’sadditionalInformation.
All new fields are additive and tagged omitempty — existing consumers that ignore unknown fields are unaffected.
The previously undocumented debtorName string field (which was never publicly released in any portal spec) has been replaced by the structured debtor/creditor model. No consumer impact.
Signing baskets and drafts remain in beta and carry over unchanged from 0.6.0-beta. The previous 0.6.0-beta spec remains selectable in the version dropdown for reference.
0.6.0-beta
Breaking change — draft and signing-basket statuses aligned with payment statuses
This release renames the wire-facing status enums on the draft and signing-basket endpoints so that all three layers (per-draft lifecycle, per-draft basket entry, basket overall) share the same uppercase vocabulary as the underlying payment endpoints. See the cross-layer status mapping section for the full picture.
Per-draft lifecycle on GET /payments/drafts/{type}/{id} (DraftResponse.status):
| Old | New |
|---|---|
DRAFT | CREATED |
APPROVING | PENDING (collapsed; APPROVING was never observable in practice) |
EXECUTING | PENDING |
EXECUTED | COMPLETED |
DELETED | DELETED (unchanged) |
Per-draft basket entry on GET /payments/drafts/approve/{requestId}/status (DraftApprovalStatus.status):
| Old | New |
|---|---|
pending | CREATED |
approved | CREATED (collapsed) |
awaiting_execution | PENDING |
completed | COMPLETED |
failed | FAILED |
Basket overall (ApprovalStatus):
| Old | New |
|---|---|
created | AWAITING_APPROVAL |
completed | APPROVED |
expired | EXPIRED |
declined | DECLINED |
In addition:
paymentIdon per-draft basket entries is now present when status isPENDINGorCOMPLETED(wasawaiting_executionorcompleted).expectedExecutionDateis now present only when status isPENDING(wasawaiting_execution).- The per-draft
FAILEDstate remains a side path — when a payment can’t be completed, the draft itself recycles back toCREATEDwithpaymentErrorpopulated, ready for retry. Same behaviour, new name.
Roll-out: clean break — no dual-emit / deprecation window. The previous 0.5.0-beta spec remains selectable in the version dropdown for reference.
0.5.0-beta
Beta release — Drafts and Signing Baskets
- Added draft endpoints for SE Bank Giro and SE Plus Giro payments, enabling staged payment preparation where fields can be added incrementally before approval
POST /payments/drafts/se-bank-giro— Create a draft. Accepts an optionaldraftIdfield — if omitted, the server generates one.GET /payments/drafts/se-bank-giro/{id}— Retrieve a draftPATCH /payments/drafts/se-bank-giro/{id}— Partially update a draftDELETE /payments/drafts/se-bank-giro/{id}— Delete a draft- Same set of endpoints for
se-plus-giro
- Added signing basket (batch approval) endpoints
GET /payments/drafts— List approvable drafts for the current user. Draft summaries include aninvalidReasonfield — a localized string explaining why a draft is invalid (present whenisValidis false) — and apaymentErrorfield — a localized string describing why a previous payment attempt failed, present when a draft returns to approvable state after a payment failure, allowing re-approval. Use theX-Languageheader to control the language.POST /payments/drafts/approve— Batch approve multiple drafts with a single authorization challenge. Accepts a requiredredirectUrlin the request body and returns an optionalauthUrlin the response so TPPs can redirect the PSU to complete Strong Customer Authentication, matching the behaviour of single-payment endpoints. After SCA the PSU is redirected back to the suppliedredirectUrl.GET /payments/drafts/approve/{requestId}/status— Poll per-draft approval and execution status. Per-draft status is one ofpending,approved,awaiting_execution,completed,failed. Each entry carriespaymentIdonce the draft reachesawaiting_executionorcompleted, an optionalexpectedExecutionDate(ISO 8601YYYY-MM-DD) when the executing service has scheduled the payment for a specific date, and a localizederrorMessagewhenfailed(controlled by theX-Languageheader).
- New draft status lifecycle:
DRAFT→APPROVING→EXECUTING→EXECUTED(orDELETED) - New approval status model:
created,completed,expired,declined - Added
PENDINGandCOMPLETEDto the SE Bank Giro and SE Plus Giro status enums. Same-day payments now transitionAWAITING_APPROVAL→APPROVED→COMPLETED, while future-dated payments transitionAWAITING_APPROVAL→PENDINGand remain inPENDINGuntil their execution date.
0.4.0
- Added
DELETE /payments/se-bank-giro/{id}— Cancel a Bank Giro payment (idempotent, returns204) - Added
DELETE /payments/se-plus-giro/{id}— Cancel a Plus Giro payment (idempotent, returns204) - Added
CANCELLEDto the SE Bank Giro and SE Plus Giro status enums
0.3.0
- Added SE Bank Giro payment type
POST /payments/se-bank-giro— Initiate a Bank Giro paymentGET /payments/se-bank-giro/{id}— Retrieve a Bank Giro payment
- Added SE Plus Giro payment type
POST /payments/se-plus-giro— Initiate a Plus Giro paymentGET /payments/se-plus-giro/{id}— Retrieve a Plus Giro payment
0.2.0
- Added
GET /accounts/{accountId}/transactions/{transactionId}— Retrieve a single transaction by ID
0.1.0
Initial release
- Account Information (AISP)
GET /accounts— List accountsGET /accounts/{accountId}/transactions— List transactionsGET /funds-confirmation— Check funds availability
- Payment Initiation (PISP)
POST /payments/domestic-credit-transfer— Initiate a domestic credit transferGET /payments/domestic-credit-transfer/{id}— Retrieve transfer statusPOST /payments/dk-payment-slip— Initiate a Danish payment slipGET /payments/dk-payment-slip/{id}— Retrieve payment slip statusPOST /payments/standing-order— Create a standing orderGET /payments/standing-order— List standing ordersGET /payments/standing-order/{id}— Retrieve a standing orderDELETE /payments/standing-order/{id}— Delete a standing order
Registration API
0.1.0
Initial release
- TPP registration, client management, and OAuth2 token endpoints