For all requests involving transactions in Uruguay, it is mandatory to include an object called rates. This object allows specifying a particular tax rate through two properties. The key property identifies the tax name—in Uruguay, this corresponds to the IVA (Value Added Tax), so the value must be "iva". The value property indicates the percentage of the applied tax rate, expressed as a numeric value.
Uruguay has the following main IVA categories:
The value should reflect the appropriate rate based on the transaction, although other values may also be declared when applicable, such as promotional rates or tax benefits.
Example with a Standard category value:
"rates": [
{
"key": "iva",
"value": 22.0
}
]
For all requests involving transactions in Uruguay, it is mandatory to include the regional_regulation_code field to ensure the correct application of regional regulations during processing. The following law codes are currently supported:
If the value provided corresponds to one of these recognized codes, the corresponding discount or special treatment will be applied during post-processing, as defined by the processing rules.
Example:
"regional_regulation_code": "17934"
The Revised Payment Services Directive (PSD2) is a European regulation introduced to increase security, transparency, and innovation within electronic payments. In effect since September 2019, PSD2 requires Payment Service Providers (PSPs) to implement Strong Customer Authentication (SCA) for most online transactions within the European Economic Area (EEA).
SCA is intended to reduce fraud and improve consumer protection by requiring users to verify their identity using multi-factor authentication during payment transactions. This applies to a wide range of operations, including:
Under PSD2, SCA requires that authentication be based on at least two of the following independent factors:
SCA must be applied in the following cases:
While Strong Customer Authentication (SCA) is required for most electronic payments, PSD2 defines several exemptions that allow transactions to be processed without triggering customer authentication. These exemptions are intended to reduce friction and optimize user experience when the associated fraud risk is considered low.
Important: The application of any exemption is subject to acceptance by the card issuer. Even if an exemption is requested, the issuer may still require SCA based on its own risk assessment.
Transactions may be exempt from SCA if both the Payment Service Provider (PSP) and the issuer meet the required fraud rate thresholds and have real-time risk analysis mechanisms in place.
Fraud Rate Threshold | Maximum Transaction Amount |
---|---|
≤ 0.13% | up to €100 |
≤ 0.06% | up to €250 |
≤ 0.01% | up to €500 |
If either the PSP or the issuer exceeds these fraud rates, the exemption may be rejected, and the transaction will require SCA.
Transactions not exceeding €30 may be exempt from SCA. However, this exemption has limits:
Recurring payments of fixed amount and frequency are only subject to SCA on the first transaction. Subsequent charges are exempt, provided they match the original terms and were initiated with customer consent.
Customers may add specific merchants to a trusted list maintained by their bank. Transactions from trusted beneficiaries can be exempted from SCA automatically, subject to issuer support and customer opt-in.
Merchant-Initiated Transactions (MITs), such as those using stored credentials or references, occur without the cardholder present. These are technically out of scope for SCA, but in practice they are often treated as exemptions. Conditions:
Other scenarios may be exempt from SCA under PSD2, including:
This process includes several steps involving the exchange of information between the merchant's backend and the issuer. At a high level, the flow includes:
Below is a breakdown of each step, including JSON examples, expected responses, and key fields.
Send an initial request to start the 3DS authentication process and retrieve card configuration and method URLs (if needed).
Request:
{
"transactionId": "test3ds102",
"transactionType": "payment",
"returnUrl": "https://google.com",
"notificationUrl": "https://google.com",
"paymentId": "test3ds101",
"orderId": "test3ds101",
"version": "v2",
"payment": {
"amount": {
"total": 1010,
"currency": "EUR"
}
},
"customer": {
"id": "12",
"name": "Ms. Carla Denisse",
"lastName": "Luna",
"email": "carla.luna@conexa.ai",
"phone": "5491136195323",
"documentType": "dni",
"documentNumber": "43087793",
"address": {
"street": "Cornelio Saavedra",
"observation": "",
"phone": "5491136195323",
"postalCode": "1832",
"city": "Lomas de Zamora",
"number": "188",
"country": "AR",
"state": "Buenos Aires"
}
},
"card": {
"number": "4548810000000003",
"name": "Ms. Nelle Beahan DVM",
"expirationDate": "12/49",
"securityCode": "123",
"type": "string",
"brand": "string",
"installments": 1
}
}
Response – Without 3DS Method Execution:
{
"protocolVersion": "2.2.0",
"threeDSServerTransID": "7bedea54-713f-4533-8ac5-fc43ef0fd9ef",
"threeDSInfo": "CardConfiguration"
}
Response – With 3DS Method Execution Required:
{
"protocolVersion": "2.2.0",
"threeDSServerTransID": "7bedea54-713f-4533-8ac5-fc43ef0fd9ef",
"threeDSMethodURL": "https://sis-d.redsys.es:25443/sis-simulador-web/threeDsMethod.jsp",
"threeDSInfo": "CardConfiguration"
}
If threeDSMethodURL
is present in the previous response, execute a POST from the client browser to that URL via an invisible iframe.
You must submit a base64-encoded JSON payload containing:
{
"threeDSServerTransID": "<value_from_previous_response>",
"threeDSMethodNotificationURL": "https://yourdomain.com/notify"
}
Once the card issuer completes device fingerprinting, it will send a POST to your threeDSMethodNotificationURL
.
If the notification is not received within 10 seconds, or if threeDSMethodURL
was not returned, consider the method as not validated.
Submit the 3DS authentication request including browser and device context information, and the data obtained earlier (threeDSServerTransID
, etc.).
Request:
{
"transactionId": "test3ds102",
"transactionType": "payment",
"payment": {
"amount": {
"total": 1010,
"currency": "EUR"
}
},
"card": {
"number": "4548810000000003",
"name": "Ms. Nelle Beahan DVM",
"expirationDate": "12/49",
"securityCode": "123",
"type": "string",
"brand": "string",
"installments": 1
},
"data": {
"protocolVersion": "2.2.0",
"threeDSServerTransID": "7bedea54-713f-4533-8ac5-fc43ef0fd9ef",
"threeDSInfo": "CardConfiguration",
"browserJavascriptEnabled": "true",
"browserAcceptHeader": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,application/json",
"browserUserAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
"browserJavaEnabled": "false",
"browserLanguage": "ES-es",
"browserColorDepth": "24",
"browserScreenHeight": "1250",
"browserScreenWidth": "1320",
"browserTZ": "52",
"threeDSCompInd": "Y",
"notificationURL": "https://sis-d.redsys.es/sis-simulador-web/SisRESTCreqCres_3DSecureV2.jsp"
}
}
threeDSCompInd
: Use Y
if Step 2 completed successfully. Otherwise, use N
.
If the response to /3ds/query
includes a Challenge, it will look like:
{
"threeDSInfo": "ChallengeRequest",
"protocolVersion": "2.2.0",
"acsURL": "https://sis-d.redsys.es/sis-simulador-web/authenticationRequest.jsp",
"creq": "eyJ0..."
}
From the client browser, initiate a POST to acsURL
using an invisible iframe, submitting creq
as a parameter.
The cardholder will be prompted by the issuer to authenticate (e.g., via OTP, biometric, app push).
Once complete, the issuer will POST a response to your notificationURL
containing the CRes.
Use the final CRes received in the previous step to finalize the payment by submitting a transparent payment authorization.
Request:
{
"transactionId": "test3ds102",
"checkoutId": "Credential2",
"paymentId": "Credential2",
"orderId": "Credential2",
"notificationUrl": "https://miweb.com/notify",
"deviceFingerPrint": "string",
"transactionType": "string",
"payment": {
"amount": {
"total": 1010,
"currency": "EUR"
}
},
"customer": {
"id": "12",
"name": "Ms. Carla Denisse",
"lastName": "Luna",
"email": "carla.luna@conexa.ai",
"phone": "5491136195323",
"documentType": "dni",
"documentNumber": "43087793",
"address": {
"street": "Cornelio Saavedra",
"observation": "",
"phone": "5491136195323",
"postalCode": "1832",
"city": "Lomas de Zamora",
"number": "188",
"country": "AR",
"state": "Buenos Aires"
}
},
"shipping": {
"phone": "5491136195323",
"city": "Lomas de Zamora",
"country": "AR",
"address": "Cornelio Saavedra",
"postalCode": "1832",
"state": "Buenos Aires",
"street": "Cornelio Saavedra"
},
"products": {
"items": [
{
"id": "1",
"unitPrice": 1500,
"name": "REMERA",
"quantity": 2
}
]
},
"tenantIntegrationCode": "string",
"card": {
"number": "4548810000000003",
"name": "Ms. Nelle Beahan DVM",
"expirationDate": "12/49",
"securityCode": "123",
"type": "string",
"brand": "string",
"installments": 1
},
"softDescriptor": "string",
"modifiers": null,
"invoice": "string",
"data": {
"threeDSInfo": "ChallengeResponse",
"protocolVersion": "2.2.0",
"cres": "eyJ0aHJlZURTU..."
}
}
Status Reference: transStatus
Value | Meaning | Next Step |
---|---|---|
Y | Authentication successful | Finalize transaction |
N | Authentication failed | Abort |
C | Challenge required | Present challenge UI |
R | Rejected by issuer | Abort |
U | Unable to complete | Retry or fallback |
Proper error handling is critical to ensure resilience and a smooth user experience. During the 3-D Secure flow via REST integration, errors may occur in various stages—such as request formatting, device fingerprinting, challenge completion, or final authorization. Below is a guide to understanding and responding to common error scenarios.
General HTTP/Transport Errors
Status Code | Meaning | Action |
---|---|---|
400 | Bad Request | Check required fields and data formats |
401 / 403 | Unauthorized / Forbidden | Validate merchant credentials |
408 / 504 | Timeout | Retry with exponential backoff |
500 / 502 | Server error / gateway issue | Retry or failover to alternative flow |