Paystack Dedicated Virtual Accounts API

Provision dedicated NUBAN virtual bank accounts for individual customers so they can pay by bank transfer with automatic reconciliation back to the customer profile. Includes split routing on inbound transfers.

Paystack Dedicated Virtual Accounts API is one of 13 APIs that Paystack publishes on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 1 machine-runnable capability that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko.

Tagged areas include Bank Transfer, NUBAN, and Virtual Accounts. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, sample payloads, and 1 Naftiko capability spec.

OpenAPI Specification

paystack-dedicated-virtual-accounts-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Paystack Dedicated Virtual Accounts API
  description: Create and manage dedicated NUBAN virtual bank accounts for customers so they can receive payments via bank
    transfer with automatic reconciliation.
  version: 1.0.0
  contact:
    name: Paystack Support
    url: https://support.paystack.com
    email: [email protected]
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.paystack.co
  description: Base API endpoint
tags:
- name: Dedicated Virtual Account
paths:
  /dedicated_account:
    post:
      tags:
      - Dedicated Virtual Account
      summary: Create Dedicated Account
      operationId: dedicatedAccount_create
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/paths/~1dedicated_account/post/requestBody/content/application~1json/schema'
          application/json:
            schema:
              type: object
              required:
              - customer
              properties:
                customer:
                  description: Customer ID or code
                  type: string
                preferred_bank:
                  description: The bank slug for preferred bank. To get a list of available banks, use the List Providers
                    endpoint
                  type: string
                subaccount:
                  description: Subaccount code of the account you want to split the transaction with
                  type: string
                split_code:
                  description: Split code consisting of the lists of accounts you want to split the transaction with
                  type: string
      responses:
        '201':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    get:
      tags:
      - Dedicated Virtual Account
      summary: List Dedicated Accounts
      operationId: dedicatedAccount_list
      parameters:
      - name: account_number
        in: query
        schema:
          type: string
      - name: customer
        in: query
        schema:
          type: string
      - name: active
        in: query
        schema:
          type: boolean
      - name: currency
        in: query
        schema:
          type: string
      - name: provider_slug
        in: query
        schema:
          type: string
      - name: bank_id
        in: query
        schema:
          type: string
      - name: perPage
        in: query
        schema:
          type: string
      - name: page
        in: query
        schema:
          type: string
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
  /dedicated_account/{account_id}:
    get:
      tags:
      - Dedicated Virtual Account
      summary: Fetch Dedicated Account
      operationId: dedicatedAccount_fetch
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    delete:
      tags:
      - Dedicated Virtual Account
      summary: Deactivate Dedicated Account
      operationId: dedicatedAccount_deactivate
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
    parameters:
    - name: account_id
      in: path
      required: true
      schema:
        type: string
  /dedicated_account/available_providers:
    get:
      tags:
      - Dedicated Virtual Account
      summary: Fetch Bank Providers
      operationId: dedicatedAccount_availableProviders
      responses:
        '200':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        '404':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
  /dedicated_account/split:
    post:
      tags:
      - Dedicated Virtual Account
      summary: Split Dedicated Account Transaction
      operationId: dedicatedAccount_addSplit
      requestBody:
        content:
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/paths/~1dedicated_account~1split/post/requestBody/content/application~1json/schema'
          application/json:
            schema:
              type: object
              required:
              - account_number
              properties:
                account_number:
                  description: Valid Dedicated virtual account
                  type: string
                subaccount:
                  description: Subaccount code of the account you want to split the transaction with
                  type: string
                split_code:
                  description: Split code consisting of the lists of accounts you want to split the transaction with
                  type: string
      responses:
        '201':
          $ref: '#/paths/~1plan/get/responses/200'
        '401':
          $ref: '#/paths/~1plan/get/responses/401'
        default:
          description: Server error
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
  schemas:
    Customer:
      allOf:
      - type: object
        required:
        - email
        properties:
          email:
            description: Customer's email address
            type: string
      - type: object
        properties:
          first_name:
            description: Customer's first name
            type: string
          last_name:
            description: Customer's last name
            type: string
          phone:
            description: Customer's phone number
            type: string
          metadata:
            description: Stringified JSON object of custom data
            type: string
      - type: object
        required:
        - authorization_code
        properties:
          authorization_code:
            description: Customer's authorization code to be deactivated
            type: string
      - type: object
        required:
        - customer
        properties:
          customer:
            description: Customer's code, or email address
            type: string
          risk_action:
            description: "One of the possible risk actions [ default, allow, deny ]. allow to whitelist. \ndeny to blacklist.\
              \ Customers start with a default risk action.\n"
            type: string
            enum:
            - default
            - allow
            - deny
      - type: object
        required:
        - type
        - country
        - bvn
        - bank_code
        - account_number
        properties:
          type:
            description: Predefined types of identification.
            type: string
            enum:
            - bvn
            - bank_account
          country:
            description: Two-letter country code of identification issuer
            type: string
          bvn:
            description: Customer's Bank Verification Number
            type: string
          bank_code:
            description: You can get the list of bank codes by calling the List Banks endpoint (https://api.paystack.co/bank).
            type: string
          account_number:
            description: Customer's bank account number.
            type: string
          value:
            description: Customer's identification number. Required if type is bvn
            type: string
    Error:
      type: object
      properties:
        status:
          type: boolean
        message:
          type: string
    Response:
      type: object
      properties:
        status:
          type: boolean
        message:
          type: string
        data:
          type: object
security:
- bearerAuth: []