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
  • Merchand ID de DEUNA:
    • Sandbox: Testing credentials for the initial implementation.
    • Producción: Production credentials for controlled testing and launch.
  • DEUNA Admin credentials
  • DEUNA public and private API Keys.

📘

Ask your DEUNA TPM for your credentials.

1. Create a Payment Link

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

This will create 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": []
}

Fields description

The fields required to create a Payment Link are documented below.

order section

This section documents the fields related to the order.

📘

For more information about orders, see 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 totl 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.
fallbackstringNo“Back” button in error screens.
include_payment_optionsarrayYesFilters available payment methods and processors at checkout.
include_payment_options[].payment_methodstringYesPayment method type.
include_payment_options[].processorsobjectYes.List of processor names to enable.

checkout_modules section

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, the default settings are used in your application. For more information, go to Customizing Payment Links

configuration section

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; // Abre el enlace en la misma ventana - 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 the test cards to process testing payments:

  • Amounts lesser than 50,000 mxn = Approved
  • Ammounts bigger than 50,000 mxn and lesser than 100,000 mxn = Declined

3DS (MPI DEUNA)

Card number:

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

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.