Endpoint catalog
Published DEUNA order, payment, user, card, merchant, payment-link, and subscription operations carried forward from the previous API reference.
On this page
Use this catalog to find the operations carried forward from the previous DEUNA API reference. The migration matrix keeps each published method and path represented once while excluding other API Gateway routes.
Published endpoint inventory#
This inventory is generated from the effective API Gateway configuration and restricted by the reviewed migration matrix. Use the filters to identify who should call an operation, which service owns it, what authorization it supports, and which headers the gateway accepts or forwards.
The catalog includes only merchant-backend and customer-application operations already present in the previous public API reference. Internal Admin, management, partner, provider-callback, and other gateway operations are excluded.
Routes below /transactions/webhooks/ receive processor events inside DEUNA and are not merchant integration endpoints. When a provider requires merchant-side callback configuration, the URL and setup steps live in that provider's connection guide—for example, the Stripe OXXO payment-status callback. Use DEUNA webhooks for notifications delivered to your own backend.
Generated from effective API Gateway operations mapped from the previous public API reference.
Merchant backend · server to serverUse from a trusted merchant backend for orders, payments and operational workflows.42
/cards/bin/{bin}Retrieve Bin
- Domain
- Cards and vault
- Owning service
- Card metadata
- Intended for
- Merchant backend · server to server
/merchants/checkout/themesList or retrieve Themes
- Domain
- Checkout
- Owning service
- Checkout configuration
- Intended for
- Merchant backend · server to server
/merchants/checkout/themesCreate Themes
- Domain
- Checkout
- Owning service
- Checkout configuration
- Intended for
- Merchant backend · server to server
/merchants/checkout/themes/{theme_id}Delete Themes
- Domain
- Checkout
- Owning service
- Checkout configuration
- Intended for
- Merchant backend · server to server
/merchants/checkout/themes/{theme_id}Update Themes
- Domain
- Checkout
- Owning service
- Checkout configuration
- Intended for
- Merchant backend · server to server
/merchants/ordersList or retrieve Orders
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/ordersCreate Orders
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/orders/{order_token}Retrieve Orders
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/orders/{order_token}Update Orders
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/orders/{order_token}/expireRun Expire for Orders
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/orders/{order_token}/payments-methodsList or retrieve Payments Methods
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/orders/{order_token}/transactions/verifyRun Verify for Transactions
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/orders/{order_token}/voidRun Void for Orders
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/transactions/orders/{order_token}/installmentsList or retrieve Installments
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/v2/merchants/orders/{order_token}/captureCapture Payment
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/v2/merchants/orders/{order_token}/refundCreate Refund
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/v2/merchants/orders/purchaseCreate Payment
- Domain
- Orders
- Owning service
- Orders and checkout
- Intended for
- Merchant backend · server to server
/merchants/payment-linksCreate Payment Links
- Domain
- Payment links
- Owning service
- Payment links
- Intended for
- Merchant backend · server to server
/merchants/payment-links/{payment_link_id}Retrieve Payment Links
- Domain
- Payment links
- Owning service
- Payment links
- Intended for
- Merchant backend · server to server
/merchants/payment-links/{payment_link_id}/ordersList or retrieve Orders
- Domain
- Payment links
- Owning service
- Payment links
- Intended for
- Merchant backend · server to server
/merchants/payment-links/allList or retrieve All
- Domain
- Payment links
- Owning service
- Payment links
- Intended for
- Merchant backend · server to server
/merchants/stores/payments-methodsList or retrieve Payments Methods
- Domain
- Payments
- Owning service
- Payments
- Intended for
- Merchant backend · server to server
/transactions/payments-methodsList or retrieve Payments Methods
- Domain
- Payments
- Owning service
- Payments
- Intended for
- Merchant backend · server to server
/merchants/installments/plans/{installment_plan_option_id}Retrieve Plans
- Domain
- Subscriptions
- Owning service
- Installments
- Intended for
- Merchant backend · server to server
/subscriptionsList or retrieve Subscriptions
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptionsCreate Subscriptions
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/{id}Retrieve Subscriptions
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/{id}Update Subscriptions
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/{id}/cancelRun Cancel for Subscriptions
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/{id}/cardsUpdate Cards
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/{id}/external-settlementCreate External Settlement
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/{id}/historyList or retrieve History
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/{id}/pauseRun Pause for Subscriptions
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/{id}/resumeRun Resume for Subscriptions
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/plansList or retrieve Plans
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/plansCreate Plans
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/plans/{id}Retrieve Plans
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/plans/{id}Update Plans
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/plans/statusesList or retrieve Statuses
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/subscriptions/statusesList or retrieve Statuses
- Domain
- Subscriptions
- Owning service
- Subscriptions
- Intended for
- Merchant backend · server to server
/users/authorizeRun Authorize for Users
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Merchant backend · server to server
/users/external-authorizeCreate External Authorize
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Merchant backend · server to server
Customer application · user to serverUse from customer-facing web or mobile flows with the user identity and device context shown.14
/users/{user_id}/cardsList or retrieve Cards
- Domain
- Cards and vault
- Owning service
- Payments
- Intended for
- Customer application · user to server
/users/{user_id}/cards/{card_id}Delete Cards
- Domain
- Cards and vault
- Owning service
- Payments
- Intended for
- Customer application · user to server
/users/{user_id}/cards/{card_id}Retrieve Cards
- Domain
- Cards and vault
- Owning service
- Payments
- Intended for
- Customer application · user to server
/users/{user_id}/cards/{card_id}/set-as-defaultSet card as default
- Domain
- Cards and vault
- Owning service
- Payments
- Intended for
- Customer application · user to server
/v2/users/{user_id}/cardsCreate Cards
- Domain
- Cards and vault
- Owning service
- Payments
- Intended for
- Customer application · user to server
/users/{user_id}/addressesList or retrieve Addresses
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
/users/{user_id}/addressesCreate Addresses
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
/users/{user_id}/addresses/{address_id}Delete Addresses
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
/users/{user_id}/addresses/{address_id}Update Addresses
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
/users/loginRun Login for Users
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
/users/logoutRun Logout for Users
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
/users/meList or retrieve Me
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
/users/registerRun Register for Users
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
/users/request-codeRun Request Code for Users
- Domain
- Users and identity
- Owning service
- Merchant management
- Intended for
- Customer application · user to server
Core integration endpoints#
The operations below retain stable anchors used by integration guides and provide additional context for the most common merchant workflows.
Orders API#
Create an order
POST /merchants/orders
Optionally creates an order before payment and returns the order_token used by DEUNA widgets and payment operations. New direct integrations can instead send the order inline to Purchase V2.
The required object varies by order type: Checkout and Subscriptions orders require the items array, while Airline orders require airline information. The base contract does not mark an individual item property as universally required. See the item field reference and vertical field guide.
cURL example
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))
}Get an order
GET /merchants/orders/{order_token}
Retrieves the current order, payment, and processing state for an order token.
cURL example
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))
}Get payment methods for an order
GET /merchants/orders/{order_token}/payments-methods
Returns the payment methods available to a specific order and merchant configuration.
cURL example
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))
}Payments API#
Create a payment
POST /v2/merchants/orders/purchase
Creates and processes an inline order in the recommended one-call flow, or processes an existing order_token when the order was created separately. See the detailed payment request guide.
cURL example
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))
}Capture a payment
POST /v2/merchants/orders/{order_token}/capture
Captures all or part of an authorized payment. Call it from the merchant backend only when the connection supports separate authorization and capture.
cURL example
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))
}Void an authorization
POST /merchants/orders/{order_token}/void
Releases an eligible authorization before capture. A successful synchronous request returns HTTP 204 No Content; asynchronous processor flows must still be tracked to their final payment status.
cURL example
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))
}Refund a payment
POST /v2/merchants/orders/{order_token}/refund
Creates a full or partial refund for a processed payment.
cURL example
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))
}User Network API#
These optional operations support customer identity, reusable addresses, and securely stored payment instruments. They are not deprecated, but they are not prerequisites for Purchase V2. Browser and mobile applications use customer authorization. Trusted merchant backends use the authorization shown for each route in the inventory above.
Authentication
Register a user
POST /users/register
Optionally creates a user that can authenticate and securely reuse customer data and stored payment methods.
cURL example
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))
}Request an OTP
POST /users/request-code
Sends the one-time code used by the passwordless authentication flow.
cURL example
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))
}Log in with an OTP
POST /users/login
Exchanges a valid one-time code for a user authorization token.
cURL example
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))
}External authorization
POST /users/external-authorize
Authenticates a user through a merchant-managed identity flow.
cURL example
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))
}Users
GET /users/me
Returns the authenticated user profile when the integration uses optional customer accounts.
cURL example
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))
}Addresses
GET /users/{user_id}/addresses
Lists reusable addresses associated with a user. This optional operation is not required before Purchase V2.
cURL example
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
Optionally saves an address for reuse by an authenticated user. An address can instead be supplied inline in a payment request.
cURL example
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}
Updates an existing reusable address. The inventory shows the Bearer authorization and merchant context required by these optional routes.
cURL example
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))
}Cards
Store a card
POST /v2/users/{user_id}/cards
Tokenizes and stores one or more cards for later use. The request body is a JSON array, including when it contains only one card. Call this customer-authorized endpoint with the user's Bearer token and the merchant context shown in the generated inventory.
Raw card data must not pass through merchant servers unless the merchant has the required PCI scope. See the Cards API vaulting flow for the request shape, security boundary, success response, and retry guidance.
cURL example
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))
}Which card POST route should I use?
Only POST /v2/users/{user_id}/cards is part of the current external Cards API contract. The other POST routes that can appear in Gateway inventories serve different compatibility or platform purposes; they are not three interchangeable ways to create a card.
| Route | What it actually does | External integration guidance |
|---|---|---|
POST /v2/users/{user_id}/cards | Tokenizes and stores one or more customer cards. Its request body is an array, even when it contains one card, and the response returns reusable DEUNA card_id values. | Use this route for new customer-authorized Cards API integrations. |
POST /users/{user_id}/cards | Preserves the legacy v1 single-card request contract for existing integrations. | Compatibility route; it is intentionally excluded from the current external API catalog. Do not start a new integration with it unless DEUNA explicitly directs you to do so. |
POST /users/{user_id}/cards/{card_id}/tokens | Adds a processor-specific token or verification result to a card that already exists. It does not create a customer card or replace the /v2 vaulting operation. | Platform-managed operation; it is intentionally excluded from external documentation and must not be called directly unless DEUNA approves the flow and contract. |
:::info Why a route can exist without appearing here The API Gateway inventory includes compatibility and platform-operated routes as well as public merchant contracts. Presence in the Gateway does not by itself make an operation a supported external API. The catalog publishes only operations that are already part of the external reference or have explicit approval from the owning team. :::
List stored cards
GET /users/{user_id}/cards
Returns the cards associated with the authenticated user.
cURL example
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))
}Retrieve a stored card
GET /users/{user_id}/cards/{card_id}
Returns one card associated with the authenticated user.
cURL example
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))
}Set a card as default
PATCH /users/{user_id}/cards/{card_id}/set-as-default
Sets or removes the selected stored card as the authenticated user's default. When a card becomes the default, DEUNA removes the default status from the user's other cards. See Set a card as default for the optional request body, response, and verification steps.
cURL example
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))
}Get card BIN information
GET /cards/bin/{bin}
Returns card network, issuer, and type metadata for a six-digit BIN.
cURL example
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))
}Merchant API#
Themes API
The Themes API is supported and is not deprecated. It manages named, merchant-scoped JSON configurations that can be applied to DEUNA Checkout and Widget experiences. Call these operations only from a trusted merchant backend with the private X-Api-Key; the Checkout Configuration service derives the merchant scope from that credential.
Theme resource
| Field | Returned | Create | Update | Description |
|---|---|---|---|---|
id | Yes | Generated | Path parameter | Theme UUID generated by DEUNA. Use it as theme_id for update and delete. |
name | Yes | Required | Optional when config is supplied | Merchant-unique name containing letters, numbers, or underscores. |
config | Yes | Required | Optional when name is supplied | JSON object containing the theme configuration consumed by the Checkout or Widget experience. |
The create operation rejects duplicate names and enforces the Checkout Configuration service's maximum theme count. Update and delete return an error when theme_id does not belong to an existing theme in the merchant configuration.
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"
}
}
}The list operation returns the same resource shape in data[]. Create and update return the affected theme. Delete succeeds with an empty response.
:::note Theme configuration schema
The service validates that config is a JSON object but does not validate its nested keys. Use the configuration shape supported by the Checkout or Widget version that will consume the theme. Do not assume that a Themes API config object and an SDK CustomStyle object are interchangeable.
:::
Payment methods
GET /merchants/stores/payments-methods
Returns the payment methods enabled for a store. Pass the store code in the required X-Store-Code header.
cURL example
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))
}Payment Links API#
POST /merchants/payment-links
Creates a payment link from a trusted merchant backend.
cURL example
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}
Retrieves a payment link and its current state.
cURL example
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
Lists the payment links associated with the authenticated merchant store.
cURL example
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
Lists the orders associated with a payment link.
cURL example
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))
}See the Payment Links integration guide for the end-to-end flow.
Subscriptions API#
Plans
GET /subscriptions/plans
Lists subscription plans available to the authenticated merchant.
cURL example
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
Creates a subscription plan.
cURL example
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))
}Subscriptions
List subscriptions
GET /subscriptions
Returns subscriptions available to the authenticated merchant.
cURL example
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))
}Create a subscription
POST /subscriptions
Creates a subscription using an existing plan and payment method.
cURL example
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))
}Update a subscription
PATCH /subscriptions/{id}
Updates an active subscription’s supported attributes.
cURL example
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))
}