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 · Statuses
      • VA · Payout
      • VA · RFI
      • VA · Currencies & limits
      • VA Opening
        • GOWD BRL Corporate VA Opening
        • VND VA Opening
        • BRL VA Opening
    • Wallet
      • Wallet · Transfer
      • Wallet · Assets & limits
      • Wallet · Deposit whitelist
      • Wallet · PaymentLink
      • Wallet Overview
      • Wallet · Deposit
      • Wallet · Statuses
      • Wallet · Withdraw
    • 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
      • Deposit Whitelist
        • Get Deposit Whitelist Options
        • Register Deposit Source Address
        • List Deposit Source Addresses
        • Get Deposit Source Address
        • Disable Deposit Source Address
        • Submit Payer Details for a Received Deposit
        • Save Sub-wallet Payer Profile
        • Update Sub-wallet Payer Profile
        • Get Sub-wallet Payer Profile
        • Get Deposit Whitelist Case
      • 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
      • Get Transaction Detail
      • List Wallet Transactions
      • Get Wallet Transaction Detail
    • 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
      • Prepay Whitelist for One-Time Payment Link
      • Prepay Whitelist for Permanent Payment Link
    • 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
      • FE: Deposit Travel Rule
      • External Provider · Deposit whitelist
      • 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
      • Create deposit Travel Rule link
      • Create deposit Travel Rule detail link
    • Mock
      • Mock Virtual account Payin Order
      • Mock wallet deposit transaction
      • Mock Payment Link deposit
      • Mock Payin Order Refund
      • Mock Payout Order Update Status
    • Pay Session
      • Request Pay Session
    • Files
      • Request File Upload URL
  • Webhooks
    • Webhooks Overview
    • KYB notifications
    • Event catalogue
    • Resend Fail Webhook
    • 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 Update
    • Crypto Deposit Order Notification
    • Collect Order Updated
    • Usd Payout Order Updated
    • onboard result
    • partner order status
    • PaymentLink Notification
    • Deposit Whitelist Notification
  • Partner Flow
    • Share KYB/KYC and open account directly
    • Get KYB/KYC submit + open account status
    • List Banks
    • Check Account
    • Add Account
    • Get Stablecoin Quote
    • Create Stable Order
    • Get Order (Single) Detail
    • List Orders(Batch)
    • Submit hash
    • Order Status Notification (STABLE_ORDER_UPDATED)
  • Appendix
    • Enums quick reference
    • Enum
    • Virtual Account(VA) Support List & KYB requirement
  • Release Notes & Changelog
  • Errors
    • Error codes catalogue
  • Change Log
    • 2026-09-21 Virtual Account independent refund orders
    • Wallet deposit source-address whitelist
  1. Virtual Account

VA · RFI

Parent: Overview
Updated: 2026-10-27
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
APPROVEDRFI review completeNormal RFI is done. A monthly limit increase may now be submitted with limitIncrease = true
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#

Full response samples are the examples avenia-brl-individual and avenia-brl-business on Get Sub Virtual Account RFI Template Info.
Individual and Business use different question ids for registration, UBO identity, trade documents, company address, and additional information.
Skip every SUB TITLE question id when you submit (RFI_TIER1_Section_Company_Identity, RFI_TIER1_Section_Business_Transaction, RFI_TIER1_Section_Address_Financial_Tax). requestedMonthlyLimit is not a template question.
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 the Sub VA id (webhook virtualAccountId or list accountId) and the template checklist.
2.
Build answerList: one row per answerable question (bizType + questionId + answer / base64Files). Skip SUB TITLE rows.
3.
POST the body; on success (data = true), wait for the same RFI webhook (or re-list).
4.
Track review via webhook / list rfiStatus (SUBMITTED → APPROVED / REJECTED / RESUBMIT_REQUIRED).
5.
If RESUBMIT_REQUIRED, reload the template and call this API again.
6.
A monthly limit increase is a separate submit, and only after the current RFI is complete (rfiStatus = APPROVED).

Critical fields#

FieldRequiredValue / rule
accountIdYesWebhook data.virtualAccountId or list accountId
answerList[].bizTypeYesTemplate bizType / webhook awaiting tier
answerList[].questionIdYesTemplate questions[].id (exact). Skip SUB TITLE
answerList[].base64Files / fileFor FILE questionsProvide at least one: fresh Base64 upload and/or existing file key
answerList[].answerFor TEXT questionsRequired when the template marks the question required. A row may carry answer or file; either one with a value is enough when the question is not a required file
answerList or customAnswerListAt least oneMust not both be empty
limitIncreaseOnly for limit increaseFirst increase: true only when rfiStatus = APPROVED (RFI review complete). Omit it on a normal submit
requestedMonthlyLimitWhen this call is a limit increasePositive amount. Not a template question
requestedMonthlyLimitCurrencyNoDefaults to USD

Normal submit#

Use this when rfiStatus is AWAITING_SUBMISSION (or a normal resubmit). Do not send limitIncrease. This keeps the Level 1 default limit (company USD 100,000, individual USD 10,000 per tax id) once review is approved.
Question ids below are the answerable rows of the AVENIA BRL Individual template (request example normal-submit). Business uses different ids for registration, UBO identity, trade documents, company address, and additional information (request example normal-submit-business). Take the ids from the template response. Skip SUB TITLE rows.
File rows use raw Base64. JVBERi0xLjQKJcfs... is a PDF. PD94bWwgdmVyc2lvbj0iMS4wIj8+... is an XML invoice. UEsDBBQAAAAI... is a ZIP of those XML files. Several entries mean several files (one per month, one per UBO, or an invoice plus its BL/AWB).
{
    "accountId": "3100",
    "answerList": [
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Business_Website_App_Or_Store_Url",
            "answer": "https://shop.example.com"
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Company_Registration_Documents",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Identity_Document",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Articles_of_Association_Ownership_Documents",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Business_Proof",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Marketplace_Service_Fee_Invoices",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Website_Or_App_Business_Documents",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Nfe_Nfte_Supporting_Invoices",
            "base64Files": [
                "PD94bWwgdmVyc2lvbj0iMS4wIj8+..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Address_Proof",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_UBO_Proof_of_Address",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Financial_Statements_Balance_Sheet",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Personal_Income_Tax_Return",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Additional_Information",
            "answer": "Documents for the default monthly limit."
        }
    ]
}
Business answerable ids:
{
    "accountId": "3100",
    "answerList": [
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Business_Website_App_Or_Store_Url",
            "answer": "https://shop.example.com"
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Business_Certificate_of_Incorporation",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Business_UBO_Proof",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Articles_of_Association_Ownership_Documents",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Business_Transaction_Proof",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Marketplace_Service_Fee_Invoices",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Website_Or_App_Business_Documents",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Nfe_Nfte_Supporting_Invoices",
            "base64Files": [
                "PD94bWwgdmVyc2lvbj0iMS4wIj8+...",
                "UEsDBBQAAAAI..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Business_Address_Proof",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_UBO_Proof_of_Address",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Financial_Statements_Balance_Sheet",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Personal_Income_Tax_Return",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Business_Additional_Information",
            "answer": "Documents for the default monthly limit."
        }
    ]
}

What to put in each file#

base64Files values are raw Base64 with no data: prefix. Truncated samples below use a real file header so the type is visible:
PDF: JVBERi0xLjQKJcfs...
NF-e / NFS-e XML: PD94bWwgdmVyc2lvbj0iMS4wIj8+... (<?xml version="1.0"?>)
XML packed in ZIP: UEsDBBQAAAAI...
Send one array entry per file. The template required flag decides whether the row must be present. Question ids still come from Get Sub Virtual Account RFI Template Info for this account. Use the table below for which file each question expects.
Level is the monthly limit band per tax id. Every VA Pix key under that tax id shares one limit. It is not an RFI question id.
LevelRequested monthly limit
Level 1Default after a normal submit is approved: company USD 100,000, individual USD 10,000.
Level 2Above the default, up to USD 500,000.
Level 3Above USD 500,000, up to USD 1,000,000.
Level 4Above USD 1,000,000.
Question (Individual id / Business id)When it appliesFiles to upload
Website / store URL RFI_TIER1_Business_Website_App_Or_Store_UrlEvery submit. The store, website, or app URL.TEXT. The store, website, or app URL.
Company registration RFI_TIER1_Company_Registration_Documents / RFI_TIER1_Business_Certificate_of_IncorporationEvery submit. Required for the default monthly limit: company USD 100,000, individual USD 10,000 per tax id.Brazil: Contrato Social. Mainland China: Business License. Hong Kong: Certificate of Incorporation. Send each document as its own PDF.
Legal representative and UBO identity RFI_TIER1_Individual_Identity_Document / RFI_TIER1_Business_UBO_ProofEvery submit. Required for the default monthly limit: company USD 100,000, individual USD 10,000 per tax id.A valid ID for the legal representative and for every UBO (passport, ID card, driver's license, residence permit, RG, RNM/RNE, or CIN). One file per person.
Ownership RFI_TIER1_Articles_of_Association_Ownership_DocumentsEvery submit. Required for the default monthly limit: company USD 100,000, individual USD 10,000 per tax id.Documents that show the current shareholders. Mainland China: Articles of Association or shareholder register. Hong Kong: latest Annual Return or NNC1. Brazil: Contrato Social.
B2B trade documents RFI_TIER1_Individual_Business_Proof / RFI_TIER1_Business_Transaction_ProofBuyer invoices and matching BL/AWB at the default monthly limit (company USD 100,000 / individual USD 10,000), and again when the requested limit is above that default.The last 3 commercial invoices that show the buyer name, each with its matching bill of lading or air waybill (BL / AWB). A Brazil-established merchant may send NF-e instead. The sample sends 3 invoice PDFs and 3 BL/AWB PDFs.
Marketplace service-fee invoices RFI_TIER1_Marketplace_Service_Fee_InvoicesPlatform service-fee invoices for the default monthly limit: company USD 100,000, individual USD 10,000 per tax id.Platform service-fee invoices issued to the merchant for the last 3 months. The sample sends one PDF per month.
Website or app documents RFI_TIER1_Website_Or_App_Business_DocumentsWebsite or app ownership and sales reports for the default monthly limit: company USD 100,000, individual USD 10,000 per tax id.Website or app ownership proof, plus sales reports for the last 3 months covering every payment channel.
NF-e / NFS-e RFI_TIER1_Nfe_Nfte_Supporting_InvoicesRequested limit above the default: up to USD 500,000 (Level 2), up to USD 1,000,000 (Level 3), or above USD 1,000,000 (Level 4).Invoices the merchant issued in the last 3 months. Originals only: NF-e or NFS-e XML, the same XML in a ZIP, or a PDF that shows the access key. Marketplace: NF-e for the merchant's own sales. Own website or app: NF-e for goods, NFS-e for services and digital content. A merchant on their own website or app with no Brazilian entity does not issue these and must apply Level 4 instead. B2B in Brazil: NF-e. Up to USD 500,000 (Level 2) needs invoices totaling at least 20% of the requested limit. Up to USD 1,000,000 (Level 3) needs at least 40%. Above USD 1,000,000 (Level 4) needs at least USD 400,000 of invoices. Each invoice counts once.
Company address RFI_TIER1_Individual_Address_Proof / RFI_TIER1_Business_Address_ProofRequested limit above USD 1,000,000 (Level 4). Also required when an individual merchant asks for more than USD 10,000.Brazil: a utility bill, bank statement, or government letter in the company name from the last 3 months. A CNPJ registration card is not accepted. Hong Kong: a valid Business Registration Certificate. Mainland China: Business License.
UBO address RFI_TIER1_UBO_Proof_of_AddressRequested monthly limit above USD 1,000,000 (Level 4).Mainland China UBO: both sides of the resident identity card (two files). Other UBOs: a utility bill or bank statement in the UBO's name from the last 3 months. An individual merchant sends their own address proof.
Financial statements RFI_TIER1_Financial_Statements_Balance_SheetRequested monthly limit above USD 1,000,000 (Level 4).Latest financial statements or balance sheet. A limit above USD 1,000,000 is set from the capacity these documents show. A merchant selling on their own website or app outside Brazil uses this, plus address proof, instead of NF-e.
Personal income tax RFI_TIER1_Personal_Income_Tax_ReturnIndividual merchant, requested limit above USD 10,000Latest personal income tax return.
Additional information RFI_TIER1_Individual_Additional_Information / RFI_TIER1_Business_Additional_InformationOptionalFree text. Do not put the requested amount here. Send it as requestedMonthlyLimit.
Skip every SUB TITLE id.
Default monthly limit after Level 1 (per tax id): company USD 100,000, individual USD 10,000. Several VA Pix keys under the same tax id share that one limit.

Limit-increase submit#

A higher monthly limit is a second submit, and only after the current RFI review is complete: rfiStatus = APPROVED. Before that, limitIncrease = true is rejected.
The amount is not a template question. Send it as requestedMonthlyLimit (positive) and requestedMonthlyLimitCurrency (optional, default USD). answerList uses the same answerable question ids as a normal submit. Put the extra invoices, and for a higher level the address proof, financial statements, and personal tax return, in the questions in the table above.
The sample requests USD 400,000 (Level 2, up to USD 500,000). Supporting invoices from the last 3 months must total at least 20% of that amount (USD 80,000). It is the full Individual body (request example limit-increase):
{
    "accountId": "3100",
    "limitIncrease": true,
    "requestedMonthlyLimit": 400000,
    "requestedMonthlyLimitCurrency": "USD",
    "answerList": [
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Business_Website_App_Or_Store_Url",
            "answer": "https://shop.example.com"
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Company_Registration_Documents",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Identity_Document",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Articles_of_Association_Ownership_Documents",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Business_Proof",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Marketplace_Service_Fee_Invoices",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Website_Or_App_Business_Documents",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Nfe_Nfte_Supporting_Invoices",
            "base64Files": [
                "PD94bWwgdmVyc2lvbj0iMS4wIj8+...",
                "PD94bWwgdmVyc2lvbj0iMS4wIj8+...",
                "PD94bWwgdmVyc2lvbj0iMS4wIj8+...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Address_Proof",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_UBO_Proof_of_Address",
            "base64Files": [
                "JVBERi0xLjQKJcfs...",
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Financial_Statements_Balance_Sheet",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Personal_Income_Tax_Return",
            "base64Files": [
                "JVBERi0xLjQKJcfs..."
            ]
        },
        {
            "bizType": "SUB_ACCOUNT_RFI_TIER_1",
            "questionId": "RFI_TIER1_Individual_Additional_Information",
            "answer": "Requesting USD 400,000. Self-issued invoices from the last 3 months total at least USD 80,000."
        }
    ]
}
If a limit-increase review is already RESUBMIT_REQUIRED or SUBMITTED, limitIncrease may be omitted. requestedMonthlyLimit must still be a positive amount. Do not send limitIncrease = true on a normal submit while rfiStatus is not yet APPROVED.

Flow — limit increase after RFI approval#

Level 1 approval keeps the default limit. To raise it, call this same API again. Do not open a different endpoint.
1.
Confirm rfiStatus = APPROVED on the webhook or on List RFI Sub Virtual Account. A first increase sent earlier is rejected.
2.
Pick the requested monthly limit in USD. One tax id has one limit, shared by every VA Pix key under that tax id.
3.
Match the target level. Submit within the same RFI materials window the channel sets (files are due within 14 days of the RFI being opened; after files arrive, review can take up to another 14 days). If nothing is submitted in the first 14 days, the monthly limit can be set to USD 0.
LevelMonthly limit per tax idDocuments on top of Level 1
Level 1Company USD 100,000. Individual USD 10,000.Base company, identity, and ownership files, plus the profile proof (marketplace invoices, website or app reports, or the last 3 B2B invoices with BL/AWB). Approval keeps this default.
Level 2Up to USD 500,000Invoices the merchant issued in the last 3 months, totaling at least 20% of the requested limit. Example: USD 400,000 requested needs at least USD 80,000 of invoices.
Level 3Up to USD 1,000,000Same invoices, totaling at least 40% of the requested limit. Example: USD 1,000,000 requested needs at least USD 400,000 of invoices.
Level 4Above USD 1,000,000Full Level 3 pack (at least USD 400,000 of invoices), plus company and UBO address proof and financial statements or a balance sheet. The limit follows the capacity those statements show.
An individual merchant who asks for more than USD 10,000 also sends address proof and the latest personal income tax return.
If the invoice total is below the threshold, the channel sets the limit from the invoices that can be verified, and not above the amount you requested. Verified total divided by 20% (cap USD 500,000) or by 40% (cap USD 1,000,000), whichever is higher. Example: USD 60,000 of invoices can support USD 300,000. Void or unverifiable invoices do not count. BRL invoices are converted to USD with the Central Bank of Brazil PTAX rate on the invoice date.
4.
Reload GET /v1/virtual-account/sub/rfi-template. Build answerList from that response. Skip SUB TITLE.
5.
POST /v1/virtual-account/sub/submit-rfi with limitIncrease = true, requestedMonthlyLimit, and the files for that level.
6.
Wait for SUB_VIRTUAL_ACCOUNT_RFI_REQUIRED. SUBMITTED means the pack is in review. APPROVED means the review finished (the limit may stay, rise, or be cut, including to USD 0). RESUBMIT_REQUIRED means reload the template and submit again. On that follow-up you may omit limitIncrease.

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.
Skip SUB TITLE question ids. Send limitIncrease = true only when rfiStatus = APPROVED; include a positive requestedMonthlyLimit (currency defaults to USD).
Treat later webhooks of the same event type as status updates; branch on data.rfiStatus.
Previous
VA · Payout
Next
VA · Currencies & limits
Built with