Authenticate
POST/v1/3ds/:id/authenticate
Submit the cardholder's device information and authentication preferences to the ACS. The provider may either complete the authentication frictionlessly (no cardholder interaction) or return a challenge URL to which the browser must be redirected.
Business rules:
- The CardAuth must be in status
available. number/month/yearmust match the fingerprint recorded on the CardAuth at creation. Any mismatch is a security failure and is rejected with HTTP 400.- When
customer_device.javascript_enabled = true, thecolor_depth,screen_height,screen_widthandtimezonefields are mandatory.
Required permission: 3ds_create.
Concurrency: authenticate acquires a 15-second Redis lock on
the CardAuth. Parallel authenticate requests return HTTP 400.
Request
Path Parameters
CardAuth UUID.
- application/json
Body
required
browser: cardholder present in a browser. Challenge will be delivered via a redirect tochallenge.url.decoupled: cardholder authenticates out of band (e.g. via a banking app push). No challenge URL is returned.no_preference: let the ACS decide.no_challenge: request frictionless; the issuer may still force a challenge.preferred: request a challenge.mandated: require a challenge (regulatory flows).
Possible values: Value must match regular expression ^\d{13,19}$
Primary Account Number (PAN) as a continuous digit string, no
separators. Sent in request bodies only — PAN is never returned in
full in responses; only first_digits and last_digits are echoed.
Possible values: >= 1 and <= 12
Possible values: >= 2000
Possible values: [browser, decoupled]
Default value: browser
Absolute URL the ACS redirects the browser to after the challenge.
Possible values: non-empty and <= 40 characters
Possible values: [no_preference, no_challenge, preferred, mandated]
Default value: no_preference
customer
object
Possible values: >= 2 characters and <= 45 characters
Possible values: <= 254 characters
Possible values: non-empty and <= 18 characters
Phone number. E.164 format is recommended.
billing_address
object
Billing or shipping address. All fields are optional.
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 16 characters
Possible values: Value must match regular expression ^[A-Z]{2}$
ISO 3166-1 alpha-2 country code in uppercase.
shipping_address
object
Billing or shipping address. All fields are optional.
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 50 characters
Possible values: non-empty and <= 16 characters
Possible values: Value must match regular expression ^[A-Z]{2}$
ISO 3166-1 alpha-2 country code in uppercase.
customer_device
object
Cardholder's browser / device metadata. Collected via the 3DS
Method (browser fingerprint script) and forwarded to the ACS for
risk scoring. When javascript_enabled = true, the screen and
timezone fields are mandatory.
Public IPv4 or IPv6 address of the customer.
Possible values: non-empty and <= 2048 characters
Possible values: non-empty and <= 2048 characters
Possible values: non-empty and <= 8 characters
BCP 47 language tag (e.g. en-US).
Possible values: [1, 4, 8, 15, 16, 24, 32, 48]
Possible values: >= 1 and <= 999999
Possible values: >= 1 and <= 999999
Possible values: Value must match regular expression ^[+-]\d{1,4}$
Browser timezone offset in minutes from UTC as returned by
Date#getTimezoneOffset(), prefixed with sign. Example:
'-180' for UTC+3.
Responses
- 200
- 400
- 401
- 403
- 404
- 422
Authentication processed. If frictionless, status is
authenticated and auth is populated. Otherwise status is
in_progress and challenge.url contains the ACS URL.
- application/json
- Schema
- Example (from schema)
Schema
1.00 SARis sent as1001.00 KWDis sent as10001 JPYis sent as1Y: Authenticated successfully.N: Not authenticated / denied.U: Authentication could not be performed.A: Attempt performed. Not authenticated but a CAVV was provided.R: Rejected by issuer.
A 36-character UUIDv7 identifier. When used as an idempotency key on write endpoints, the client is responsible for generating a fresh UUID for each logical operation and retaining it across retries.
merchant
object
Brief representation of the merchant that owns the resource.
A 36-character UUIDv7 identifier. When used as an idempotency key on write endpoints, the client is responsible for generating a fresh UUID for each logical operation and retaining it across retries.
Merchant display name (English).
Stable, human-readable merchant identifier assigned by the acquirer. Often used as the merchant's principal reference in scheme reports.
Merchant display name in Arabic, when configured.
Possible values: [draft, available, in_progress, authenticated, failed]
Possible values: [visa, mastercard, mada, amex]
The card scheme (network) associated with the card. mada is detected from the issuing BIN and takes precedence over Visa / Mastercard co-branding for Saudi-issued cards.
Possible values: <= 100000000
A non-negative integer representing a monetary value in the smallest
currency unit for the associated currency (minor units).
Examples:
For most order-creating endpoints the minimum is 100
(one full major unit). Endpoints that support zero-value operations
(such as /v1/orders/verify and /v1/orders/:id/extend) allow 0.
Possible values: Value must match regular expression ^[A-Z]{3}$
ISO 4217 three-letter currency code in uppercase.
The currency must match the currency configured for the merchant's scheme-level terminals. Once an order is created, its currency is immutable: every subsequent capture, void, refund and extension is denominated in the same currency.
Last message reported by the 3DS provider.
Possible values: [system_error, rejected, denied, unavailable, upstream_error, null]
EMVCo protocol error code (e.g. 203, 405) when the ACS rejects the request.
Possible values: [no_preference, no_challenge, preferred, mandated]
True when the authentication completed without a challenge.
challenge
object
Challenge details returned when the ACS requires cardholder interaction.
ACS URL to redirect the cardholder to.
Base64-encoded Challenge Request (CReq) that must be POSTed to
url as the creq form field.
auth
object
Authentication values that must be echoed on the subsequent
authorization request (as source.auth).
CAVV / 3DS server transaction value.
Possible values: [Y, N, U, A, R]
Transaction status from the 3DS authentication response:
Possible values: [00, 01, 02, 05, 06, 07]
Electronic Commerce Indicator returned by the directory server / issuer ACS. Identifies the authentication strength and is required when submitting a 3DS-authenticated transaction.
Possible values: [2.0.0, 2.1.0, 2.2.0, 2.3.0]
EMV 3-D Secure protocol version the authentication was performed under.
A 36-character UUIDv7 identifier. When used as an idempotency key on write endpoints, the client is responsible for generating a fresh UUID for each logical operation and retaining it across retries.
A 36-character UUIDv7 identifier. When used as an idempotency key on write endpoints, the client is responsible for generating a fresh UUID for each logical operation and retaining it across retries.
Possible values: Value must match regular expression ^\d{12}$
Purchase date in YYYYMMDDHHMM format (UTC). Generated by the 3DS
server during authentication. Must be echoed back verbatim when the
authorization is submitted, otherwise authentication values are
rejected by the scheme.
ISO 8601 UTC timestamp with time zone designator.
ISO 8601 UTC timestamp with time zone designator.
{
"id": "0191f5a7-3d99-7f81-b7ec-962a5f5fdd7c",
"merchant": {
"id": "0191f5a7-3d99-7f81-b7ec-962a5f5fdd7c",
"name": "Example Store",
"merchant_id": "MERCHANT001",
"arabic_name": "متجر الأمثلة"
},
"status": "draft",
"scheme": "visa",
"amount": 10000,
"currency": "SAR",
"return_url": "string",
"message": "string",
"failure_reason": "system_error",
"emvco_error_code": "string",
"emvco_error_message": "string",
"challenge_preference": "no_preference",
"frictionless": true,
"statement_descriptor": "string",
"challenge": {
"url": "string",
"creq": "string"
},
"auth": {
"value": "string",
"status": "Y",
"eci": "05",
"version": "2.0.0",
"ds_transaction_id": "0191f5a7-3d99-7f81-b7ec-962a5f5fdd7c",
"acs_transaction_id": "0191f5a7-3d99-7f81-b7ec-962a5f5fdd7c",
"ds_reference_number": "string",
"acs_reference_number": "string",
"tds_purchase_date": "202501151430"
},
"created_at": "2025-01-15T14:30:00Z",
"updated_at": "2025-01-15T14:30:00Z"
}
CardAuth is not available, card details do not match the
fingerprint, or a concurrent authenticate is in progress.
- application/json
- Schema
- Example (from schema)
Schema
{
"message": "This order cannot be captured."
}
Authentication failed.
- application/json
- Schema
- Example (from schema)
Schema
{
"message": "Missing authentication information"
}
The authenticated principal lacks the required permission.
- application/json
- Schema
- Example (from schema)
Schema
{
"message": "Unauthorized"
}
The referenced resource does not exist.
- application/json
- Schema
- Example (from schema)
Schema
{
"message": "The Order you are looking for was not found."
}
Validation error.
- application/json
- Schema
- Example (from schema)
Schema
Array [
]
errors
object
required
property name*
string[]
string
{
"message": "The given data was invalid.",
"errors": {
"amount": [
"The amount field must be at least 100."
],
"source.number": [
"The number must be a valid credit card."
]
}
}