> ## Documentation Index
> Fetch the complete documentation index at: https://dev-docs.pagoramp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create virtual account

> Open a dedicated (permanent) or dynamic (amount-bound, temporary) virtual account for a customer. Needs a webhook secret on the merchant account. Returns status requires_action with a nextStep when the provider needs the customer to verify first, and pending while the provider approves it.



## OpenAPI

````yaml /pagoramp-checkout-openapi.json post /api/v1/virtual-accounts
openapi: 3.0.0
info:
  title: Pagoramp Open API
  description: Our collection orchestration API for merchants to integrate to their system
  version: '1.0'
  contact: {}
servers:
  - url: https://pay-api.pagoramp.com
    description: Production
  - url: https://pay-api-staging.pagoramp.com
    description: Staging
security:
  - x-api-key: []
tags:
  - name: Checkout
    description: ''
  - name: P2P
    description: ''
  - name: Payment Links
    description: ''
  - name: Customer
    description: ''
  - name: Customers
    description: ''
  - name: Virtual Accounts
    description: ''
  - name: Misc
    description: ''
paths:
  /api/v1/virtual-accounts:
    post:
      tags:
        - Virtual Accounts
      summary: Create virtual account
      description: >-
        Open a dedicated (permanent) or dynamic (amount-bound, temporary)
        virtual account for a customer. Needs a webhook secret on the merchant
        account. Returns status requires_action with a nextStep when the
        provider needs the customer to verify first, and pending while the
        provider approves it.
      operationId: VirtualAccountsController_create
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateVirtualAccountDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                example:
                  status: success
                  message: Virtual account created successfully
                  data:
                    uuid: 9a1c1c52-7b8e-4a52-9f0e-3e6b0a8d6c11
                    reference: va_1001
                    status: active
                    currency: NGN
                    country: NG
                    type: dedicated
                    bankDetails:
                      rail: nuban
                      accountName: ACME PAY / JOHN DOE
                      accountNumber: '0123456789'
                      bankName: Wema Bank
                      bankCode: '035'
                      extra: {}
                    customer:
                      uuid: 224ca5c5-f2a6-419b-bf36-73997434d945
                      email: johndoe@example.com
                    expectedAmount: null
                    expiresAt: null
                    nextStep: null
                    statusReason: null
                    metadata:
                      orderId: '12345'
                    createdAt: '2026-10-16T09:31:00.000Z'
        '400':
          description: ''
          content:
            application/json:
              schema:
                example:
                  status: error
                  message: The customer is missing details this currency needs
                  errors:
                    - field: identification.number
                      code: required
        '422':
          description: ''
          content:
            application/json:
              schema:
                example:
                  status: error
                  message: This currency is not available
                  errors:
                    - field: currency
                      code: currency_unavailable
      security:
        - x-api-key: []
components:
  schemas:
    CreateVirtualAccountDto:
      type: object
      properties:
        customerId:
          type: string
          example: 224ca5c5-f2a6-419b-bf36-73997434d945
          description: The customer uuid
        currency:
          type: string
          example: NGN
          description: NGN, CAD, USD, EUR, GBP, KES, GHS or TZS
        type:
          type: string
          enum:
            - dedicated
            - dynamic
          example: dedicated
        country:
          type: string
          example: NG
        reference:
          type: string
          example: va_1001
          description: Your own reference, unique per merchant
        metadata:
          type: object
          example:
            orderId: '12345'
        amount:
          type: number
          example: 5000
          description: 'Dynamic accounts only: the amount the payer must send'
        expiresIn:
          type: number
          example: 7200
          description: 'Dynamic accounts only: seconds until the account expires'
        redirectUrl:
          type: string
          example: https://app.example.com/verification-complete
          description: >-
            Where the customer returns after a hosted verification step (USD,
            EUR, GBP)
        termsAcceptance:
          description: Needed for CAD accounts
          allOf:
            - $ref: '#/components/schemas/TermsAcceptanceDto'
      required:
        - customerId
        - currency
        - type
    TermsAcceptanceDto:
      type: object
      properties:
        acceptedAt:
          type: string
          example: '2026-10-16T09:30:00.000Z'
        ipAddress:
          type: string
          example: 102.89.0.1
      required:
        - acceptedAt
        - ipAddress
  securitySchemes:
    x-api-key:
      type: apiKey
      in: header
      name: x-api-key

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.