1. Virtual Account
BPN OpenAPI
  • Get started
    • Introduction to BPN
    • Introduction to API
    • Architecture Overview
    • Authentication
    • Environments
    • Response envelope
    • Idempotency
  • Guides
    • Virtual Account
      • Virtual Account Overview
      • VA · Payin
      • VA · Payout
      • VA · RFI
      • VA · Statuses
      • VA · Currencies & limits
    • Wallet
      • Wallet Overview
      • Wallet · Deposit
      • Wallet · Withdraw
      • Wallet · Transfer
      • Wallet · Statuses
      • Wallet · Assets & limits
    • Convert
      • Convert Overview
      • Convert · Quote & submit
      • Convert · Business types
      • Convert · Pairs & limits
      • Convert · Statuses
  • API Reference
    • Virtual Account
      • Virtual Account field notes
      • Inquiry Master VA Balance
      • List Primary Virtual Accounts
      • Create Virtual Account
      • Get Virtual Account Detail
      • List Virtual Account
      • List Virtual Account Orders
      • Get Virtual Account Order Detail
      • Refund Virtual Account Order
      • List RFI Sub Virtual Account
      • Get Sub Virtual Account RFI Template Info
      • Sub Virtual Account Submit RFI
      • Add Bank Account
      • List Bank Account
      • List Banks
      • Payout via Virtual Account
      • Send Email Verify Code
    • Wallet
      • Wallet field notes
      • Get Asset Balance
      • Get Deposit Address
      • Add Deposit Sender
      • Add Withdraw Whitelist
      • Delete Withdraw Whiltelist
      • Request Withdraw
      • Query Wallet Internal Transfer Detail
      • List Wallet Internal Transfer order
      • Wallet Internal Transfer
      • Create Sub Account
      • Query Transaction History
      • List Wallets
      • List Sub Account
    • Payment Link
      • Abnormal fund
        • Abnormal funds
        • Matchable Payment links
        • Link Order(Abnormal fund)
        • Submit to platform
      • Create Payment Link
      • List Payment links
      • Get Curreny Network Config
    • Convert
      • Convert field notes
      • Inquery FX Rate
      • Get Stablecoin Quote
      • Create Stable Order
      • Get Order (Single) Detail
      • List Orders(Batch)
    • KYB
      • Share KYB/KYC Info For Sub User
      • Get KYB Sub User Status
    • Reconciliation
      • Get Reconciliation Order List By Page
    • External Provider
      • FE: Create stablecoin collection sub-account link
      • Create stablecoin collection sub-account link
      • Get sub wallet account
      • List sub wallet accounts
      • Change sub wallet status
      • Query stablecoin collection order list
      • Query stablecoin collection order status
      • Get quote
      • Accept stablecoin collection order
      • Reject stablecoin collection order
      • Query USD balance
      • USD Payout (withdrawal)
      • Query USD Payout order status
      • Query USD Payout order list
    • Mock
      • Mock Virtual account Payin Order
      • Mock wallet deposit transaction
      • Mock Payin Order Refund
      • Mock Payout Order Update Status
    • Pay Session
      • Request Pay Session
  • Webhooks
    • Webhooks Overview
    • Event catalogue
    • KYB notifications
    • Resend Fail Webhook
      POST
    • Open Virtual Account Status
    • Virtual Account Payment Status
    • Virtual Account Invoice update
    • Transaction Status Notification
    • KYB Status Notification
    • Deposit Sender Detail Required
    • Abnormal Fund Notification
    • WALLET_TRANSFER_ORDER_UPDATED
    • Sub Virtual Account RFI Required
    • Sub Wallet Update
    • wallet address whitelist Copy
    • Crypto Deposit Order Notification
    • Collect Order Updated
    • Usd Payout Order Updated
    • onboard result
    • partner order status
    • PaymentLink Notification
  • Partner Flow
    • inquiry supported currency
    • KYC/KYB Sharing
    • inquiry onboard status
    • get price
    • Create order
    • order list
    • inquiry single order
    • get user deposit address
    • get payment instruction
    • sync fund notification
    • daily settlement records
  • Appendix
    • Enums quick reference
    • Virtual Account(VA) Support List & KYB requirement
  • Release Notes & Changelog
  • Errors
    • Error codes catalogue
  1. Virtual Account

VA · RFI

Parent: Overview
Updated: 2026-08-09
Compliance remediation is driven asynchronously by webhooks — not by a fixed amount threshold. It is decoupled from the main Payin flow: the payin can keep progressing while remediation is handled separately via SUB_VIRTUAL_ACCOUNT_RFI_REQUIRED.
#DocumentMethod / EventPath
1Sub Virtual Account RFI RequiredWebhookSUB_VIRTUAL_ACCOUNT_RFI_REQUIRED
2List RFI Sub Virtual AccountGET/v1/virtual-account/sub/rfi-list
3Get Sub Virtual Account RFI Template InfoGET/v1/virtual-account/sub/rfi-template
4Sub Virtual Account Submit RFIPOST/v1/virtual-account/sub/submit-rfi

1. Overview#

When a Sub Virtual Account (Sub VA) requires additional compliance materials (RFI — Request for Information), the platform notifies the merchant via webhook, then the merchant:
1.
Receives Sub Virtual Account RFI Required (push), and/or polls List RFI Sub Virtual Account
2.
Calls Get Sub Virtual Account RFI Template Info to load the question / file checklist
3.
Calls Sub Virtual Account Submit RFI to upload answers and documents
4.
Continues to receive the same webhook (or re-list) as review progresses — use rfiStatus for the latest outcome

Quick steps#

1.
Webhook (async): SUB_VIRTUAL_ACCOUNT_RFI_REQUIRED
2.
GET /v1/virtual-account/sub/rfi-template
3.
POST /v1/virtual-account/sub/submit-rfi
4.
Poll GET /v1/virtual-account/sub/rfi-list / GET /v1/virtual-account/sub/get until rfiStatus / account or order status updates

Integration notes#

Before remediation completes, Payin / Payout orders may stay in intermediate states for a long time.
Do not blindly re-fire payout while status is RESUBMIT / RFI incomplete.
Account-side statuses: VA · Statuses · VirtualAccountStatus.
RFI state machine: VA · Statuses · VirtualAccountRFIStatus.

2. Webhook — Sub Virtual Account RFI Required#

Event type: SUB_VIRTUAL_ACCOUNT_RFI_REQUIRED
Full field reference: Sub Virtual Account RFI Required

How to use#

1.
Configure your Stable webhook URL to accept this event.
2.
On receive, deduplicate by eventId.
3.
Branch on data.rfiStatus (see table below).
4.
If materials are required, call the template API with virtualAccountId + bizTypeList, then submit RFI.
5.
Keep listening to this same event for submit / review status updates.

Critical fields#

FieldWhy it mattersHow to use
eventIdIdempotencyIgnore duplicate deliveries with the same id
eventTypeEvent filterMust be SUB_VIRTUAL_ACCOUNT_RFI_REQUIRED
data.virtualAccountIdIdentifies the Sub VATemplate: virtualAccountId; Submit: accountId
data.awaitingRfiTypeListWhich tiers need materialsTemplate: bizTypeList (1:1)
data.rfiStatusLifecycle / review resultBranch merchant logic; review results reuse this webhook
data.rfiFeedbackReject / resubmit reasonPresent when rfiStatus is REJECTED or RESUBMIT_REQUIRED; show to end users / ops
referenceIdEnvelope referenceUsually VA id; prefer data.virtualAccountId for API calls

Example payload#

{
    "eventId": "36190155-28a2-42f9-a55a-1359654b7384",
    "eventType": "SUB_VIRTUAL_ACCOUNT_RFI_REQUIRED",
    "referenceId": "538",
    "status": "SUCCESS",
    "timestamp": 1764235978954,
    "data": {
        "virtualAccountId": "3100",
        "externalAccountId": "",
        "accountName": "ALBrooks",
        "currency": "MXN",
        "status": "SUCCESS",
        "awaitingRfiTypeList": [
            "SUB_ACCOUNT_RFI_TIER_1"
        ],
        "rfiStatus": "AWAITING_SUBMISSION"
    }
}

rfiStatus values#

rfiStatusMeaningMerchant action
AWAITING_SUBMISSIONMaterials requiredFetch template → submit RFI
EARLY_WARNINGEarly warning; materials may be submitted earlyOptional early submit
RESETPreviously triggered; monthly reset; still submittableMay submit again
RESUBMIT_REQUIREDCompliance requested resubmissionFetch template → resubmit
SUBMITTEDMaterials received; under reviewWait for next webhook
APPROVEDReview approvedNo further RFI action
REJECTEDReview rejectedFollow compliance guidance

3. API — List RFI Sub Virtual Account#

API: List RFI Sub Virtual Account
Method / Path: GET /v1/virtual-account/sub/rfi-list

How to use#

1.
Call this API to poll / reconcile Sub VAs that need RFI (or to refresh status after submit / review).
2.
Optionally filter with rfiStatus (e.g. AWAITING_SUBMISSION) and/or currency.
3.
For each item that still needs materials:
accountId → template virtualAccountId / submit accountId
awaitingRfiTypeList → template bizTypeList
4.
Continue with Get Sub Virtual Account RFI Template Info → Sub Virtual Account Submit RFI.

Critical fields#

Request
ParameterRequiredNote
rfiStatusNoCommon filter: AWAITING_SUBMISSION, RESUBMIT_REQUIRED, SUBMITTED, APPROVED, REJECTED, …
currencyNoISO 4217 (e.g. MXN)
accountBusinessTypeNoDefaults to Normal on the request model
parentAccountIdNoOptional parent (primary) account id
Response (data[])
FieldWhy it mattersHow to use
accountIdSub VA idSame as webhook virtualAccountId; pass to template + submit
rfiStatusAccount-level RFI statusBranch list / polling logic
awaitingRfiTypeListTiers still needing materialsTemplate bizTypeList
rfiFeedbackReject / resubmit reasonNon-null when rfiStatus is REJECTED / RESUBMIT_REQUIRED
rfiInfo.rfiTierList[]Per-tier status + answersResubmit / display previously submitted answerList

Example request#

This list API is a pull complement to the webhook push. Prefer the webhook for real-time updates; use list for catch-up, reconciliation, and UI listing.

4. API — Get Sub Virtual Account RFI Template Info#

API: Get Sub Virtual Account RFI Template Info
Method / Path: GET /v1/virtual-account/sub/rfi-template

How to use#

1.
Call this API only after a webhook with a submittable rfiStatus (e.g. AWAITING_SUBMISSION, RESUBMIT_REQUIRED).
2.
Pass query params mapped from the webhook (see Critical fields).
3.
For each template in data[], iterate questions[] and prepare submit answers:
questions[].id → submit questionId
template bizType → submit bizType
type = FILE → prepare base64Files / file; text-like → prepare answer
Honor required = true
4.
Next step: Sub Virtual Account Submit RFI.

Critical fields#

Request
ParameterRequiredMap from webhookNote
bizTypeListYesdata.awaitingRfiTypeListWrong/missing → empty or incomplete checklist
virtualAccountIdRecommendeddata.virtualAccountIdNeeded to resolve channel-specific template
currencyOptionaldata.currencyISO 4217
Response (data[]) — fields you must carry to submit
FieldHow to use on submit
bizTypeanswerList[].bizType
questions[].idanswerList[].questionId (exact match)
questions[].typeFILE → files; TEXT → answer
questions[].requiredMust provide content when true

Example request#

Do not hard-code question ids from samples — always load them from this API for the current virtualAccountId / channel.

5. API — Sub Virtual Account Submit RFI#

API: Sub Virtual Account Submit RFI
Method / Path: POST /v1/virtual-account/sub/submit-rfi

How to use#

1.
Ensure you already have webhook virtualAccountId and the template checklist.
2.
Build answerList: one row per question (bizType + questionId + answer / base64Files).
3.
POST the body; on success (data = true), wait for the same RFI webhook.
4.
Track review via webhook rfiStatus (SUBMITTED → APPROVED / REJECTED / RESUBMIT_REQUIRED).
5.
If RESUBMIT_REQUIRED, reload the template and call this API again.

Critical fields#

FieldRequiredValue / rule
accountIdYesWebhook data.virtualAccountId
answerList[].bizTypeYesTemplate bizType / webhook awaiting tier
answerList[].questionIdYesTemplate questions[].id (exact)
answerList[].base64Files / fileFor FILE questionsProvide at least one: fresh Base64 upload and/or existing file key
answerList[].answerFor text questionsRequired when template marks the question required
answerList or customAnswerListAt least oneMust not both be empty

Example request body#

{
    "accountId": "4059",
    "answerList": [
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Identity_Document",
            "answer": "",
            "file": "",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "iVBORw0KGgoAAAANSUhEUgAA..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Address_Proof",
            "answer": "",
            "file": "",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "iVBORw0KGgoAAAANSUhEUgAA..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Business_Proof",
            "answer": "",
            "file": "",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "iVBORw0KGgoAAAANSUhEUgAA..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Supporting_Documents",
            "answer": "",
            "file": "",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "iVBORw0KGgoAAAANSUhEUgAA..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Additional_Information",
            "answer": "",
            "file": ""
        }
    ]
}

Success response (data)#

true means the submission is accepted. Later review status comes from webhook Sub Virtual Account RFI Required via data.rfiStatus — do not treat this boolean as the final compliance result.

6. End-to-end checklist#

Configure your Stable webhook URL to accept eventType = SUB_VIRTUAL_ACCOUNT_RFI_REQUIRED.
On receive: persist eventId for idempotency; read data.virtualAccountId, awaitingRfiTypeList, and rfiStatus.
Call GET /v1/virtual-account/sub/rfi-template with bizTypeList = awaitingRfiTypeList and virtualAccountId = virtualAccountId.
Build answerList from template questions (bizType + questionId + answer / base64Files).
Call POST /v1/virtual-account/sub/submit-rfi with accountId = virtualAccountId.
Treat later webhooks of the same event type as status updates; branch on data.rfiStatus.
Previous
VA · Payout
Next
VA · Statuses
Built with