Holvi Payment Initiation API

PISP endpoints - initiate and confirm SEPA / SEPA Instant / SWIFT payments.

OpenAPI Specification

holvi-payment-initiation-api-openapi.yml Raw ↑
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.