Holvi Payment Initiation API
PISP endpoints - initiate and confirm SEPA / SEPA Instant / SWIFT payments.
PISP endpoints - initiate and confirm SEPA / SEPA Instant / SWIFT payments.
openapi: 3.0.3
info:
title: Holvi PSD2 Account Information Payment Initiation API
version: '2.0'
description: PSD2 (Payment Services Directive 2) API for licensed Third Party Providers (TPPs) to access Holvi customer payment accounts (AISP) and initiate SEPA / SEPA Instant / SWIFT payments (PISP) with Strong Customer Authentication, plus optional Verification of Payee (VOP). TPPs authenticate with an eIDAS QSEAL client certificate, a Holvi Client-Id/Client-Secret pair, and per-request HTTP message signatures (Draft Cavage HTTP Signatures v10, RSA-SHA256). End users (PSUs) grant consent through a redirect login flow that yields a JWT bearer access token.
contact:
name: Holvi Developer Support
email: developer@holvi.com
url: https://holvi-developer.zendesk.com/hc/en-gb
x-api-evangelist:
method: generated
source: https://holvi.github.io/psd2-api/
generated: '2026-07-19'
servers:
- url: https://api.psd2.holvi.com
description: Production
security:
- HolviClientId: []
HolviClientSecret: []
HolviSignatureHeader: []
HolviBearer: []
tags:
- name: Payment Initiation
description: PISP endpoints - initiate and confirm SEPA / SEPA Instant / SWIFT payments.
paths:
/api/v2/payment-initiation/:
post:
tags:
- Payment Initiation
operationId: initiatePayment
summary: Initiate a payment
description: 'Initiates a payment from a Holvi customer payment account. Supports SEPA, SEPA Instant and SWIFT (international) payments. After initiation the customer must complete Strong Customer Authentication (SCA) on their phone; poll the payment state until it becomes `verified`. Set `execute_verification_of_payee: true` to run Verification of Payee (VOP) - a perfect match returns 201, a fuzzy/no match returns 202 requiring confirmation.'
security:
- HolviClientId: []
HolviClientSecret: []
HolviSignatureHeader: []
HolviBearer: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PaymentInitiationRequest'
responses:
'201':
description: Payment created successfully (perfect match or VOP disabled)
content:
application/json:
schema:
$ref: '#/components/schemas/Payment'
'202':
description: VOP verification requires user confirmation
content:
application/json:
schema:
$ref: '#/components/schemas/VopPendingResponse'
'400':
description: VOP verification failed or invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: Unsuccessful authentication
'403':
description: Forbidden. The user lacks payment-initiation permission or is not verified.
'503':
description: Service unavailable
/api/v2/payment-initiation/{payment_initialization_id}/confirm-vop:
post:
tags:
- Payment Initiation
operationId: confirmVop
summary: Confirm a payment after VOP fuzzy/no match
description: When VOP returns a fuzzy match or no match (202), call this endpoint to confirm and proceed with the payment after the user has reviewed the name mismatch.
security:
- HolviClientId: []
HolviClientSecret: []
HolviSignatureHeader: []
HolviBearer: []
parameters:
- name: payment_initialization_id
in: path
required: true
description: The ID returned from the initial VOP payment request.
schema:
type: string
format: uuid
responses:
'201':
description: Payment confirmed and created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/Payment'
'401':
description: Unsuccessful authentication
'403':
description: Insufficient permissions
'404':
description: Payment initialization not found or not in confirmable state
'503':
description: Service unavailable
components:
schemas:
Counterparty:
type: object
properties:
name:
type: string
bic:
type: string
account_identifier:
type: string
description: IBAN or national account number
account_identifier_type:
type: string
enum:
- iban
- national_account_number
street:
type: string
building:
type: string
maxLength: 16
postcode:
type: string
maxLength: 16
region:
type: string
maxLength: 35
city:
type: string
country:
type: string
description: ISO 3166-1 alpha-2 country code
additional_info:
type: string
VopPendingResponse:
type: object
properties:
payment_initialization_id:
type: string
format: uuid
vop_result:
$ref: '#/components/schemas/VopResult'
requires_confirmation:
type: boolean
VopResult:
type: object
properties:
request_uuid:
type: string
format: uuid
match_result:
type: string
enum:
- match
- close-match
- no-match
match_name:
type: string
confidence_score:
type: number
PaymentInitiationRequest:
type: object
required:
- payment_account
- amount
- counterparty
properties:
payment_account:
type: string
format: uuid
amount:
type: string
currency:
type: string
description: ISO 4217; defaults to account currency
counterparty:
$ref: '#/components/schemas/Counterparty'
due_date:
type: string
format: date
unstructured_reference:
type: string
maxLength: 140
structured_reference:
type: string
maxLength: 35
end_to_end_id:
type: string
maxLength: 36
method:
type: string
enum:
- sepa
- international
default: sepa
instant:
type: boolean
default: false
description: Request a SEPA Instant payment
execute_verification_of_payee:
type: boolean
default: false
description: Enable Verification of Payee (VOP).
Payment:
type: object
properties:
uuid:
type: string
format: uuid
counterparty:
$ref: '#/components/schemas/Counterparty'
amount:
type: string
currency:
type: string
method:
type: string
enum:
- sepa
- international
booking_date:
type: string
format: date
nullable: true
due_date:
type: string
format: date
nullable: true
execution_at:
type: string
format: date-time
nullable: true
state:
type: string
enum:
- unverified
- verified
- paid
- notenoughbalance
- cancelled
- scheduled
direction:
type: string
enum:
- in
- out
is_credit:
type: boolean
nullable: true
structured_reference:
type: string
maxLength: 35
unstructured_reference:
type: string
maxLength: 140
end_to_end_id:
type: string
maxLength: 36
Error:
type: object
description: Holvi PSD2 error envelope.
properties:
error:
type: string
details:
type: string
securitySchemes:
HolviClientId:
type: apiKey
in: header
name: X-Holvi-Client-Id
description: Client ID identifying the TPP application (from approved onboarding).
HolviClientSecret:
type: apiKey
in: header
name: X-Holvi-Client-Secret
description: Client Secret authenticating the TPP (from approved onboarding).
HolviSignatureHeader:
type: apiKey
in: header
name: Signature
description: Application-level HTTP message signature (Draft Cavage HTTP Signatures v10, RSA-SHA256, key >= 2048-bit) over (request-target), Host, Date [, Content-Type, Digest for write methods], keyId = Client-Id, using the eIDAS QSEAL certificate.
HolviBearer:
type: http
scheme: bearer
bearerFormat: JWT
description: PSU consent JWT access token from the consent token exchange.