Coins.ph Virtual Account API

Virtual account creation and management

OpenAPI Specification

coinsph-virtual-account-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: TRADING Account Virtual Account API
  version: 1.0.0
  description: API reference for Account management — Coins.ph
servers:
- url: https://api.pro.coins.ph
  description: Production
- url: https://api.9001.pl-qa.coinsxyz.me
  description: Sandbox
tags:
- name: Virtual Account
  description: Virtual account creation and management
paths:
  /openapi/v1/virtual-account/create:
    post:
      tags:
      - Virtual Account
      summary: Create Virtual Account
      description: 'Create a new virtual account.


        **Webhook:** ✅ Supported (requires Coins.ph configuration)'
      operationId: createVirtualAccount
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - vAccountType
              - vAccountUsage
              - cAccountNumber
              - cAccountName
              properties:
                vAccountType:
                  type: integer
                  enum:
                  - 0
                  - 1
                  description: 'Virtual Account Type. `0`: ENTERPRISE type, `1`: PERSONAL type.'
                  example: 1
                vAccountUsage:
                  type: integer
                  enum:
                  - 0
                  - 1
                  description: 'Virtual Account Usage Type. `0`: ONE_TIME, `1`: MULTIPLE.'
                  example: 1
                validityPeriod:
                  type: string
                  enum:
                  - D1
                  - D2
                  - D3
                  - D4
                  - D5
                  - D6
                  - D7
                  description: 'Virtual Account Validity Period: Only applies to one-time transaction type. When vAccountUsage is ONE_TIME, validityPeriod is required.

                    Enumeration Values:

                    - `D1`: 1 day

                    - `D2`: 2 days

                    - `D3`: 3 days

                    - `D4`: 4 days

                    - `D5`: 5 days

                    - `D6`: 6 days

                    - `D7`: 7 days'
                  example: D7
                cAccountNumber:
                  type: string
                  description: User ID on other platforms (not Coins). Better be unique.
                  example: '1234567890'
                cAccountName:
                  type: string
                  description: User name on other platforms (not Coins).
                  example: John Doe
                coinsUserId:
                  type: string
                  description: Required for PERSONAL type. The user's Coins userId (external ID). **Must be passed as a string** to avoid large integer precision loss.
                  example: '2248914299514407681'
                requestId:
                  type: string
                  maxLength: 64
                  description: Idempotency key for this creation request.
                  example: SEC-EVATEST-Q20260630153000000022
                businessScenario:
                  type: string
                  enum:
                  - AUTO_ON_RAMP
                  - AUTO_OFF_RAMP
                  - AUTO_RAMP
                  - ''
                  description: 'Business scenario for automatic ramp.

                    - `AUTO_ON_RAMP`: Fiat in → Crypto out (fiatDestination required)

                    - `AUTO_OFF_RAMP`: Crypto in → Fiat out (cryptoDestination required)

                    - `AUTO_RAMP`: Both directions (both destinations required)

                    - ``: Non-auto scenario (default)'
                  example: AUTO_ON_RAMP
                fiatDestination:
                  $ref: '#/components/schemas/FiatDestination'
                  description: Required when businessScenario is AUTO_ON_RAMP or AUTO_RAMP.
                cryptoDestination:
                  $ref: '#/components/schemas/CryptoDestination'
                  description: Required when businessScenario is AUTO_OFF_RAMP or AUTO_RAMP.
                needStaticQrCode:
                  type: boolean
                  description: Whether to generate a QRPH static QR code simultaneously. Defaults to `false`.
                  example: true
                extend:
                  type: object
                  additionalProperties: true
                  description: Extended fields with additional information. Key and value length must not exceed 1000 characters.
                  example:
                    accountAddress: test address
                fiatSettings:
                  type: array
                  description: Fiat-related settings for the virtual account, including fiat currency types and corresponding channels. At least one of fiatSettings or cryptoSettings must be present.
                  items:
                    $ref: '#/components/schemas/CurrencyNetworkSetting'
                  example:
                  - token: PHP
                    network: INSTAPAY
                cryptoSettings:
                  type: array
                  description: Crypto-related settings for the virtual account, including crypto types and corresponding networks. Cannot be set when vAccountUsage is ONE_TIME.
                  items:
                    $ref: '#/components/schemas/CurrencyNetworkSetting'
                  example:
                  - token: USDT
                    network: BSC
            example:
              vAccountType: 1
              vAccountUsage: 1
              cAccountNumber: EVA-SECVATEST-ACT-20260630-00022
              cAccountName: SecTestAccount
              coinsUserId: '2248914299514407681'
              requestId: SEC-EVATEST-Q20260630153000000022
              businessScenario: AUTO_RAMP
              fiatSettings:
              - token: PHP
                network: INSTAPAY
              fiatDestination:
                token: USDT
                network: BSC
                address: '0x434f31cff8dc8ab55a58b6e12f6297df105ebfac'
              cryptoSettings:
              - token: USDT
                network: BSC
              cryptoDestination:
                currency: PHP
                transactionChannel: INSTAPAY
                transactionSubject: gcash
                recipientAccountNumber: 09123456789
                recipientName: Juan Dela Cruz
                recipientAddress: 123 Manila Street, Manila City, Philippines
                remarks: Crypto withdrawal fund transfer
              needStaticQrCode: true
              extend:
                accountAddress: test address
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/CreateVirtualAccountSuccess'
                - $ref: '#/components/schemas/VAErrorResponse'
              examples:
                success:
                  summary: Success
                  value:
                    status: 0
                    error: OK
                    data:
                      vAccountId: '2229106125796322048'
                    params: null
                error:
                  summary: Error
                  value:
                    code: -70020005
                    msg: Virtual account number already exists. Please use a different account number.
  /openapi/v1/virtual-account/update:
    post:
      tags:
      - Virtual Account
      summary: Update Virtual Account
      description: 'Update the fiat or crypto settings of an existing virtual account.


        **Webhook:** ✅ Supported (requires Coins.ph configuration)'
      operationId: updateVirtualAccount
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - vAccountId
              properties:
                vAccountId:
                  type: string
                  description: Virtual account ID.
                  example: '2229106125796322048'
                fiatSettings:
                  type: array
                  description: Fiat address settings to add.
                  items:
                    $ref: '#/components/schemas/CurrencyNetworkSetting'
                cryptoSettings:
                  type: array
                  description: Crypto address settings to add.
                  items:
                    $ref: '#/components/schemas/CurrencyNetworkSetting'
                idList:
                  type: array
                  description: ID list of fiat address settings to delete. from fiatSettings.id or cryptoSettings.id
                  items:
                    type: string
                  example:
                  - '101'
                  - '102'
                businessScenario:
                  type: string
                  enum:
                  - AUTO_ON_RAMP
                  - AUTO_OFF_RAMP
                  - AUTO_RAMP
                  - NA
                  description: Update the business scenario.
                  example: AUTO_RAMP
                fiatDestination:
                  $ref: '#/components/schemas/FiatDestination'
                  description: Fiat destination to update. `null` = no change; empty object `{}` = clear; with value = overwrite.
                cryptoDestination:
                  $ref: '#/components/schemas/CryptoDestination'
                  description: Crypto destination to update. `null` = no change; empty object `{}` = clear; with value = overwrite.
                needStaticQrCode:
                  type: boolean
                  nullable: true
                  description: '`null` = no action; `true` = activate or create static QR code; `false` = suspend static QR code.'
                  example: true
            example:
              vAccountId: '2229106125796322048'
              fiatSettings:
              - token: PHP
                network: SWIFTPAY_PESONET
              idList:
              - '101'
              businessScenario: AUTO_RAMP
              fiatDestination:
                token: USDT
                network: BSC
                address: '0x434f31cff8dc8ab55a58b6e12f6297df105ebfac'
              needStaticQrCode: true
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/BooleanSuccessResponse'
                - $ref: '#/components/schemas/VAErrorResponse'
              examples:
                success:
                  summary: Success
                  value:
                    data: true
                    error: OK
                    status: 0
                error:
                  summary: Error
                  value:
                    code: -70020006
                    msg: One-time virtual account cannot be updated.
  /openapi/v1/virtual-account/details:
    post:
      tags:
      - Virtual Account
      summary: Virtual Account Details
      description: Retrieve the full details of virtual accounts. At least one of `vAccountId`, `cAccountNumber`, `requestId`, or `coinsUserId` must be provided. Returns a list.
      operationId: getVirtualAccountDetails
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                vAccountId:
                  type: string
                  description: Virtual account ID.
                  example: '2229106125796322048'
                cAccountNumber:
                  type: string
                  maxLength: 64
                  description: User ID on other platforms (not Coins).
                  example: EVA-SECVATEST-ACT-20260630-00022
                requestId:
                  type: string
                  maxLength: 64
                  description: Idempotency key used when creating the virtual account.
                  example: SEC-EVATEST-Q20260630153000000022
                coinsUserId:
                  type: string
                  description: The user's Coins userId (PERSONAL type, external ID). Should be numeric string
                  example: '2248914299514407681'
            example:
              requestId: SEC-EVATEST-Q20260630153000000022
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                - type: object
                  properties:
                    status:
                      type: integer
                      example: 0
                    error:
                      type: string
                      example: OK
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/VirtualAccountDetail'
                - $ref: '#/components/schemas/VAErrorResponse'
              examples:
                success:
                  summary: Success
                  value:
                    status: 0
                    error: OK
                    data:
                    - vAccountId: '2250248269847533312'
                      cAccountNumber: EVA-SECVATEST-ACT-20260702-00075
                      cAccountName: SecTestAccount
                      vAccountType: 0
                      vAccountUsage: 1
                      validityPeriod: null
                      userId: '1573829012941197056'
                      coinsUserId: '0'
                      status: 1
                      fiatStatus: 1
                      cryptoStatus: 1
                      businessScenario: AUTO_OFF_RAMP
                      requestId: SEC-EVATEST-Q202607015300000066
                      fiatSettings:
                      - id: '478'
                        token: PHP
                        network: SWIFTPAY_PESONET
                        tokenLogo: https://static.pro.coins.xyz/upload/images/PHP.png
                        networkLogo: https://static.pro.coins.xyz/upload/images/PESONet.png
                        status: 1
                        address: ''
                      cryptoSettings:
                      - id: '479'
                        token: USDT
                        network: BSC
                        tokenLogo: https://static.pro.coins.xyz/upload/images/USDT-NEW.png
                        networkLogo: https://static.pro.coins.xyz/resource/images/BNB.png
                        status: 1
                        address: '0x4905c1b6cc346dbc541f6a96c7d1f8ae7933e21c'
                      fiatDestination:
                        token: ETH
                        network: ETH
                        address: '0x72d367b5efeb5dbb364dfae83f245d1d6e35e6c9'
                        tag: null
                      cryptoDestination:
                        currency: PHP
                        transactionChannel: INSTAPAY
                        transactionSubject: gcash
                        recipientAccountNumber: 09123456789
                        recipientName: Juan Dela Cruz
                        recipientAddress: 123 Manila Street, Manila City, Philippines
                        remarks: Crypto withdrawal fund transfer
                      staticQrCode: 00020101021128600011ph.ppmi.p2m0111DCPHPHM1XXX0319197489344632592819205030105204076353036085802PH5923COINS TEST ACCT QR NAME6006Taguig62380011ph.ppmi.p2m051922502482749783040026304CA52
                      staticQrCodeStatus: ACTIVE
                      extend:
                        staticQrCodeRequestId: VA2250248274872309504
                        staticQrCodeStatus: ACTIVE
                        staticQrCode: 00020101021128600011ph.ppmi.p2m0111DCPHPHM1XXX0319197489344632592819205030105204076353036085802PH5923COINS TEST ACCT QR NAME6006Taguig62380011ph.ppmi.p2m051922502482749783040026304CA52
                      createTime: '2026-07-02 10:01:37'
                      updateTime: '2026-07-02 10:01:38'
                error:
                  summary: Error
                  value:
                    code: -70020002
                    msg: Virtual account does not exist.
  /openapi/v1/virtual-account/list:
    post:
      tags:
      - Virtual Account
      summary: List Virtual Accounts
      description: Paginate and filter all virtual accounts under the current merchant.
      operationId: listVirtualAccounts
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                pageNum:
                  type: integer
                  minimum: 1
                  maximum: 1000
                  description: Page number, default 1.
                  example: 1
                pageSize:
                  type: integer
                  minimum: 1
                  maximum: 100
                  description: Page size, default 20.
                  example: 20
                vAccountId:
                  type: string
                  description: Filter by virtual account ID.
                  example: '2229106125796322048'
                cAccountNumber:
                  type: string
                  maxLength: 64
                  description: Filter by user ID on other platforms (not Coins).
                  example: EVA-SECVATEST-ACT-20260630-00022
                coinsUserId:
                  type: string
                  description: Filter by the user's Coins userId (PERSONAL type, external ID). **Must be passed as a string** to avoid large integer precision loss.
                  example: '2248914299514407681'
                vAccountType:
                  type: integer
                  enum:
                  - 0
                  - 1
                  description: 'Filter by type. `0`: ENTERPRISE, `1`: PERSONAL.'
                vAccountUsage:
                  type: integer
                  enum:
                  - 0
                  - 1
                  description: 'Filter by usage. `0`: ONE_TIME, `1`: MULTIPLE.'
                vAddressType:
                  type: string
                  enum:
                  - FIAT
                  - CRYPTO
                  - ALL
                  description: Filter by address type.
                status:
                  type: integer
                  enum:
                  - 1
                  - 2
                  description: 'Filter by status. `1`: ACTIVE, `2`: DEACTIVATED.'
                start:
                  type: string
                  description: 'Creation time start (format: `yyyy-MM-dd HH:mm:ss`).'
                  example: '2026-06-01 00:00:00'
                end:
                  type: string
                  description: 'Creation time end (format: `yyyy-MM-dd HH:mm:ss`).'
                  example: '2026-06-30 23:59:59'
                containsAddress:
                  type: boolean
                  description: Whether to include address settings (`fiatSettings`/`cryptoSettings`) in the response. Defaults to `false`. When `true`, returns up to **100 ACTIVE** address entries per virtual account, ordered by update time descending.
                  example: true
            example:
              pageNum: 1
              pageSize: 20
              vAccountType: 1
              status: 1
              cAccountNumber: EVA-SECVATEST-ACT-20260630-00022
              containsAddress: true
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                - type: object
                  properties:
                    status:
                      type: integer
                      example: 0
                    error:
                      type: string
                      example: OK
                    total:
                      type: integer
                      description: Total number of records.
                      example: 3
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/VirtualAccountDetail'
                - $ref: '#/components/schemas/VAErrorResponse'
              examples:
                success:
                  summary: Success
                  value:
                    status: 0
                    error: OK
                    total: 1
                    data:
                    - vAccountId: '2229106125796322048'
                      cAccountNumber: EVA-SECVATEST-ACT-20260630-00022
                      cAccountName: SecTestAccount
                      vAccountType: 1
                      vAccountUsage: 1
                      status: 1
                      fiatStatus: 1
                      cryptoStatus: 2
                      validityPeriod: null
                      businessScenario: AUTO_ON_RAMP
                      requestId: SEC-EVATEST-Q20260630153000000022
                      fiatSettings:
                      - id: '201'
                        token: PHP
                        network: INSTAPAY
                        tokenLogo: https://static.coins.xyz/PHP.png
                        networkLogo: null
                        status: 1
                        address: null
                      cryptoSettings: []
                      fiatDestination:
                        token: USDT
                        network: BSC
                        address: '0x434f31cff8dc8ab55a58b6e12f6297df105ebfac'
                        tag: null
                      cryptoDestination: null
                      staticQrCode: 00020101021128600011ph.ppmi.p2m...
                      staticQrCodeStatus: ACTIVE
                      extend:
                        accountAddress: test address
                      userId: '2067534261742978048'
                      createTime: '2026-06-30 15:30:00'
                      updateTime: '2026-06-30 15:30:05'
                error:
                  summary: Error
                  value:
                    code: -70010000
                    msg: System error occurred. Please try again later.
  /openapi/v1/virtual-account/reactivate:
    post:
      tags:
      - Virtual Account
      summary: Reactivate Virtual Account
      description: 'Reactivate a deactivated virtual account.


        **Webhook:** ✅ Supported (requires Coins.ph configuration)'
      operationId: reactivateVirtualAccount
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - vAccountId
              - vAddressType
              properties:
                vAccountId:
                  type: string
                  description: Virtual account ID.
                  example: '100001'
                vAddressType:
                  type: string
                  enum:
                  - FIAT
                  - CRYPTO
                  description: 'Reactivate currency type: `FIAT` or `CRYPTO`.'
                  example: FIAT
            example:
              vAccountId: '100001'
              vAddressType: FIAT
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/BooleanSuccessResponse'
                - $ref: '#/components/schemas/VAErrorResponse'
              examples:
                success:
                  summary: Success
                  value:
                    data: true
                    error: OK
                    status: 0
                error:
                  summary: Error
                  value:
                    code: -70020006
                    msg: One-time virtual account cannot be updated.
  /openapi/v1/virtual-account/deactivate:
    post:
      tags:
      - Virtual Account
      summary: Deactivate Virtual Account
      description: 'Deactivate fiat and/or crypto channels of a virtual account.


        **Webhook:** ✅ Supported (requires Coins.ph configuration)'
      operationId: deactivateVirtualAccount
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - vAccountId
              - vAddressType
              properties:
                vAccountId:
                  type: string
                  description: Virtual account ID.
                  example: '100001'
                vAddressType:
                  type: array
                  items:
                    type: string
                    enum:
                    - FIAT
                    - CRYPTO
                  description: 'Deactivate currency type(s): `["FIAT"]`, `["CRYPTO"]`, or `["FIAT","CRYPTO"]`.'
                  example:
                  - FIAT
                  - CRYPTO
            example:
              vAccountId: '100001'
              vAddressType:
              - FIAT
              - CRYPTO
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/BooleanSuccessResponse'
                - $ref: '#/components/schemas/VAErrorResponse'
              examples:
                success:
                  summary: Success
                  value:
                    data: true
                    error: OK
                    status: 0
                error:
                  summary: Error
                  value:
                    code: -70020006
                    msg: One-time virtual account cannot be updated.
  /openapi/v1/virtual-account/order/list:
    post:
      tags:
      - Virtual Account
      summary: Virtual Account Transactions List
      description: Retrieve the transaction list for a virtual account.
      operationId: listVirtualAccountTransactions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - vAddressType
              properties:
                vAccountId:
                  type: string
                  description: Virtual account ID.
                  example: '100001'
                pageNum:
                  type: integer
                  minimum: 1
                  maximum: 1000
                  description: Page number, default 1.
                  example: 1
                pageSize:
                  type: integer
                  minimum: 1
                  maximum: 100
                  description: Page size, default 20.
                  example: 20
                vAddressType:
                  type: string
                  enum:
                  - FIAT
                  - CRYPTO
                  description: 'Currency type: `FIAT` or `CRYPTO`.'
                  example: FIAT
                orderId:
                  type: string
                  description: Transaction ID.
                  example: ORD20240115001
                start:
                  type: string
                  description: 'Transaction start time (format: `yyyy-MM-dd HH:mm:ss`).'
                  example: '2024-01-01 00:00:00'
                end:
                  type: string
                  description: 'Transaction end time (format: `yyyy-MM-dd HH:mm:ss`).'
                  example: '2024-01-31 23:59:59'
                network:
                  type: string
                  description: Fiat channel or crypto network (e.g., `INSTAPAY`, `SWIFTPAY_PESONET`, `ETH`, `BSC`).
                  example: BSC
            example:
              pageNum: 1
              pageSize: 20
              vAccountId: '100001'
              vAddressType: FIAT
              orderId: ORD20240115001
              network: INSTAPAY
              start: '2024-01-01 00:00:00'
              end: '2024-01-31 23:59:59'
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                - type: object
                  properties:
                    status:
                      type: integer
                      example: 0
                    error:
                      type: string
                      example: OK
                    total:
                      type: integer
                      description: Total number of records.
                      example: 200
                    data:
                      type: array
                      items:
                        $ref: '#/components/schemas/VirtualAccountTransaction'
                - $ref: '#/components/schemas/VAErrorResponse'
  /openapi/v1/virtual-account/check-network:
    post:
      tags:
      - Virtual Account
      summary: Check Virtual Account Network
      description: Check whether a specific network/address combination is valid for a virtual account.
      operationId: checkVirtualAccountNetwork
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - vAccountId
              - token
              - network
              properties:
                vAccountId:
                  type: string
                  description: Virtual account ID.
                  example: '100001'
                token:
                  type: string
                  description: Currency (e.g., `PHP`, `USDT`).
                  example: USDT
                network:
                  type: string
                  description: Fiat channel or crypto network (e.g., `INSTAPAY`, `TRC20`).
                  example: TRC20
                address:
                  type: string
                  description: Crypto deposit address.
                  example: TN123456789abcdef
            example:
              vAccountId: '100001'
              token: USDT
              network: TRC20
              address: TN123456789abcdef
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                - type: object
                  properties:
                    status:
                      type: integer
                      example: 0
                    error:
                      type: string
                      example: OK
                    data:
                      $ref: '#/components/schemas/VirtualAccountCheckResult'
                - $ref: '#/components/schemas/VAErrorResponse'
components:
  schemas:
    BooleanSuccessResponse:
      type: object
      properties:
        status:
          type: integer
          example: 0
        error:
          type: string
          example: OK
        data:
          type: boolean
          description: Returns true on success.
          example: true
    VirtualAccountTransaction:
      type: object
      properties:
        userId:
          type: string
          description: User ID of the merchant.
          example: userId
        vAccountUsage:
          type: integer
          description: Virtual Account Usage Type.
          example: 1
        vAccountId:
          type: string
          description: Virtual account ID.
          example: vAccountId
        orderId:
          type: string
          description: Transaction ID.
          example: orderId
        token:
          type: string
          description: Currency (e.g., `PHP`, `USDT`).
          example: USDT
        network:
          type: string
          description: Fiat channel or crypto network.
          example: TRC20
        address:
          type: string
          nullable: true
          description: Crypto deposit address.
          example: TN123456789abcdef
        amount:
          type: number
          description: Transaction amount (number).
          example: 100.5
        totalAmount:
          type: string
          description: Transaction amount (string).
          example: '100.50'
        channelOrderId:
          type: string
          description: Third-party order ID.
          example: CH20240115001
        fromUserName:
          type: string
          nullable: true
          description: Transaction sender name.

# --- truncated at 32 KB (44 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/coinsph/refs/heads/main/openapi/coinsph-virtual-account-api-openapi.yml