Frequently Asked Questions

Clear answers for the repeated integration issues: live vs sandbox keys, KYC values, file upload IDs, card creation, deposits, user-level tracking, balances, fees, transactions, and webhooks.

Showing all answers
KYC checklist Documents, file IDs, town code, occupation code, area code, and cardholder review. Card flow Virtual card creation, physical bind, activation, card type, and top-up sequence. Deposit tracking How customer deposits are identified by token, user ID, address, and internal ID. Error fixes Fast answers for mobile format, wrong file ID, town error, access denied, and balance issues.
No matching FAQ found. Try searching for an endpoint, field name, or exact error message.

Environment and Authentication

Use the correct key and base URL before debugging payload fields.

What base URL should I use?

Use production for live keys and sandbox for sandbox keys.

Production: https://{api-domain}/api/v1
Sandbox:    https://{api-domain}/sandbox/api/v1
Can I use a sandbox key on production?

No. Sandbox keys only work on the sandbox path. Production keys only work on the production path.

How do I authenticate API requests?

Every API request must include the API key in the X-API-KEY header.

X-API-KEY: wc_your_api_key
Content-Type: application/json
Accept: application/json
Can one API token see another token's records?

No. Cards, cardholders, deposits, transactions, webhook events, wallet addresses, and balances are filtered by the authenticated API token.

If a resource was created by another token, the API returns access denied instead of leaking the record.

KYC and Cardholders

Submit complete cardholder data, valid reference codes, and file IDs from the same environment.

What is the correct KYC sequence?
Collect the user's details and KYC documents in your own frontend.
Upload documents using POST /common/files/upload.
Create the cardholder using POST /cardholders/create-v2.
Check the final result through GET /webhook-events or POST /cardholders/list.
Create or bind cards only after the cardholder status is pass_audit.
What documents are needed for B2C KYC?

Typical B2C KYC needs these file IDs:

  • idFrontId: IC/passport front image.
  • idBackId: IC/passport back image, if applicable.
  • idHoldId: selfie or user holding ID, if required.
Upload the files using the same API key and same environment as the cardholder creation request.
Does KYC support the China national ID card?

No. KYC does not support the China (mainland) national identity card. Applicants from China must verify with a passport instead — submit idType: PASSPORT with the passport images.

A China national ID card will be rejected during KYC review. Use a passport for applicants from China.
Is idNoExpiryDate required?

It is optional when idType is GOVERNMENT_ISSUED_ID_CARD. If omitted, the API forwards 2099-12-31 as the no-expiry placeholder. For other document types, include the expiry date when creating or updating a B2C cardholder.

What is ipAddress?

ipAddress is the end user or cardholder public IP address at the time they submit KYC.

"ipAddress": "203.0.113.10"

Do not use an internal server IP such as 172.18.0.8 in production.

Should areaCode include +?

The supported reference value is +65 for Singapore. The API also accepts 65 and normalizes it to +65 before forwarding.

"areaCode": "65",
"mobile": "88569936"
Where do I get valid town and occupation values?
  • Town/city codes: GET /common/cities or GET /common/cities/hierarchical.
  • Occupation codes: POST /cardholders/occupations.
  • Supported countries and area codes: common/reference APIs and POST /cards/support-bins.
What address format is accepted?

Use letters, numbers, spaces, and hyphen only. Avoid symbols such as #, commas, slashes, or special characters.

Wrong: 461B Yishun Ave 6 #10-1061
Right: 461B Yishun Ave 6 10-1061
How long does cardholder creation take?

The initial API response can return a pending status such as wait_audit. The final result is asynchronous and should be checked through webhook events or cardholder list status.

Card Creation and Activation

Choose the correct card type first. Virtual and physical flows are not the same.

Which endpoint creates a card?

Use POST /cards/create-v2. Required fields depend on the card type returned by POST /cards/support-bins.

What is the production physical card type?
Physical:
BIN: 49372410
cardTypeId: 111059
status: online

Virtual:
BIN: 49372410
cardTypeId: 111069
status: online
What is the physical card flow?
Create or bind the physical card to an approved holder.
Get the activation code through the supported activation-code flow.
Call POST /cards/activate-physical.
Set or update PIN if required using POST /cards/update-pin.
Top up the card using POST /cards/deposit.
Monitor spend and authorization transactions.
Can I use a printed PAN directly as cardNo?

Not always. Some physical-card flows require the provider card ID instead of the printed PAN. If /cards/bind returns Card does not exist, confirm whether the input is the required provider card ID.

Why does /cards/bindExistingCard return 404?

bindExistingCard is the OpenAPI operation ID / SDK function name, not the endpoint URL. The correct API path is POST /api/v1/cards/bind. For physical cards, pass the correct cardTypeId for the card BIN. For BIN 49372410, use cardTypeId: 111059.

curl --location --request POST 'https://wasabi.alphalinx.top/api/v1/cards/bind' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --header 'Accept: application/json' \
  --data '{
    "cardNo": "4937241005769252",
    "cardTypeId": 111059,
    "holderId": 211980
  }'
Does the virtual card issuing fee apply to physical card bind?

No. The virtual card issuing fee applies to virtual card creation only. Physical card bind should not be charged as virtual card issuing.

Deposits, Wallets, and User IDs

Use customer identifiers when creating card top-up orders so deposits can be attributed correctly.

How does userId or externalUserId work?

userId and externalUserId mean the end-user/customer ID from your system. You may include either field when requesting the funding address, then use the same value when creating the card top-up order.

POST /wallet/v2/create?coinKey=USDT_TRC20&userId=11
POST /wallet/v2/create?coinKey=USDT_TRC20&externalUserId=11
What is the current wallet deposit to card top-up process?
Call POST /api/v1/wallet/v2/create?coinKey=USDT_BEP20&externalUserId=CUSTOMER_ID.
Show data.address to the customer as the funding wallet deposit address for the selected network.
Customer sends the exact intended crypto amount to data.address.
Create POST /api/v1/wallet/card-topup-orders with cardNo, amount, coinKey, externalUserId, sourceAddress, and txHash when available.
The wallet callback confirms the deposit, deducts the deposit fee, then loads the net amount to the card automatically.
Check status with GET /api/v1/wallet/card-topup-orders/{id} or GET /api/v1/wallet/card-topup-orders?txHash=0x....
POST /api/v1/wallet/v2/create?coinKey=USDT_BEP20&externalUserId=CUSTOMER_001
POST /api/v1/wallet/card-topup-orders

{
  "cardNo": "USER_CARD_NO",
  "amount": "100.00",
  "coinKey": "USDT_BEP20",
  "externalUserId": "CUSTOMER_001",
  "sourceAddress": "0xUSER_SENDING_WALLET",
  "txHash": "0xTRANSACTION_HASH"
}
Do not use /api/v1/wallet/deposit or /api/v1/wallet/deposit/transactions. Those legacy wallet APIs have been removed. Use the v2 wallet APIs and card top-up orders only.
Can deposits be identified by user?

Yes. Create a pending card top-up record before or after the user sends funds. The safest match is by txHash. If txHash is not available yet, store sourceAddress, amount, coin key, user ID, and card number so the webhook can match the deposit later.

{
  "coinKey": "USDT_TRC20",
  "internalId": null,
  "externalUserId": "11",
  "userId": "11",
  "address": "FUNDING_WALLET_ADDRESS"
}
POST /api/v1/wallet/card-topup-orders

{
  "cardNo": "USER_CARD_NO",
  "amount": "100.00",
  "coinKey": "USDT_BEP20",
  "externalUserId": "11",
  "sourceAddress": "0xUSER_SENDING_WALLET",
  "txHash": "0xTRANSACTION_HASH"
}
Is internalId safe to store?

Yes. It is encrypted and can be stored with your customer top-up record. It is not the raw database ID.

Does each user have a separate provider balance?

The spendable balance is merchant-level under the API token. The user ID is your customer reference for your own top-up record; your backend should enforce that a customer's credited amount is only used for that customer's card.

Correct model: merchant-level spendable balance plus customer-level top-up/order tracking in your system.
Which networks are supported for crypto deposit addresses?

Use the coin keys returned by POST /wallet/v2/coins. Common supported examples are:

  • USDT_TRC20
  • USDT_BEP20
  • USDT_ERC20
What if address creation returns 503?

The deposit address service could not issue an address. Common causes are missing configuration, no existing reusable address for that token/coin, address quota reached, or chain mapping not available. Retry only after configuration or quota is resolved.

Balances and Card Top-up

Card funding depends on the API token balance and the user's tracked deposit ledger.

Where do card top-up funds come from?
Call POST /wallet/v2/create and show data.address as the deposit address.
Create POST /wallet/card-topup-orders with the target cardNo, amount, user ID, source address, and txHash when available.
User deposits crypto to data.address.
Wallet webhook confirms the deposit and matches the pending top-up record.
Deposit fee is deducted and the net amount is loaded to the card automatically.

The net card top-up amount after fees must be at least 1.00 USD. If the calculated net amount is below this minimum, the order is rejected or marked failed and the funds remain in the wallet balance.

Check the top-up status with GET /api/v1/wallet/card-topup-orders/{id} or search by transaction hash with GET /api/v1/wallet/card-topup-orders?txHash=0x....

Status values are pending, deposit_requested, completed, and failed. If status is failed, read errorMessage.
Which endpoint checks available balance?

Use GET /accounts/assets. The response is scoped to the current API token only.

Why do I get Insufficient balance?

The API token balance does not have enough available funds to cover the requested amount plus applicable fees. Fund the token balance first, then retry.

Fees

Fees can be configured per API token, with global values used as fallback.

When are fees charged?
FeeWhen charged
KYC onboarding feeAfter cardholder approval completes.
Virtual card issuing feeAfter virtual card creation succeeds.
Top-up feeWhen deposit/top-up is credited or processed.
Authorization feeWhen an authorization fee event is received.
Cross-border / FX feeWhen a cross-border transaction fee event is received.
Are fees dynamic by API token?

Yes. Fees can be configured per API token. If no token-specific fee is set, the global fee can be used.

Transactions and Webhooks

Use transaction endpoints for history and webhook events for async status changes.

How do I get card spending transactions?
  • POST /cards/auth-transactions for authorization/spend records.
  • POST /cards/auth-fee-transactions for authorization fee records.
  • POST /cards/operation-transactions-v2 for lifecycle operations.
  • POST /cards/3ds-transactions for OTP, authorization URL, or activation-code records.
How do I get async results?

Poll GET /webhook-events. Filter by category, reference_id, merchant_order_no, or status.

Are webhook events scoped by API token?

Yes. API token users only see webhook events assigned to their own token.

Common Errors

Use these checks before escalating an integration issue.

Please enter the correct mobile phone number format

Use a supported mobile code such as +65 for Singapore. Sending 65 is also accepted by this API and normalized before forwarding.

If this still fails, confirm the card type supports the holder country and area code through /cards/support-bins.
The ID-front or ID-back or ID-Holder file is wrong

Re-upload the three KYC files using the same API key and same environment, then use the new returned file IDs in create-v2.

Document request upload failed

This happens inside the KYC cardholder API when the submitted idFrontId, idBackId, or idHoldId cannot be accepted for the current request.

  • Upload the KYC documents again using POST /common/files/upload.
  • Use the same environment: live files for live KYC, sandbox files for sandbox KYC.
  • Use the same X-API-KEY for file upload and cardholders/create-v2.
  • Use supported file types: jpg, jpeg, png, or pdf, maximum 2 MB.
town parameter error

The submitted town is not a valid city/town code for the selected country. Fetch valid values from the city API and use the returned code.

The BIN not support the model

The selected cardTypeId does not support the requested cardHolderModel. Use /cards/support-bins to confirm whether the BIN supports B2B or B2C.

The cardNumber can not be blank

The selected card type is physical and requires a physical card number or provider card identifier, depending on the flow.

Card number does not exist or Card does not exist

The card number/provider card ID is not found or not assigned to the account. Confirm the correct card identifier and physical inventory mapping.

Access denied: this resource does not belong to your API key

The card, cardholder, wallet address, transaction, or event belongs to another API token. Use only resources created or assigned under the current API key.

Insufficient balance

The API token balance is not enough to perform the operation. Fund the token balance first, then retry the card create or top-up.