Payment Link via API

This page provides a detailed guide for integrating Payment Link functionality into your application via API.

The DEUNA Payment Link allows you to create payment links for purchases.

The Payment Link facilitates and streamlines the payment process through the DEUNA platform and drastically reduces the need for any development.

Requirements

  • Basic knowledge of JavaScript and Typescript
  • API URLS:
    • Sandbox: https://api.sandbox.deuna.io
    • Production: https://api.deuna.io
  • DEUNA merchant ID:
    • Sandbox: Testing credentials for the initial implementation
    • Production: Production credentials for controlled testing and launch
  • DEUNA Admin credentials
  • DEUNA public and private API keys

📘

Ask your DEUNA TPM for credentials.

1. Create a payment link

Make a request to the Create order endpoint with the order_type set as PAYMENT LINK.

This creates an order token associated with the payment link.

Example request

{
    "order_type": "PAYMENT_LINK",
    "payer_info": {
        "email": "[email protected]" // email of the user
    },
    "order": {
        "order_id": "{{identificador orden del comercio}}",
        "currency": "MXN",
        "items_total_amount": 150000, //Monto con 2 decimales sin punto
        "sub_total": 150000,
        "total_amount": 150000,
        "store_code": "all",
        // URL to redirect back after payment is attempted
        "redirect_urls": {
            "success": "https://www.google.com?q=success", // redirect on successful payment
            "error": "https://www.google.com?q=failure",  // redirect on failure payment
            "close": "https://www.google.com?q=close" // redirect on user closing the payment link
        },
        "payer_info":{
            "email": "[email protected]" // email of the user
        },
        "billing_address": {
            "country": "MX",
            "country_code": "MX",
            "email": "[email protected]" // email of the user
        },
        "items": [ // items the user is purchasing
            {
                "id": "79", // required
                "name": "Pago de impuesto", // required
                "description": "Pago de servicio de agua", // required
                "type": "virtual", // required to send "virtual"
                "total_amount": { // required
                    "amount": 150000,
                    "currency": "MXN"
                },
                "unit_price": { // required
                    "amount": 150000,
                    "currency": "MXN"
                },
                "quantity": 1, // required
                "category": "Pago de servicios", // required
                "image_url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj5Ywbfmq1apVaZL9YeODf1J22DzGDI9THkA&s" // required
            }
        ],
        "webhook_urls": { // API Endpoint into which we will send you the order status updates
            "notify_order": "https://webhook.site/54a29453-05fd-4875-a861-08071421a609"
        }
    }
}

Example response

{
    "token": "638f7ec0-9f1f-4898-8b42-a1ac2d555216",
    "order_type": "PAYMENT_LINK",
    "order": {
        "order_id": "4167f4a3-0081-4b3d-82ba-cf8da04e5cc4",
        "store_code": "all",
        "currency": "MXN",
        "tax_amount": 0,
        "display_tax_amount": "MXN 0.00",
        "shipping_amount": 0,
        "display_shipping_amount": "MXN 0.00",
        "items_total_amount": 150000,
        "display_items_total_amount": "MXN 1500.00",
        "sub_total": 150000,
        "display_sub_total": "MXN 1500.00",
        "total_amount": 150000,
        "display_total_amount": "MXN 1500.00",
        "items": [
            {
                "id": "79",
                "name": "Pago de impuesto",
                "description": "Pago de servicio de agua",
                "options": "",
                "total_amount": {
                    "amount": 1000,
                    "original_amount": 0,
                    "display_amount": "MXN 1500.00",
                    "display_original_amount": "MXN 0.00",
                    "currency": "MXN",
                    "currency_symbol": "",
                    "total_discount": 0,
                    "display_total_discount": "MXN 0.00"
                },
                "unit_price": {
                    "amount": 1000,
                    "display_amount": "MXN 1500.00",
                    "currency": "MXN",
                    "currency_symbol": ""
                },
                "tax_amount": {
                    "amount": 0,
                    "display_amount": " 0.00",
                    "currency": "",
                    "currency_symbol": ""
                },
                "quantity": 1,
                "uom": "",
                "upc": "",
                "sku": "",
                "isbn": "",
                "brand": "",
                "manufacturer": "",
                "category": "taxation",
                "color": "",
                "size": "",
                "weight": {
                    "weight": 0,
                    "unit": ""
                },
                "image_url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj5Ywbfmq1apVaZL9YeODf1J22DzGDI9THkA&s",
                "details_url": "",
                "type": "virtual",
                "taxable": false,
                "discounts": [],
                "included_in_subscription": false,
                "item_details": []
            }
        ],
        "discounts": [],
        "shipping_address": {
            "id": 0,
            "user_id": "",
            "first_name": "",
            "last_name": "",
            "phone": "",
            "identity_document": "",
            "lat": 0,
            "lng": 0,
            "address1": "",
            "address2": "",
            "city": "",
            "zipcode": "",
            "state_name": "",
            "country_code": "",
            "additional_description": "",
            "address_type": "",
            "is_default": false,
            "created_at": "",
            "updated_at": "",
            "identity_document_type": "",
            "email": "",
            "state_code": "",
            "country": ""
        },
        "shipping_options": {
            "type": "",
            "details": {
                "store_name": "",
                "address": "",
                "address_coordinates": {
                    "lat": 0,
                    "lng": 0
                },
                "contact": {
                    "name": "",
                    "phone": ""
                },
                "additional_details": {
                    "pickup_time": "0001-01-01T00:00:00Z",
                    "stock_location": ""
                }
            }
        },
        "user_instructions": "",
        "metadata": {},
        "status": "pending",
        "payment": {
            "data": {
                "amount": {
                    "amount": 0,
                    "currency": ""
                },
                "metadata": {},
                "from_card": {
                    "card_brand": "",
                    "first_six": "",
                    "last_four": "",
                    "bank_name": "",
                    "country_iso": "",
                    "credential_source": "",
                    "expiry_month": "",
                    "expiry_year": ""
                },
                "updated_at": "0001-01-01 00:00:00 +0000 UTC",
                "method_type": "",
                "merchant": {
                    "store_code": "",
                    "id": "",
                    "affiliation_code": "",
                    "mcc": ""
                },
                "created_at": "0001-01-01 00:00:00 +0000 UTC",
                "id": "",
                "processor": "",
                "customer": {
                    "email": "",
                    "id": "",
                    "first_name": "",
                    "last_name": ""
                },
                "status": "",
                "reason": "",
                "external_transaction_id": "",
                "merchant_payment_processor_name": "",
                "authorization_code": "",
                "installment_interest_calculations": null,
                "three_ds_details": {},
                "merchant_payment_processor_id": ""
            }
        },
        "gift_card": [],
        "redirect_url": "",
        "webhook_urls": null,
        "total_discount": 0,
        "display_total_discount": "MXN 0.00",
        "shipping": {
            "original_amount": 0,
            "total_discount": 0,
            "discounts": []
        },
        "cash_change": 0,
        "shipping_method": {
            "code": "",
            "name": "",
            "min_delivery_date": "",
            "max_delivery_date": "",
            "cost": 0,
            "display_cost": "",
            "tax_amount": 0,
            "display_tax_amount": "",
            "scheduler": []
        },
        "shipping_methods": [],
        "timezone": "",
        "scheduled_at": "",
        "billing_address": {
            "id": 0,
            "user_id": "",
            "first_name": "",
            "last_name": "",
            "phone": "",
            "identity_document": "",
            "lat": 0,
            "lng": 0,
            "address1": "",
            "address2": "",
            "city": "",
            "zipcode": "",
            "state_name": "",
            "country_code": "MX",
            "additional_description": "",
            "address_type": "",
            "is_default": false,
            "created_at": "2025-04-30T01:45:30Z",
            "updated_at": "2025-04-30T01:45:30Z",
            "email": "[email protected]",
            "identity_document_type": "",
            "country": "",
            "state_code": ""
        },
        "payment_link": "https://pay.bancoazteca.deuna.com//638f7ec0-9f1f-4898-8b42-a1ac2d555216",
        "display_shipping_tax_amount": "MXN 0.00",
        "display_total_tax_amount": "MXN 0.00",
        "shipping_tax_amount": 0,
        "total_tax_amount": 0,
        "user_id": "",
        "include_payment_options": [],
        "redirect_urls": {
            "success": "https://www.google.com?q=success",
            "pending": "",
            "error": "https://www.google.com?q=failure",
            "fallback": "",
            "close": "https://www.google.com?q=close"
        },
        "created_at": "2025-04-30 01:45:30.06298093 +0000 UTC",
        "updated_at": "",
        "payer_info": {
            "email": "[email protected]",
            "person_type": "UNKNOWN_PERSON"
        },
        "discount_amount": 0,
        "shipping_discount_amount": 0,
        "device_fingerprint": "",
        "expired_at": "",
        "version": "0",
        "fraud": null,
        "total_interest_amount": 0,
        "display_total_interest_amount": "MXN 0.00",
        "payment_method": "",
        "token": "",
        "statement_descriptor": "",
        "callback_urls": null
    },
    "custom_fields": [],
    "checkout_modules": []
}

Payment link fields

The fields required to create a payment link are documented below.

order fields

This section documents the fields related to the order.

📘

For more information about orders, refer to the Order API.

FieldTypeRequiredDescription
order_idstringYesInternal ID for the order
store_codestringYesStore code
currencystringYesISO 4217 currency
total_tax_amountnumberYesTotal tax amount
items_total_amountnumberYesSum of base prices of all items before taxes.
sub_totalnumberYesitems_total_amount + total_tax_amount.
total_amountnumberYesTotal amount extracted from sub_total.
itemsarrayYesItems list
order.items[].idstringYesUnique item ID
order.items[].namestringYesItem name for the client
order.items[].descriptionstringNoDetailed description
order.items[].quantityintegerYesQuantity of items
order.items[].unit_priceobjectYesUnit price
amountnumberYesUnit amount
currencystringYesISO currency for unit_price
currency_symbolstringYesCurrency symbol
order.items[].tax_amountobjectNoTax applied to item
order.items[].total_amountobjectYesFinal total amount
amountnumberYesTotal amount after taxes and discounts
discount_amountnumberYesDiscounted amount (if applicable)
original_amountnumberYesOriginal price without taxes
order.items[].image_urlstringNoItem image URL
redirect_urlsobjectNoRedirect URLs to each result
closestringNoCloses the checkout
successstringNoFor successful payments
pendingstringNoFor pending payments
errorstringNoFor failures in the payment
fallbackstringNoBack button in error screens
include_payment_optionsarrayYesFilters available payment methods and processors at checkout.
include_payment_options[].payment_methodstringYesPayment method type
include_payment_options[].processorsobjectYesList of processor names to enable

checkout_modules fields

Define which modules you want to display when opening the payment link in your widget:

CampoTipoRequiresQué ocurre / Para qué sirve
checkout_modulesarrayNoList of checkout modules to display
namestringYesModule name: UserInfoPattern, OrderDetailPattern, LoginPattern

🚧

If you do not send checkout_modules, then the default settings are used in your application. For more information, refer to Customizing Payment Links.

configuration fields

These fields correspond to the settings and customization of Payment Links.

📘

For more information, refer to Create payment link in the Admin.

FieldTypeRequiredDescription
expires_atstringNoExpiration date/time (ISO 8601). Without this field, the date/time will not expire.
payment_link_namestringNoDescriptive name for your Payment Link (max. 60 characters).
max_completed_purchasesintegerNoLimit of successful purchases before deactivating the link.
max_payment_retriesintegerNoLimit of payment attempts per user (includes rejections).

2. Fetch the redirect field

In the API response, useorder.payment_link to redirect the user to the payment screen.
Integrate the payment link into an app or share it through your webpage.

📘

Use your own payment processing interface and logic to integrate Payment Link into your application.

In the call response, you will find the payment link in the field payment_link.

Integrate the Payment Link into a javascript function, where a href.location that redirects to the generated link.

function openDeunaPayment() {
    const paymentLink = "https://api.deuna.io/payment-links/{payment-link-id}";
    window.location.href = paymentLink; // Opens the link in the same window
}
<!DOCTYPE html>
<html>
  .
  .
<body>
 <div class="container">
        <h1>Realizar Pago</h1>
        <p>Haz clic en el botón "Pagar con Deuna" para continuar con el pago.</p>
        <button id="payButton" class="pay-button" onclick="openDeunaPayment()">Pagar con Deuna</button>
    </div>
    <script src="app.ts"></script>
</body>
</html>

Test cards

Use test cards to process testing payments:

  • Amounts less than 50,000 mxn = Approved
  • Amounts greater than 50,000 mxn and less than 100,000 mxn = Declined

3DS (MPI DEUNA)

Card number:

  • 4000000000002503 (challenge success)
  • 4000000000002370 (challenge fail)
  • 4000000000002701 (frictionless success)
  • 4000000000002925 (frictionless fail)
  • Expiration date: 05/26
  • CVV: 123
  • Card colder: Prueba por Deuna

📘

The test cards work for tests with mexican pesos (mxn).

Without 3DS

Card number:

  • 4111111111111111 (credit)
  • 5474925432670366 (credit)
  • 4152313289903408 (debit)
  • 5200828282828210 (debit)
  • 4242424242424242 (credit)
  • 4622943127013705
  • Expiration date: 05/26
  • CVV: 123
  • Card holder: Prueba por Deuna

3. Get payment status

Make a request to the Get Order endpoint to check the payment status.

Use the order token in the request.

Example response

{
    "token": "bb0aa546-8d96-4121-8cc2-981f2e3082d1",
    "order_type": "PAYMENT_LINK",
    "order": {
        "order_id": "8000-123-293467",
        "store_code": "all",
        "currency": "MXN",
        "tax_amount": 0,
        "display_tax_amount": "MXN 0.00",
        "shipping_amount": 0,
        "display_shipping_amount": "MXN 0.00",
        "items_total_amount": 166746,
        "display_items_total_amount": "MXN 1,500.00",
        "sub_total": 166746,
        "display_sub_total": "MXN 1,500.00",
        "total_amount": 166746,
        "display_total_amount": "MXN 1,500.00",
        "items": [
            {
                "id": "8000-123-293467",
                "name": "PAGO REGULAR SERVICIO DE AGUA",
                "description": "PAGO REGULAR SERVICIO DE AGUA Contrato: 14932 Periodo Inicial:   202501 Periodo Final:   202502",
                "options": "",
                "total_amount": {
                    "amount": 166746,
                    "original_amount": 0,
                    "display_amount": "MXN 1,500.00",
                    "display_original_amount": "MXN 0.00",
                    "currency": "MXN",
                    "currency_symbol": "",
                    "total_discount": 0,
                    "display_total_discount": "MXN 0.00"
                },
                "unit_price": {
                    "amount": 166746,
                    "display_amount": "MXN 1,500.00",
                    "currency": "MXN",
                    "currency_symbol": ""
                },
                "tax_amount": {
                    "amount": 0,
                    "display_amount": " 0.00",
                    "currency": "",
                    "currency_symbol": ""
                },
                "quantity": 1,
                "uom": "",
                "upc": "",
                "sku": "",
                "isbn": "",
                "brand": "",
                "manufacturer": "",
                "category": "curso",
                "color": "",
                "size": "",
                "weight": {
                    "weight": 0,
                    "unit": ""
                },
                "image_url": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSj5Ywbfmq1apVaZL9YeODf1J22DzGDI9THkA&",
                "details_url": "",
                "type": "virtual",
                "taxable": false,
                "discounts": [],
                "included_in_subscription": false,
                "item_details": []
            }
        ],
        "discounts": [],
        "shipping_address": {
            "id": 0,
            "user_id": "",
            "first_name": "ROBERTO ANTONIO",
            "last_name": "MILLAN FLORES",
            "phone": "+52 5619179755",
            "identity_document": "",
            "lat": 0,
            "lng": 0,
            "address1": "",
            "address2": "",
            "city": "",
            "zipcode": "55770",
            "state_name": "",
            "country_code": "MX",
            "additional_description": "",
            "address_type": "",
            "is_default": true,
            "created_at": "2025-04-30T00:05:19Z",
            "updated_at": "2025-04-30T00:05:19Z",
            "identity_document_type": "",
            "email": "[email protected]",
            "state_code": "",
            "country": "MX"
        },
        "shipping_options": {
            "type": "",
            "details": {
                "store_name": "",
                "address": "",
                "address_coordinates": {
                    "lat": 0,
                    "lng": 0
                },
                "contact": {
                    "name": "",
                    "phone": ""
                },
                "additional_details": {
                    "pickup_time": "0001-01-01T00:00:00Z",
                    "stock_location": ""
                }
            }
        },
        "user_instructions": "",
        "metadata": {},
        "status": "succeeded",
        "payment": {
            "data": {
                "amount": {
                    "amount": 166746,
                    "currency": "MXN"
                },
                "metadata": {
                    "authorization_code": "020815"
                },
                "from_card": {
                    "card_brand": "mastercard",
                    "first_six": "520416",
                    "last_four": "8095",
                    "installment": {
                        "installments": 1,
                        "plan_id": "",
                        "plan_option_id": "",
                        "installment_type": "",
                        "installment_rate": 0,
                        "installment_amount": 0
                    },
                    "bank_name": "Banco Nacional De Mexico, S.A.",
                    "country_iso": "MX",
                    "credential_source": "",
                    "expiry_month": "04",
                    "expiry_year": "2028"
                },
                "updated_at": "2025-04-30 00:05:20.824900873 +0000 UTC",
                "method_type": "credit_card",
                "merchant": {
                    "store_code": "all",
                    "id": "ba8537e7-4f9d-4306-94f9-784c99304bde",
                    "affiliation_code": "127",
                    "mcc": "4900"
                },
                "created_at": "2025-04-30 00:05:19.747601 +0000 UTC",
                "id": "8000-123-293467",
                "processor": "baz_gateway",
                "customer": {
                    "email": "[email protected]",
                    "id": "88635a0c-2bca-4f43-80a0-d6ebbd31709a",
                    "first_name": "",
                    "last_name": ""
                },
                "status": "processed",
                "reason": "",
                "external_transaction_id": "100740865324",
                "merchant_payment_processor_name": "9269029",
                "processor_error": {
                    "code": "",
                    "message": ""
                },
                "authorization_code": "020815",
                "installment_interest_calculations": null,
                "routing_strategy": "Procesamiento sin 3DS + Antifraude",
                "three_ds_details": {},
                "data_sync": {
                    "iso8583_processing_code": "",
                    "iso8583_response_code": "",
                    "iso8583_response_code_description": "",
                    "switch_name": "PROSA"
                },
                "merchant_payment_processor_id": "12235b03-e48c-4ca6-8e7c-c18676df1546"
            }
        },
        "gift_card": [],
        "redirect_url": "",
        "webhook_urls": null,
        "total_discount": 0,
        "display_total_discount": "MXN 0.00",
        "shipping": {
            "original_amount": 0,
            "total_discount": 0,
            "discounts": []
        },
        "cash_change": 0,
        "shipping_method": {
            "code": "",
            "name": "",
            "min_delivery_date": "",
            "max_delivery_date": "",
            "cost": 0,
            "display_cost": "",
            "tax_amount": 0,
            "display_tax_amount": "",
            "scheduler": []
        },
        "shipping_methods": [],
        "timezone": "",
        "scheduled_at": "",
        "billing_address": {
            "id": 0,
            "user_id": "",
            "first_name": "ROBERTO ANTONIO",
            "last_name": "MILLAN FLORES",
            "phone": "+52 5619179755",
            "identity_document": "",
            "lat": 0,
            "lng": 0,
            "address1": "M 64 L 21 GALEANA",
            "address2": "",
            "city": "Ojo de Agua",
            "zipcode": "55770",
            "state_name": "Estado de México",
            "country_code": "MX",
            "additional_description": "",
            "address_type": "",
            "is_default": false,
            "created_at": "2025-04-30T00:05:19Z",
            "updated_at": "2025-04-30T00:05:19Z",
            "email": "[email protected]",
            "identity_document_type": "",
            "country": "",
            "state_code": "MEX"
        },
        "payment_link": "https://pay.bancoazteca.deuna.com//bb0aa546-8d96-4121-8cc2-981f2e3082d1",
        "display_shipping_tax_amount": "MXN 0.00",
        "display_total_tax_amount": "MXN 0.00",
        "shipping_tax_amount": 0,
        "total_tax_amount": 0,
        "user_id": "",
        "include_payment_options": [],
        "redirect_urls": {
            "success": "https://www.google.com?q=success",
            "pending": "https://www.google.com?q=pending",
            "error": "https://www.google.com?q=error",
            "fallback": "",
            "close": "https://www.google.com?q=close"
        },
        "created_at": "2025-04-30 00:00:24.145522886 +0000 UTC",
        "updated_at": "2025-04-30 00:05:20.921803615 +0000 UTC",
        "payer_info": {
            "email": "[email protected]",
            "person_type": "UNKNOWN_PERSON"
        },
        "discount_amount": 0,
        "shipping_discount_amount": 0,
        "device_fingerprint": "",
        "expired_at": "",
        "version": "0",
        "fraud": {
            "analysis": {
                "score": 0.4589535,
                "processor": "SIFT",
                "risk_level": "low",
                "status": "automatic_decision",
                "type": "",
                "fraud_decision": "low_risk",
                "details": "Everything Else",
                "processor_response": "order_looks_ok_payment_abuse"
            }
        },
        "total_interest_amount": 0,
        "display_total_interest_amount": "MXN 0.00",
        "payment_method": "",
        "token": "",
        "statement_descriptor": "",
        "browser_details": {
            "screen_height": 753,
            "screen_width": 339,
            "user_agent": "",
            "ip_address": "",
            "color_depth": 24,
            "java_enabled": false,
            "java_script_enabled": false,
            "language": "es-ES",
            "time_zone_offset": 0,
            "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
        },
        "callback_urls": null
    },
    "custom_fields": [],
    "checkout_modules": [],
    "refunds": []
}

4. Listen to Payment link events

Use DEUNA Webhooks to listen for Payment Link events.

Set delivery retries to a maximum of three attempts.

📘

Configure the notification_type as async since every action is executed only after the notification fails.