Catálogo de terminales
Operaciones publicadas de DEUNA para órdenes, pagos, usuarios, tarjetas, comercios, enlaces de pago y suscripciones, migradas desde la referencia de API anterior.
En esta página
Usa este catálogo para encontrar las operaciones migradas desde la referencia de API anterior de DEUNA. La matriz de migración mantiene cada método y ruta publicados representados una sola vez y excluye las demás rutas del API Gateway.
Inventario de endpoints publicados#
Este inventario se genera a partir de la configuración efectiva del API Gateway y está limitado por la matriz de migración revisada. Usa los filtros para identificar quién debe llamar una operación, qué servicio la gestiona, qué autorización admite y qué encabezados acepta o reenvía el gateway.
El catálogo incluye solo operaciones de backend del comercio y de aplicaciones de cliente que ya estaban presentes en la referencia pública de API anterior. Se excluyen las operaciones internas de Admin, de gestión, de socios, callbacks de proveedores y otras operaciones del gateway.
Las rutas a continuación /transactions/webhooks/ reciben eventos del procesador dentro de DEUNA y no son endpoints de integración del comerciante. Cuando un proveedor requiere configuración de callback del lado del comerciante, la URL y los pasos de configuración se encuentran en la guía de conexión de ese proveedor—por ejemplo, el callback de estado de pago Stripe OXXOUtilice Webhooks DEUNA para notificaciones entregadas a tu propio backend.
Generado a partir de las operaciones efectivas del API Gateway mapeadas desde la referencia pública anterior.
Backend del comercio · servidor a servidorÚsalo desde un backend confiable del comercio para órdenes, pagos y flujos operativos.42
/cards/bin/{bin}Obtener Bin
- Dominio
- Cards and vault
- Servicio responsable
- Card metadata
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/checkout/themesListar u obtener Themes
- Dominio
- Checkout
- Servicio responsable
- Checkout configuration
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/checkout/themesCrear Themes
- Dominio
- Checkout
- Servicio responsable
- Checkout configuration
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/checkout/themes/{theme_id}Eliminar Themes
- Dominio
- Checkout
- Servicio responsable
- Checkout configuration
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/checkout/themes/{theme_id}Actualizar Themes
- Dominio
- Checkout
- Servicio responsable
- Checkout configuration
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/ordersListar u obtener Orders
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/ordersCrear Orders
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/orders/{order_token}Obtener Orders
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/orders/{order_token}Actualizar Orders
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/orders/{order_token}/expireEjecutar Expire para Orders
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/orders/{order_token}/payments-methodsListar u obtener Payments Methods
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/orders/{order_token}/transactions/verifyEjecutar Verify para Transactions
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/orders/{order_token}/voidEjecutar Void para Orders
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/transactions/orders/{order_token}/installmentsListar u obtener Installments
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/v2/merchants/orders/{order_token}/captureCapturar Payment
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/v2/merchants/orders/{order_token}/refundCrear Refund
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/v2/merchants/orders/purchaseCrear Payment
- Dominio
- Orders
- Servicio responsable
- Orders and checkout
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/payment-linksCrear Payment Links
- Dominio
- Payment links
- Servicio responsable
- Payment links
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/payment-links/{payment_link_id}Obtener Payment Links
- Dominio
- Payment links
- Servicio responsable
- Payment links
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/payment-links/{payment_link_id}/ordersListar u obtener Orders
- Dominio
- Payment links
- Servicio responsable
- Payment links
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/payment-links/allListar u obtener All
- Dominio
- Payment links
- Servicio responsable
- Payment links
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/stores/payments-methodsListar u obtener Payments Methods
- Dominio
- Payments
- Servicio responsable
- Payments
- Dirigido a
- Backend del comercio · servidor a servidor
/transactions/payments-methodsListar u obtener Payments Methods
- Dominio
- Payments
- Servicio responsable
- Payments
- Dirigido a
- Backend del comercio · servidor a servidor
/merchants/installments/plans/{installment_plan_option_id}Obtener Plans
- Dominio
- Subscriptions
- Servicio responsable
- Installments
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptionsListar u obtener Subscriptions
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptionsCrear Subscriptions
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/{id}Obtener Subscriptions
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/{id}Actualizar Subscriptions
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/{id}/cancelEjecutar Cancel para Subscriptions
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/{id}/cardsActualizar Cards
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/{id}/external-settlementCrear External Settlement
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/{id}/historyListar u obtener History
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/{id}/pauseEjecutar Pause para Subscriptions
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/{id}/resumeEjecutar Resume para Subscriptions
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/plansListar u obtener Plans
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/plansCrear Plans
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/plans/{id}Obtener Plans
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/plans/{id}Actualizar Plans
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/plans/statusesListar u obtener Statuses
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/subscriptions/statusesListar u obtener Statuses
- Dominio
- Subscriptions
- Servicio responsable
- Subscriptions
- Dirigido a
- Backend del comercio · servidor a servidor
/users/authorizeEjecutar Authorize para Users
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Backend del comercio · servidor a servidor
/users/external-authorizeCrear External Authorize
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Backend del comercio · servidor a servidor
Aplicación del cliente · usuario a servidorÚsalo en flujos web o móviles para clientes con la identidad y el contexto de dispositivo indicados.14
/users/{user_id}/cardsListar u obtener Cards
- Dominio
- Cards and vault
- Servicio responsable
- Payments
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/{user_id}/cards/{card_id}Eliminar Cards
- Dominio
- Cards and vault
- Servicio responsable
- Payments
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/{user_id}/cards/{card_id}Obtener Cards
- Dominio
- Cards and vault
- Servicio responsable
- Payments
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/{user_id}/cards/{card_id}/set-as-defaultEstablecer tarjeta predeterminada
- Dominio
- Cards and vault
- Servicio responsable
- Payments
- Dirigido a
- Aplicación del cliente · usuario a servidor
/v2/users/{user_id}/cardsCrear Cards
- Dominio
- Cards and vault
- Servicio responsable
- Payments
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/{user_id}/addressesListar u obtener Addresses
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/{user_id}/addressesCrear Addresses
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/{user_id}/addresses/{address_id}Eliminar Addresses
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/{user_id}/addresses/{address_id}Actualizar Addresses
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/loginEjecutar Login para Users
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/logoutEjecutar Logout para Users
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/meListar u obtener Me
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/registerEjecutar Register para Users
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
/users/request-codeEjecutar Request Code para Users
- Dominio
- Users and identity
- Servicio responsable
- Merchant management
- Dirigido a
- Aplicación del cliente · usuario a servidor
Puntos finales de integración principales#
Las operaciones siguientes conservan los anclajes estables utilizados por las guías de integración y proporcionan contexto adicional para los flujos de trabajo comerciales más comunes.
API de pedidos#
Crear un pedido
POST /merchants/orders
Crea opcionalmente una orden antes del pago y devuelve el order_token que usan los widgets y las operaciones de pago de DEUNA. Las nuevas integraciones directas pueden enviar la orden en línea a Purchase V2.
El objeto requerido varía según el tipo de pedido: los pedidos de Pago y Suscripciones requieren la matriz de artículos, mientras que los pedidos de Aerolíneas requieren información de la aerolínea. El contrato base no marca una propiedad de artículo individual como universalmente requerida. Ver el referencia de campo de artículo y guía de campo vertical.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/merchants/orders' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Idempotency-Key: IDEMPOTENCY_KEY' \
--header 'X-Prediction-Id: PREDICTION_ID_VALUE' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/merchants/orders", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Idempotency-Key": "IDEMPOTENCY_KEY",
"X-Prediction-Id": "PREDICTION_ID_VALUE",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/merchants/orders",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Idempotency-Key": "IDEMPOTENCY_KEY",
"X-Prediction-Id": "PREDICTION_ID_VALUE",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/orders",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Idempotency-Key: IDEMPOTENCY_KEY",
"X-Prediction-Id: PREDICTION_ID_VALUE",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/orders"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Idempotency-Key", "IDEMPOTENCY_KEY")
.header("X-Prediction-Id", "PREDICTION_ID_VALUE")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/merchants/orders", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Idempotency-Key", "IDEMPOTENCY_KEY")
request.Header.Set("X-Prediction-Id", "PREDICTION_ID_VALUE")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Obtener un pedido
GET /merchants/orders/{order_token}
Recupera el estado actual del pedido, el pago y el procesamiento de un token de pedido.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/merchants/orders/{order_token}' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'x-merchant-id: MERCHANT_ID'const response = await fetch("https://api.sandbox.deuna.io/merchants/orders/{order_token}", {
method: "GET",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-merchant-id": "MERCHANT_ID"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/merchants/orders/{order_token}",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-merchant-id": "MERCHANT_ID"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/orders/{order_token}",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"Authorization: Bearer USER_ACCESS_TOKEN",
"x-merchant-id: MERCHANT_ID"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/orders/{order_token}"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("x-merchant-id", "MERCHANT_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/merchants/orders/{order_token}", nil)
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("x-merchant-id", "MERCHANT_ID")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Obtener métodos de pago para un pedido
GET /merchants/orders/{order_token}/payments-methods
Devuelve los métodos de pago disponibles para un pedido específico y una configuración de comerciante.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/merchants/orders/{order_token}/payments-methods' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Store-Code: STORE_CODE'const response = await fetch("https://api.sandbox.deuna.io/merchants/orders/{order_token}/payments-methods", {
method: "GET",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Store-Code": "STORE_CODE"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/merchants/orders/{order_token}/payments-methods",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Store-Code": "STORE_CODE"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/orders/{order_token}/payments-methods",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Store-Code: STORE_CODE"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/orders/{order_token}/payments-methods"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Store-Code", "STORE_CODE")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/merchants/orders/{order_token}/payments-methods", nil)
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Store-Code", "STORE_CODE")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}API de pagos#
Crear un pago
POST /v2/merchants/orders/purchase
Crea y procesa una orden en línea con el flujo recomendado de una sola llamada, o procesa un order_token existente cuando la orden se creó por separado. Consulta la guía detallada de guía de solicitud de pago.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/v2/merchants/orders/purchase' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'Cookie: COOKIE_VALUE' \
--header 'X-Device-Id: DEVICE_ID' \
--header 'X-Merchant-ID: MERCHANT_ID' \
--header 'X-Prediction-Id: PREDICTION_ID_VALUE' \
--header 'X-Session-Id: SESSION_ID' \
--header 'X-Store-Code: STORE_CODE' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/v2/merchants/orders/purchase", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"Cookie": "COOKIE_VALUE",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-ID": "MERCHANT_ID",
"X-Prediction-Id": "PREDICTION_ID_VALUE",
"X-Session-Id": "SESSION_ID",
"X-Store-Code": "STORE_CODE",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/v2/merchants/orders/purchase",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"Cookie": "COOKIE_VALUE",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-ID": "MERCHANT_ID",
"X-Prediction-Id": "PREDICTION_ID_VALUE",
"X-Session-Id": "SESSION_ID",
"X-Store-Code": "STORE_CODE",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/v2/merchants/orders/purchase",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"Authorization: Bearer USER_ACCESS_TOKEN",
"Cookie: COOKIE_VALUE",
"X-Device-Id: DEVICE_ID",
"X-Merchant-ID: MERCHANT_ID",
"X-Prediction-Id: PREDICTION_ID_VALUE",
"X-Session-Id: SESSION_ID",
"X-Store-Code: STORE_CODE",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/v2/merchants/orders/purchase"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("Cookie", "COOKIE_VALUE")
.header("X-Device-Id", "DEVICE_ID")
.header("X-Merchant-ID", "MERCHANT_ID")
.header("X-Prediction-Id", "PREDICTION_ID_VALUE")
.header("X-Session-Id", "SESSION_ID")
.header("X-Store-Code", "STORE_CODE")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/v2/merchants/orders/purchase", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("Cookie", "COOKIE_VALUE")
request.Header.Set("X-Device-Id", "DEVICE_ID")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
request.Header.Set("X-Prediction-Id", "PREDICTION_ID_VALUE")
request.Header.Set("X-Session-Id", "SESSION_ID")
request.Header.Set("X-Store-Code", "STORE_CODE")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Capturar un pago
POST /v2/merchants/orders/{order_token}/capture
Captura todo o parte de un pago autorizado. Llámelo desde el backend del comerciante solo cuando la conexión admita autorización y captura por separado.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/capture' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/capture", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/capture",
headers={
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/capture",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/capture"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/capture", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Anular una autorización
POST /merchants/orders/{order_token}/void
Libera una autorización elegible antes de la captura. Una solicitud sincrónica exitosa devuelve HTTP 204 No Content; Los flujos de procesador asincrónicos aún deben rastrearse hasta su estado de pago final.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/merchants/orders/{order_token}/void' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/merchants/orders/{order_token}/void", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/merchants/orders/{order_token}/void",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/orders/{order_token}/void",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/orders/{order_token}/void"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/merchants/orders/{order_token}/void", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Reembolsar un pago
POST /v2/merchants/orders/{order_token}/refund
Crea un reembolso total o parcial para un pago procesado.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/refund' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/refund", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/refund",
headers={
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/refund",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/refund"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/v2/merchants/orders/{order_token}/refund", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}API de red de usuario#
Estas operaciones opcionales admiten identidad de clientes, direcciones reutilizables e instrumentos de pago almacenados de forma segura. No están obsoletas, pero no son requisitos previos para Purchase V2. Las aplicaciones web y móviles usan autorización del cliente. Los backends de confianza del comercio usan la autorización indicada para cada ruta en el inventario anterior.
Autenticación
Registrar un usuario
POST /users/register
Crea opcionalmente un usuario que puede autenticarse y reutilizar de forma segura sus datos y métodos de pago almacenados.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/users/register' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Merchant-Id: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/users/register", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-Id": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/users/register",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-Id": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/register",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Merchant-Id: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/register"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Merchant-Id", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/users/register", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Solicitar una OTP
POST /users/request-code
Envía el código de un solo uso utilizado por el flujo de autenticación sin contraseña.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/users/request-code' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Device-Id: DEVICE_ID' \
--header 'X-Merchant-Id: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/users/request-code", {
method: "POST",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/users/request-code",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/request-code",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Device-Id: DEVICE_ID",
"X-Merchant-Id: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/request-code"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Device-Id", "DEVICE_ID")
.header("X-Merchant-Id", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/users/request-code", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Device-Id", "DEVICE_ID")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Iniciar sesión con una OTP
POST /users/login
Intercambia un código único válido por un token de autorización de usuario.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/users/login' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Device-Id: DEVICE_ID' \
--header 'X-Merchant-Id: MERCHANT_ID' \
--header 'X-Qa-Api-Key: QA_API_KEY_VALUE' \
--header 'X-Recaptcha-Token: RECAPTCHA_TOKEN_VALUE' \
--header 'X-Session-ID: SESSION_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/users/login", {
method: "POST",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID",
"X-Qa-Api-Key": "QA_API_KEY_VALUE",
"X-Recaptcha-Token": "RECAPTCHA_TOKEN_VALUE",
"X-Session-ID": "SESSION_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/users/login",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID",
"X-Qa-Api-Key": "QA_API_KEY_VALUE",
"X-Recaptcha-Token": "RECAPTCHA_TOKEN_VALUE",
"X-Session-ID": "SESSION_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/login",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Device-Id: DEVICE_ID",
"X-Merchant-Id: MERCHANT_ID",
"X-Qa-Api-Key: QA_API_KEY_VALUE",
"X-Recaptcha-Token: RECAPTCHA_TOKEN_VALUE",
"X-Session-ID: SESSION_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/login"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Device-Id", "DEVICE_ID")
.header("X-Merchant-Id", "MERCHANT_ID")
.header("X-Qa-Api-Key", "QA_API_KEY_VALUE")
.header("X-Recaptcha-Token", "RECAPTCHA_TOKEN_VALUE")
.header("X-Session-ID", "SESSION_ID")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/users/login", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Device-Id", "DEVICE_ID")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
request.Header.Set("X-Qa-Api-Key", "QA_API_KEY_VALUE")
request.Header.Set("X-Recaptcha-Token", "RECAPTCHA_TOKEN_VALUE")
request.Header.Set("X-Session-ID", "SESSION_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Autorización externa
POST /users/external-authorize
Autentica a un usuario a través de un flujo de identidad administrado por el comerciante.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/users/external-authorize' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Auth-Message: AUTH_MESSAGE_VALUE' \
--header 'X-Device-Id: DEVICE_ID' \
--header 'X-Merchant-Id: MERCHANT_ID'const response = await fetch("https://api.sandbox.deuna.io/users/external-authorize", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Auth-Message": "AUTH_MESSAGE_VALUE",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/users/external-authorize",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Auth-Message": "AUTH_MESSAGE_VALUE",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/external-authorize",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Auth-Message: AUTH_MESSAGE_VALUE",
"X-Device-Id: DEVICE_ID",
"X-Merchant-Id: MERCHANT_ID"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/external-authorize"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Auth-Message", "AUTH_MESSAGE_VALUE")
.header("X-Device-Id", "DEVICE_ID")
.header("X-Merchant-Id", "MERCHANT_ID")
.method("POST", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/users/external-authorize", nil)
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Auth-Message", "AUTH_MESSAGE_VALUE")
request.Header.Set("X-Device-Id", "DEVICE_ID")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Usuarios
GET /users/me
Devuelve el perfil del usuario autenticado cuando la integración usa cuentas de cliente opcionales.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/users/me' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Device-Id: DEVICE_ID' \
--header 'X-Merchant-Id: MERCHANT_ID'const response = await fetch("https://api.sandbox.deuna.io/users/me", {
method: "GET",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/users/me",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/me",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Device-Id: DEVICE_ID",
"X-Merchant-Id: MERCHANT_ID"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/me"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Device-Id", "DEVICE_ID")
.header("X-Merchant-Id", "MERCHANT_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/users/me", nil)
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Device-Id", "DEVICE_ID")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Direcciones
GET /users/{user_id}/addresses
Enumera las direcciones reutilizables asociadas a un usuario. Esta operación opcional no es necesaria antes de Purchase V2.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/users/{user_id}/addresses' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Device-Id: DEVICE_ID' \
--header 'X-Merchant-Id: MERCHANT_ID'const response = await fetch("https://api.sandbox.deuna.io/users/{user_id}/addresses", {
method: "GET",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/users/{user_id}/addresses",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/{user_id}/addresses",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Device-Id: DEVICE_ID",
"X-Merchant-Id: MERCHANT_ID"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/{user_id}/addresses"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Device-Id", "DEVICE_ID")
.header("X-Merchant-Id", "MERCHANT_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/users/{user_id}/addresses", nil)
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Device-Id", "DEVICE_ID")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}POST /users/{user_id}/addresses
Guarda opcionalmente una dirección para que un usuario autenticado la reutilice. También se puede proporcionar una dirección en línea en una solicitud de pago.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/users/{user_id}/addresses' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Device-Id: DEVICE_ID' \
--header 'X-Merchant-Id: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/users/{user_id}/addresses", {
method: "POST",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/users/{user_id}/addresses",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/{user_id}/addresses",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Device-Id: DEVICE_ID",
"X-Merchant-Id: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/{user_id}/addresses"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Device-Id", "DEVICE_ID")
.header("X-Merchant-Id", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/users/{user_id}/addresses", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Device-Id", "DEVICE_ID")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}PATCH /users/{user_id}/addresses/{address_id}
Actualiza una dirección reutilizable existente. El inventario muestra la autorización Bearer y el contexto del comercio requeridos por estas rutas opcionales.
Ejemplo de cURL
curl --request PATCH \
--url 'https://api.sandbox.deuna.io/users/{user_id}/addresses/{address_id}' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Device-Id: DEVICE_ID' \
--header 'X-Merchant-Id: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/users/{user_id}/addresses/{address_id}", {
method: "PATCH",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"PATCH",
"https://api.sandbox.deuna.io/users/{user_id}/addresses/{address_id}",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Device-Id": "DEVICE_ID",
"X-Merchant-Id": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/{user_id}/addresses/{address_id}",
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Device-Id: DEVICE_ID",
"X-Merchant-Id: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/{user_id}/addresses/{address_id}"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Device-Id", "DEVICE_ID")
.header("X-Merchant-Id", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("PATCH", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("PATCH", "https://api.sandbox.deuna.io/users/{user_id}/addresses/{address_id}", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Device-Id", "DEVICE_ID")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Tarjetas
guardar una tarjeta
POST /v2/users/{user_id}/cards
Tokeniza y almacena una o más tarjetas para uso futuro. El cuerpo de la solicitud es un arreglo JSON, incluso cuando contiene una sola tarjeta. Llama a este endpoint autorizado por el cliente con el token Bearer del usuario y el contexto del comercio mostrado en el inventario generado.
Los datos sin procesar de la tarjeta no deben pasar por los servidores del comercio, salvo que este tenga el alcance PCI requerido. Consulta el flujo de vaulting de la API de Cards para conocer la forma de la solicitud, el límite de seguridad, la respuesta correcta y las pautas de reintento.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/v2/users/{user_id}/cards' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Merchant-ID: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/v2/users/{user_id}/cards", {
method: "POST",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/v2/users/{user_id}/cards",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/v2/users/{user_id}/cards",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/v2/users/{user_id}/cards"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Merchant-ID", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/v2/users/{user_id}/cards", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}¿Qué ruta POST de tarjeta debo usar?
Solo POST /v2/users/{user_id}/cards es parte del contrato actual de la API externa de Tarjetas. Las otras rutas POST que pueden aparecer en los inventarios de Gateway sirven para diferentes propósitos de compatibilidad o de plataforma; no son tres formas intercambiables de crear una tarjeta.
| Ruta | Lo que realmente hace | Guía de integración externa |
|---|---|---|
POST /v2/users/{user_id}/cards | Tokeniza y almacena una o más tarjetas de cliente. Su cuerpo de solicitud es un arreglo, incluso cuando contiene una sola tarjeta, y la respuesta devuelve tokens DEUNA reutilizables. card_id values. | Usa esta ruta para nuevas integraciones de la API de Tarjetas autorizadas por el cliente. |
POST /users/{user_id}/cards | Preserva el contrato de solicitud de tarjeta única heredado v1 para integraciones existentes. | Ruta de compatibilidad; está intencionalmente excluida del catálogo actual de API externas. No inicies una nueva integración con ella a menos que DEUNA te indique explícitamente hacerlo. |
POST /users/{user_id}/cards/{card_id}/tokens | Agrega un token específico del procesador o un resultado de verificación a una tarjeta que ya existe. No crea una tarjeta de cliente ni reemplaza la /v2 operación de almacenamiento seguro. | Operación gestionada por la plataforma; está intencionalmente excluida de la documentación externa y no debe ser llamada directamente a menos que DEUNA apruebe el flujo y el contrato. |
:::info Por qué una ruta puede existir sin aparecer aquí El inventario de API Gateway incluye rutas de compatibilidad y operadas por la plataforma, así como contratos públicos de comerciante. La presencia en el Gateway no convierte por sí misma a una operación en una API externa soportada. El catálogo publica solo operaciones que ya son parte de la referencia externa o tienen aprobación explícita del equipo propietario. :::
Enumerar tarjetas almacenadas
GET /users/{user_id}/cards
Devuelve las tarjetas asociadas al usuario autenticado.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/users/{user_id}/cards' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Merchant-ID: MERCHANT_ID'const response = await fetch("https://api.sandbox.deuna.io/users/{user_id}/cards", {
method: "GET",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID": "MERCHANT_ID"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/users/{user_id}/cards",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID": "MERCHANT_ID"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/{user_id}/cards",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID: MERCHANT_ID"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/{user_id}/cards"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Merchant-ID", "MERCHANT_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/users/{user_id}/cards", nil)
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Obtener una tarjeta almacenada
GET /users/{user_id}/cards/{card_id}
Devuelve una tarjeta asociada al usuario autenticado.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN'const response = await fetch("https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}", {
method: "GET",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}", nil)
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Establecer una tarjeta como predeterminada
PATCH /users/{user_id}/cards/{card_id}/set-as-default
Establece o elimina la tarjeta guardada seleccionada como predeterminada del usuario autenticado. Cuando una tarjeta pasa a ser la predeterminada, DEUNA elimina ese estado de las demás tarjetas del usuario. Consulta Establecer una tarjeta como predeterminada para conocer el cuerpo de solicitud opcional, la respuesta y los pasos de verificación.
Ejemplo de cURL
curl --request PATCH \
--url 'https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}/set-as-default' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'X-Merchant-ID: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}/set-as-default", {
method: "PATCH",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"PATCH",
"https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}/set-as-default",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}/set-as-default",
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"X-Merchant-ID: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}/set-as-default"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("X-Merchant-ID", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("PATCH", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("PATCH", "https://api.sandbox.deuna.io/users/{user_id}/cards/{card_id}/set-as-default", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Obtener información del BIN de la tarjeta
GET /cards/bin/{bin}
Devuelve metadatos de red, emisor y tipo de tarjeta para un BIN de seis dígitos.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/cards/bin/{bin}' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Merchant-Id: MERCHANT_ID'const response = await fetch("https://api.sandbox.deuna.io/cards/bin/{bin}", {
method: "GET",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-Id": "MERCHANT_ID"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/cards/bin/{bin}",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-Id": "MERCHANT_ID"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/cards/bin/{bin}",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Merchant-Id: MERCHANT_ID"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/cards/bin/{bin}"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Merchant-Id", "MERCHANT_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/cards/bin/{bin}", nil)
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}API comercial#
API de Temas
La API de Temas está soportada y no está deprecada. Gestiona configuraciones JSON con nombre y alcance del comerciante que pueden aplicarse a las experiencias DEUNA Checkout y Widget. Llama a estas operaciones solo desde un backend de comerciante confiable con la clave privada X-Api-Key; el servicio de Configuración de Checkout deriva el alcance del comerciante de esa credencial.
Recurso Tema
| campo | Devuelto | crear | Actualizar | Descripción |
|---|---|---|---|---|
id | Sí | Generado | Parámetro de ruta | UUID del tema generado por DEUNA. Úsalo como theme_id para actualizar y eliminar. |
name | Sí | Requerido | Opcional cuando config se proporciona | Nombre único para el comerciante que contiene letras, números o guiones bajos. |
config | Sí | Requerido | Opcional cuando name se proporciona | Objeto JSON que contiene la configuración del tema consumida por la experiencia Checkout o Widget. |
La operación de creación rechaza nombres duplicados y aplica el conteo máximo de temas del servicio de Configuración de Checkout. La actualización y eliminación devuelven un error cuando theme_id no pertenece a un tema existente en la configuración del comerciante.
curl --request POST \
--url 'https://api.sandbox.deuna.io/merchants/checkout/themes' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"name": "checkout_default",
"config": {
"theme": {
"mainColor": "#1479A8",
"secondaryColor": "#111827",
"backgroundColor": "#FFFFFF"
}
}
}'const response = await fetch("https://api.sandbox.deuna.io/merchants/checkout/themes", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "checkout_default",
"config": {
"theme": {
"mainColor": "#1479A8",
"secondaryColor": "#111827",
"backgroundColor": "#FFFFFF"
}
}
})
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/merchants/checkout/themes",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"Content-Type": "application/json"
},
json={
"name": "checkout_default",
"config": {
"theme": {
"mainColor": "#1479A8",
"secondaryColor": "#111827",
"backgroundColor": "#FFFFFF"
}
}
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/checkout/themes",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"name" => "checkout_default",
"config" => [
"theme" => [
"mainColor" => "#1479A8",
"secondaryColor" => "#111827",
"backgroundColor" => "#FFFFFF"
]
]
])
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/checkout/themes"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"checkout_default\",\n \"config\": {\n \"theme\": {\n \"mainColor\": \"#1479A8\",\n \"secondaryColor\": \"#111827\",\n \"backgroundColor\": \"#FFFFFF\"\n }\n }\n }"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/merchants/checkout/themes", strings.NewReader("{\n \"name\": \"checkout_default\",\n \"config\": {\n \"theme\": {\n \"mainColor\": \"#1479A8\",\n \"secondaryColor\": \"#111827\",\n \"backgroundColor\": \"#FFFFFF\"\n }\n }\n }"))
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}{
"id": "bfcabe59-48c9-4c36-b041-71597478689c",
"name": "checkout_default",
"config": {
"theme": {
"mainColor": "#1479A8",
"secondaryColor": "#111827",
"backgroundColor": "#FFFFFF"
}
}
}La operación de lista devuelve la misma forma de recurso en data[]. La creación y actualización devuelven el tema afectado. La eliminación tiene éxito con una respuesta vacía.
:::note Esquema de configuración de tema
El servicio valida que config es un objeto JSON pero no valida sus claves anidadas. Usa la forma de configuración soportada por la versión de Checkout o Widget que consumirá el tema. No asumas que un objeto config de la API de Temas y un objeto CustomStyle del SDK son intercambiables.
:::
Métodos de pago
GET /merchants/stores/payments-methods
Devuelve los métodos de pago habilitados para una tienda. Pase el código de la tienda en el requerido X-Store-Code header.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/merchants/stores/payments-methods' \
--header 'X-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Idempotency-Key: IDEMPOTENCY_KEY' \
--header 'X-Merchant-Id: MERCHANT_ID' \
--header 'X-Prediction-Id: PREDICTION_ID_VALUE' \
--header 'X-Store-Code: STORE_CODE'const response = await fetch("https://api.sandbox.deuna.io/merchants/stores/payments-methods", {
method: "GET",
headers: {
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Idempotency-Key": "IDEMPOTENCY_KEY",
"X-Merchant-Id": "MERCHANT_ID",
"X-Prediction-Id": "PREDICTION_ID_VALUE",
"X-Store-Code": "STORE_CODE"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/merchants/stores/payments-methods",
headers={
"X-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Idempotency-Key": "IDEMPOTENCY_KEY",
"X-Merchant-Id": "MERCHANT_ID",
"X-Prediction-Id": "PREDICTION_ID_VALUE",
"X-Store-Code": "STORE_CODE"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/stores/payments-methods",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Idempotency-Key: IDEMPOTENCY_KEY",
"X-Merchant-Id: MERCHANT_ID",
"X-Prediction-Id: PREDICTION_ID_VALUE",
"X-Store-Code: STORE_CODE"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/stores/payments-methods"))
.header("X-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Idempotency-Key", "IDEMPOTENCY_KEY")
.header("X-Merchant-Id", "MERCHANT_ID")
.header("X-Prediction-Id", "PREDICTION_ID_VALUE")
.header("X-Store-Code", "STORE_CODE")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/merchants/stores/payments-methods", nil)
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Idempotency-Key", "IDEMPOTENCY_KEY")
request.Header.Set("X-Merchant-Id", "MERCHANT_ID")
request.Header.Set("X-Prediction-Id", "PREDICTION_ID_VALUE")
request.Header.Set("X-Store-Code", "STORE_CODE")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}API de enlaces de pago#
POST /merchants/payment-links
Crea un enlace de pago desde un backend comercial confiable.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/merchants/payment-links' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/merchants/payment-links", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/merchants/payment-links",
headers={
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/payment-links",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/payment-links"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/merchants/payment-links", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}GET /merchants/payment-links/{payment_link_id}
Recupera un enlace de pago y su estado actual.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}'const response = await fetch("https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}", {
method: "GET"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}", nil)
if err != nil { panic(err) }
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}GET /merchants/payment-links/all
Lista los enlaces de pago asociados con la tienda del comercio autenticado.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/merchants/payment-links/all'const response = await fetch("https://api.sandbox.deuna.io/merchants/payment-links/all", {
method: "GET"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/merchants/payment-links/all",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/payment-links/all",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/payment-links/all"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/merchants/payment-links/all", nil)
if err != nil { panic(err) }
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}GET /merchants/payment-links/{payment_link_id}/orders
Lista las órdenes asociadas con un enlace de pago.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}/orders'const response = await fetch("https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}/orders", {
method: "GET"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}/orders",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}/orders",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}/orders"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/merchants/payment-links/{payment_link_id}/orders", nil)
if err != nil { panic(err) }
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Ver el Guía de integración de enlaces de pago para el flujo de extremo a extremo.
API de suscripciones#
Planes
GET /subscriptions/plans
Enumera los planes de suscripción disponibles para el comerciante autenticado.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/subscriptions/plans' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'x-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Merchant-ID: MERCHANT_ID'const response = await fetch("https://api.sandbox.deuna.io/subscriptions/plans", {
method: "GET",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/subscriptions/plans",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/subscriptions/plans",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"x-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Merchant-ID: MERCHANT_ID"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/subscriptions/plans"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("x-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Merchant-ID", "MERCHANT_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/subscriptions/plans", nil)
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("x-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}POST /subscriptions/plans
Crea un plan de suscripción.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/subscriptions/plans' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'x-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Merchant-ID: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/subscriptions/plans", {
method: "POST",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/subscriptions/plans",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/subscriptions/plans",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"x-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Merchant-ID: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/subscriptions/plans"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("x-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Merchant-ID", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/subscriptions/plans", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("x-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Suscripciones
Listar suscripciones
GET /subscriptions
Devuelve las suscripciones disponibles para el comerciante autenticado.
Ejemplo de cURL
curl --request GET \
--url 'https://api.sandbox.deuna.io/subscriptions' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'x-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Merchant-ID: MERCHANT_ID'const response = await fetch("https://api.sandbox.deuna.io/subscriptions", {
method: "GET",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/subscriptions",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/subscriptions",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"x-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Merchant-ID: MERCHANT_ID"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/subscriptions"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("x-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Merchant-ID", "MERCHANT_ID")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/subscriptions", nil)
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("x-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Crear una suscripción
POST /subscriptions
Crea una suscripción utilizando un plan y un método de pago existentes.
Ejemplo de cURL
curl --request POST \
--url 'https://api.sandbox.deuna.io/subscriptions' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'x-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Merchant-ID: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/subscriptions", {
method: "POST",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/subscriptions",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/subscriptions",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"x-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Merchant-ID: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/subscriptions"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("x-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Merchant-ID", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/subscriptions", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("x-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Actualizar una suscripción
PATCH /subscriptions/{id}
Actualiza los atributos admitidos de una suscripción activa.
Ejemplo de cURL
curl --request PATCH \
--url 'https://api.sandbox.deuna.io/subscriptions/{id}' \
--header 'Authorization: Bearer USER_ACCESS_TOKEN' \
--header 'x-Api-Key: YOUR_PRIVATE_API_KEY' \
--header 'X-Merchant-ID: MERCHANT_ID' \
--header 'Content-Type: application/json' \
--data @request.jsonconst response = await fetch("https://api.sandbox.deuna.io/subscriptions/{id}", {
method: "PATCH",
headers: {
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
body: "@request.json"
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"PATCH",
"https://api.sandbox.deuna.io/subscriptions/{id}",
headers={
"Authorization": "Bearer USER_ACCESS_TOKEN",
"x-Api-Key": "YOUR_PRIVATE_API_KEY",
"X-Merchant-ID": "MERCHANT_ID",
"Content-Type": "application/json"
},
data="@request.json",
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/subscriptions/{id}",
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer USER_ACCESS_TOKEN",
"x-Api-Key: YOUR_PRIVATE_API_KEY",
"X-Merchant-ID: MERCHANT_ID",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => "@request.json"
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/subscriptions/{id}"))
.header("Authorization", "Bearer USER_ACCESS_TOKEN")
.header("x-Api-Key", "YOUR_PRIVATE_API_KEY")
.header("X-Merchant-ID", "MERCHANT_ID")
.header("Content-Type", "application/json")
.method("PATCH", HttpRequest.BodyPublishers.ofString("@request.json"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("PATCH", "https://api.sandbox.deuna.io/subscriptions/{id}", strings.NewReader("@request.json"))
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer USER_ACCESS_TOKEN")
request.Header.Set("x-Api-Key", "YOUR_PRIVATE_API_KEY")
request.Header.Set("X-Merchant-ID", "MERCHANT_ID")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}