1. FAQ
VM_API
English
  • 简体中文
  • English
  • Integration Guide
  • Environment Configuration
  • Global Error Codes
  • Transaction Type Description
  • Card Status Description
  • Webhook Signature Verification
  • VM Card operation
    • Get Account Balance
      POST
    • Get Card Product Code
      POST
    • Apply for Card
      POST
    • Card Details
      POST
    • Modify Card Limit(For credit line cards only)
      POST
    • Freeze/Unfreeze Card
      POST
    • Card Top-up(For prepaid cards only)
      POST
    • Card Refund(For prepaid cards only)
      POST
    • Transaction Records
      POST
    • Delete Card
      POST
    • Card List
      POST
    • Card Flow
      POST
  • Notification
    • WebHook
    • Card 3DS Notification
  • Change Log
    • Change Log
  • FAQ
    • FAQ
  • Get accessToken
    GET
  • 数据模型
    • 示例数据模型
      • Pet
      • Category
      • Tag
  1. FAQ

FAQ

VM Open API Technical Q&A and Confirmation Record#

Document Notes#

This document consolidates the questions and written responses exchanged during the VM Open API integration process. To preserve a complete communication record, the main Q&A and all subsequent supplementary confirmations are retained in their original chronological order.

1. Fees and Billing Rules#

1.1 Account Funding Fee#

Q: Is this fee charged when funds are credited to the VM main account, or when /rechargeCard is called to fund a prepaid card?
A: The fee is charged when funds are credited to the VM main account. No fee is charged when /rechargeCard is called to fund a prepaid card.
Q: If account funding and card funding are separate stages, are fees charged at both stages?
A: No. No fee is charged at the card funding stage.
Q: What are the fee basis, amount precision, rounding rule, and minimum fee?
A: The fee is calculated as 0.3% of the funding amount, rounded to two decimal places. No minimum fee applies.
Q: When /refundCard is called to return the card balance to the account, is the previously charged funding fee refunded?
A: Card funding itself is free of charge, so there is no card funding fee to refund.

1.2 Card Issuance Fee#

Q: Which product_code values or BINs are covered by this price?
A: The price applies to BINs 537872, 555671, 544015, and 525962.
Q: Is a fee charged if card issuance fails?
A: No.
Q: Is a fee charged when a duplicate request is rejected?
A: No card issuance fee is charged if no card is actually created.
Q: Do different regions, card networks, prepaid cards, and limit-based cards use different prices?
A: Yes. Any fee change will be communicated separately. For the time being, the BINs and prices specified in the first item of this section apply.

1.3 Other Fees#

The following fees are waived when the Declined Transaction Rate is within the normal range. The current billing rules are as follows.
Fee TypeBilling Rule
Purchase authorization or failed transaction feeBIN 537872: USD 0.20 per transaction; BINs 555671, 544015, and 525962: USD 0.30 per transaction.
Purchase refund feeBIN 537872: 5% per purchase refund; BINs 555671, 544015, and 525962: 10% per purchase refund.
Decline or dispute feeA Declined Transaction is treated as a failed transaction and charged under the purchase authorization or failed transaction fee above. A Chargeback Transaction is charged at USD 35 per transaction.
Cross-border transaction and foreign exchange conversion feesNo fee.
Card balance return feeNo fee.
Account withdrawal or outbound transfer feeA withdrawal from the VM ledger balance to an external wallet is charged at 2% of the withdrawal amount.

2. Authentication and Payload Encryption#

2.1 Actual Request Format#

The integration guide requires business parameters to be encrypted with the VM public key and submitted in the following format:
{
  "content": "RSA ciphertext"
}
Q: Which APIs in the Sandbox and Production environments require an encrypted content payload?
A: Every card API with a business request body must use the {"content":"RSA ciphertext"} format, including:
/createCard
/cardDetail
/freezeCard
/deleteCard
/rechargeCard
/refundCard
/cardTransaction
/updateCardLimit
/getCardList
/getCardFlow
/getProductCode and /getAccountBalance have no business request body and may be called with an empty body.
Q: Can any business API accept plaintext JSON directly?
A: No.
Q: Is data always encrypted in a successful response?
A: Yes.
Q: Are parameter, authentication, or decryption error responses returned as plaintext or ciphertext?
A: Error responses are returned as plaintext.
Q: Can complete Sandbox cURL requests and actual responses be provided for /getAccountBalance, /createCard, /cardDetail, /rechargeCard, and /refundCard?
A: The relevant examples are available in the API documentation.

2.2 Long RSA Payload Processing#

Q: How are long payloads processed when using RSA-4096 with PKCS#1 v1.5?
A:
The maximum plaintext block size is 501 bytes, and each ciphertext block is 512 bytes.
Blocks are encrypted or decrypted in source order and concatenated in the same order.
Encryption sequence: JSON UTF-8 bytes -> RSA/PKCS#1 v1.5 encryption -> Base64 encoding -> Hex encoding of the Base64 string.
Decryption sequence: Hex decoding -> Base64 decoding -> RSA/PKCS#1 v1.5 decryption -> UTF-8 JSON.
JSON is serialized using json.dumps(data) and then UTF-8 encoded. After decryption, the UTF-8 string is parsed as JSON.
The fixed test vectors in the documentation may be used directly for integration testing.
For the official sample code, refer to the Python example in the API documentation.

2.3 VM Public Key and Key Rotation#

Q: What is the official method for obtaining the VM public key and verifying its fingerprint?
A: This information is communicated through a separate controlled channel.
Q: What notification mechanism is used when the VM public key is updated?
A: Updates are made as needed and communicated accordingly.
Q: Can the merchant public key be rotated without service interruption?
A: Minute-level switching is supported.
Q: Can the old and new merchant public keys remain valid concurrently for a period of time?
A: No.

3. Access Token#

/getAccessToken currently uses app_id and app_secret to obtain a Token.
QuestionResponse
Should the Authorization header contain the Token directly, or use Bearer <token>?Provide the Token directly. Do not use the Bearer format.
Is expired_time a Unix timestamp in seconds?Yes.
What is the default Token validity period?7,200 seconds.
Is it recommended to obtain a new Token before expiration?Yes. Obtain a new Token at least 600 seconds before expiration.
Does the old Token become invalid immediately after a new Token is obtained?It is recommended that the old Token be discontinued immediately.
Can multiple valid Tokens exist concurrently?It is recommended that only the latest Token be used.
What is the revocation and rotation process for App Secrets and Tokens?Refer to the responses to the relevant subsequent questions.
Can app_secret be submitted in a POST body or by another method?No. /getAccessToken is currently a GET route and obtains a Token through the app_id and app_secret parameters.

4. Request Idempotency and Final-Result Queries#

The X-Client-Request-Id header was added in the June 9, 2026 changelog.
Q: Does this header apply to all APIs, particularly /createCard, /rechargeCard, /refundCard, /updateCardLimit, and /deleteCard?
A: Yes.
Q: What are the length, character set, and uniqueness scope of the Request ID?
A: The length must not exceed 64 characters. Letters, digits, and -, _, ., and : are permitted. Uniqueness is determined by the AppId + ClientRequestId combination. The current implementation only records an invalid-format flag and does not directly reject a request whose format is non-compliant.
Q: How long is the Request ID retained by the server?
A: It is currently retained permanently.
Q: If the same Request ID and the same parameters are submitted again, is the original result returned?
A: No. The original result is not returned; the response is Duplicate Client Request Id.
Q: How is the request handled if the same Request ID is used with different parameters?
A: It is still rejected as a duplicate Request ID and returns Duplicate Client Request Id.
Q: How are two concurrent requests with the same Request ID handled?
A: Only one request is allowed to enter business processing. The remaining requests return Duplicate Client Request Id.
Q: If the first request succeeds but the client does not receive the response, how should the final result be queried?
A: There is currently no unified operation-status query API. Query the corresponding business result as follows:
Card issuance result: /getCardList or /cardDetail
Card funding and card-balance return result: /getCardFlow
Purchase transaction result: /cardTransaction
For write APIs involving card issuance or fund movements, the following information is currently available or queryable:
InformationCurrent Position
Unique operation reference/getCardFlow returns flow_id, which may be used for reconciliation and deduplication.
Operation statusMust be determined according to the specific business operation.
Requested amount and actual amountMust be determined according to the specific business operation.
FeeNo unified field is currently returned.
Balance before and after the operationThe current response returns the post-operation balance.
Creation and update timesRefer to the fields actually returned by the relevant API.

5. Card Products, Card Types, and Balances#

5.1 Product Information#

/getProductCode currently returns the BIN, product code, card type, card network, issuing region, and remaining number of cards that may be issued.
ItemCurrent Position
Card issuance fee and funding feeNot returned by the API.
/createCard amount rangeamount >= 1; save cards also require amount <= 50000.
/rechargeCard amount range10 <= amount <= 50000.
/refundCard amount rangeamount >= 0.
Per-card, daily, and account-level frequency limitsTo be communicated offline.
3DS, AVS, and subscription-payment capabilitiesTo be communicated separately.
Supported or restricted countries, merchants, and MCCsTo be communicated separately.
Card validity period and product availability notificationsTo be communicated separately.

5.2 save and share Cards#

Q: For a save card, does amount in /createCard represent the initial card funding amount?
A: Yes.
Q: For a share card, does amount represent the total limit?
A: Yes.
Q: Which funding pools do balance and wallet_balance represent?
A: balance is the main account balance and corresponds to the prepaid-card funding pool. wallet_balance is the wallet balance and corresponds to the shared-card or limit-based-card funding pool.
Q: What is the currency of the two balance fields, and do both represent available balances?
A: Both are denominated in USD and both represent available balances.
Q: When amount is modified through /updateCardLimit, how does it affect the limit wallet?
A: This API applies only to share cards. The submitted amount becomes the new total limit.
Q: How does the API behave if the reduced limit is below the amount already used or a pending authorization?
A: The system does not check pending authorizations. The limit can be adjusted when the API conditions are met, but transactions may fail after the adjustment.

5.3 Address and Cardholder Fields#

Q: Can card_address be omitted entirely from /createCard?
A: Yes.
Q: If card_address is provided, is address_line_two required?
A: No. An empty string may be submitted when there is no content.
Q: What format requirements apply to the name, country, state, postal code, area code, mobile number, and email address?
A:
first_name and last_name are required and must not be empty.
card_address as a whole is optional. If provided, every nested field except address_line_two is required.
Address fields support letters, digits, spaces, and hyphens (-) only. Chinese characters and special characters such as commas, periods, #, and @ are not supported.
The area code, mobile number, and email address are optional and currently have no format restrictions.

6. Prepaid-Card Funding and Balance Return#

Q: Where are funds debited from and returned to by /rechargeCard and /refundCard?
A: /rechargeCard debits the main account balance and increases the prepaid-card balance. /refundCard returns funds from the prepaid-card balance to the main account balance.
Q: Are partial funding and partial balance returns supported?
A: Yes. A specified amount may be funded or returned. The /rechargeCard amount range is 10 to 50,000; /refundCard requires amount >= 0.
Q: What are the per-transaction and daily amount limits?
A: They must be confirmed separately.
Q: Is processing completed synchronously, or can it enter PENDING?
A: Processing is completed synchronously.
Q: If the API returns the string "true", does this mean the fund movement is final?
A: Yes. Nevertheless, the final result should still be verified against the card details, card flow, and financial flow query results.
Q: Can a flow_id or another fund-operation reference be returned?
A: Refer to the preceding explanation of /getCardFlow.
Q: How is the maximum refundable balance calculated when the card has pending authorizations?
A: The refundable amount for /refundCard is based on the card's current available balance. Amounts corresponding to pending authorizations are generally already held or reserved by the card network or channel, which reduces the available balance returned by the channel. VM API does not deduct those amounts a second time.
Q: What do amount, reality_amount, account_balance, ref, and code in getCardFlow represent?
A:
flow_id: Fund-flow ID.
amount: Flow amount.
reality_amount: Actual amount field.
account_balance: Account balance after the flow is completed.
ref, code: The corresponding fields passed through from the fund-flow table.
Q: Is getCardFlow.flow_id globally unique and never reused?
A: Yes.
Q: Does the card fund flow include fees and their currencies?
A: It does not include fee flows or return a fee-currency field.

7. Transaction Records and Reconciliation#

7.1 Transaction Relationships#

Q: Does auth_id remain the same across Authorization, Settlement, Reversal, and Refund records?
A: The externally returned auth_id is a transaction-record ID generated by the VM system, not the channel's original authorization ID. It can identify one returned record, but it cannot be used reliably as a common relationship ID across Authorization, Settlement, Reversal, and Refund records.
Q: Does each transaction event have an independent and immutable event ID?
A: No.
Q: Can one authorization result in partial settlement or multiple settlements?
A: Yes.
Q: Can one purchase result in a partial refund or multiple refunds?
A: Yes.
Q: Which field links a settlement, reversal, or refund to the original authorization or settlement record?
A: The earlier response stated that they were linked by auth_id. Subsequent confirmation established that auth_id cannot be guaranteed as a stable relationship ID for the complete transaction lifecycle.
Q: Can ARN, RRN, STAN, or another network reference be provided?
A: No.

7.2 Queries and Pagination#

The current position for /cardTransaction is as follows:
ItemResponse
Field filtered by start_time and end_timeauth_time.
Time-range boundariesBoth the start and end times are inclusive.
Time-field timezoneThe storage timezone of auth_time depends on the timezone of the data returned by each channel.
Default sort orderDescending by auth_time.
Pagination stabilityOffset/limit pagination is currently used. Pagination results are not guaranteed to remain stable if records are added during the query.
Maximum query range and data retention periodThe maximum page_size is 1,000. No query-time-span limit is currently defined, and historical data is currently retained long term.
Incremental queryIncremental queries by update time, cursor, or event ID are not supported.

7.3 Amounts and Fees#

Q: What do auth_amount/auth_currency and settle_amount/settle_currency represent?
A: auth_amount and auth_currency represent the authorization amount and authorization currency. settle_amount and settle_currency represent the settlement amount and settlement currency. Externally returned amounts are absolute values.
Q: Are refund and reversal amounts returned as positive or negative values?
A: They are returned as positive values.
Q: What decimal precision and rounding rules apply to amounts?
A:
The API does not restrict the number of decimal places in the input, but business processing and storage retain two decimal places.
Standard rounding is used. For example, 1.234 is processed as 1.23, and 1.235 as 1.24.
Callers are advised to submit amounts with two decimal places. Any excess decimal places will be rounded automatically.
Q: How can daily statements, balance snapshots, or complete transaction exports be obtained?
A: Financial details may be exported from the console. Other requirements may be raised in the integration group.

8. Webhooks and 3DS Notifications#

8.1 Source Verification#

The current capabilities for ordinary transaction Webhooks and 3DS notifications are as follows:
Verification CapabilityCurrent Position
HMAC or public-key signatureNot currently supported.
Configurable callback secretOnly the callback URL is currently configured; no independent Callback Secret is provided.
timestamp and nonceTransaction data includes a transaction time, but it is not a timestamp + nonce used for signature verification or replay prevention.
Unique event_id or delivery_idOrdinary transactions may use auth_id to identify a transaction, but no independent event_id or delivery_id is provided. 3DS notifications also have no independent event ID.
Fixed outbound IP listMust be confirmed separately.
mTLSMutual TLS is not currently used for callbacks.

8.2 Fields and Delivery Rules#

QuestionResponse
Is the official card-ID field in an ordinary Webhook cardId or card_id?card_id.
Is successful receipt determined solely by an HTTP 2xx response?The earlier position was that the HTTP status code was evaluated and the response Message was not mandatory, although returning a success message was recommended. Subsequent responses further refined the ACK rules for different categories.
Response timeout30 seconds.
Meaning of "sent three times"A maximum of three attempts in total. Subsequent responses distinguish between different Webhook categories.
Retry interval and maximum delivery periodThe earlier position was to retry after a timeout. Subsequent confirmation did not commit to a fixed retry interval or a strict maximum delivery period.
Can deliveries be duplicated or out of order?Strict ordering is not guaranteed. The business system must not assume that notifications are ordered or delivered only once.
Are delivery logs, failure queries, and manual redelivery available?To be communicated separately. Subsequent responses provide details for different Webhook categories.

8.3 3DS#

ItemCurrent Position
challenge_id or transaction_idNeither field is currently included in the 3DS callback.
Unique event IDNo independent event_id or delivery_id is provided.
OTP generation and expiration timesNot returned in the callback.
Number of notifications or attempts for the same transactionThe payload does not contain the notification or attempt count. The system queue retries upon failure.
OTP replay-protection rulesNo replay-protection field or rule is currently provided.
Query or redelivery after a missed WebhookThere is currently no API for querying or redelivering 3DS notifications. The system queue retries automatically upon failure.
Note: 3DS is currently disabled by default for all card BINs in the VMCardio system, so no 3DS notifications will be sent. Advance notice will be provided if this configuration changes.

9. Success Codes, Error Codes, and Rate Limits#

Q: What is the unified success criterion for all APIs, and how do HTTP status codes map to the business code?
A: The original responses did not establish a complete mapping covering all APIs. The currently confirmed position is that, when calling VM API, code = 0 in the response body indicates business success and a nonzero value indicates failure. Each API should still be handled according to the official API documentation and the actual response.
Q: Which error codes correspond to an invalid Token, an expired Token, and an incorrect App Secret?
A: If Authorization is empty or the Token is invalid or expired, the response code is 400003. If the App Secret is incorrect, the response code is 400007.
Q: Which permission issues do 400004 and 400007 represent?
A: 400004 means No Permission; 400007 means the App Secret is incorrect.
Q: Which errors confirm that the request was not executed and may be retried safely?
A: Examples include Authorization Is Empty, Invalid Token, Invalid AppId, Params Content Error, and decryption failures. Because the error scenarios cannot be exhaustively enumerated, query the final state through card details, the card list, card flows, or transaction records before retrying.
Q: Which errors mean that the execution result is unknown and the final state must be queried first?
A: Card-service errors, timeouts, a response not received by the client, and network errors after the request has entered business processing may leave the result unknown. In these cases, first query the final result through card details, the card list, card flows, or transaction records.
Q: What Sandbox and Production rate limits, time windows, and concurrency limits correspond to error code 400008?
A: Sandbox and Production currently use the same rules:
A given API may be called up to 100 times per minute and 86,400 times per day by the same subject.
Sliding windows are used: the minute window covers the most recent 60 seconds, and the daily window covers the most recent 24 hours.
The maximum number of concurrent connections is 1,000.
Q: Is Retry-After returned when rate limiting is triggered?
A: No.

10. Freezing, Deletion, and Reversal Transactions#

Q: Does CANCELLED always represent a frozen state that can be restored by submitting ACTIVE?
A: The status definitions are as follows: ACTIVE means active, CANCELLED means disabled, and DELETED means deleted. In /freezeCard, CANCELLED means frozen or disabled and can be restored by submitting ACTIVE; DELETED cannot be restored.
Q: Does a card closed by VM risk control also use CANCELLED?
A: VM risk-control closure uses DELETED. A card frozen by the issuer after three consecutive incorrect CVV or expiration-date entries may appear as CANCELLED and will generally be released automatically after three to five days.
Q: Can settlement, reversal, or refund of an authorized transaction still occur after the card is frozen?
A: This depends on the transaction status before the freeze. In general, the merchant cannot initiate a new card debit after the freeze. Refunds and authorization reversals can still be credited to the card. An Authorization approved before the freeze may still result in a subsequent Settlement; refer to the subsequent supplementary confirmation for the specific rules.
Q: Is /deleteCard irreversible?
A: Yes.
Q: Can a card be deleted if it has a balance or pending authorizations?
A: Yes. The card balance is returned before deletion.
Q: Is the card balance returned automatically when the card is deleted?
A: Yes.
Q: Where are merchant refunds or dispute credits posted after the card has been deleted?
A: If the card is active, the funds are returned to the card. If the card has been deleted, the funds are returned to the account ledger.

11. UAT and Production Contract#

Items for Confirmation:
The official materials currently list only Sandbox and Production. Please confirm whether a separate UAT environment exists.
If there is no separate UAT environment, please confirm whether OpenAPI version 1.0.0 is the current Production contract version and explain any Schema or behavioral differences between Sandbox and Production.
If Production differs from the confirmed Sandbox contract in RSA direction, key size, block processing, or encoding, please list the differences.
The rate-limit values, sliding windows, concurrency cap, and absence of Retry-After have been recorded. Please confirm whether the "same subject" used for rate limiting is calculated by AppId, account, sub-account, outbound IP, or a combination of these dimensions.
Response:
Only Sandbox and Production are currently provided externally; there is no separate UAT environment. Sandbox is used for system integration and pre-production testing.
Sandbox and Production use the same business-payload encryption format. Every card API with a business request body must submit:
{
  "content": "RSA ciphertext"
}
This applies to:
/createCard
/cardDetail
/freezeCard
/deleteCard
/rechargeCard
/refundCard
/cardTransaction
/updateCardLimit
/getCardList
/getCardFlow
/getProductCode and /getAccountBalance have no business request body and may be called with an empty body. Business APIs do not accept plaintext JSON directly. data in a successful response is encrypted; parameter, authentication, or decryption error responses are plaintext.
Business APIs are currently rate-limited by the appId + API dimension corresponding to the App/API Key. /getAccessToken is rate-limited by the source IP + request URL dimension.
The RSA rules confirmed here are as follows:
Key size: 4,096 bits.
Padding: PKCS#1 v1.5.
Maximum plaintext block size: 501 bytes.
Ciphertext block size: 512 bytes.
Blocks are encrypted or decrypted in source order and concatenated in the same order.
Encryption sequence: JSON UTF-8 bytes -> RSA encryption -> Base64 encoding -> Hex encoding.
Decryption sequence: Hex decoding -> Base64 decoding -> RSA decryption -> UTF-8 JSON.
JSON is serialized using json.dumps(data) and then UTF-8 encoded.

12. Request ID and Final-Fact Association#

Items for Confirmation:
It is known that the same Request ID returns Duplicate, does not return the result of the first request, and that there is currently no unified operation-status query API.
Confirm whether Request ID deduplication registration and the business transaction are atomic.
Confirm whether the Request ID is registered and consumed during IP allowlist verification, authentication, rate limiting, Hex/Base64/RSA decryption, parameter validation, and the stages before and after business processing begins.
flow_id has been confirmed as globally unique, but the mapping between Request ID and flow_id remains to be confirmed. In addition to response-header echoing and internal logs, please confirm whether Request ID is written to Card Flow, Transaction, Webhook, or financial-detail records.
If Request ID is not written to final-fact tables, please confirm whether another immutable ID exists that can associate a write request one-to-one with its final fact.
Response:
X-Client-Request-Id applies to all APIs, including card issuance, funding, refund, limit modification, and card deletion APIs. The rules are as follows:
The maximum length is 64 characters.
Letters, digits, and -, _, ., and : are permitted.
The uniqueness scope is AppId + ClientRequestId.
The field takes effect and consumes the ClientRequestId only after the request has passed authentication and decryption and entered the business API logging path.
It is currently retained permanently.
The same Request ID returns Duplicate Client Request Id regardless of whether the parameters are the same.
The result of the first request is not returned.
If two requests with the same Request ID arrive concurrently, only one is allowed to enter business processing; the others return Duplicate.
There is currently no unified operation-status query API.
If the client does not receive the response, query the business result as follows:
Card issuance: /getCardList or /cardDetail
Funding and card-balance return: /getCardFlow
Purchase transactions: /cardTransaction

13. Freezing, Pending Authorizations, and Late Settlement After Deletion#

Items for Confirmation:
Whether an Authorization approved before a card enters CANCELLED can still result in a Settlement after the freeze, and, if so, how funds are debited and queried.
Whether automatic card-balance return and card deletion are part of the same atomic transaction.
Whether deletion fails and rolls back in full if the automatic balance return fails.
Which flow_id or financial relationship field corresponds to the automatic balance return.
Whether a late Settlement can still debit funds after card deletion and, if so, the funding source, the representation of a negative balance or recovery, and the query and reconciliation method.
Response:
The status definitions are as follows:
ACTIVE: Active.
CANCELLED: Frozen or disabled; may be restored by submitting ACTIVE.
DELETED: Deleted; cannot be restored.
VMCard risk-control closure uses DELETED. An issuer freeze caused by consecutive incorrect CVV or expiration-date entries may appear as CANCELLED and is generally released automatically after three to five days.
The other rules are as follows:
Refunds and authorization reversals can still be credited to the card after it is frozen.
/deleteCard is irreversible.
A card may still be deleted if it has a balance or pending authorizations.
The card balance is returned before deletion.
A late merchant refund is credited to the card if the card is active.
A late merchant refund is credited to the account ledger if the card has been deleted.
The automatic refund performed when deleting a card is credited to the account ledger.
A late Settlement generally does not occur after card deletion. If a merchant forces a debit, the funds are deducted from the account ledger and generally cannot be recovered.
The related fund movements can be queried and reconciled through financial details.

14. Production Operations for Ordinary Webhooks#

Items for Confirmation:
No signature, Callback Secret, Nonce, independent Event/Delivery ID, or mTLS is currently provided.
The earlier position was that ordinary Webhooks are evaluated by HTTP status code, the response Message is not mandatory, the timeout is 30 seconds, up to three attempts are made in total, retries occur after a timeout, and delivery order is not guaranteed.
Before Production launch, the fixed outbound IP/CIDR and IPv4/IPv6 ranges, as well as the address-change notification process and overlap period between old and new addresses, must be confirmed.
Clarify which HTTP status codes indicate successful receipt.
Clarify whether the maximum of three total attempts also applies to non-success HTTP status codes, along with the retry interval and maximum delivery period.
Clarify how delivery logs may be viewed and how manual redelivery is performed.
Response:
The current fixed Production outbound IP is 8.219.3.65. If the address changes, notice will be provided in the integration group. VM will perform the corresponding switchover after the customer completes its configuration change.
When a customer calls VM API, code = 0 in the response body indicates business success; a nonzero value indicates failure.
For a Webhook delivered to the customer's receiving endpoint, the receiver is advised to return HTTP 200 OK and the following JSON to remain compatible with the current success criterion for transaction-flow Webhooks:
{
  "msg": "ok"
}
A non-2xx response, timeout, network error, or a transaction-flow Webhook response body whose msg is not ok may be treated as a delivery failure and trigger a retry or failure record.
The delivery rules differ by category:
VM API asynchronous callbacks have a 30-second request timeout, but the queue is currently configured for one attempt. Status and error information are recorded after a failure; three automatic attempts should not be promised externally.
Transaction-flow Webhooks currently make up to three attempts in total. HTTP 4xx/5xx responses, network or connection errors, timeouts, and response bodies that do not match the success format are treated as delivery failures and retried.
No fixed retry interval is currently configured. Actual retry times depend on queue scheduling and Worker load; neither a fixed interval nor a strict maximum delivery period is guaranteed.
Delivery records are handled as follows:
VM API asynchronous callbacks provide a delivery-record table that can record request_id, callback_url, request body, response code, response body, status, failure reason, sending time, and other information.
Transaction-flow Webhooks currently rely primarily on failure logs and queue logs and do not provide a complete successful-delivery query table.

15. Acceptance Testing for Non-Empty Transactions and Ordinary Webhooks#

Q: Can a Sandbox or controlled Production test method be arranged to generate a verifiable set of Authorization, Settlement, Reversal, Refund, and ordinary transaction Webhook events and cross-check /cardTransaction, the ordinary Webhook, /getCardFlow where applicable, and financial details?
A: N/A.

16. Request ID and Final Facts#

Items for Confirmation:
Whether Request ID deduplication registration and the business transaction are atomic.
Whether Request ID is written to Card Flow, Transaction, Webhook, or financial-detail records; if not, whether another immutable ID exists that can associate a write request one-to-one with its final fact.
Whether DECLINED and other failure statuses in /getCardFlow are always final and have no fund or card-status side effects, or whether compensation, rollback, or late success may still occur.
Whether any write API can return success before the business operation has reached a final state.
The maximum propagation delay after a successful write for card, Flow, Transaction, or financial facts, and when an empty query result may be treated as mature negative evidence.
Response:
X-Client-Request-Id deduplication is registered in VM API logging middleware and is not part of the same database transaction as subsequent business-table writes. Its atomic consistency with the business transaction therefore cannot be guaranteed.
This ID is not written as a stable field to final-fact tables such as Card Flow or Transaction. VM API asynchronous callbacks preferentially use it as the callback request_id, but it is not a one-to-one relationship key for transaction, fund, or card facts.
/getCardFlow queries fund flows such as card funding and card-balance returns to the account; it does not query the purchase transaction lifecycle.
DECLINED means that the fund flow failed, PENDING means that it is being processed, and COMPLETE means that it completed. DECLINED may be treated as the failure status of that Flow, but it cannot by itself establish the final fund outcome of the complete end-to-end process.
For some write APIs, a successful response means only that VM API or the card service has accepted the request successfully or completed the current synchronous processing step. It does not mean that every subsequent channel status, fund settlement, late transaction, or asynchronous callback is final.
The client must not determine the final outcome solely from a successful write-API response. It should rely on subsequent queries, callbacks, balances, and transaction or fund flows.
There is currently no fixed maximum propagation delay that can be committed to externally.

17. Time and Anomalous Flows#

Q: Does /cardTransaction.auth_time use a fixed timezone for the target product? If not, how can the Timezone or UTC Offset of each record be obtained? A Sandbox /getCardFlow record once had amount = -10 and reality_amount = 0, while the balance actually changed by 10. What is its final accounting meaning?
A: /cardTransaction.auth_time currently does not return a Timezone or UTC Offset field. The record time is the value stored after each channel processes the transaction. The final accounting meaning of the anomalous record must be confirmed further against the original flow provided through a controlled channel.

18. Transaction Relationship Fields for the Target Product#

Q: Does the target product provide a vendor parent transaction ID, settlement or refund parent-child fields, or another stable extended relationship key?
A: No extended fields are provided.

19. Freezing, Deletion, and Late Debits#

Items for Confirmation:
At which stages or statuses an approved Authorization may still result in a Settlement after the card is frozen, and whether the funds are then debited from the card's available balance or the account ledger.
Whether automatic card-balance return before deletion and the deletion operation are part of the same atomic transaction; if the automatic return fails, whether the deletion fails in full and the original card status is retained.
Whether the target Production product generates a card refund with a unique flow_id when automatically returning the balance upon deletion, and whether a stable relationship field exists between that flow, the /deleteCard request, and the financial details.
If a late Settlement leaves the account underfunded, how the API or console represents a negative value, freeze, debt, or another restricted state, and whether a structured alert is provided.
Response:
Freezing or deleting a card only prevents new Authorizations.
An Authorization that was approved before deletion and has not yet been settled or fully reversed may still be submitted by the merchant for Settlement.
A late Settlement is first debited from the card balance. If the card balance is insufficient, it is debited from the main account ledger.
The automatic card-balance return before deletion and the deletion operation are part of the same atomic transaction. If the automatic return fails, the deletion fails in full and the original card status is retained.
The account ledger may display a negative amount in the console.
If the account balance is insufficient, the card issuance API returns error code 700004.
No structured alert is currently provided.
No flow_id or stable relationship field is currently available for the automatic card-balance return performed upon deletion.

20. Chargeback, Dispute, and Other Recovery Events#

Q: Does the target product support Chargeback, Dispute, or other extended fund-recovery events? If so, please provide their fields, enum values, and fund movements in /cardTransaction, Webhooks, and financial details.
A: N/A.

21. Does /refundCard Support Returning the Card Balance Exactly to Zero?#

Q:
Please separately confirm whether, for the current target prepaid-card (save) products in Sandbox and Production, /refundCard allows amount to equal the card's full available_amount at the time of the call and leaves the card balance at exactly 0.00 USD after the refund.
EnvironmentItem to Confirm
SandboxWhether amount = available_amount is permitted and leaves the card balance at exactly 0.00 USD.
ProductionWhether amount = available_amount is permitted and leaves the card balance at exactly 0.00 USD.
If this is not permitted, please provide the exact maximum amount that may be returned in a single /refundCard call and the exact minimum balance that must remain. If both environments use the same rule, please state this explicitly. If the rule applies only to particular products or versions, please also specify its scope.
The customer will initiate card deletion only after the card balance reaches the confirmed minimum value. Balance-return and deletion capabilities will remain disabled until the exact values are confirmed.
A:
ProductCard Network and Issuing CountryBINMinimum Residual Balance
VC110Visa, United States43612077, 43612078, 43612079, 43612080, 43612081, 40041641, 40024200USD 0.10
VC113Mastercard, United States537872USD 0.10
VC102Mastercard, United States555671, 544015, 525962May be returned to USD 0.00
Sandbox and Production use the same processing rules.

22. Hosted Reveal or Other Controlled Card-Data Disclosure#

Q:
Please confirm whether any of the following capabilities are provided so that full card data does not have to enter the customer's ordinary application systems:
A VM-hosted card-data display page.
An embeddable iframe.
A one-time or short-lived card-data display Token or link.
Another VM-hosted controlled method for disclosing card data.
If any such capability is provided, please also explain:
Whether it is available in Sandbox.
The integration method and authentication model.
Token or link validity, one-time-use rules, and invalidation rules.
Available audit records.
Required request fields and the list of masked response fields.
A:
Hosted Reveal, iframe, one-time or short-lived card-data display Tokens/links, and other VM-hosted controlled card-data disclosure methods are not currently provided.

23. Merchant-Refund Data Channel and Transaction Type#

Q: Through which data channel is a merchant-initiated refund returned? Does it appear in /getCardFlow under a particular type, in the transaction-query API under a particular transaction_type, or in both APIs?
A: Merchant-initiated refunds are returned primarily through /cardTransaction. The same merchant-refund event is not also returned as a /getCardFlow record. The business meanings of the relevant types are as follows:
type = "card recharge" in /getCardFlow: funds transferred from the platform account to the card.
type = "card refund" in /getCardFlow: card balance returned to the platform account.
type = "Refund" in /cardTransaction: merchant purchase refund.
type = "Reversal" in /cardTransaction: purchase authorization reversal.

24. Original-Transaction Relationship, Amount Semantics, and Final-State Indicator#

Q: How is a refund record linked to the original purchase? Does it include the original transaction's auth_id or a similar field? What do the amount fields mean, and which status indicates that the refund is final?
A: It can currently be confirmed only that the refund record and original purchase belong to the same card. The existing external fields cannot reliably associate the refund with a specific original transaction. The refund amount is returned as a positive value. The caller must determine the direction of funds from the transaction type, not from the sign of the amount.
A completed refund must satisfy both of the following conditions:
type = "Refund" AND status = "COMPLETE"

25. Webhook Coverage, Event Type, and Payload Fields#

Q: Does the Webhook configured in the console cover merchant-initiated refunds? If so, what are the event type and payload fields?
A: After a transaction Webhook is configured, refund records that have been persisted and trigger forwarding are sent asynchronously to the same callback URL. The refund event type is Refund. The Webhook payload fields are as follows:
ParameterTypeDescription
auth_idStringTransaction ID
card_idStringCard ID
vm_card_idStringVM card ID
auth_timeStringTransaction authorization time
auth_amountDoubleAuthorization amount
auth_currencyStringAuthorization currency
settle_amountDoubleSettlement amount
settle_currencyStringSettlement currency
statusStringTransaction status
typeStringTransaction type
merchant_nameStringTransaction merchant
create_timeStringCreation time
descriptionStringTransaction details or failure information

26. Sandbox Merchant-Refund Simulation#

Q: How can a merchant refund be simulated in Sandbox for integration testing?
A: VM API currently does not provide a separate merchant-refund simulation API.
修改于 2026-09-04 02:44:35
上一页
Change Log
下一页
Get accessToken
Built with