openapi: 3.0.3 info: title: Kora (Korapay) Merchant Balances Virtual Bank Accounts API description: 'The Kora merchant REST API for pan-African payments. It supports pay-ins (card, bank transfer, mobile money, pay-with-bank), payouts (single, bulk, remittance), NGN and USD virtual bank accounts, balances, refunds, multi-currency conversion, and payout utilities (bank / mobile-money lookups and account resolution). All requests are authenticated with API keys - a public key for client-side charge initiation and a secret key (Bearer) for server-side and financial operations - and each account has separate Test and Live mode keys. Card charge payloads must be AES-256 encrypted with your encryption key. Webhook notifications carry an `x-korapay-signature` header that is an HMAC SHA-256 of the response `data` object signed with your secret key. This document is a representative, grounded subset of the public Kora API. Request and response schemas are simplified; consult the Kora developer documentation for the authoritative field-level contract. Endpoints are confirmed against Kora''s published documentation except where a description notes an inferred path.' version: '1.0' contact: name: Kora Developer Support url: https://developers.korapay.com email: support@korapay.com servers: - url: https://api.korapay.com/merchant/api/v1 description: Kora merchant API (Test and Live selected by the API key used) security: - secretKeyAuth: [] tags: - name: Virtual Bank Accounts description: Dedicated NGN and USD virtual bank accounts. paths: /virtual-bank-account: post: operationId: createVirtualBankAccount tags: - Virtual Bank Accounts summary: Create a virtual bank account description: Creates a dedicated NGN or USD virtual bank account (permanent or temporary) tied to a customer, with the KYC information required by the destination market (for example a BVN for NGN accounts). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VirtualBankAccountInput' responses: '200': description: The created virtual bank account. content: application/json: schema: $ref: '#/components/schemas/VirtualBankAccount' '401': $ref: '#/components/responses/Unauthorized' /virtual-bank-account/transactions: get: operationId: listVirtualBankAccountTransactions tags: - Virtual Bank Accounts summary: Fetch virtual bank account transactions description: Retrieves the transactions that funded a virtual bank account. parameters: - name: account_number in: query required: true description: The virtual bank account number. schema: type: string - $ref: '#/components/parameters/StartDate' - $ref: '#/components/parameters/EndDate' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/Limit' responses: '200': description: A list of transactions on the virtual bank account. content: application/json: schema: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' /virtual-bank-account/{accountReference}: parameters: - name: accountReference in: path required: true description: The account_reference supplied when the account was created. schema: type: string get: operationId: getVirtualBankAccount tags: - Virtual Bank Accounts summary: Retrieve a virtual bank account description: Retrieves a virtual bank account by its account reference. responses: '200': description: The virtual bank account. content: application/json: schema: $ref: '#/components/schemas/VirtualBankAccount' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' components: schemas: VirtualBankAccount: type: object properties: status: type: boolean message: type: string data: type: object properties: account_reference: type: string account_number: type: string account_name: type: string bank_code: type: string bank_name: type: string currency: type: string additionalProperties: true VirtualBankAccountInput: type: object required: - account_name - account_reference - permanent - bank_code - customer - kyc properties: account_name: type: string account_reference: type: string permanent: type: boolean bank_code: type: string customer: type: object required: - name properties: name: type: string email: type: string format: email kyc: type: object description: KYC identifiers required for the destination market. properties: bvn: type: string description: Bank Verification Number (required for NGN accounts). ErrorResponse: type: object properties: status: type: boolean message: type: string data: type: object additionalProperties: true parameters: Page: name: page in: query required: false description: Page number for pagination. schema: type: integer StartDate: name: start_date in: query required: false description: Start of the date range (ISO 8601). schema: type: string format: date EndDate: name: end_date in: query required: false description: End of the date range (ISO 8601). schema: type: string format: date Limit: name: limit in: query required: false description: Number of records per page. schema: type: integer responses: NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Unauthorized: description: Missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' securitySchemes: secretKeyAuth: type: http scheme: bearer description: 'Secret API key passed as `Authorization: Bearer sk_...`. Required for server-side and financial operations (payouts, balances, virtual bank accounts, refunds, conversions, charge verification). Test and Live modes use different keys.' publicKeyAuth: type: http scheme: bearer description: Public API key (`pk_...`) used from client-side code to initiate charges. Cannot access financial data.