unified-payments
  1. Unified Payments
unified-payments
  • Unified Payments
    • Overview
    • Encryption
    • Authentication
    • Card (Non-3DS)
    • Card (3DS)
    • Apple Pay
  • Unified Payments API
    • Payments
      • Initiate Payment
      • List Payments
      • Get Payment
    • Refunds
      • Initiate Refund
      • List Refunds
      • Get Refund
  • Schemas
    • Schemas
      • SuccessResponse
    • ErrorResponse
    • PaymentRequest
    • PaymentResponse
    • WebhookPayload
  1. Unified Payments

Card (3DS)

3DS Card Payments#

Process card payments with 3D Secure authentication for enhanced security and fraud protection.

Overview#

3DS (3D Secure) payments add an authentication step where the customer verifies their identity with their card issuer. This provides:
Enhanced security - Reduces fraud risk
Liability shift - Card issuer assumes fraud liability (not merchant)
Regulatory compliance - Required for PSD2 in Europe
Higher approval rates - Issuers trust authenticated transactions
Trade-off: Additional redirect step (slightly longer checkout) compared to non-3DS payments.

Authentication#

All requests must include your Client ID in the Authorization header.
See Authentication Guide for details.

Encryption#

Card data must be encrypted before sending.
See Encryption Guide for implementation details.

Endpoint#

POST /v2/payments
Base URLs:
Sandbox: https://sandbox-acquiring.globalremitfs.com
Production: https://acquiring.globalremitfs.com

Payment Flow#

3DS payments follow a redirect-based flow:
1. Merchant initiates payment → POST /v2/payments
2. API returns challenge_url → Redirect customer to this URL
3. Customer completes 3DS challenge → Authentication on card issuer page
4. Nuvion processes payment → Customer redirected back to merchant
5. Merchant receives webhook → Payment confirmation (optional)

Request Parameters#

FieldTypeRequiredDescription
merchant_referencestringYesYour unique order/transaction reference (must be unique)
merchant_metaobjectNoCustom metadata (max 10 key-value pairs)
amountintegerYesAmount in smallest currency unit (cents for USD, pence for GBP)
currencystringYesISO 4217 currency code (USD, GBP, EUR, etc.)
descriptionstringNoPayment description (shown to customer)
payment_methodobjectYesPayment method details
payment_method.typestringYesMust be "card"
payment_method.datastringYesRSA-encrypted card data (see encryption guide)
billing_addressobjectYesCustomer billing address
billing_address.first_namestringYesCustomer first name
billing_address.last_namestringYesCustomer last name
billing_address.emailstringYesCustomer email (must be valid format)
billing_address.address_line_onestringYesThe first line of the billing address
billing_address.address_line_onestringNoThe second line of the billing address
billing_address.countrystringYesISO 3166-1 alpha-2 country code (US, GB, etc.)
billing_address.citystringYesCity name
billing_address.statestringYesState name
billing_address.zipstringNoPostal/ZIP code
browser_infoobjectRecommendedBrowser details (required for 3DS2)
browser_info.accept_headerstringNoBrowser Accept header
browser_info.user_agentstringNoBrowser User-Agent
browser_info.java_enabledbooleanNoJava enabled in browser
browser_info.javascript_enabledbooleanNoJavaScript enabled (usually true)
browser_info.languagestringNoBrowser language (en-US, etc.)
browser_info.color_depthstringNoScreen color depth (24, 32, etc.)
browser_info.screen_heightstringNoScreen height in pixels
browser_info.screen_widthstringNoScreen width in pixels
browser_info.timezone_offsetstringNoTimezone offset in minutes
ip_addressstringYesCustomer IP address (for fraud detection)
redirect_urlstringYesURL to redirect customer after payment completion
webhook_urlstringNoURL for payment status webhooks
enable_3dsbooleanNoSet to true to force 3DS. Default: auto-detect
Note: browser_info is highly recommended for 3DS2 compliance and better approval rates.

Response Fields (Initiation)#

Success Response (HTTP 200)#

FieldTypeDescription
statusstringAlways "successful"
messagestringSuccess message
dataobjectPayment response data
data.payment_idstringUnique payment identifier (ULID format)
data.merchant_referencestringYour original transaction reference
data.merchant_metaobjectYour custom metadata (if provided)
data.amountintegerPayment amount
data.currencystringPayment currency
data.statusstring"3ds_required" - customer needs to complete 3DS
data.session_idstring3DS session identifier
data.challenge_urlstringRedirect customer to this URL
data.created_atnumberPayment creation timestamp (Unix ms)
data.completed_atnumbernull (payment not yet complete)

Response Fields (After 3DS Completion)#

After the customer completes 3DS, they're redirected to your redirect_url with query parameters:
ParameterDescription
payment_idNuvion payment ID
merchant_referenceYour original transaction reference
statusEither "success" or "failed"
You should then retrieve the payment details or rely on the webhook.

Example Request#

Full JSON#

{
  "merchant_reference": "order_67890",
  "merchant_meta": {
    "customer_id": "cust_456",
    "subscription_id": "sub_789"
  },
  "amount": 15000,
  "currency": "USD",
  "description": "Premium Plan - 6 Months",
  "payment_method": {
    "type": "card",
    "data": "tbjH0nx6WaEkzHOjgw2crsusmVBuL8s+PxWFqYb5cWZ3k1..."
  },
  "billing_address": {
    "first_name": "Jane",
    "last_name": "Smith",
    "email": "jane.smith@example.com",
    "country": "US",
    "city": "Los Angeles",
    "zip": "90001"
  },
  "browser_info": {
    "accept_header": "text/html,application/xhtml+xml",
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)...",
    "java_enabled": false,
    "javascript_enabled": true,
    "language": "en-US",
    "color_depth": "24",
    "screen_height": "1080",
    "screen_width": "1920",
    "timezone_offset": "-300"
  },
  "ip_address": "203.0.113.42",
  "redirect_url": "https://yoursite.com/payment/callback",
  "webhook_url": "https://yoursite.com/webhooks/payment",
  "enable_3ds": true
}

cURL#

Node.js#

Collecting Browser Info (Frontend)#

Example Responses#

3DS Challenge Required#

{
  "status": "successful",
  "message": "3DS authentication required",
  "data": {
    "payment_id": "01HXYZ123ABC456DEF789GHI",
    "merchant_reference": "order_67890",
    "merchant_meta": {
      "customer_id": "cust_456",
      "subscription_id": "sub_789"
    },
    "amount": 15000,
    "currency": "USD",
    "status": "3ds_required",
    "session_id": "01HXYZ987SESSION654XYZ",
    "challenge_url": "https://acquiring.globalremitfs.com/3ds-sessions/01HXYZ987SESSION654XYZ",
    "created_at": 1699564800000,
    "completed_at": null
  }
}
Action: Redirect the customer to challenge_url.

Frictionless Flow (No Challenge)#

Sometimes the card issuer approves without requiring customer interaction:
{
  "status": "successful",
  "message": "Payment processed successfully",
  "data": {
    "payment_id": "01HXYZ123ABC456DEF789GHI",
    "merchant_reference": "order_67890",
    "merchant_meta": {
      "customer_id": "cust_456",
      "subscription_id": "sub_789"
    },
    "amount": 15000,
    "currency": "USD",
    "status": "completed",
    "authorization_code": "AUTH123456",
    "created_at": 1699564800000,
    "completed_at": 1699564802000
  }
}
Note: Check data.status - if it's "completed", payment succeeded without redirect!

Redirect URL Parameters#

After 3DS completion, the customer is redirected to your redirect_url with these query parameters:
ParameterDescription
payment_idNuvion payment ID
merchant_referenceYour original transaction reference
statusEither "success" or "failed"
Example successful redirect:
https://yoursite.com/payment/callback?payment_id=01HXYZ123ABC456DEF789GHI&merchant_reference=order_67890&status=success
Example failed redirect:
https://yoursite.com/payment/callback?payment_id=01HXYZ123ABC456DEF789GHI&merchant_reference=order_67890&status=failed
Your redirect URL may already have query parameters. Nuvion's parameters are appended safely:
https://yoursite.com/callback?session=abc123&payment_id=01HXYZ...&merchant_reference=order_67890&status=success

Handling the Redirect#

Webhooks#

If you provide a webhook_url, Nuvion will send a POST request with the payment result:
{
  "event": "payment.completed",
  "payment_id": "01HXYZ123ABC456DEF789GHI",
  "merchant_reference": "order_67890",
  "merchant_meta": {
    "customer_id": "cust_456",
    "subscription_id": "sub_789"
  },
  "status": "completed",
  "amount": 15000,
  "currency": "USD",
  "authorization_code": "AUTH123456",
  "created_at": 1699564800000,
  "completed_at": 1699564825000
}
Failed payment webhook:
{
  "event": "payment.failed",
  "payment_id": "01HXYZ123ABC456DEF789GHI",
  "merchant_reference": "order_67890",
  "merchant_meta": {
    "customer_id": "cust_456",
    "subscription_id": "sub_789"
  },
  "status": "failed",
  "failure_reason": "3DS authentication failed",
  "amount": 15000,
  "currency": "USD",
  "created_at": 1699564800000,
  "completed_at": 1699564820000
}
Always verify webhook signatures (documentation coming soon).

Testing#

Test Card Numbers (Sandbox)#

Card Number3DS Behavior
40000000000010913DS challenge (authentication required)
40000000000010003DS frictionless (no challenge, auto-approved)
40000000000010183DS failed (customer fails authentication)
4111111111111111Standard test card (3DS behavior varies)
Note: Use any future expiry date and any 3-digit CVV.

Test 3DS Challenge#

When redirected to the 3DS challenge page in sandbox:
Password: Any value (e.g., "password", "test", "123")
The challenge will auto-submit and process the payment

Common Errors#

Missing browser_info#

Impact: May result in lower approval rates or 3DS failures
Solution: Always collect and send browser_info for 3DS payments

Duplicate merchant_reference#

Error: "A payment with this merchant reference already exists"
Solution: Each merchant_reference must be unique

Decryption failed#

Error: "Failed to decrypt payment data"
Solution: Check your encryption implementation. See Encryption Guide

Client ID not found#

Error: "Client ID not found"
Solution: Verify your Client ID. See Authentication Guide

When to Use Non-3DS Instead#

Consider using non-3DS payments for:
Very low-risk transactions
Recurring payments with saved cards
Faster checkout (no redirect)
Regions where 3DS is not required
Warning: Non-3DS has higher fraud risk and merchant liability.

3DS2 vs 3DS1#

Nuvion automatically uses 3DS2 when available, with fallback to 3DS1:
Feature3DS23DS1
AuthenticationFrictionless (70%+ cases)Always challenge
Mobile SupportNative app integrationBrowser only
Data SharingRich context (browser_info)Limited
User ExperienceSeamlessPop-up/redirect
Recommendation: Always provide browser_info for optimal 3DS2 experience.

Best Practices#

✅ DO#

Always collect and send browser_info
Handle both 3ds_required and completed status responses
Implement webhook handling for reliable notifications
Show clear messaging during 3DS redirect
Test with all test cards in sandbox
Log payment_id for support inquiries

❌ DON'T#

Skip browser_info (reduces approval rates)
Assume all 3DS payments require redirect (frictionless exists)
Rely only on redirects (use webhooks too)
Show technical errors to customers
Use same merchant_reference for retries

Support#

Email: support@nuvion.com
Documentation: https://acquiring-docs.globalremitfs.com
Modified at 2026-01-13 10:54:37
Previous
Card (Non-3DS)
Next
Apple Pay
Built with