UQPAY supports 3D Secure (3DS) authentication to help prevent fraud on online transactions. By default, 3DS decisions are made by the UQPAY risk engine. You can override this behavior per card to either enforce or bypass 3DS challenges.
Control the allow_3ds_transactions flag under risk_controls:
| Value | Behavior |
|---|
Y (default) | Risk engine evaluates each transaction. May trigger 3DS challenge for high-risk transactions |
N | Bypasses risk evaluation. All transactions proceed via frictionless flow |
When set to N, the card uses a frictionless 3DS authentication mechanism. Transactions complete without OTP input and are treated as cardholder-authenticated. As a result, disputes based on fraud or unauthorized use cannot be raised for such transactions. For enhanced security, it is recommended to keep this set to Y.
Set at card creation
{
"cardholder_id": "7c4ff2cd-1bf6-4aaa-bf16-266771425011",
"card_product_id": "7c4ff2cd-1bf6-4aaa-bf16-266771425011",
"card_currency": "USD",
"card_limit": 2100.02,
"risk_controls": {
"allow_3ds_transactions": "N"
}
}
Update on an existing card
curl -X POST https://api-sandbox.uqpaytech.com/api/v1/issuing/cards/{card_id} \
-H "x-auth-token: YOUR_API_TOKEN" \
-H "x-idempotency-key: $(uuidgen | tr '[:upper:]' '[:lower:]')" \
-H "Content-Type: application/json" \
-d '{
"risk_controls": {
"allow_3ds_transactions": "N"
}
}'
- If
allow_3ds_transactions is omitted during card creation, it defaults to Y.
- During card update, omitting the field leaves the current setting unchanged.
- Physical cards automatically have
allow_3ds_transactions set to Y upon activation.
- This setting affects only 3DS behavior. Other fraud checks are not affected.
OTP delivery
When a 3DS challenge is triggered, an OTP is sent to the cardholder’s registered email address. The cardholder enters the OTP on the authentication page to complete verification.
Ensure the cardholder’s email is accurate when creating or updating the cardholder. OTPs are valid for a few minutes.
3DS OTP webhook
UQPAY sends a card.3ds.otp webhook when an OTP is generated:
{
"version": "V1.6.0",
"event_name": "ISSUING",
"event_type": "card.3ds.otp",
"event_id": "26de83a5-cea5-4f84-ab11-48813025e40a",
"source_id": "12ea604d-5899-43d6-8c2d-618c9ce8eae3",
"data": {
"otp": "12344444",
"reference_code": "4868798",
"customer_id": "67f006f4-d593-49f4-be0e-f1f894e8933b",
"card_id": "1d749d10-511e-469f-9a83-0560a602ac37",
"card_number": "1234********3381",
"transaction_currency": "USD",
"transaction_amount": "100",
"merchant_name": "Example Merchant"
}
}