Utilities
API Health
This endpoint could be used as Heartbeat to know if the API is up and running.
import requests
url = "https://backend.ducapp.net/api/health"
payload={}
headers = {}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)curl --location --request GET 'https://backend.ducapp.net/api/health'var requestOptions = {
method: 'GET',
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/health", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"status": true
}
Request
GET /api/health
Host: backend.ducapp.net
Headers:
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
boolean | Status of API. |
File Upload
Endpoint to upload a file to the system. The file must be sent with multipart/form-data as Content-Type Header.
curl --location --request POST 'https://backend.ducapp.net/api/upload/' \
--form 'name="TextUpload"' \
--form 'file=@"/path/to/file.png"'var formdata = new FormData();
formdata.append("name", "TextUpload");
formdata.append("file", fileInput.files[0], "file.png");
var requestOptions = {
method: 'POST',
body: formdata,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/upload/", requestOptions)
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
url = "https://backend.ducapp.net/api/upload/"
payload = {
"name": "TextUpload"
}
files = [
('file', ('file.png', open('/path/to/file.png','rb'), 'image/png'))
]
response = requests.request("POST", url, data=payload, files=files)
print(response.text)
Example Response:
{
"url": "default/7d048180-9194-11f0-b841-75b00e464f2a.png",
"defaultUrl": "https://s3.amazonaws.com/ducwallet-dev-uploaded-files/fileserver/default/7d048180-9194-11f0-b841-75b00e464f2a.png",
"uploaded": 1,
"fileName": "7d048180-9194-11f0-b841-75b00e464f2a.png",
"path": "default/7d048180-9194-11f0-b841-75b00e464f2a.png",
"type": "image/png",
"size": 373505
}
Request
POST /api/upload/
Host: backend.ducapp.net
Headers:
Content-Type: multipart/form-data
Request Body (form-data)
| NAME | TYPE | DESCRIPTION |
|---|---|---|
name |
string | A text identifier for the uploaded file |
file |
file | File to be uploaded (binary stream) |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Relative path of the uploaded file in storage |
defaultUrl |
string | Full public URL to access the uploaded file |
uploaded |
number | Status flag (1 if successfully uploaded) |
fileName |
string | Name assigned to the uploaded file |
path |
string | Path to the file in the storage system |
type |
string | MIME type of the uploaded file (e.g., image/png) |
size |
number | File size in bytes |
Get Advertisement
Endpoint to retrieve a list of active advertisements available to the user.
curl --location --request GET 'https://backend.ducapp.net/api/public/advertisement' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: <USER_TOKEN>'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <ACCESS_TOKEN>");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/public/advertisement", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
url = "https://backend.ducapp.net/api/public/advertisement"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>'
}
response = requests.get(url, headers=headers)
print(response.text)
Example Response:
{
"absolute_ads": [
{
"title": "Invite friends and family",
"description": "<p>Invite a new user and trade money when they send the first remittance.</p>",
"isPublic": true,
"target": [],
"targetRadius": 4900,
"viewing_time_seconds": 3,
"startDate": "2021-04-30T20:01:32.879Z",
"endDate": "2025-12-31T17:00:00.000Z",
"gradient": {
"label": 18,
"value": "2E"
},
"images": [
{
"name": null,
"size": 112061,
"type": "image/png",
"url": "https://s3.amazonaws.com/ducwallet-dev-uploaded-files/fileserver/default/example.png"
}
],
"geolocation": {
"coordinates": [-79.384293, 43.653908],
"type": "Point"
},
"ownerID": "5e1f699f822583414751acd3",
"status": "ACTIVE",
"order": 19,
"createdAt": "2021-04-30T20:02:08.189Z",
"updatedAt": "2025-09-03T19:59:40.267Z",
"id": "608c62400148c0a0197a88e7"
}
]
}
Request
GET /api/v2/advertisement
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
absolute_ads |
[advertisement] |
Array of advertisements objects (See below) |
advertisement Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
title |
string | Title of the advertisement |
description |
string | HTML-formatted description of the advertisement |
isPublic |
boolean | Whether the ad is visible to all users |
target |
array | List of user IDs targeted by the ad (empty if public) |
targetRadius |
number | Radius (in meters) defining the target geolocation area |
viewing_time_seconds |
number | Time in seconds the ad should be displayed |
startDate |
string | Date and time when the ad becomes active |
endDate |
string | Date and time when the ad expires |
discountPercent |
number | null |
tags |
array | Tags associated with the advertisement |
gradient |
object | Object with label and value to represent visual gradient styling |
images |
[image] |
List of images attached to the advertisement |
geolocation |
object | Location object with coordinates and type |
ownerID |
string | ID of the owner/creator of the advertisement |
status |
string | Current status of the advertisement (e.g., ACTIVE) |
order |
number | Display order of the ad |
createdAt |
string | Timestamp of ad creation |
updatedAt |
string | Timestamp of last update |
id |
string | Unique identifier of the advertisement |
image Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
name |
string | Name of the file (if available) |
size |
number | File size in bytes |
type |
string | MIME type (e.g., image/png) |
url |
string | Public URL of the advertisement image |
geolocation Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
coordinates |
array | Array with longitude and latitude [lng, lat] |
_id |
string | Unique identifier of the geolocation |
type |
string | Type of geolocation (e.g., "Point") |
Users
Get User Settings
Endpoint to obtain the configuration, preferences, notifications and privacy settings of the logged-in user to be able to use the platform services.
curl --location --request POST 'https://backend.ducapp.net/api/v2/users/settings' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: "POST",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/v2/users/settings", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/v2/users/settings"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers)
print(response.text)
```json
{
"user": {
"connected": false,
"deleted": false,
"loginFailCount": 0,
"blockedUntil": null,
"disabled": false,
"isBlocked": false,
"validatedUser": true,
"isBusinessType": false,
"firstLoginRequired": false,
"changePasswordRequired": false,
"twofAuthEnabled": false,
"registeredUser": true,
"defaultCurrency": "USD",
"language": "en_US",
"allowFaceRecognition": true,
"needKYCVerification": false,
"verified": true,
"trustLevel": 8,
"transactionCount": 12,
"beneficiaries": [
"687f3f9e8403d05faf9b58d9",
"68950a399048e52a9d502cdc"
],
"requestOTPCount": 12,
"_id": "5ebaf91c80b385353b9283da",
"firstName": "John",
"lastName": "Doe",
"avatar": "https://s3.amazonaws.com/.../avatars/john-doe.png",
"walletAddress": "0x0F673BAF2C67eb6165CC526df5386032d653fbB4",
"status": "Activated",
"email": "john.doe@gmail.com",
"reviews": [],
"createdAt": "2020-03-10T15:57:56.489Z",
"updatedAt": "2025-08-21T19:31:02.589Z",
"lastLoginAt": "2025-08-21T19:31:02.324Z",
"location": {
"coordinates": [-80.00328104, 22.41070851],
"_id": "689659c6abb1382b8d7a64ad",
"type": "Point"
},
"location_timestamp": 1754669841000,
"identityNumber": "02090970502",
"phone": "+5355555555",
"country": "Canada",
"country_iso_code": "CAN",
"nameFull": "John Doe",
"activationCode": "235678",
"city": "Toronto",
"houseNumber": "16",
"street": "Main Street 123",
"zipcode": "M5J2N8",
"fullNameShort": "John D.",
"fullNameLong": "John Doe",
"fullName": "John Doe",
"fullAddress": "16, Main Street 123, Toronto, M5J2N8, Canada.",
"score": 3,
"id": "5ebaf91c80b385353b9283da",
"source1": {
"isActive": true,
"wasChanged": false,
"verificationId": "5ecb3db88e4629000d0963dc",
"name": "Passport",
"allowAttachment": true,
"order": 1281,
"key": "passport"
},
"source2": {
"isActive": true,
"wasChanged": false,
"verificationId": "5ecb3db88e4629000d0963db",
"name": "Driving license / DNI",
"allowAttachment": true,
"order": 1280,
"key": "driving_license"
},
"providersNotification": [
{ "provider": "email", "active": true },
{ "provider": "sms", "active": true },
{ "provider": "push", "active": true }
],
"privacyConfigurationsSettings": [
{ "key": "localization", "value": true }
]
}
}
Example Response:
{
"user": {
"connected": false,
"deleted": false,
"loginFailCount": 0,
"blockedUntil": null,
"disabled": false,
"isBlocked": false,
"validatedUser": true,
"isBusinessType": false,
"firstLoginRequired": false,
"changePasswordRequired": false,
"twofAuthEnabled": false,
"registeredUser": false,
"defaultCurrency": "CAD",
"language": "es_ES",
"allowFaceRecognition": true,
"needKYCVerification": false,
"verified": false,
"userWasUpdate": false,
"trustLevel": 7,
"transactionCount": 0,
"beneficiaries": [
"677f3f9e8503d05caf8b58d9",
],
"requestOTPCount": 61,
"_id": "5e67b9041016f12effaa2f9f",
"firstName": "Jonh",
"lastName": "Doe",
"avatar": "https://s3.amazonaws.com/ducwallet-dev-uploaded-files/fileserver/users/5e67b9041016f12effaa2e8c/avatars/c8d82a40-6844-11f0-87ca-830515aa8bde.png",
"walletAddress": "0x8az0E6cE31F2879b64f67c2191FF5A4B33B82Ff6",
"status": "Activated",
"email": "jonh.doe@gmail.com",
"reviews": [],
"createdAt": "2020-03-10T15:57:56.489Z",
"updatedAt": "2025-09-07T19:02:54.252Z",
"lastLoginAt": "2025-09-07T19:02:54.186Z",
"location": {
"coordinates": [
-80.00328104,
22.41070851
],
"_id": "689659c6abb1382b8d7a64ad",
"type": "Point"
},
"location_timestamp": 1754669841000,
"activeCreditCard": null,
"address": null,
"biometricPublicKey": null,
"birthDate": "2002-09-09T00:00:00.000Z",
"identityNumber": "97100270607",
"phone": "+5357575757",
"country": "Canada",
"country_iso_code": "CAN",
"nameFull": "John Doe",
"activationCode": null,
"city": "Ottawa",
"houseNumber": "15",
"street": "5th street, Madeup Vecinity, B/ C & B",
"zipcode": "501100",
"fullNameShort": "John D.",
"fullNameLong": "John Doe Doe",
"fullName": "John Doe",
"fullAddress": "15, 5th street, Madeup Vecinity, B/ C & B, 501100, Canada.",
"score": 3,
"id": "5e67b9041016f12effaa2f9f",
"source1": {
"isActive": true,
"wasChanged": false,
"verificationId": "5ecb3db88e4629000d0963dc",
"_id": "5ecb3db88e4629000d0963dc",
"name": "Passport",
"allowAttachment": true,
"order": 1281,
"key": "passport"
},
"source2": {
"isActive": true,
"wasChanged": false,
"verificationId": "5ecb3db88e4629000d0963db",
"_id": "5ecb3db88e4629000d0963db",
"name": "Driving license / DNI",
"allowAttachment": true,
"order": 1280,
"key": "driving_license"
},
"providersNotification": [
{
"provider": "email",
"active": false
},
{
"provider": "push",
"active": true
},
{
"provider": "sms",
"active": true
}
],
"privacyConfigurationsSettings": [
{
"key": "localization",
"value": false
}
]
}
}
Request
POST api/v2/users/settings/
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
None Required
Response Body
The response body is an {user} object that contains all the information fields of the logged in user
| NAME | TYPE | DESCRIPTION |
|---|---|---|
user |
object | User object containing all user data |
user Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
connected |
boolean | Whether the user is currently connected |
deleted |
boolean | Whether the user account is deleted |
loginFailCount |
number | Number of failed login attempts |
blockedUntil |
string|null | Date until the user is blocked (null if not blocked) |
disabled |
boolean | Whether the account is disabled |
isBlocked |
boolean | Whether the user is blocked |
validatedUser |
boolean | Whether the user has been validated |
isBusinessType |
boolean | Whether the account type is business |
firstLoginRequired |
boolean | Whether the user must complete a first login action |
changePasswordRequired |
boolean | Whether the user must change password |
twofAuthEnabled |
boolean | Whether two-factor authentication is enabled |
registeredUser |
boolean | Whether the user has completed registration |
defaultCurrency |
string | Default currency for transactions (e.g., CAD) |
language |
string | Preferred language code (e.g., es_ES) |
allowFaceRecognition |
boolean | Whether the user allows face recognition |
needKYCVerification |
boolean | Whether KYC verification is required |
verified |
boolean | Whether the user is verified |
userWasUpdate |
boolean | Whether the user information was updated |
trustLevel |
number | User trust level (numeric score) |
transactionCount |
number | Total number of transactions performed by the user |
beneficiaries |
[string] | Array of beneficiary IDs linked to the user |
requestOTPCount |
number | Number of OTP requests made by the user |
_id |
string | Unique user identifier |
firstName |
string | User’s first name |
lastName |
string | User’s last name |
avatar |
string | URL to the user’s avatar image |
walletAddress |
string | Blockchain wallet address of the user |
status |
string | Current account status (e.g., Activated) |
email |
string | User’s email address |
reviews |
array | Array of user reviews (empty if none) |
createdAt |
string | Timestamp of account creation |
updatedAt |
string | Timestamp of last update |
lastLoginAt |
string | Timestamp of the last login |
location |
object | Location object (see below) |
location_timestamp |
number | Timestamp when the location was recorded |
activeCreditCard |
object|null | Active credit card details if available |
address |
string|null | User’s address |
biometricPublicKey |
string|null | Public key for biometric authentication |
birthDate |
string | User’s birthdate (ISO 8601 format) |
identityNumber |
string | User’s identity number |
phone |
string | User’s phone number |
country |
string | Country name |
country_iso_code |
string | Country ISO code |
nameFull |
string | Full formatted name |
activationCode |
string|null | Activation code if required |
city |
string | User’s city |
houseNumber |
string | House number |
street |
string | Street address |
zipcode |
string | Postal/ZIP code |
fullNameShort |
string | Short version of the user’s full name |
fullNameLong |
string | Long version of the user’s full name |
fullName |
string | User’s complete name |
fullAddress |
string | Full formatted address |
score |
number | User score |
id |
string | Alias for _id (same value) |
source1 |
object | First verification source, passport (see below) |
source2 |
object | Second verification source, driving license / DNI (see below) |
providersNotification |
array | Array of notification provider settings (email, push, sms) |
privacyConfigurationsSettings |
array | Array of privacy configuration settings |
location Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
coordinates |
[number] | Array with longitude and latitude |
_id |
string | Location object ID |
type |
string | Geometry type (e.g., Point) |
source Object (source1 / source2)
| NAME | TYPE | DESCRIPTION |
|---|---|---|
isActive |
boolean | Whether this verification source is active |
wasChanged |
boolean | Whether this source was modified |
verificationId |
string | Unique ID of the verification process |
_id |
string | Unique identifier |
name |
string | Name of the document/source (e.g., Passport) |
allowAttachment |
boolean | Whether attachments are allowed |
order |
number | Order priority of the verification |
key |
string | Key identifier of the source |
providersNotification Array
| NAME | TYPE | DESCRIPTION |
|---|---|---|
provider |
string | Notification provider (email, push, sms) |
active |
boolean | Whether the provider is active |
privacyConfigurationsSettings Array
| NAME | TYPE | DESCRIPTION |
|---|---|---|
key |
string | Privacy setting key (e.g., localization) |
value |
boolean | Value of the privacy setting |
Login
Endpoint to obtain the user credentials to be able to use the platform services.
curl --location --request POST 'https://backend.ducapp.net/api/auth/login' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "john.doe@test.ducapp.net",
"password": "$2y$10$EiZYJxdFvdTBfY97uTfU1e11U5vAFmxTnAQ5M.d0q8zU9"
}
'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
email: "john.doe@test.ducapp.net",
password: "$2y$10$EiZYJxdFvdTBfY97uTfU1e11U5vAFmxTnAQ5M.d0q8zU9",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/auth/login", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/auth/login"
payload = json.dumps({
"email": "john.doe@test.ducapp.net",
"password": "$2y$10$EiZYJxdFvdTBfY97uTfU1e11U5vAFmxTnAQ5M.d0q8zU9"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ7.eyJfaWQiOiI1ZWJhZjkxYzgwYjM4NTM1M2I5MjgzZGQiLCJmaXJzdE5hbWUiOiJEYXJpYW4iLCJsYXN0TmFtZSI6IkFsdmFyZXoiLCJlbWFpbCI6ImRhcmlhbi5hbHZhcmV6LnRAZ21haWwuY29tIiwicGhvbmUiOiIrNTM1MjU1MjYxNSIsIndhbGxldEFkZHJlc3MiOiIweDBGNjczQkFGMkM2N2ViNjE2NUNDNTI2ZGY1Mzg2MDMyZDY1M2ZiQjUiLCJkZWZhdWx0Q3VycmVuY3kiOiJVU0QiLCJyb2xlcyI6WyI1ZDdjNzFlZGRmZTg1OTAwMGZmNzE2YmIiLCI1ZDdjNzFlZGRmZTg1OTAwMGZmNzE2YmMiLCI1ZGUwMzAyYTU4ZTUzMDAwMGRlMGRkMmIiLCI2MjRjYzQyZTlhZjAwMDU5YzQ3NzZlMjMiXSwibGFuZ3VhZ2UiOiJFTiIsImxhc3RMb2dpbkF0IjoiMjAyNC0wMi0xNlQxNzoyNDoyMS45NDhaIiwic3RhdHVzIjoiQWN0aXZhdGVkIiwidmVyaWZpZWQiOmZhbHNlLCJ0cnVzdExldmVsIjo4LCJpc0Jsb2NrZWQiOmZhbHNlLCJsb2dpbkZhaWxDb3VudCI6MCwiYmxvY2tlZFVudGlsIjpudWxsLCJpYXQiOjE3MDgxMDQyNjIsImV4cCI6MTcwODEyMjI2Mn0.TA8dS_GS21OXQlmzZ45pWvrBQVsA9sy_Tapr_p8-zwZ",
"isMerchant": true,
"id": "5ebaf91c80b385353b9283da",
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@gmail.com",
"phone": "+5355555555",
"walletAddress": "0x0F673BAF2C67eb6165CC526df5386032d653fbB4",
"defaultCurrency": "USD",
"status": "Activated",
"trustLevel": 8,
"isBlocked": false
}
Request
POST /api/auth/login
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
phone\email |
string | Registered User phone number or email |
password |
string | Registered User password |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
accessToken |
string | Token to access authenticated endpoints |
isMerchant |
string | Weather the user is merchant or not |
id |
string | The user id |
firstName |
string | The user first name |
lastName |
string | The user last name |
email |
string | The user registered email |
phone |
string | The user registered phone number |
walletAddress |
string | The user wallet address |
defaultCurrency |
string | The user default selected currency |
status |
string | The user status |
trustLevel |
string | The user trust level |
isBlocked |
string | Weather the user is blocked or not |
Register User
Endpoint to register a new user in the platform.
curl --location --request POST 'https://backend.ducapp.net/api/private/users/register' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"appVersion": "0.1",
"language": "EN",
"defaultCurrency": "USD",
"firstName": "John",
"lastName": "Doe",
"phone": "+1-202-555-0106",
"providerValue": "john.doe@test.ducapp.net",
"identityNumber": "035742265",
"street": "Schoenersville Rd",
"houseNumber": "2118",
"city": "PA",
"country": "United States",
"zipcode": "18017",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATQAAAEzCAIAAAAw5mh...",
"source1": {
"url": "https://www.someimage.com/url/passportImage.jpg",
"name": "passportPicture",
"type": "mime/jpg",
"size": "50"
},
"source2": {
"url": "https://www.someimage.com/url/licenceImage.jpg",
"name": "drivingLicence",
"type": "mime/jpg",
"size": "50"
},
"province": "Pennsylvania",
"birthDate": "1984-11-20",
"country_iso_code": "US",
"password": "$2y$10$EiZYJxdFvdTBfY97uTfU1e11U5vAFmxTnAQ5M.d0q8zU9",
"areConditionsAccepted": "true"
}
'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
appVersion: "0.1",
language: "EN",
defaultCurrency: "USD",
firstName: "John",
lastName: "Doe",
phone: "+1-202-555-0106",
providerValue: "john.doe@test.ducapp.net",
identityNumber: "035742265",
street: "Schoenersville Rd",
houseNumber: "2118",
city: "PA",
country: "United States",
zipcode: "18017",
image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATQAAAEzCAIAAAAw5mh...",
source1: {
url: "https://www.someimage.com/url/passportImage.jpg",
name: "passportPicture",
type: "mime/jpg",
size: "50",
},
source2: {
url: "https://www.someimage.com/url/licenceImage.jpg",
name: "drivingLicence",
type: "mime/jpg",
size: "50",
},
province: "Pennsylvania",
birthDate: "1984-11-20",
country_iso_code: "US",
password: "$2y$10$EiZYJxdFvdTBfY97uTfU1e11U5vAFmxTnAQ5M.d0q8zU9",
areConditionsAccepted: "true",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/register", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/private/users/register"
payload = json.dumps({
"appVersion": "0.1",
"language": "EN",
"defaultCurrency": "USD",
"firstName": "John",
"lastName": "Doe",
"phone": "+1-202-555-0106",
"providerValue": "john.doe@test.ducapp.net",
"identityNumber": "035742265",
"street": "Schoenersville Rd",
"houseNumber": "2118",
"city": "PA",
"country": "United States",
"zipcode": "18017",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATQAAAEzCAIAAAAw5mh...",
"source1": {
"url": "https://www.someimage.com/url/passportImage.jpg",
"name": "passportPicture",
"type": "mime/jpg",
"size": "50"
},
"source2": {
"url": "https://www.someimage.com/url/licenceImage.jpg",
"name": "drivingLicence",
"type": "mime/jpg",
"size": "50"
},
"province": "Pennsylvania",
"birthDate": "1984-11-20",
"country_iso_code": "US",
"password": "$2y$10$EiZYJxdFvdTBfY97uTfU1e11U5vAFmxTnAQ5M.d0q8zU9",
"areConditionsAccepted": "true"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"user": {
"connected": false,
"deleted": false,
"loginFailCount": 0,
"blockedUntil": null,
"disabled": false,
"isBlocked": false,
"validatedUser": false,
"isBusinessType": false,
"firstLoginRequired": true,
"changePasswordRequired": false,
"twofAuthEnabled": false,
"registeredUser": false,
"defaultCurrency": "USD",
"language": "EN",
"allowFaceRecognition": true,
"needKYCVerification": false,
"verified": false,
"userWasUpdate": false,
"trustLevel": 0,
"transactionCount": 0,
"beneficiaries": [],
"requestOTPCount": 0,
"_id": "63c97c15ec25226662f661ed",
"firstName": "John",
"lastName": "Doe",
"phone": "+1-202-555-0106",
"identityNumber": "035742265",
"street": "Schoenersville Rd",
"houseNumber": "2118",
"city": "PA",
"country": "United States",
"zipcode": "18017",
"birthDate": "1984-11-20T00:00:00.000Z",
"email": "john.doe@test.ducapp.net",
"activationCode": "519260",
"status": "Pending",
"walletAddress": "0x714A084613d73465844260bE9f6352CfB00e7aEe",
"reviews": [],
"createdAt": "2023-01-19T17:21:25.829Z",
"updatedAt": "2023-01-19T17:21:25.829Z",
"nameFull": "John Doe",
"fullNameShort": "John D.",
"fullNameLong": "John Doe",
"fullName": "John Doe",
"score": 3,
"id": "63c97c15ec25226662f661ed"
}
}
Request
POST /api/private/users/register
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
appVersion |
string | Allowed version to interact with the platform |
language |
string | The preferred user language |
defaultCurrency |
string | The preferred user currency |
providerValue |
string | The user email |
password |
string | The user password |
firstName |
string | The user firstName |
lastName |
string | The user lastName |
phone |
string | The user phone number |
birthDate |
string | The user birthdate |
identityNumber |
string | The user identity number |
houseNumber |
string | The user identity house number |
street |
string | The user street name |
city |
string | The user city name |
zipcode |
string | The user zipcode number |
province |
string | The user province name |
country |
string | The user country name |
country_iso_code |
string | The user country ISO code in alpha2 format |
areConditionsAccepted |
string | The user agreement to use his data for verification purpose |
source1 |
{Image} |
The user passport picture |
source2 |
{Image} |
The user driving license picture |
image |
base64 string image | The user pattern picture |
Image
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Url to access the image asset |
name |
string | Name of the image asset |
type |
string | Type of the image asset (mime/jpg) |
size |
string | Size of the image asset |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
user |
Object | The user info (see below) |
user Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
connected |
boolean | Whether the user is currently connected |
deleted |
boolean | Whether the user account is deleted |
loginFailCount |
number | Number of failed login attempts |
blockedUntil |
string|null | Date until the user is blocked (null if not blocked) |
disabled |
boolean | Whether the account is disabled |
isBlocked |
boolean | Whether the user is blocked |
validatedUser |
boolean | Whether the user is validated |
isBusinessType |
boolean | Whether the account type is business |
firstLoginRequired |
boolean | Whether the user must complete a first login action |
changePasswordRequired |
boolean | Whether the user must change their password |
twofAuthEnabled |
boolean | Whether two-factor authentication is enabled |
registeredUser |
boolean | Whether the user has completed registration |
defaultCurrency |
string | Default currency for transactions (e.g., USD) |
language |
string | Preferred language code (e.g., EN) |
allowFaceRecognition |
boolean | Whether the user allows face recognition |
needKYCVerification |
boolean | Whether KYC verification is required |
verified |
boolean | Whether the user is verified |
userWasUpdate |
boolean | Whether the user information was updated |
trustLevel |
number | User trust level (numeric score) |
transactionCount |
number | Total number of transactions performed by the user |
beneficiaries |
[string] | Array of beneficiary IDs linked to the user |
requestOTPCount |
number | Number of OTP requests made by the user |
_id |
string | Unique user identifier |
firstName |
string | User’s first name |
lastName |
string | User’s last name |
phone |
string | User’s phone number |
identityNumber |
string | User’s identity number |
street |
string | Street address |
houseNumber |
string | House number |
city |
string | User’s city |
country |
string | Country name |
zipcode |
string | Postal/ZIP code |
birthDate |
string | User’s birthdate (ISO 8601 format) |
email |
string | User’s email address |
activationCode |
string | Activation code for user registration |
status |
string | Current account status (e.g., Pending) |
walletAddress |
string | Blockchain wallet address of the user |
reviews |
array | Array of user reviews (empty if none) |
createdAt |
string | Timestamp of account creation |
updatedAt |
string | Timestamp of last update |
nameFull |
string | Full formatted name |
fullNameShort |
string | Short version of the user’s full name |
fullNameLong |
string | Long version of the user’s full name |
fullName |
string | User’s complete name |
score |
number | User score |
id |
string | Alias for _id (same value) |
Verify User
This endpoint could be used to verify user's email or phone number and change the user status to Activated.
import requests
import json
url = "https://backend.ducapp.net/api/private/users/verify"
payload = json.dumps({
"userID": "61c0da6a7623905113d7683e",
"activationCode": "162660"
})
headers = {
'x-api-key': `<YOUR_API_KEY>`,
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/users/verify' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"userID": "61c0da6a7623905113d7683e",
"activationCode": "162660"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
userID: "61c0da6a7623905113d7683e",
activationCode: "162660",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/verify", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
{
"validatedUser": true,
"message": "Your account has been validated. Welcome to DUC App!!!"
}
Request
POST /api/private/users/verify
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
userID |
string | Id of the user to be activated |
activationCode |
string | Code send to the user phone or email |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
validatedUser |
boolean | Indicates if the user has been validated or not |
message |
string | Description of the response |
Update User
Endpoint to update the authenticated user data.
import requests
import json
url = "https://backend.ducapp.net/api/private/users/update"
payload = json.dumps({
"image": "data:image/png;base64,iVBORw0KGgoAAAANS...",
"firstName": "Jane"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("PATCH", url, headers=headers, data=payload)
print(response.text)curl --location --request PATCH 'https://backend.ducapp.net/api/private/users/verify' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"image": "data:image/png;base64,iVBORw0KGgoAAAANS...",
"firstName": "Jane"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
image: "data:image/png;base64,iVBORw0KGgoAAAANS...",
firstName: "Jane",
});
var requestOptions = {
method: "PATCH",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/verify", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
{
"user": {
"connected": false,
"deleted": false,
"loginFailCount": 0,
"blockedUntil": null,
"disabled": false,
"isBlocked": false,
"validatedUser": true,
"isBusinessType": false,
"firstLoginRequired": true,
"changePasswordRequired": false,
"twofAuthEnabled": false,
"registeredUser": false,
"defaultCurrency": "USD",
"language": "EN",
"allowFaceRecognition": true,
"needKYCVerification": false,
"verified": false,
"userWasUpdate": true,
"trustLevel": 1,
"transactionCount": 0,
"beneficiaries": [],
"requestOTPCount": 0,
"_id": "63c97c15ec25226662f661ed",
"firstName": "Jane",
"lastName": "Doe",
"phone": "+1-202-555-0106",
"identityNumber": "035742265",
"street": "Schoenersville Rd",
"houseNumber": "2118",
"city": "PA",
"country": "United States",
"zipcode": "18017",
"birthDate": "1984-11-20T00:00:00.000Z",
"email": "john.doe@test.ducapp.net",
"activationCode": null,
"status": "Activated",
"walletAddress": "0x714A084613d73465844260bE9f6352CfB00e7aEe",
"reviews": [],
"createdAt": "2023-01-19T17:21:25.829Z",
"updatedAt": "2023-01-19T17:40:37.528Z",
"nameFull": "Jane Doe",
"kyc": {
"RecordStatus": "nomatch",
"consultedAt": "2023-01-19T17:21:41.170Z",
"transactionID": "1b983b75-571a-4ef5-806c-c194ea31c5cd",
"gatheredInfo": "{\"PersonInfo\":{\"FirstGivenName\":\"John\",\"FirstSurName\":\"Doe\",\"DayOfBirth\":21,\"MonthOfBirth\":11,\"YearOfBirth\":1984},\"Location\":{\"BuildingNumber\":\"2118\",\"StreetName\":\"Schoenersville Rd\",\"City\":\"PA\",\"StateProvinceCode\":\"Pennsylvania\",\"PostalCode\":\"18017\"}}"
},
"lastLoginAt": "2023-01-19T17:39:47.916Z",
"fullNameShort": "Jane D.",
"fullNameLong": "Jane Doe",
"fullName": "Jane Doe",
"score": 3,
"id": "63c97c15ec25226662f661ed"
}
}
Request
PATCH /api/private/users/update
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
The fields of the request body are all completely optional, you can send an empty body and still get a response without any update on the previous fields.
| NAME | TYPE | DESCRIPTION |
|---|---|---|
firstName |
string | The user firstName |
lastName |
string | The user lastName |
phone |
string | The user phone number |
birthDate |
string | The user birthDate |
identityNumber |
string | The user identity number |
houseNumber |
string | The user identity house number |
street |
string | The user street name |
city |
string | The user city name |
zipcode |
string | The user zipcode number |
province |
string | The user province name |
country |
string | The user country name |
country_iso_code |
string | The user country ISO code in alpha2 format |
source1 |
{image} |
The user passport picture |
source2 |
{image} |
The user driving license picture |
image |
base64 string image | The user pattern picture |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
user |
object | User object containing all user data |
user Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
connected |
boolean | Whether the user is currently connected |
deleted |
boolean | Whether the user account is deleted |
loginFailCount |
number | Number of failed login attempts |
blockedUntil |
string|null | Date until the user is blocked (null if not blocked) |
disabled |
boolean | Whether the account is disabled |
isBlocked |
boolean | Whether the user is blocked |
validatedUser |
boolean | Whether the user is validated |
isBusinessType |
boolean | Whether the account type is business |
firstLoginRequired |
boolean | Whether the user must complete a first login action |
changePasswordRequired |
boolean | Whether the user must change their password |
twofAuthEnabled |
boolean | Whether two-factor authentication is enabled |
registeredUser |
boolean | Whether the user has completed registration |
defaultCurrency |
string | Default currency for transactions (e.g., CAD) |
language |
string | Preferred language code (e.g., es_ES) |
allowFaceRecognition |
boolean | Whether the user allows face recognition |
needKYCVerification |
boolean | Whether KYC verification is required |
verified |
boolean | Whether the user is verified |
userWasUpdate |
boolean | Whether the user information was updated |
trustLevel |
number | User trust level (numeric score) |
transactionCount |
number | Total number of transactions performed by the user |
beneficiaries |
[string] | Array of beneficiary IDs linked to the user |
requestOTPCount |
number | Number of OTP requests made by the user |
_id |
string | Unique user identifier |
firstName |
string | User’s first name |
lastName |
string | User’s last name |
avatar |
string | URL to the user’s avatar image |
walletAddress |
string | Blockchain wallet address of the user |
status |
string | Current account status (e.g., Activated) |
email |
string | User’s email address |
reviews |
array | Array of user reviews (empty if none) |
createdAt |
string | Timestamp of account creation |
updatedAt |
string | Timestamp of last update |
lastLoginAt |
string | Timestamp of the last login |
location |
object | Location object (see below) |
location_timestamp |
number | Timestamp when the location was recorded |
activeCreditCard |
object|null | Active credit card details if available |
address |
string|null | User’s address |
biometricPublicKey |
string|null | Public key for biometric authentication |
birthDate |
string | User’s birthdate (ISO 8601 format) |
identityNumber |
string | User’s identity number |
phone |
string | User’s phone number |
country |
string | Country name |
country_iso_code |
string | Country ISO code |
nameFull |
string | Full formatted name |
availableServices |
object | Object containing flags for all services available to the user (see below) |
activationCode |
string|null | Activation code if required |
city |
string | User’s city |
houseNumber |
string | House number |
street |
string | Street address |
zipcode |
string | Postal/ZIP code |
fullNameShort |
string | Short version of the user’s full name |
fullNameLong |
string | Long version of the user’s full name |
fullName |
string | User’s complete name |
fullAddress |
string | Full formatted address |
score |
number | User score |
id |
string | Alias for _id (same value) |
location Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
coordinates |
[number] | Array with longitude and latitude |
_id |
string | Location object ID |
type |
string | Geometry type (e.g., Point) |
availableServices Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
ADD_FUND |
boolean | Ability to add funds to the wallet |
BANK_ACCOUNT_TRANSACTION |
boolean | Enable bank account transactions |
CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions |
CREDIT_CARD_TRANSACTION_USD |
boolean | Enable credit card transactions in USD |
MLC_CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions in MLC |
DELIVERY_TRANSACTION |
boolean | Enable delivery transactions |
DELIVERY_TRANSACTION_USD |
boolean | Enable delivery transactions in USD |
THUNES_TRANSACTION |
boolean | Enable Thunes transactions |
EMAIL_MONEY_TRANSACTION |
boolean | Enable email-based money transfers |
EMAIL_PAYMENT_REQUEST |
boolean | Enable email-based payment requests |
PAYMENT_REQUEST |
boolean | Whether generic payment requests are enabled |
P2P_TRANSFER |
boolean | Enable peer-to-peer transfers |
TOKENS_BUY |
boolean | Ability to buy tokens |
TOKENS_BUY_MCP |
boolean | Ability to buy tokens using MCP |
TOKENS_BUY_CRYPTO |
boolean | Ability to buy tokens using cryptocurrencies |
TOKENS_BUY_GPAY |
boolean | Ability to buy tokens with Google Pay |
TOKENS_BUY_APPLE_PAY |
boolean | Ability to buy tokens with Apple Pay |
TOKEN_EXCHANGE |
boolean | Whether token exchange is available |
TOPUP_RECHARGE |
boolean | Enable top-up recharges |
TOKENS_BUY_INLINE |
boolean | Ability to buy tokens inline |
TOKENS_BUY_CRYPTO_INLINE |
boolean | Inline token purchase with cryptocurrencies |
TOKENS_BUY_GPAY_INLINE |
boolean | Inline token purchase with Google Pay |
TOKENS_BUY_APPLE_PAY_INLINE |
boolean | Inline token purchase with Apple Pay |
EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline email-based payment requests |
ZELLE_EMAIL_PAYMENT_REQUEST |
boolean | Enable Zelle email payment requests |
ZELLE_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline Zelle email payment requests |
TOKENS_BUY_CRYPTO_APPLE |
boolean | Ability to buy tokens with crypto via Apple Pay |
SEPA_EMAIL_PAYMENT_REQUEST |
boolean | Enable SEPA email payment requests |
ACH_EMAIL_PAYMENT_REQUEST |
boolean | Enable ACH email payment requests |
MLC_PAYMENT_REQUEST |
boolean | Enable MLC-based payment requests |
PAYMENT_LINK_REQUEST |
boolean | Enable payment link requests |
INSTAPAY_EUROPA |
boolean | Enable Instapay services in Europe |
SCAN_PAY_P2P_TRANSFER |
boolean | Enable peer-to-peer transfers via Scan & Pay |
DELIVERY_TRANSACTION_EUR |
boolean | Enable delivery transactions in EUR |
TOKENS_BUY_CRYPTO_INLINE_APPLE |
boolean | Inline crypto purchase via Apple Pay |
SEPA_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline SEPA email payment requests |
ACH_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline ACH email payment requests |
MLC_PAYMENT_REQUEST_INLINE |
boolean | Inline MLC payment requests |
PAYMENT_LINK_REQUEST_INLINE |
boolean | Inline payment link requests |
INSTAPAY_EUROPA_INLINE |
boolean | Inline Instapay Europe services |
Get User
Endpoint to get the authenticated user data.
import requests
import json
url = "https://backend.ducapp.net/api/private/users"
payload = json.dumps({})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/users' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: "POST",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
{
"user": {
"connected": false,
"deleted": false,
"loginFailCount": 0,
"blockedUntil": null,
"disabled": false,
"isBlocked": false,
"validatedUser": true,
"isBusinessType": false,
"firstLoginRequired": true,
"changePasswordRequired": false,
"twofAuthEnabled": false,
"registeredUser": false,
"defaultCurrency": "USD",
"language": "EN",
"allowFaceRecognition": true,
"needKYCVerification": false,
"verified": false,
"userWasUpdate": true,
"trustLevel": 1,
"transactionCount": 0,
"beneficiaries": [],
"requestOTPCount": 0,
"_id": "63c97c15ec25226662f661ed",
"firstName": "Jane",
"lastName": "Doe",
"phone": "+1-202-555-0106",
"identityNumber": "035742265",
"street": "Schoenersville Rd",
"houseNumber": "2118",
"city": "PA",
"country": "United States",
"zipcode": "18017",
"birthDate": "1984-11-20T00:00:00.000Z",
"email": "john.doe@test.ducapp.net",
"activationCode": null,
"status": "Activated",
"walletAddress": "0x714A084613d73465844260bE9f6352CfB00e7aEe",
"reviews": [],
"createdAt": "2023-01-19T17:21:25.829Z",
"updatedAt": "2023-01-19T17:40:37.528Z",
"nameFull": "Jane Doe",
"kyc": {
"RecordStatus": "nomatch",
"consultedAt": "2023-01-19T17:21:41.170Z",
"transactionID": "1b983b75-571a-4ef5-806c-c194ea31c5cd",
"gatheredInfo": "{\"PersonInfo\":{\"FirstGivenName\":\"John\",\"FirstSurName\":\"Doe\",\"DayOfBirth\":21,\"MonthOfBirth\":11,\"YearOfBirth\":1984},\"Location\":{\"BuildingNumber\":\"2118\",\"StreetName\":\"Schoenersville Rd\",\"City\":\"PA\",\"StateProvinceCode\":\"Pennsylvania\",\"PostalCode\":\"18017\"}}"
},
"lastLoginAt": "2023-01-19T17:39:47.916Z"
}
}
Request
POST /api/private/users
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
user |
Object | The user info |
user Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
connected |
boolean | Whether the user is currently connected |
deleted |
boolean | Whether the user account is deleted |
loginFailCount |
number | Number of failed login attempts |
blockedUntil |
string|null | Date until the user is blocked (null if not blocked) |
disabled |
boolean | Whether the account is disabled |
isBlocked |
boolean | Whether the user is blocked |
validatedUser |
boolean | Whether the user is validated |
isBusinessType |
boolean | Whether the account type is business |
firstLoginRequired |
boolean | Whether the user must complete a first login action |
changePasswordRequired |
boolean | Whether the user must change their password |
twofAuthEnabled |
boolean | Whether two-factor authentication is enabled |
registeredUser |
boolean | Whether the user has completed registration |
defaultCurrency |
string | Default currency for transactions (e.g., CAD) |
language |
string | Preferred language code (e.g., es_ES) |
allowFaceRecognition |
boolean | Whether the user allows face recognition |
needKYCVerification |
boolean | Whether KYC verification is required |
verified |
boolean | Whether the user is verified |
userWasUpdate |
boolean | Whether the user information was updated |
trustLevel |
number | User trust level (numeric score) |
transactionCount |
number | Total number of transactions performed by the user |
beneficiaries |
[string] | Array of beneficiary IDs linked to the user |
requestOTPCount |
number | Number of OTP requests made by the user |
_id |
string | Unique user identifier |
firstName |
string | User’s first name |
lastName |
string | User’s last name |
avatar |
string | URL to the user’s avatar image |
walletAddress |
string | Blockchain wallet address of the user |
status |
string | Current account status (e.g., Activated) |
email |
string | User’s email address |
reviews |
array | Array of user reviews (empty if none) |
createdAt |
string | Timestamp of account creation |
updatedAt |
string | Timestamp of last update |
lastLoginAt |
string | Timestamp of the last login |
location |
object | Location object (see below) |
location_timestamp |
number | Timestamp when the location was recorded |
activeCreditCard |
object|null | Active credit card details if available |
address |
string|null | User’s address |
biometricPublicKey |
string|null | Public key for biometric authentication |
birthDate |
string | User’s birthdate (ISO 8601 format) |
identityNumber |
string | User’s identity number |
phone |
string | User’s phone number |
country |
string | Country name |
country_iso_code |
string | Country ISO code |
nameFull |
string | Full formatted name |
availableServices |
object | Object containing flags for all services available to the user (see below) |
activationCode |
string|null | Activation code if required |
city |
string | User’s city |
houseNumber |
string | House number |
street |
string | Street address |
zipcode |
string | Postal/ZIP code |
fullNameShort |
string | Short version of the user’s full name |
fullNameLong |
string | Long version of the user’s full name |
fullName |
string | User’s complete name |
fullAddress |
string | Full formatted address |
score |
number | User score |
id |
string | Alias for _id (same value) |
source1 |
object | First verification source, passport (see below) |
source2 |
object | Second verification source, driving license / DNI (see below) |
location Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
coordinates |
[number] | Array with longitude and latitude |
_id |
string | Location object ID |
type |
string | Geometry type (e.g., Point) |
availableServices Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
PAYMENT_REQUEST |
boolean | Whether generic payment requests are enabled |
TOKENS_BUY |
boolean | Ability to buy tokens |
TOKENS_BUY_GPAY |
boolean | Ability to buy tokens with Google Pay |
TOKENS_BUY_APPLE_PAY |
boolean | Ability to buy tokens with Apple Pay |
TOKENS_BUY_CRYPTO |
boolean | Ability to buy tokens using cryptocurrencies |
TOKENS_BUY_CRYPTO_APPLE |
boolean | Ability to buy tokens with crypto via Apple Pay |
EMAIL_PAYMENT_REQUEST |
boolean | Enable email-based payment requests |
ZELLE_EMAIL_PAYMENT_REQUEST |
boolean | Enable Zelle email payment requests |
SEPA_EMAIL_PAYMENT_REQUEST |
boolean | Enable SEPA email payment requests |
ACH_EMAIL_PAYMENT_REQUEST |
boolean | Enable ACH email payment requests |
MLC_PAYMENT_REQUEST |
boolean | Enable MLC-based payment requests |
PAYMENT_LINK_REQUEST |
boolean | Enable payment link requests |
INSTAPAY_EUROPA |
boolean | Enable Instapay services in Europe |
AUTHORIZENET_CAD |
boolean | Enable Authorize.net payments in CAD |
AUTHORIZENET_USD |
boolean | Enable Authorize.net payments in USD |
TOKEN_EXCHANGE |
boolean | Whether token exchange is available |
TOKENS_BUY_MCP |
boolean | Ability to buy tokens using MCP |
ADD_FUND |
boolean | Ability to add funds to the wallet |
P2P_TRANSFER |
boolean | Enable peer-to-peer transfers |
SCAN_PAY_P2P_TRANSFER |
boolean | Enable peer-to-peer transfers via Scan & Pay |
TOPUP_RECHARGE |
boolean | Enable top-up recharges |
CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions |
CREDIT_CARD_TRANSACTION_USD |
boolean | Enable credit card transactions in USD |
MLC_CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions in MLC |
DELIVERY_TRANSACTION |
boolean | Enable delivery transactions |
DELIVERY_TRANSACTION_USD |
boolean | Enable delivery transactions in USD |
DELIVERY_TRANSACTION_EUR |
boolean | Enable delivery transactions in EUR |
EMAIL_MONEY_TRANSACTION |
boolean | Enable email-based money transfers |
THUNES_TRANSACTION |
boolean | Enable Thunes transactions |
BANK_ACCOUNT_TRANSACTION |
boolean | Enable bank account transactions |
TOKENS_BUY_INLINE |
boolean | Ability to buy tokens inline |
TOKENS_BUY_GPAY_INLINE |
boolean | Inline token purchase with Google Pay |
TOKENS_BUY_APPLE_PAY_INLINE |
boolean | Inline token purchase with Apple Pay |
TOKENS_BUY_CRYPTO_INLINE |
boolean | Inline token purchase with cryptocurrencies |
TOKENS_BUY_CRYPTO_INLINE_APPLE |
boolean | Inline crypto purchase via Apple Pay |
EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline email-based payment requests |
ZELLE_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline Zelle email payment requests |
SEPA_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline SEPA email payment requests |
ACH_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline ACH email payment requests |
MLC_PAYMENT_REQUEST_INLINE |
boolean | Inline MLC payment requests |
PAYMENT_LINK_REQUEST_INLINE |
boolean | Inline payment link requests |
INSTAPAY_EUROPA_INLINE |
boolean | Inline Instapay Europe services |
AUTHORIZENET_CAD_INLINE |
boolean | Inline Authorize.net payments in CAD |
AUTHORIZENET_USD_INLINE |
boolean | Inline Authorize.net payments in USD |
source Object (source1 / source2)
| NAME | TYPE | DESCRIPTION |
|---|---|---|
isActive |
boolean | Whether this verification source is active |
wasChanged |
boolean | Whether this source was modified |
verificationId |
string | Unique ID of the verification process |
_id |
string | Unique identifier |
name |
string | Name of the document/source (e.g., Passport) |
allowAttachment |
boolean | Whether attachments are allowed |
order |
number | Order priority of the verification |
key |
string | Key identifier of the source |
Find User by ID
Endpoint to obtain a specific user profile by user ID.
curl --location --request GET 'https://backend.ducapp.net/api/private/users/5ebaf91c80b385353b9283da' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/5ebaf91c80b385353b9283da", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
url = "https://backend.ducapp.net/api/private/users/5ebaf91c80b385353b9283da"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
Example Response:
{
"user": {
"_id": "5ebaf91c80b385353b9283da",
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@gmail.com",
"phone": "+5355555555",
"walletAddress": "0x0F673BAF2C67eb6165CC526df5386032d653fbB4",
"status": "Activated",
"defaultCurrency": "USD",
"language": "en_US",
"trustLevel": 8,
"isBlocked": false,
"verified": true,
"registeredUser": true,
"providersNotification": [
{ "provider": "email", "active": true },
{ "provider": "sms", "active": true },
{ "provider": "push", "active": true }
],
"privacyConfigurationsSettings": [
{ "key": "localization", "value": true }
],
"identityNumber": "02090970502",
"country": "Canada",
"country_iso_code": "CAN",
"city": "Toronto",
"street": "Main Street 123",
"houseNumber": "16",
"zipcode": "M5J2N8",
"createdAt": "2020-03-10T15:57:56.489Z",
"updatedAt": "2025-08-21T19:31:02.589Z",
"lastLoginAt": "2025-08-21T19:31:02.324Z",
"score": 3
}
}
Request
GET /api/private/users/{userId}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Path Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
userId |
string | The unique user ID |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
user |
object | Main container with user data |
firstName / lastName |
string | User’s first and last name |
email / phone |
string | Registered email and phone number |
walletAddress |
string | Wallet address linked to the account |
status |
string | Account status (e.g., Activated) |
defaultCurrency |
string | Default selected currency |
language |
string | Preferred language (locale) |
trustLevel |
number | User trust/security score |
isBlocked |
boolean | Whether the user is blocked or not |
verified |
boolean | Whether the user is identity-verified |
registeredUser |
boolean | Whether the user is fully registered |
providersNotification |
array | Notification providers (email, sms, push) |
privacyConfigurationsSettings |
array | Privacy preferences (e.g. localization sharing) |
identityNumber |
string | User identity or document number |
country / city / street |
string | User residence information |
houseNumber / zipcode |
string | Address details |
createdAt / updatedAt |
datetime | Account creation and last update timestamps |
lastLoginAt |
datetime | Last login datetime |
score |
number | Internal user score |
Find Users
Endpoint to search for users by a given value (e.g., name, email, phone number).
curl --location --request POST 'https://backend.ducapp.net/api/private/users/find' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"value": "john.doe@test.com",
"projection": {
"firstName": 1,
"lastName": 1,
"email": 1,
"phone": 1
},
"limit": 1
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"value": "john.doe@test.com",
"projection": {
"firstName": 1,
"lastName": 1,
"email": 1,
"phone": 1
},
"limit": 1
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/find", requestOptions)
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://backend.ducapp.net/api/private/users/find"
payload = json.dumps({
"value": "john.doe@test.com",
"projection": {
"firstName": 1,
"lastName": 1,
"email": 1,
"phone": 1
},
"limit": 1
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"users": [
{
"_id": "64a97c15ec25226662f661ed",
"firstName": "John",
"lastName": "Doe",
"email": "john.doe@test.com",
"phone": "+1-202-555-0123",
"fullNameShort": "John D.",
"fullNameLong": "John Doe",
"fullName": "John Doe",
"fullAddress": "123 Main St, New York, USA",
"score": 3,
"id": "64a97c15ec25226662f661ed"
}
]
}
Request
POST /api/private/users/find
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
value |
string | Text to search for (can be name, email, phone, etc.) |
projection |
object | Fields to return for each user (similar to MongoDB projection). (Default: all) |
limit |
number | Maximum number of results. (Default = 10) |
Only the value field is required, projection and limit are optional
If you specify a projection you will recieve only _id, fullNameShort, fullAddress, score, id and the values specified on the proyection.
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
users |
[object] | Array of users matching the search criteria |
user Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
connected |
boolean | Whether the user is currently connected |
deleted |
boolean | Whether the user account is deleted |
loginFailCount |
number | Number of failed login attempts |
blockedUntil |
string|null | Date until the user is blocked (null if not blocked) |
disabled |
boolean | Whether the account is disabled |
isBlocked |
boolean | Whether the user is blocked |
validatedUser |
boolean | Whether the user is validated |
isBusinessType |
boolean | Whether the account type is business |
firstLoginRequired |
boolean | Whether the user must complete a first login action |
changePasswordRequired |
boolean | Whether the user must change their password |
twofAuthEnabled |
boolean | Whether two-factor authentication is enabled |
registeredUser |
boolean | Whether the user has completed registration |
defaultCurrency |
string | Default currency for transactions (e.g., CAD) |
language |
string | Preferred language code (e.g., es_ES) |
allowFaceRecognition |
boolean | Whether the user allows face recognition |
needKYCVerification |
boolean | Whether KYC verification is required |
verified |
boolean | Whether the user is verified |
userWasUpdate |
boolean | Whether the user information was updated |
trustLevel |
number | User trust level (numeric score) |
transactionCount |
number | Total number of transactions performed by the user |
beneficiaries |
[string] | Array of beneficiary IDs linked to the user |
requestOTPCount |
number | Number of OTP requests made by the user |
_id |
string | Unique user identifier |
firstName |
string | User’s first name |
lastName |
string | User’s last name |
avatar |
string | URL to the user’s avatar image |
walletAddress |
string | Blockchain wallet address of the user |
status |
string | Current account status (e.g., Activated) |
email |
string | User’s email address |
reviews |
array | Array of user reviews (empty if none) |
createdAt |
string | Timestamp of account creation |
updatedAt |
string | Timestamp of last update |
lastLoginAt |
string | Timestamp of the last login |
location |
object | Location object (see below) |
location_timestamp |
number | Timestamp when the location was recorded |
activeCreditCard |
object|null | Active credit card details if available |
address |
string|null | User’s address |
biometricPublicKey |
string|null | Public key for biometric authentication |
birthDate |
string | User’s birthdate (ISO 8601 format) |
identityNumber |
string | User’s identity number |
phone |
string | User’s phone number |
country |
string | Country name |
country_iso_code |
string | Country ISO code |
nameFull |
string | Full formatted name |
availableServices |
object | Object containing flags for all services available to the user (see below) |
activationCode |
string|null | Activation code if required |
city |
string | User’s city |
houseNumber |
string | House number |
street |
string | Street address |
zipcode |
string | Postal/ZIP code |
fullNameShort |
string | Short version of the user’s full name |
fullNameLong |
string | Long version of the user’s full name |
fullName |
string | User’s complete name |
fullAddress |
string | Full formatted address |
score |
number | User score |
id |
string | Alias for _id (same value) |
location Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
coordinates |
[number] | Array with longitude and latitude |
_id |
string | Location object ID |
type |
string | Geometry type (e.g., Point) |
availableServices Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
ADD_FUND |
boolean | Ability to add funds to the wallet |
BANK_ACCOUNT_TRANSACTION |
boolean | Enable bank account transactions |
CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions |
CREDIT_CARD_TRANSACTION_USD |
boolean | Enable credit card transactions in USD |
MLC_CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions in MLC |
DELIVERY_TRANSACTION |
boolean | Enable delivery transactions |
DELIVERY_TRANSACTION_USD |
boolean | Enable delivery transactions in USD |
THUNES_TRANSACTION |
boolean | Enable Thunes transactions |
EMAIL_MONEY_TRANSACTION |
boolean | Enable email-based money transfers |
EMAIL_PAYMENT_REQUEST |
boolean | Enable email-based payment requests |
PAYMENT_REQUEST |
boolean | Whether generic payment requests are enabled |
P2P_TRANSFER |
boolean | Enable peer-to-peer transfers |
TOKENS_BUY |
boolean | Ability to buy tokens |
TOKENS_BUY_MCP |
boolean | Ability to buy tokens using MCP |
TOKENS_BUY_CRYPTO |
boolean | Ability to buy tokens using cryptocurrencies |
TOKENS_BUY_GPAY |
boolean | Ability to buy tokens with Google Pay |
TOKENS_BUY_APPLE_PAY |
boolean | Ability to buy tokens with Apple Pay |
TOKEN_EXCHANGE |
boolean | Whether token exchange is available |
TOPUP_RECHARGE |
boolean | Enable top-up recharges |
TOKENS_BUY_INLINE |
boolean | Ability to buy tokens inline |
TOKENS_BUY_CRYPTO_INLINE |
boolean | Inline token purchase with cryptocurrencies |
TOKENS_BUY_GPAY_INLINE |
boolean | Inline token purchase with Google Pay |
TOKENS_BUY_APPLE_PAY_INLINE |
boolean | Inline token purchase with Apple Pay |
EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline email-based payment requests |
ZELLE_EMAIL_PAYMENT_REQUEST |
boolean | Enable Zelle email payment requests |
ZELLE_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline Zelle email payment requests |
TOKENS_BUY_CRYPTO_APPLE |
boolean | Ability to buy tokens with crypto via Apple Pay |
SEPA_EMAIL_PAYMENT_REQUEST |
boolean | Enable SEPA email payment requests |
ACH_EMAIL_PAYMENT_REQUEST |
boolean | Enable ACH email payment requests |
MLC_PAYMENT_REQUEST |
boolean | Enable MLC-based payment requests |
PAYMENT_LINK_REQUEST |
boolean | Enable payment link requests |
INSTAPAY_EUROPA |
boolean | Enable Instapay services in Europe |
SCAN_PAY_P2P_TRANSFER |
boolean | Enable peer-to-peer transfers via Scan & Pay |
DELIVERY_TRANSACTION_EUR |
boolean | Enable delivery transactions in EUR |
TOKENS_BUY_CRYPTO_INLINE_APPLE |
boolean | Inline crypto purchase via Apple Pay |
SEPA_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline SEPA email payment requests |
ACH_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline ACH email payment requests |
MLC_PAYMENT_REQUEST_INLINE |
boolean | Inline MLC payment requests |
PAYMENT_LINK_REQUEST_INLINE |
boolean | Inline payment link requests |
INSTAPAY_EUROPA_INLINE |
boolean | Inline Instapay Europe services |
Get Balance
Endpoint to get the balance of the authenticated user.
import requests
import json
url = "https://backend.ducapp.net/api/private/users/get-balance"
payload = json.dumps({})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({});
var requestOptions = {
method: "GET",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/get-balance", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));curl --location --request GET 'https://backend.ducapp.net/api/private/users/get-balance' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{}'
Example Response:
{
"balance": [
{
"currency": "USD",
"amount": 0
},
{
"currency": "CAD",
"amount": 0
},
{
"currency": "CUP",
"amount": 0
},
{
"currency": "EUR",
"amount": 0
}
]
}
Request
GET /api/private/users/get-balance
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
balance |
[Account] |
Array of Account with the balance of each coin |
Account Array
| NAME | TYPE | DESCRIPTION |
|---|---|---|
currency |
string | Code of the account currency |
amount |
float | Amount of the account |
Get User System Status
Endpoint to obtain the logged-in user system status.
curl --location --request GET 'https://backend.ducapp.net/api/v2/settings/' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/v2/settings/", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
url_all = "https://backend.ducapp.net/api/v2/settings/"
url_one = "https://backend.ducapp.net/api/v2/settings/exchange_spread"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response_all = requests.request("GET", url_all, headers=headers)
print(response_all.text)
Example Response:
{
"payment_link_auto_expiry_recurrence": {
"_id": "686dd3498905cfc72673a727",
"key": "payment_link_auto_expiry_recurrence",
"active": true,
"createdAt": "2025-07-09T02:26:17.438Z",
"updatedAt": "2025-07-09T03:25:50.258Z",
"value": {
"type": "expression",
"cronSpec": "0 0 1 * * *",
"recurrenceType": "expression"
},
"valueType": "json"
},
"enable_custom_payment_link": {
"_id": "683fbfd11c5c316ec7f37dcd",
"key": "enable_custom_payment_link",
"active": true,
"createdAt": "2025-06-04T03:38:57.760Z",
"updatedAt": "2025-06-04T03:44:06.586Z",
"value": false,
"valueType": "boolean"
}
///Rest of the settings...
}
Example Response:
{
"exchange_spread": {
"_id": "5dc0f95add34e70f6ed9efb1",
"active": true,
"key": "exchange_spread",
"value": "2.5",
"type": "coins",
"createdAt": "2019-11-05T04:23:54.353Z",
"updatedAt": "2023-01-30T15:28:36.347Z",
"__v": 0,
"scope": "coins"
}
}
Request
GET /api/v2/settings/
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
None required
Response Body
| Key | Value Type | Value Example | Description |
|---|---|---|---|
payment_link_auto_expiry_recurrence |
JSON | { "type": "expression", "cronSpec": "0 0 1 * * *", "recurrenceType": "expression" } |
Defines recurrence rules for auto-expiring payment links. |
payment_link_auto_expiry_past_times |
JSON | { "unit": "days", "amount": "7" } |
Defines how long past payment links remain valid before expiration. |
enable_custom_payment_link |
Boolean | true |
Enables or disables custom payment links. |
interac_etransfer_minimum_amount |
Number | 0 |
Minimum amount allowed for Interac e-transfer. |
sepa_account_information |
JSON | { "recipientName": "Lemargo Inc", "iban": "GB89...", "bic": "TCCLGB3L" } |
Stores SEPA account information for transfers. |
ach_account_information |
JSON | { "recipientName": "Lemargo Inc", "bankName": "TD Bank", "routingNumber": "004", "accountNumber": "1234567890" } |
ACH account details for US transfers. |
api_client_secret_key |
String | "test.f06f2444-e2ef-5d41-bf1e-de36fec7c2dd" |
Secret key used by API clients for authentication. |
default_receiver_info |
JSON | { "countryCode": "CUB", "address": "CALLE 23...", "city": "PLAZA DE LA REVOLUCIÓN" } |
Default receiver information for money transfers. |
topups_schedule_recurrence_rule |
JSON | { "type": "expression", "cronSpec": "0 0 6 * * *", "recurrenceType": "expression" } |
Defines recurrence schedule for top-up operations. |
default_sender_info |
JSON | { "senderName": "Henry", "senderLastName": "Martinez", "senderDocumentType": "PAS", ... } |
Default sender’s KYC and identity information. |
payments_drop_in |
Boolean | true |
Indicates if "drop-in" payment method is enabled. |
interac_etransfer_update_task |
Boolean | true |
Indicates whether Interac e-transfer updates are active. |
interac_etransfer_update_period |
JSON | { "amount": "15", "unit": "minutes" } |
Frequency of Interac e-transfer update checks. |
interac_etransfer_active |
Boolean | true |
Enables Interac e-transfer service. |
interac_etransfer_moderate |
Boolean | false |
Enables moderation on Interac e-transfers. |
collection_provider |
String | "thunes" |
Provider for collection services. |
payments_provider |
String | "authorizenetcad" |
Payment gateway provider. |
payments_provider_currency |
String | "CAD" |
Currency used by payment provider. |
ftp_export_to_path |
String | "transactionsStatus" |
FTP export directory path. |
ftp_import_from_path |
String | "transactionsFile" |
FTP import directory path. |
ftp_base_path |
String | "data" |
Base FTP directory path. |
valid_kyc_period |
JSON | { "AMOUNT": "6", "UNIT": "months" } |
Period for which KYC remains valid. |
crypto_buy_is_active |
String | "true" |
Indicates if crypto buying is enabled. |
min_amount_to_verification |
Number | 5 |
Minimum transaction amount requiring user verification. |
thunes_source_currency |
String | "USD" |
Source currency for Thunes cashout transactions. |
require_documents_user_register |
Boolean | true |
Whether user registration requires documents. |
user_register_moderate |
Boolean | false |
Enables moderation on new user registrations. |
thunes_exchange_spread |
Number | 0 |
Exchange spread applied to Thunes transactions. |
moderate_thunes_transaction |
Boolean | true |
Enables moderation for Thunes transactions. |
duc_app_fee_multiplier |
Number | 3 |
Application fee multiplier. |
duc_app_fee_percent |
Number | 0 |
Application fee as a percentage. |
max_amount_buy_auto_without_trust_level |
Number | 0 |
Max amount users can buy automatically without trust level. |
max_amount_without_use_face_verification |
Number | 0 |
Max amount allowed without face verification. |
must_use_face_verification |
Boolean | false |
Whether face verification is mandatory. |
cashout_limit_amount |
String | "50" |
Default limit for cashout transactions. |
cashout_min_limit_amount |
Number | 4 |
Minimum allowed cashout amount. |
cashout_max_limit_amount |
Number | 12000000 |
Maximum allowed cashout amount. |
denied_countries_by_sanctions |
Array | ["CF","CG","IR","IQ",...] |
List of countries denied due to sanctions. |
topups_agent_discount_percent |
Number | 10 |
Discount percentage for top-up agents. |
topups_provider |
String | "dtone" |
Provider for top-up services. |
enable_disable_services |
JSON | { "PAYMENT_REQUEST": true, "TOKENS_BUY": false, ... } |
Controls availability of different system services. |
ccard_buying_period |
String | "2419200" |
Credit card buying period (in seconds). |
user_kyc_verification_is_active |
Boolean | true |
Enables KYC verification system. |
is_on_maintenance |
Boolean | false |
Whether the system is under maintenance. |
ccard_buying_amount |
String | "700000" |
Credit card buying amount limit. |
email_money_transfer_address |
String | "emailtransfer@ducapp.com" |
Email address used for money transfers. |
cashout_card_allow_send_money |
Boolean | false |
Whether sending money via cashout card is allowed. |
allowed_app_versions |
Array | ["0.1","1.80.2","2.0.0"] |
Allowed versions of the application. |
topups_discount_percent |
Number | 10 |
Discount applied on top-up transactions. |
exchange_spread |
String | "2.5" |
Exchange spread applied to coin transactions. |
exchange_update_mode |
Number | 6 |
Exchange update frequency/mode. |
apple_pay_buy_is_active |
String | "true" |
Indicates if Apple Pay buy option is active. |
moderate_min_buy_flow_limit |
Number | 5 |
Minimum limit to apply moderation in buy flow. |
user_register_enabled |
Boolean | true |
Enables user registration. |
max_face_detection |
Number | 2 |
Maximum allowed detected faces in verification. |
exchange_fee |
Number | 253.6 |
Exchange fee applied to transactions. |
allowed_email_verification |
Boolean | false |
Whether email verification is allowed. |
mcp_buy_is_active |
Boolean | false |
Enables/disables MCP buy feature. |
expiry_time_transaction_order |
JSON | { "amount": "24", "unit": "hours" } |
Expiry time for transaction orders. |
qr_logo_src |
String | "https://backoffice.ducapp.com/assets/image/logo-collapse.png" |
URL for QR code logo. |
balance_delta |
Number | 0.5 |
Adjustment value applied to balances. |
face_recognition_distance_threshold |
Number | 0.6 |
Threshold for face recognition similarity. |
allowed_phone_verification |
Boolean | false |
Whether phone verification is allowed. |
google_pay_buy_is_active |
String | "true" |
Indicates if Google Pay buy option is active. |
send_user_location_on_buy |
Boolean | false |
Sends user location during buy transactions. |
kyc_verification_items |
JSON | [{"name":"Email","value":"email"},{"name":"Phone","value":"phone"}] |
List of required KYC verification items. |
crypto_spread |
String | "2.5" |
Spread applied to crypto transactions. |
avs_moneris_verify |
Boolean | true |
Enables AVS verification with Moneris. |
cuban_cards_regex |
JSON | { "BPA_CARD": "^((92)\\d{0,2})(1299)\\d{0,8}?$", ... } |
Regex patterns for validating Cuban bank cards. |
validate_captcha_enabled |
Boolean | false |
Whether captcha validation is required. |
check_request_otp |
Boolean | true |
Enables OTP validation for requests. |
request_otp_max |
Number | 5 |
Maximum number of OTP requests allowed. |
request_otp_max_time |
JSON | { "amount": "1", "unit": "days" } |
Maximum time window for OTP requests. |
mailgun_active_domain |
String | "mail.ducapp.com" |
Active Mailgun domain used for sending emails. |
transaction_fee_source |
String | "range" |
Source used for determining transaction fee. |
zelle_money_transfer_address |
String | "emailtransfer@ducapp.com" |
Email address used for Zelle transfers. |
Get User System Status by Key
Endpoint to retrieve the details of a specific application setting using its key.
curl --location --request GET 'https://backend.ducapp.net/api/v2/settings/payments_drop_in' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>'
--header 'Content-Type': application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "<Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/v2/settings/payments_drop_in", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error))import requests
url = "https://backend.ducapp.net/api/v2/settings/payments_drop_in"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
Example Response:
{
"payments_drop_in": {
"_id": "6384ed3aadf38b000e9f54f2",
"key": "payments_drop_in",
"active": true,
"value": true,
"type": "system",
"scope": "payment",
"updatedAt": "2025-05-12T20:11:31.709Z",
"createdAt": "2022-11-28T17:17:46.546Z",
"valueType": "boolean"
}
}
Request
GET /api/v2/settings/{key}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Path Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
settingKey |
string | The key of the setting to be retrieved |
Response Body
The response is an object where the key matches the settingKey.
| NAME | TYPE | DESCRIPTION |
|---|---|---|
_id |
string | Unique identifier of the setting |
active |
boolean | Whether the setting is active |
key |
string | Setting key |
value |
any | Value of the setting (string, number, boolean) |
type |
string | Category/type of the setting (e.g. system, coins, topups) |
scope |
string | Scope of the setting |
createdAt |
string | Timestamp of creation |
updatedAt |
string | Timestamp of last update |
valueType |
string | Defines the type of the value field (e.g., string, number, boolean, json). |
Available key Values
The following keys can be used in the path parameter {key}:
| key | type | scope |
|---|---|---|
| exchange_update_mode | coins | coins |
| exchange_spread | coins | coins |
| ccard_buying_period | blockchain | blockchain |
| email_money_transfer_address | system | email_transfer |
| topups_agent_discount_percent | topups | |
| topups_provider | system | topups |
| duc_app_fee_multiplier | system | cashout |
| moderate_thunes_transaction | system | cashout |
| user_kyc_verification_is_active | system | app |
| apple_pay_buy_is_active | system | app |
| crypto_buy_is_active | system | app |
| moderate_min_buy_flow_limit | system | tokenbuy |
| ftp_base_path | ||
| user_register_enabled | system | signup |
| max_face_detection | system | face-recognition |
| exchange_fee | coins | |
| topups_discount_percent | topups | topups |
| is_on_maintenance | system | app |
| cashout_card_allow_send_money | system | cashout |
| enable_disable_services | system | service |
| min_amount_to_verification | system | app |
| allowed_email_verification | system | signup |
| thunes_exchange_spread | system | cashout |
| cashout_limit_amount | system | cashout |
| valid_kyc_period | system | app |
| mcp_buy_is_active | system | app |
| expiry_time_transaction_order | system |
Get User Service Status
Endpoint to retrieve the status of the different services available to the authenticated user
curl --location --request GET 'https://backend.ducapp.net/api/v2/settings/user/service-status' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>'
--header 'Content-Type: application/jsonvar myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/v2/settings/user/service-status", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
url = "https://backend.ducapp.net/api/v2/settings/user/service-status"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
Example Response:
{
"PAYMENT_REQUEST": true,
"TOKENS_BUY": false,
"TOKENS_BUY_GPAY": false,
"TOKENS_BUY_APPLE_PAY": false,
"TOKENS_BUY_CRYPTO": true,
"TOKENS_BUY_CRYPTO_APPLE": true,
"EMAIL_PAYMENT_REQUEST": true,
"ZELLE_EMAIL_PAYMENT_REQUEST": true,
"SEPA_EMAIL_PAYMENT_REQUEST": true,
"ACH_EMAIL_PAYMENT_REQUEST": true,
"MLC_PAYMENT_REQUEST": false,
"PAYMENT_LINK_REQUEST": true,
"INSTAPAY_EUROPA": true,
"AUTHORIZENET_CAD": true,
"AUTHORIZENET_USD": true,
"TOKEN_EXCHANGE": true,
"TOKENS_BUY_MCP": false,
"ADD_FUND": false,
"P2P_TRANSFER": true,
"SCAN_PAY_P2P_TRANSFER": true,
"TOPUP_RECHARGE": true,
"CREDIT_CARD_TRANSACTION": true,
"CREDIT_CARD_TRANSACTION_USD": true,
"MLC_CREDIT_CARD_TRANSACTION": true,
"DELIVERY_TRANSACTION": true,
"DELIVERY_TRANSACTION_USD": true,
"DELIVERY_TRANSACTION_EUR": true,
"EMAIL_MONEY_TRANSACTION": true,
"THUNES_TRANSACTION": true,
"BANK_ACCOUNT_TRANSACTION": false,
"TOKENS_BUY_INLINE": true,
"TOKENS_BUY_GPAY_INLINE": false,
"TOKENS_BUY_APPLE_PAY_INLINE": false,
"TOKENS_BUY_CRYPTO_INLINE": true,
"TOKENS_BUY_CRYPTO_INLINE_APPLE": true,
"EMAIL_PAYMENT_REQUEST_INLINE": true,
"ZELLE_EMAIL_PAYMENT_REQUEST_INLINE": true,
"SEPA_EMAIL_PAYMENT_REQUEST_INLINE": true,
"ACH_EMAIL_PAYMENT_REQUEST_INLINE": true,
"MLC_PAYMENT_REQUEST_INLINE": false,
"PAYMENT_LINK_REQUEST_INLINE": true,
"INSTAPAY_EUROPA_INLINE": true,
"AUTHORIZENET_CAD_INLINE": true,
"AUTHORIZENET_USD_INLINE": false
}
Request
GET /api/v2/settings/user/service-status
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
None Required
Response Body
The response is an object where each property is a service flag (boolean), indicating whether the service is available (true) or not (false).
| NAME | TYPE | DESCRIPTION |
|---|---|---|
PAYMENT_REQUEST |
boolean | Whether generic payment requests are enabled |
TOKENS_BUY |
boolean | Ability to buy tokens |
TOKENS_BUY_GPAY |
boolean | Ability to buy tokens using Google Pay |
TOKENS_BUY_APPLE_PAY |
boolean | Ability to buy tokens using Apple Pay |
TOKENS_BUY_CRYPTO |
boolean | Ability to buy tokens using cryptocurrencies |
TOKENS_BUY_CRYPTO_APPLE |
boolean | Ability to buy tokens with crypto via Apple Pay |
EMAIL_PAYMENT_REQUEST |
boolean | Whether email-based payment requests are enabled |
ZELLE_EMAIL_PAYMENT_REQUEST |
boolean | Enable payment requests via Zelle email |
SEPA_EMAIL_PAYMENT_REQUEST |
boolean | Enable payment requests via SEPA email |
ACH_EMAIL_PAYMENT_REQUEST |
boolean | Enable payment requests via ACH email |
MLC_PAYMENT_REQUEST |
boolean | Enable MLC-based payment requests |
PAYMENT_LINK_REQUEST |
boolean | Whether payment link requests are enabled |
INSTAPAY_EUROPA |
boolean | Enable Instapay services in Europe |
AUTHORIZENET_CAD |
boolean | Enable Authorize.net payments in CAD |
AUTHORIZENET_USD |
boolean | Enable Authorize.net payments in USD |
TOKEN_EXCHANGE |
boolean | Whether token exchange is available |
TOKENS_BUY_MCP |
boolean | Ability to buy tokens using MCP |
ADD_FUND |
boolean | Ability to add funds to the wallet |
P2P_TRANSFER |
boolean | Enable peer-to-peer transfers |
SCAN_PAY_P2P_TRANSFER |
boolean | Enable peer-to-peer transfers via Scan & Pay |
TOPUP_RECHARGE |
boolean | Enable top-up recharges |
CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions |
CREDIT_CARD_TRANSACTION_USD |
boolean | Enable credit card transactions in USD |
MLC_CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions in MLC |
DELIVERY_TRANSACTION |
boolean | Enable delivery-related transactions |
DELIVERY_TRANSACTION_USD |
boolean | Enable delivery transactions in USD |
DELIVERY_TRANSACTION_EUR |
boolean | Enable delivery transactions in EUR |
EMAIL_MONEY_TRANSACTION |
boolean | Enable email-based money transactions |
THUNES_TRANSACTION |
boolean | Enable Thunes transactions |
BANK_ACCOUNT_TRANSACTION |
boolean | Enable bank account transactions |
TOKENS_BUY_INLINE |
boolean | Ability to buy tokens inline (UI option) |
TOKENS_BUY_GPAY_INLINE |
boolean | Inline token purchase with Google Pay |
TOKENS_BUY_APPLE_PAY_INLINE |
boolean | Inline token purchase with Apple Pay |
TOKENS_BUY_CRYPTO_INLINE |
boolean | Inline token purchase with cryptocurrencies |
TOKENS_BUY_CRYPTO_INLINE_APPLE |
boolean | Inline crypto purchase via Apple Pay |
EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline email-based payment requests |
ZELLE_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline Zelle email payment requests |
SEPA_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline SEPA email payment requests |
ACH_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline ACH email payment requests |
MLC_PAYMENT_REQUEST_INLINE |
boolean | Inline MLC payment requests |
PAYMENT_LINK_REQUEST_INLINE |
boolean | Inline payment link requests |
INSTAPAY_EUROPA_INLINE |
boolean | Inline Instapay Europe services |
AUTHORIZENET_CAD_INLINE |
boolean | Inline Authorize.net payments in CAD |
AUTHORIZENET_USD_INLINE |
boolean | Inline Authorize.net payments in USD |
Get User Service Status by Key
Endpoint to retrieve the status of a specific user service by its key.
curl --location --request GET 'https://backend.ducapp.net/api/v2/settings/user/service-status/PAYMENT_REQUEST' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/v2/settings/user/service-status/PAYMENT_REQUEST", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
url = "https://backend.ducapp.net/api/v2/settings/user/service-status/PAYMENT_REQUEST"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
Example Response:
{
"PAYMENT_REQUEST": true
}
Request
GET /api/v2/settings/user/service-status/{key}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Path Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
key |
string | The service key to check availability status |
Response Body
The response is an object where the property matches the requested key. Each property is a boolean flag (true or false) indicating if the service is enabled.
| Key | Type | Description |
|---|---|---|
PAYMENT_REQUEST |
boolean | Whether generic payment requests are enabled |
TOKENS_BUY |
boolean | Ability to buy tokens |
TOKENS_BUY_GPAY |
boolean | Ability to buy tokens using Google Pay |
TOKENS_BUY_APPLE_PAY |
boolean | Ability to buy tokens using Apple Pay |
TOKENS_BUY_CRYPTO |
boolean | Ability to buy tokens using cryptocurrencies |
TOKENS_BUY_CRYPTO_APPLE |
boolean | Ability to buy tokens with crypto via Apple Pay |
EMAIL_PAYMENT_REQUEST |
boolean | Whether email-based payment requests are enabled |
ZELLE_EMAIL_PAYMENT_REQUEST |
boolean | Enable payment requests via Zelle email |
SEPA_EMAIL_PAYMENT_REQUEST |
boolean | Enable payment requests via SEPA email |
ACH_EMAIL_PAYMENT_REQUEST |
boolean | Enable payment requests via ACH email |
MLC_PAYMENT_REQUEST |
boolean | Enable MLC-based payment requests |
PAYMENT_LINK_REQUEST |
boolean | Whether payment link requests are enabled |
INSTAPAY_EUROPA |
boolean | Enable Instapay services in Europe |
AUTHORIZENET_CAD |
boolean | Enable Authorize.net payments in CAD |
AUTHORIZENET_USD |
boolean | Enable Authorize.net payments in USD |
TOKEN_EXCHANGE |
boolean | Whether token exchange is available |
TOKENS_BUY_MCP |
boolean | Ability to buy tokens using MCP |
ADD_FUND |
boolean | Ability to add funds to the wallet |
P2P_TRANSFER |
boolean | Enable peer-to-peer transfers |
SCAN_PAY_P2P_TRANSFER |
boolean | Enable peer-to-peer transfers via Scan & Pay |
TOPUP_RECHARGE |
boolean | Enable top-up recharges |
CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions |
CREDIT_CARD_TRANSACTION_USD |
boolean | Enable credit card transactions in USD |
MLC_CREDIT_CARD_TRANSACTION |
boolean | Enable credit card transactions in MLC |
DELIVERY_TRANSACTION |
boolean | Enable delivery-related transactions |
DELIVERY_TRANSACTION_USD |
boolean | Enable delivery transactions in USD |
DELIVERY_TRANSACTION_EUR |
boolean | Enable delivery transactions in EUR |
EMAIL_MONEY_TRANSACTION |
boolean | Enable email-based money transactions |
THUNES_TRANSACTION |
boolean | Enable Thunes transactions |
BANK_ACCOUNT_TRANSACTION |
boolean | Enable bank account transactions |
TOKENS_BUY_INLINE |
boolean | Ability to buy tokens inline (UI option) |
TOKENS_BUY_GPAY_INLINE |
boolean | Inline token purchase with Google Pay |
TOKENS_BUY_APPLE_PAY_INLINE |
boolean | Inline token purchase with Apple Pay |
TOKENS_BUY_CRYPTO_INLINE |
boolean | Inline token purchase with cryptocurrencies |
TOKENS_BUY_CRYPTO_INLINE_APPLE |
boolean | Inline crypto purchase via Apple Pay |
EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline email-based payment requests |
ZELLE_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline Zelle email payment requests |
SEPA_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline SEPA email payment requests |
ACH_EMAIL_PAYMENT_REQUEST_INLINE |
boolean | Inline ACH email payment requests |
MLC_PAYMENT_REQUEST_INLINE |
boolean | Inline MLC payment requests |
PAYMENT_LINK_REQUEST_INLINE |
boolean | Inline payment link requests |
INSTAPAY_EUROPA_INLINE |
boolean | Inline Instapay Europe services |
AUTHORIZENET_CAD_INLINE |
boolean | Inline Authorize.net payments in CAD |
AUTHORIZENET_USD_INLINE |
boolean | Inline Authorize.net payments in USD |
Update Notification Settings
Endpoint to update the user’s notification providers preferences.
curl --location --request PATCH 'https://backend.ducapp.net/api/v2/users/update-settings-notifications' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"notificationProviders": [
{ "provider": "email", "active": false },
{ "provider": "sms", "active": true },
{ "provider": "push", "active": true }
]
}'var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"notificationProviders": [
{ "provider": "email", "active": false },
{ "provider": "sms", "active": true },
{ "provider": "push", "active": true }
]
});
var requestOptions = {
method: "PATCH",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/v2/users/update-settings-notifications", requestOptions)
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://backend.ducapp.net/api/v2/users/update-settings-notifications"
payload = json.dumps({
"notificationProviders": [
{ "provider": "email", "active": false },
{ "provider": "sms", "active": true },
{ "provider": "push", "active": true }
]
})
headers = {
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("PATCH", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"data": {
"status": 201,
"payload": "Notification providers successfully updated"
}
}
Request
PATCH /api/v2/users/update-settings-notifications
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
notificationProviders |
[object] | Array of providers with their active status |
notificationProvider Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
provider |
string | Notification channel (email, sms, push) |
active |
boolean | Whether the notification provider is active |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
object | Response object (see below) |
data Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | HTTP-like status code (201 if successfully updated) |
payload |
string | Confirmation message |
Request OTP
Endpoint to request a new One-Time Password (OTP) for a specific user. This endpoint allows configuration of whether the request should be validated before generating the OTP.
By default, the parameter evaluateBeforeRequest is set to true.
curl --location --request POST 'https://backend.ducapp.net/api/private/users/otp' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"userId": "5ebaf91c80b385353b9283da",
"value": "john.doe@gmail.com",
"evaluateBeforeRequest": false
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
userId: "5ebaf91c80b385353b9283da",
value: "john.doe@gmail.com",
evaluateBeforeRequest: false
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/otp", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/private/users/otp"
payload = json.dumps({
"userId": "5ebaf91c80b385353b9283da",
"value": "john.doe@gmail.com",
"evaluateBeforeRequest": false
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"requestCompleted": true,
"message": {
"code": 200,
"message": "260144"
}
}
Request
POST /api/private/users/otp
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
userId |
string | Unique ID of the user requesting the OTP |
value |
string | Destination for OTP (phone number or email) |
evaluateBeforeRequest |
boolean | Whether to validate request conditions before sending the OTP |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
requestCompleted |
boolean | Indicates if the OTP request was successfully completed |
message |
object | Container with OTP details |
message.code |
number | Response status code (e.g., 200) |
message.message |
string | The generated OTP code sent to the user |
Request Simple OTP
Endpoint to request a new One-Time Password (OTP) for a specific user in a simplified way.
Unlike /otp, this endpoint always disables pre-validation (evaluateBeforeRequest = false) and directly generates the OTP.
curl --location --request POST 'https://backend.ducapp.net/api/private/users/simple-otp' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"userId": "5ebaf91c80b385353b9283da",
"value": "john.doe@gmail.com"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
userId: "5ebaf91c80b385353b9283da",
value: "john.doe@gmail.com"
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/users/simple-otp", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/private/users/simple-otp"
payload = json.dumps({
"userId": "5ebaf91c80b385353b9283da",
"value": "john.doe@gmail.com"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"requestCompleted": true,
"message": {
"code": 200,
"message": "260144"
}
}
Request
POST /api/private/users/simple-otp
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
userId |
string | Unique ID of the user requesting the OTP |
value |
string | Destination for OTP (phone number or email) |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
requestCompleted |
boolean | Indicates if the OTP request was successfully completed |
message |
object | Container with OTP details |
message.code |
number | Response status code (e.g., 200) |
message.message |
string | The generated OTP code sent to the user |
Request Password Change
Endpoint to request a password change for a user account via email or phone number.
curl --location --request POST 'https://backend.ducapp.net/api/auth/request-password-change' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "john.doe@gmail.com"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
email: "john.doe@gmail.com"
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/auth/request-password-change", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/auth/request-password-change"
payload = json.dumps({
"email": "john.doe@gmail.com"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"changeCompleted": true,
"message": "We have sent a confirmation code to your email/phone to recover your password"
}
Request
POST /api/auth/request-password-change
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
email |
string | Registered email of the user |
phone |
string | Registered phone number of the user (without spaces) |
⚠️ Note: You must provide either email or phone, not both.
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
changeCompleted |
boolean | Indicates if the password reset process was successfully started |
message |
string | Confirmation message |
Change Password
Endpoint to confirm and complete the user password reset process using the received activation code.
curl --location --request POST 'https://backend.ducapp.net/api/auth/change-password' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"activationCode": "704202",
"password": "NarutoSasuke*69"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
activationCode: "704202",
password: "NarutoSasuke*69"
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/auth/change-password", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/auth/change-password"
payload = json.dumps({
"activationCode": "704202",
"password": "NarutoSasuke*69"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"changeCompleted": true,
"message": "Password successfully updated"
}
Request:
POST /api/auth/change-password
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
activationCode |
string | Code received by email/phone to confirm |
password |
string | New password to set for the account |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
changeCompleted |
boolean | Indicates if password change was successful |
message |
string | Informational message |
Gift Card
Create Gift Card
Endpoint to generate a gift card.
curl --location --request POST 'https://backend.ducapp.net/api/private/cards/create' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"holderName": "John Doe",
"email": "john.doe@email.com",
"phone": "+5355555555",
"idNumber": "92051540268"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
holderName: "John Doe",
email: "john.doe@email.com",
phone: "+5355555555",
idNumber: "92051540268",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/cards/create", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/private/cards/create"
payload = json.dumps({
"holderName": "John Doe",
"email": "john.doe@email.com",
"phone": "+5355555555",
"idNumber": "92051540268"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"record": {
"isExpired": false,
"_id": "65cbef0b5ec3cb655f60196c",
"holder": "John Doe",
"idNumber": "92051540268",
"cvv2": "385",
"email": "john.doe@gmail.com",
"phone": "+5355555555",
"number": "1605661015643626",
"expiry": {
"month": "01",
"year": "25"
},
"balance": [],
"negativeRetentions": [],
"positiveRetentions": [],
"createdAt": "2024-02-13T22:36:59.775Z",
"updatedAt": "2024-02-13T22:36:59.775Z"
}
}
Request
POST /api/private/cards/create
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
holderName |
string | (Optional) Gift card holder name |
email |
string | Gift card associated email |
phone |
string | Gift card associated phone number |
idNumber |
string | Gift card associated identification number |
Response Body
| Field | Type | Description |
|---|---|---|
record |
object | Contains the details of the created gift card. |
record Object
| Field | Type | Description |
|---|---|---|
isExpired |
boolean | Indicates whether the gift card is expired (false = active, true = expired). |
_id |
string | Unique identifier of the gift card in the database. |
holder |
string | Full name of the gift card holder. |
idNumber |
string | Identification number of the holder. |
cvv2 |
string | Security code of the gift card (CVV2). |
email |
string | Email address associated with the holder. |
phone |
string | Phone number associated with the holder. |
number |
string | Unique gift card number. |
expiry |
object | Object containing the expiration date of the card. |
balance |
array | List of balance movements related to the gift card (empty when created). |
negativeRetentions |
array | List of negative retentions (empty when created). |
positiveRetentions |
array | List of positive retentions (empty when created). |
createdAt |
string | Date and time when the gift card was created (ISO 8601 format). |
updatedAt |
string | Date and time of the last update of the gift card (ISO 8601 format). |
expiry Object
| Field | Type | Description |
|---|---|---|
month |
string | Expiration month (MM format). |
year |
string | Expiration year (YY format). |
Validate Gift Card
Endpoint to check whether a gift card is valid.
curl --location --request POST 'https://backend.ducapp.net/api/private/cards/validate' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"number": "1445835256915505",
"cvv2": "952"
}
'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
number: "1445835256915505",
cvv2: "952",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/cards/validate", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/private/cards/validate"
payload = json.dumps({
number: '1445835256915505',
cvv2: '952',
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"message": "Card is valid",
"valid": true,
"_id": "66cr4fca7bc0d7741eb7730a",
"isExpired": false,
"holder": "John Doe",
"number": "1445835256915505",
"cvv2": "653",
"expiry": {
"month": "07",
"year": "26"
}
}
Request
POST /api/private/cards/validate
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id or number |
string | The id or the number of the gift card |
cvv2 |
string | The security code of the gift card |
Response Body
| Field | Type | Description |
|---|---|---|
message |
string | Validation result message. |
valid |
boolean | Indicates if the gift card is valid. |
_id |
string | Unique identifier of the gift card in the database. |
isExpired |
boolean | Indicates if the gift card is expired (true = expired, false = active). |
holder |
string | Full name of the gift card holder. |
number |
string | Unique gift card number. |
cvv2 |
string | Security code of the gift card (CVV2). |
expiry |
object | Object containing the expiration date of the gift card. |
expiry Object
| Field | Type | Description |
|---|---|---|
month |
string | Expiration month (MM format). |
year |
string | Expiration year (YY format). |
Add Funds to Gift Card
Endpoint to add funds to a gift card.
import requests
import json
url = "https://backend.ducapp.net/api/private/cards/credit"
payload = json.dumps({
"number": "1261053544885941",
"currency": "USD",
"amount": 10,
"externalID": "GiftCard-CREDIT-4e604f32-0b33-4631-88ac-2f3e56e3ee15",
"concept": "Try to reboot the SMTP card, maybe it will index the digital matrix!",
"paymentMethod": {
"paymentLink": true
}
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/cards/credit' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"number": "1261053544885941",
"currency": "USD",
"amount": 10,
"externalID": "GiftCard-CREDIT-4e604f32-0b33-4631-88ac-2f3e56e3ee15",
"concept": "Try to reboot the SMTP card, maybe it will index the digital matrix!",
"paymentMethod": {
"paymentLink": true
}
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
number: "1261053544885941",
currency: "USD",
amount: 10,
externalID: "GiftCard-CREDIT--4e604f32-0b33-4631-88ac-2f3e56e3ee15",
concept:
"Try to reboot the SMTP card, maybe it will index the digital matrix!",
paymentMethod: {
paymentLink: true,
},
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/cards/credit", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com).",
"paymentLink": {
"url": "https://pay.ducapp.com/txnsTW...",
"id": "%2FU9uGv8maxlTGX7idVsDQtG4I%2Fn62sAY8y7vVWvJU...",
"qrCode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAACcCAYAAACKuMJNAAAABmJLR0QA/"
},
"transaction": {
"transactionAmount": 10,
"transactionStatus": "requested",
"currency": "USD",
"type": "PAYMENT_REQUEST",
"images": [],
"balanceSender": 62383.63,
"balanceReceiver": 1087.15,
"_id": "68cd5e1507b9db0eab1b899e",
"sender": "0x3c1ed3433916f130a7badf8b1ad770cfa2fd03be",
"receiver": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82999",
"owner": "5e67b9041016f12effaa2e8c",
"concept": "Service rendered: Gift Card Add Token - Good/Service provided (0bdcaa3a-f463-4af2-8175-79523c96235a).",
"metadata": {
"isTokenBuyInline": true,
"apiClientId": "68cd5e1507b9db0eab1b899e",
"exchangeMetadata": {
"exchangeRate": 0.7249,
"paymentLinkPrice": {
"amount": 13.8,
"currency": "CAD"
}
},
"orderId": "DUCApp-Default.Link-AA99679759",
"requestParams": {
"product": {
"name": "Service rendered: Gift Card Add Token",
"description": "Good/Service provided (0bdcaa3a-f463-4af2-8175-79523c96235a)."
},
"price": {
"amount": 10,
"currency": "USD"
},
"link": {
"provider": null,
"allowPromoCode": false,
"collectBillingAddress": false,
"collectPhoneNumber": false,
"paymentMethodTypes": [
"card"
]
}
},
"paymentProvider": "authorizenetcad",
"method": "PAYMENT_LINK",
"paymentLinkId": "%2FU9uGv8maxlTGX7idVsDQtG4I%2Fn62sAY8y7vVWvJU...",
"paymentLinkUrl": "https://pay.ducapp.com/txnsTW",
"paymentLinkLongUrl": "https://backend.ducapp.net/payment-links/authorize/%2FU9uGv8maxlTGX7idVsDQtG4I%2Fn62sAY8y7vVWvJU...",
"paymentLinkQRCode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAACcCAYAAACKuMJNAAAABmJLR0QA/wD/AP+gvaeTAAAKjElEQVR4nO3dW2wcVx0G8O",
"shortenLink": {
"shortUrl": "https://pay.ducapp.com/txnsTW",
"metadata": {
"domain": "pay.ducapp.com",
"longUrl": "https://backend.ducapp.net/payment-links/authorize/%2FU9uGv8maxlTGX7idVsDQtG4I%2Fn62sAY8y7vVWvJU...",
"key": "txnsTW",
"slug": "txnsTW",
"expiration": "2025-09-20 13:43",
"expireClicks": null
}
},
"paymentLinkInfo": {
"id": "%2FU9uGv8maxlTGX7idVsDQtG4I%2Fn62sAY8y7vVWvJU...",
"url": "https://backend.ducapp.net/payment-links/authorize/%2FU9uGv8maxlTGX7idVsDQtG4I%2Fn62sAY8y7vVWvJU...",
"metadata": {
"description": "DUCApp-Default.Link-AA00679752",
"metadata": {
"orderId": "DUCApp-Default.Link-AA00679752",
"walletAddress": "0x8ab0E7dF31F2899b64f77c2291FF5A3B33B82Ff7",
"amount": 10,
"currency": "USD",
"concept": "Service rendered: Gift Card Add Token - Good/Service provided (0bdcaa3a-f463-4af2-8175-79523c96235a).",
"locale": "es"
},
"token": "U9uGv8maxlTGX7idVsDQtG4I",
"messages": {
"resultCode": "Ok",
"message": [
{
"code": "I00001",
"text": "Successful."
}
]
}
}
},
"balanceSender": {
"requested": 62383.63
},
"balanceReceiver": {
"requested": 1087.15
}
},
"transactionID": "AA00679752",
"externalID": "0bdcaa3a-f463-4af2-8175-79553c55235f",
"createdAt": "2025-09-19T13:43:49.083Z",
"updatedAt": "2025-09-19T13:43:49.083Z",
"__v": 0,
"id": "68cd5e1507b9db0eab1b899e"
}
}
}
Request
POST /api/private/cards/credit
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| Field | Type | Description |
|---|---|---|
id |
string | Unique identifier of the gift card. Required if number is not provided. |
number |
string | Gift card number. Required if id is not provided. |
concept |
string | (Optional) Description or reason for the credit operation. |
currency |
CAD, USD, EUR |
Currency used for the transaction. |
amount |
number | Amount to be added to the gift card. (Must be positive and more than 5). |
externalID |
string | External identifier provided by the client to trace the transaction. |
paymentMethod |
object | Defines the method of payment for the credit operation. |
paymentMethodObject
| NAME | TYPE | DESCRIPTION |
|---|---|---|
paymentLink |
{paymentLink} or boolean |
Whether to complete de payment process using a payment link. |
serverToServer |
Server to Server |
Complete the payment process sending credit card information |
paymentLink Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
provider |
string | The payment link provider. Could be default or duc to use a DUC platform custom payment link |
redirectUrl |
string | Url to be redirected to after the payment have been completed |
Server to Server
| NAME | TYPE | DESCRIPTION |
|---|---|---|
number |
string | Credit card number |
expiry_date |
string | Credit card expiry date |
cvc |
string | Credit card security code |
avs_street_name |
string | Credit card address street name |
avs_street_number |
string | Credit card address house number |
avs_zipcode |
string | Credit card address zip code |
name_on_card |
string | Name on card |
email |
string | Credit card associated email |
phone |
string | Credit card associated phone |
location |
object | Location of the credit card owner at the moment of the operation |
locationObject
| NAME | TYPE | DESCRIPTION |
|---|---|---|
latitude |
string | Latitude |
longitude |
string | Longitude |
timestamp |
string | Timestamp |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
object | Contains the details of the payment transaction |
data Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | HTTP-like status code of the request (e.g. 200 = OK) |
payload |
string | Message describing the current status of the transaction |
paymentLink |
object | Payment link details to complete the payment process (See below) |
transaction |
object | Transaction details including amounts, balances, participants, and metadata (See below) |
data.paymentLink Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | URL of the payment link |
id |
string | Identifier of the payment link |
qrCode |
string | Base64-encoded PNG QR code for the payment link |
data.transaction Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
transactionAmount |
number | Amount of the transaction |
transactionStatus |
string | Current transaction status (e.g. requested) |
currency |
string | Currency used in the transaction (USD, CAD, EUR) |
type |
string | Transaction type (e.g. PAYMENT_REQUEST) |
images |
array | Attached images |
balanceSender |
number | Balance of the sender after transaction |
balanceReceiver |
number | Balance of the receiver after transaction |
_id |
string | Internal MongoDB ID of the transaction |
sender |
string | Blockchain address or internal ID of the sender |
receiver |
string | Blockchain address or internal ID of the receiver |
owner |
string | Internal ID of the owner in the system |
concept |
string | Description of the transaction concept |
metadata |
object | Transaction metadata with exchange details, request parameters, etc (See below) |
transactionID |
string | Unique transaction identifier (human-readable) |
externalID |
string | External identifier provided by the client |
createdAt |
string | Creation timestamp (ISO 8601) |
updatedAt |
string | Last update timestamp (ISO 8601) |
id |
string | Alias of _id |
transaction.metadata Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
isTokenBuyInline |
bool | Indicates if the token purchase was inline |
apiClientId |
string | API client ID associated with the request |
exchangeMetadata |
object | Exchange rate and payment link pricing details |
orderId |
string | Order ID generated for the transaction |
requestParams |
object | Parameters passed in the payment request (product, price, link) (See below) |
paymentProvider |
string | Payment provider used (e.g. authorizenetcad) |
method |
string | Method of payment (e.g. PAYMENT_LINK) |
paymentLinkId |
string | Identifier of the payment link |
paymentLinkUrl |
string | Shortened payment link URL |
paymentLinkLongUrl |
string | Full backend payment link URL |
paymentLinkQRCode |
string | Base64 QR code for the payment link |
shortenLink |
object | Shortened link information with metadata (See below) |
paymentLinkInfo |
object | Extended payment link information (id, url, metadata, messages) (See below) |
balanceSender |
object | Requested balance state for the sender (See below) |
balanceReceiver |
object | Requested balance state for the receiver (See below) |
transaction.metadata.exchangeMetadata Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
exchangeRate |
number | Exchange rate applied |
paymentLinkPrice |
object | Payment link price (amount + currency) |
transaction.metadata.exchangeMetadata.paymentLinkPrice Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | Price amount of the link |
currency |
string | Currency of the price |
transaction.metadata.requestParams Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
product |
object | Product name and description |
price |
object | Price amount and currency |
link |
object | Link configuration (provider, promo codes, etc.) |
transaction.metadata.requestParams.product Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
name |
string | Product name |
description |
string | Product description/details |
transaction.metadata.requestParams.price Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | Price amount requested |
currency |
string | Currency of the price (USD, etc.) |
transaction.metadata.requestParams.link Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
provider |
string | Payment link provider (can be null or specific provider) |
allowPromoCode |
boolean | Whether promo codes are allowed |
collectBillingAddress |
boolean | Whether billing address is collected |
collectPhoneNumber |
boolean | Whether phone number is collected |
paymentMethodTypes |
array | Accepted payment methods (e.g., ["card"]) |
transaction.metadata.shortenLink Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
shortUrl |
string | Shortened payment link |
metadata |
object | Metadata about the shortened URL (domain, longUrl, key, expiration, etc.) |
transaction.metadata.shortenLink.metadata Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
domain |
string | Domain used in the short link |
longUrl |
string | Original (unshortened) payment link URL |
key |
string | Unique key identifying the shortened link |
slug |
string | Slug portion of the short link |
expiration |
string | Expiration datetime of the short link (ISO 8601) |
expireClicks |
number or null | Maximum clicks before expiration (if configured) |
transaction.metadata.paymentLinkInfo Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | Payment link identifier |
url |
string | Backend payment link URL |
metadata |
object | Extended metadata (orderId, wallet, amount, locale, etc) |
transaction.metadata.paymentLinkInfo.metadata Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
description |
string | Description of the payment link (e.g., internal reference) |
metadata |
object | Nested metadata with orderId, wallet, etc. (See below) |
token |
string | Token associated with the payment link |
messages |
object | Messages and result codes returned from the provider (See below) |
transaction.metadata.paymentLinkInfo.metadata.metadata Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
orderId |
string | Order identifier |
walletAddress |
string | Wallet address used |
amount |
number | Amount requested |
currency |
string | Currency used (USD, etc.) |
concept |
string | Concept/description of the transaction |
locale |
string | Locale/language for the payment link (e.g. es) |
transaction.metadata.paymentLinkInfo.metadata.messages Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
resultCode |
string | Overall result code (e.g., Ok) |
message |
array | List of message objects with code/text from the provider |
transaction.metadata.balanceSender Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
requested |
number | Requested balance state for the sender |
transaction.metadata.balanceReceiver Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
requested |
number | Requested balance state for the receiver |
Sub Funds from Gift Card
Endpoint to debit funds from a gift card.
import requests
import json
url = "https://backend.ducapp.net/api/private/cards/debit"
payload = json.dumps({
"number": "1374207233653440",
"cvv2": "105",
"amount": 10,
"currency": "USD",
"externalID": "GiftCard-DEBIT-8ea02b91-bb13-4acf-abb5-102541278844",
"concept": "withdrawal",
"expiry": {
"month": "11",
"year": "26"
}
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/cards/debit' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
number: "1374207233653440",
cvv2: "105",
amount: 10,
currency: "USD",
externalID: "GiftCard-DEBIT-8ea02b91-bb13-4acf-abb5-102541278844",
concept: "withdrawal",
expiry: {
"month": "11",
"year": "26"
}
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
number: "1374207233653440",
cvv2: "105",
amount: 10,
currency: "USD",
externalID: "GiftCard-DEBIT-8ea02b91-bb13-4acf-abb5-102541278844",
concept: "withdrawal",
expiry: {
"month": "11",
"year": "26"
}
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/cards/debit", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
{
"transactionID": "AA00380690",
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com)."
}
Request
POST /api/private/cards/debit
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | Gift card unique identifier. Can be used instead of number |
number |
string | Gift card number. Used if id is not provided |
expiry |
object | Expiry date of the gift card (See below) |
cvv2 |
string | CVV2 security code of the gift card |
amount |
number | Amount to be debited from the gift card |
currency |
string | Currency code (e.g., USD, CAD, EUR) |
concept |
string | Description or concept for the debit transaction |
externalID |
string | Unique external identifier for idempotency and transaction tracking |
expiry Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
month |
string | Expiration month of the gift card ("MM" format) |
year |
string | Expiration year of the gift card ("YY" or "YYYY" format) |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
transactionID |
string | Transaction id reference |
status |
number | Status of the request |
payload |
string | Description of the response |
Get Gift Card Balance
Endpoint to get the balance of a gift card by its ID.
import requests
import json
url = "https://backend.ducapp.net/api/private/cards/balance/657a05df7c8a8598bf217605"
payload = {}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/cards/balance/657a05df7c8a8598bf217605 ",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));curl --location --request GET 'https://backend.ducapp.net/api/private/cards/balance/657a05df7c8a8598bf217605 ' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
Example Response:
{
"balance": [
{
"currency": "USD",
"amount": 30.00
},
{
"currency": "CAD",
"amount": 0
},
{
"currency": "CUP",
"amount": 0
},
{
"currency": "EUR",
"amount": 77.00
}
],
"negativeRetentions": [
{
"currency": "USD",
"amount": 6
}
],
"positiveRetentions": [
{
"currency": "USD",
"amount": 10
}
]
}
Request
GET /api/private/cards/balance/:id
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Path Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | The unique ID of the card |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
balance |
[Account] |
Array of Account with the balance of each coin |
negativeRetentions |
[Account] |
Array of Account with debit type pending operations of each coin |
positiveRetentions |
[Account] |
Array of Account with add fund type pending operations of each coin |
Account Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
currency |
string | Code of the account currency |
amount |
float | Amount of the account |
List Gift Cards
Endpoint to get the logged-in user associated gift cards.
import requests
import json
url = "https://backend.ducapp.net/api/private/cards"
payload = json.dumps({})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)curl --location --request GET 'https://backend.ducapp.net/api/private/cards' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/private/cards", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
{
"data": [
{
"_id": "659880af93331a457c224bbc",
"isExpired": false,
"holder": "John Doe",
"number": "1421476434954286",
"cvv2": "799",
"expiry": {
"month": "07",
"year": "25"
},
"balance": [
{
"amount": 32,
"currency": "USD"
},
{
"amount": 2,
"currency": "CAD"
},
{
"amount": 0,
"currency": "CUP"
},
{
"amount": 78,
"currency": "EUR"
}
],
"negativeRetentions": [
{
"amount": 8,
"currency": "USD"
}
],
"positiveRetentions": [
{
"amount": 10,
"currency": "USD"
}
]
}
]
}
Request
GET /api/private/cards
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
[Gift Card] |
Array of card objects with details |
Gift Card Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
_id |
string | Gift card identifier |
isExpired |
boolean | Whether the gift card is expired or not |
holder |
string | Gift card holder name |
number |
string | Gift card number |
cvv2 |
string | Gift card CVV2 security code |
expiry |
{Expiry} |
Gift card expiry date |
balance |
[Account] |
Array of Account with the balance of each coin |
negativeRetentions |
[Account] |
Array of Account with debit type pending operations of each coin |
positiveRetentions |
[Account] |
Array of Account with add fund type pending operations of each coin |
Expiry Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
month |
string | Expiry month |
year |
string | Expiry year two numbers format |
Account Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
currency |
string | Code of the account currency |
amount |
float | Amount of the account |
Expire Gift Card
Endpoint to expire or restore a gift card.
import requests
import json
url = "https://backend.ducapp.net/api/private/cards/expire/658a05df7c9a8598vf217605"
payload = {}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: "POST",
headers: myHeaders,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/cards/expire/658a05df7c9a8598vf217605 ",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));curl --location --request POST 'https://backend.ducapp.net/api/private/cards/expire/658a05df7c9a8598vf217605 ' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
Example Response:
{
"success": true,
"message": "Card expired successfully"
}
Request
POST /api/private/cards/expire/:id
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Path Variables
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | unique ID of the gift card to expire/restore |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
success |
boolean | Whether the gift card was expired or not |
message |
string | Description message |
Beneficiaries
Get Beneficiaries
Endpoint to obtain the user beneficiaries list.
curl --location --request POST 'https://backend.ducapp.net/api/private/users/beneficiary' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'POST',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/users/beneficiary", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
url = "https://backend.ducapp.net/api/private/users/beneficiary"
payload = {}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
[
{
"isBlocked": false,
"_id": "64a6eb05f9bd31b44b52a244",
"deliveryCI": "02120112345",
"deliveryContact": "Juan",
"deliveryLastName": "Perez",
"deliverySecondLastName": "Cruz",
"deliveryArea": "Matanzas",
"deliveryZone": "Provincias",
"country_iso_code": "CU",
"deliveryCity": "Limonar",
"streetName": "Street",
"houseNumber": "34",
"zipcode": "5100",
"deliveryPhone": "3243434",
"country": "Cuba",
"email": "wewe@d.cu",
"createdAt": "2024-02-25T19:30:45.751Z",
"updatedAt": "2024-08-27T15:39:35.732Z",
"beneficiaryFullName": "Juan Perez Cruz",
"creditCards": [
{
"number": "9227959873502222",
"cardHolderName": "Juan Perez Cruz",
"bankName": "Banco Metropolitano",
"currency": "CUP"
}
]
}
]
Request
POST /api/private/users/beneficiary
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
| data | [{Beneficiary}] |
Array of beneficiary objects |
Beneficiary
| NAME | TYPE | DESCRIPTION |
|---|---|---|
isBlocked |
string | Wheter the beneficiary is blocked or not |
_id |
string | Beneficiary Id |
deliveryCI |
string | Beneficiary Identification Number |
deliveryContact |
string | Beneficiary Name |
deliveryLastName |
string | Beneficiary Lastname |
deliverySecondLastName |
string | Beneficiary Second Lastname |
deliveryArea |
string | Beneficiary Province |
deliveryZone |
string | Zone to which the province of the beneficiary belongs |
country_iso_code |
string | The ISO code of the country |
deliveryCity |
string | Beneficiary Municipality |
streetName |
string | Beneficiary street name |
houseNumber |
string | Beneficiary house number |
zipcode |
string | Beneficiary zip code |
deliveryPhone |
string | Beneficiary phone number |
country |
string | Beneficiary country name |
email |
string | Beneficiary email |
createdAt |
string | Timestamp of account creation |
updatedAt |
string | Timestamp of last update |
beneficiaryFullName |
string | Beneficiary full name |
creditCards |
[{Credit Card}] |
Array of credit card asociated to this beneficiary |
Credit Card
| NAME | TYPE | DESCRIPTION |
|---|---|---|
number |
string | The credit card numeber |
cardHolderName |
string | The credit card holder name |
bankName |
string | The credit card bank name |
currency |
string | The credit card currency |
Search Beneficiaries by CI
Endpoint to obtain a beneficiary given his identity number.
curl --location --request POST 'https://backend.ducapp.net/api/private/users/beneficiary/92062743322' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'POST',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/users/beneficiary/92062743322", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
url = "https://backend.ducapp.net/api/private/users/beneficiary/92062743322"
payload = {}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
[
{
"_id": "61a5151e6732e5442b4c482c",
"isBlocked": false,
"deliveryCI": "92062743322",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "Doe",
"country_iso_code": "CU",
"country": "Cuba",
"deliveryArea": "Santiago de Cuba",
"deliveryZone": "Provincias",
"deliveryCity": "Songo la Maya",
"streetName": "Main",
"houseNumber": "195",
"zipcode": "80100",
"email": "john.doe@test.com",
"deliveryPhone": "+5358542711",
"beneficiaryFullName": "John Doe Doe",
"creditCards": [
{
"number": "9225959870121891",
"cardHolderName": "John Doe",
"bankName": "Banco Metropolitano",
"currency": "USD"
},
]
}
]
Request
POST /api/private/users/beneficiary/{identifier}
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
| data | [{Beneficiary}] |
Array of beneficiary objects |
Beneficiary
| NAME | TYPE | DESCRIPTION |
|---|---|---|
isBlocked |
string | Wheter the beneficiary is blocked or not |
_id |
string | Beneficiary Id |
deliveryCI |
string | Beneficiary Identification Number |
deliveryContact |
string | Beneficiary Name |
deliveryLastName |
string | Beneficiary Lastname |
deliverySecondLastName |
string | Beneficiary Second Lastname |
deliveryArea |
string | Beneficiary Province |
deliveryZone |
string | Zone to which the province of the beneficiary belongs |
country_iso_code |
string | The ISO code of the country |
deliveryCity |
string | Beneficiary Municipality |
streetName |
string | Beneficiary street name |
houseNumber |
string | Beneficiary house number |
zipcode |
string | Beneficiary zip code |
deliveryPhone |
string | Beneficiary phone number |
email |
string | Beneficiary email |
country |
string | Beneficiary country name |
beneficiaryFullName |
string | Beneficiary full name |
creditCards |
[{Credit Card}] |
Array of credit card asociated to this beneficiary |
Credit Card
| NAME | TYPE | DESCRIPTION |
|---|---|---|
number |
string | The credit card numeber |
cardHolderName |
string | The credit card holder name |
bankName |
string | The credit card bank name |
currency |
string | The credit card currency |
Create Beneficiary
Endpoint to create a beneficiary for the authenticated user.
curl --location --request POST 'https://backend.ducapp.net/api/private/users/beneficiary/create' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"identityNumber": "92062743323",
"firstName": "John",
"lastName": "Doe",
"secondLastName": "Doe",
"countryIsoCode": "CU",
"country": "Cuba",
"zone": "Santa Clara",
"province": "Villa Clara",
"municipality": "Santa Clara",
"streetName": "Street",
"houseNumber": "15",
"zipcode": "80100",
"email": "john.doe@test.com",
"phone": "+5357575757",
"creditCards": []
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({{
"identityNumber": "92062743323",
"firstName": "John",
"lastName": "Doe",
"secondLastName": "Doe",
"countryIsoCode": "CU",
"country": "Cuba",
"zone": "Santa Clara",
"province": "Villa Clara",
"municipality": "Santa Clara",
"streetName": "Street",
"houseNumber": "15",
"zipcode": "80100",
"email": "john.doe@test.com",
"phone": "+5357575757",
"creditCards": []
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/users/beneficiary/create", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://backend.ducapp.net/api/private/users/beneficiary/create"
payload = json.dumps({
"identityNumber": "92062743323",
"firstName": "John",
"lastName": "Doe",
"secondLastName": "Doe",
"countryIsoCode": "CU",
"country": "Cuba",
"zone": "Santa Clara",
"province": "Villa Clara",
"municipality": "Santa Clara",
"streetName": "Street",
"houseNumber": "15",
"zipcode": "80100",
"email": "john.doe@test.com",
"phone": "+5357575757",
"creditCards": []
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"creditCardIds": [],
"senders": [
"6e67b9045016f12effaa2f9d"
],
"isBlocked": false,
"_id": "68b67e3d8eb80b4e5b2a5831",
"deliveryCI": "92062743329",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "Doe",
"deliveryArea": "Villa Clara",
"deliveryZone": "Santa Clara",
"country_iso_code": "CU",
"metadata": {
"apiClientId": "67b3f875bf625ceee691evb8"
},
"deliveryCity": "Santa Clara",
"streetName": "Street",
"houseNumber": "15",
"zipcode": "80100",
"deliveryPhone": "+5357575757",
"country": "Cuba",
"email": "john.doe@test.com",
"owner": "6e67b9045016f12effaa2f9d",
"createdAt": "2025-09-02T05:18:53.933Z",
"updatedAt": "2025-09-02T05:18:53.933Z",
"beneficiaryFullName": "John Doe Doe",
"__v": 0,
"deliveryFullName": "John Doe Doe",
"deliveryAddress": "Street 15, ZIP: 80100, Santa Clara, Cuba",
"birthdate": "1991-06-06T04:00:00.000Z",
"id": "68b67e3d8eb80b4e5b2a5831"
}
Request
POST /api/private/users/beneficiary/create
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
identityNumber |
string | Beneficiary identification number |
firstName |
string | Beneficiary first name |
lastName |
string | Beneficiary last name |
secondLastName |
string | Beneficiary second last name |
countryIsoCode |
string | ISO code of the country (e.g., "CU") |
country |
string | Country name |
zone |
string | Zone of the beneficiary (e.g., "Santa Clara") |
province |
string | Province of the beneficiary |
municipality |
string | Municipality of the beneficiary |
streetName |
string | Street name of the beneficiary |
houseNumber |
string | House number of the beneficiary |
zipcode |
string | ZIP/postal code of the beneficiary |
email |
string | Email address of the beneficiary |
phone |
string | Phone number of the beneficiary |
creditCards |
array | Array of credit cards associated (optional) |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
| data | {Beneficiary} |
Beneficiary object |
Beneficiary
| NAME | TYPE | DESCRIPTION |
|---|---|---|
creditCardIds |
[string] | IDs of the credit cards linked to this beneficiary |
senders |
[string] | Array of sender IDs linked to this beneficiary |
isBlocked |
boolean | Whether the beneficiary is blocked or not |
_id |
string | Beneficiary ID |
deliveryCI |
string | Beneficiary identification number |
deliveryContact |
string | Beneficiary first name |
deliveryLastName |
string | Beneficiary last name |
deliverySecondLastName |
string | Beneficiary second last name |
deliveryArea |
string | Beneficiary province |
deliveryZone |
string | Beneficiary zone |
country_iso_code |
string | ISO code of the country |
metadata |
object | Metadata object (e.g., apiClientId) |
deliveryCity |
string | Beneficiary municipality |
streetName |
string | Beneficiary street name |
houseNumber |
string | Beneficiary house number |
zipcode |
string | Beneficiary ZIP/postal code |
deliveryPhone |
string | Beneficiary phone number |
country |
string | Beneficiary country name |
email |
string | Beneficiary email |
owner |
string | ID of the user who owns this beneficiary |
createdAt |
string (date) | Date of creation (ISO 8601 format) |
updatedAt |
string (date) | Date of last update (ISO 8601 format) |
beneficiaryFullName |
string | Beneficiary full name |
__v |
number | Version key (MongoDB internal) |
deliveryFullName |
string | Full delivery name of the beneficiary |
deliveryAddress |
string | Full formatted delivery address |
birthdate |
string (date) | Beneficiary birthdate (if available) |
id |
string | Alias of _id (duplicate beneficiary ID) |
Credit Card
| NAME | TYPE | DESCRIPTION |
|---|---|---|
number |
string | The credit card number |
cardHolderName |
string | The credit card holder name |
bankName |
string | The credit card bank name |
currency |
string | The credit card currency |
Update Beneficiary
Endpoint to update a beneficiary given his id.
curl --location --request POST 'https://backend.ducapp.net/api/private/users/beneficiary/update' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header : Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"isBlocked": false,
"deliveryCI": "92062743329",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "Doe",
"deliveryArea": "Holguín",
"deliveryZone": "Provincias",
"country_iso_code": "CU",
"deliveryCity": "Holguin",
"streetName": "Main",
"houseNumber": "200",
"zipcode": "80100",
"deliveryPhone": "+5357575757",
"country": "Cuba",
"email": "john.doe@test.com",
"beneficiaryFullName": "John Doe Doe",
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authentication", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"isBlocked": false,
"deliveryCI": "92062743329",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "Doe",
"deliveryArea": "Holguín",
"deliveryZone": "Provincias",
"country_iso_code": "CU",
"deliveryCity": "Holguin",
"streetName": "Main",
"houseNumber": "200",
"zipcode": "80100",
"deliveryPhone": "+5357512618",
"country": "Cuba",
"email": "john.doe@test.com",
"beneficiaryFullName": "John Doe Doe",
"_id": "64b6e055af1bb56a944098db"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/users/beneficiary/update", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://backend.ducapp.net/api/private/users/beneficiary/update"
payload = json.dumps({
"isBlocked": False,
"deliveryCI": "92062743329",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "Doe",
"deliveryArea": "Holguín",
"deliveryZone": "Provincias",
"country_iso_code": "CU",
"deliveryCity": "Holguin",
"streetName": "Main",
"houseNumber": "200",
"zipcode": "80100",
"deliveryPhone": "+5357575757",
"country": "Cuba",
"email": "john.doe@test.com",
"beneficiaryFullName": "John Doe Doe",
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authentication': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"creditCardIds": [],
"isBlocked": false,
"_id": "64b6e055af1bb56a944098db",
"deliveryCI": "92062743329",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "Doe",
"deliveryArea": "Holguín",
"deliveryZone": "Provincias",
"country_iso_code": "CU",
"deliveryCity": "Holguin",
"streetName": "Main",
"houseNumber": "200",
"zipcode": "80100",
"deliveryPhone": "+5357575757",
"country": "Cuba",
"email": "john.doe@test.com",
"beneficiaryFullName": "John Doe Doe"
}
Request
POST /api/private/users/beneficiary/update
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
| data | {Beneficiary} |
Beneficiary object |
Beneficiary
| NAME | TYPE | DESCRIPTION |
|---|---|---|
isBlocked |
string | Wheter the beneficiary is blocked or not |
_id |
string | Beneficiary Id |
deliveryCI |
string | Beneficiary Identification Number |
deliveryContact |
string | Beneficiary Name |
deliveryLastName |
string | Beneficiary Lastname |
deliverySecondLastName |
string | Beneficiary Second Lastname |
deliveryArea |
string | Beneficiary Province |
deliveryZone |
string | Zone to which the province of the beneficiary belongs |
country_iso_code |
string | The ISO code of the country |
deliveryCity |
string | Beneficiary Municipality |
streetName |
string | Beneficiary street name |
houseNumber |
string | Beneficiary house number |
zipcode |
string | Beneficiary zip code |
deliveryPhone |
string | Beneficiary phone number |
email |
string | Beneficiary email |
country |
string | Beneficiary country name |
beneficiaryFullName |
string | Beneficiary full name |
creditCards |
[{Credit Card}] |
Array of credit cards asociated to this beneficiary |
Credit Card
| NAME | TYPE | DESCRIPTION |
|---|---|---|
number |
string | The credit card number |
cardHolderName |
string | The credit card holder name |
bankName |
string | The credit card bank name |
currency |
string | The credit card currency |
Add Funds
Credit/Debit Card
Endpoint to add funds using credit/debit card
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/token/buy"
payload = json.dumps({
"amount": 100,
"currency": "USD",
"location": {
"latitude": "-76.25804853625596",
"longitude": "20.888864980079234",
"timestamp": "1635185398"
},
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"email": "john.doe@test.ducapp.net",
"phone": "+19058025826",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "33186",
"merchant_external_id": "Ext-46562452"
})
headers = {
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN> ',
'x-api-key': '<YOUR_API_KEY>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/token/buy' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN> ' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 100,
"currency": "USD",
"location": {
"latitude": "-76.25804853625596",
"longitude": "20.888864980079234",
"timestamp": "1635185398"
},
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"email": "john.doe@test.ducapp.net",
"phone": "+19058025826",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "33186",
"merchant_external_id": "Ext-46562452"
}'var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN> ");
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
amount: 100,
currency: "USD",
location: {
latitude: "-76.25804853625596",
longitude: "20.888864980079234",
timestamp: "1635185398",
},
creditCardNumber: "5454545454545454",
creditCardHolderName: "Ruben Gonzalez Ramirez",
expiryDate: "07/29",
cvc: "123",
email: "john.doe@test.ducapp.net",
phone: "+19058025826",
avs_street_name: "Main Street",
avs_street_number: "508",
avs_zipcode: "33186",
merchant_external_id: "Ext-46562452",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/transactions/token/buy",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/token/buy
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | The amount to send buy |
currency |
number | The currency of the user |
creditCardNumber |
number | Information for payment, credit card number |
creditCardHolderName |
number | Information for payment, name that appears on the credit card |
expiryDate |
number | Information for payment, expiration date |
cvc |
number | Information for payment, cvc |
avs_street_name |
number | Information for payment, street name |
avs_street_number |
number | Information for payment, residence number |
avs_zipcode |
number | Information for payment, zip code |
cardHolderEmail |
number | Information for payment, credit card owner email |
cardHolderPhone |
number | Information for payment, credit card owner phone |
location |
{Location} |
Information on the users GPS location at the time of the transaction |
email |
string | Email of the credit card owner |
phone |
string | Phone number of the credit card owner |
merchant_external_id |
string | External id for the current merchant for this transaction |
Location
| NAME | TYPE | DESCRIPTION |
|---|---|---|
latitude |
string | Latitude |
longitude |
string | Longitude |
timestamp |
string | Timestamp |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
Email Money Request
Endpoint to add funds via email money request
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/token/emt"
payload = json.dumps({
"amount": 100,
"currency": "CAD",
"concept": "Family Support",
"firstName": "Ruben",
"lastName": "González",
"merchant_external_id": "Ext-4656245235"
})
headers = {
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN> ',
'x-api-key': '<YOUR_API_KEY>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/token/emt' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN> ' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 100,
"currency": "CAD",
"concept": "Family Support",
"firstName": "Ruben",
"lastName": "González",
"merchant_external_id": "Ext-4656245235"
}'var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN> ");
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
amount: 100,
currency: "CAD",
concept: "Family Support",
firstName: "Ruben",
lastName: "González",
merchant_external_id: "Ext-4656245235",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/transactions/token/emt",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/token/emt
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | The amount to send buy |
currency |
string | The currency of the user (Only CAD) |
concept |
string | A brief description of the transaction |
firstName |
string | Name of the person the money is requested from |
lastName |
string | Lastname of the person the money is requested from |
merchant_external_id |
string | External id for the current merchant for this transaction |
Currency: CAD
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
Payment Link
Endpoint to add funds via payment link
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/token/createPaymentLink"
payload = json.dumps({
"product": {
"name": "Online Shop",
"description": "Products & Shipping"
},
"amount": 14,
"currency": "USD",
"merchant_external_id": "Payment-Link-{{$randomUUID}}",
"redirectUrl": "https://ducapp.net",
"customize": {
"toWalletAddress": "0x0a300E48AaA17746d15b0Db8185a84B4B72B01Ae",
"price": {
"allowCustomAmount": false,
"minAmount": 13,
"maxAmount": 14
},
"link": {
"provider": "default",
"allowPromoCode": false,
"collectBillingAddress": true,
"collectPhoneNumber": true
}
}
})
headers = {
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN> ',
'x-api-key': '<YOUR_API_KEY>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location 'https://backend.ducapp.net/api/private/transactions/token/createPaymentLink' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN> ' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"product": {
"name": "Online Shop",
"description": "Products & Shipping"
},
"amount": 14,
"currency": "USD",
"merchant_external_id": "Payment-Link-{{$randomUUID}}",
"redirectUrl": "https://ducapp.net",
"customize": {
"toWalletAddress": "0x0a300E48AaA17746d15b0Db8185a84B4B72B01Ae",
"price": {
"allowCustomAmount": false,
"minAmount": 13,
"maxAmount": 14
},
"link": {
"provider": "default",
"allowPromoCode": false,
"collectBillingAddress": true,
"collectPhoneNumber": true
}
}
}'var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN> ");
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
product: {
name: "Online Shop",
description: "Products & Shipping",
},
amount: 14,
currency: "USD",
merchant_external_id: "Payment-Link-{{$randomUUID}}",
redirectUrl: "https://ducapp.net",
customize: {
toWalletAddress: "0x0a300E48AaA17746d15b0Db8185a84B4B72B01Ae",
price: {
allowCustomAmount: false,
minAmount: 13,
maxAmount: 14,
},
link: {
provider: "default",
allowPromoCode: false,
collectBillingAddress: true,
collectPhoneNumber: true,
},
},
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/transactions/token/createPaymentLink",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response
{
"data": {
"status": 200,
"payload": {
"message": "To complete the transaction you must pay using the payment link. A notification will be sent to your email (john.doe@test.ducapp.net) when done.",
"link": "https://pay.ducapp.com/adeWqj",
"qrCode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAACcCAYAAACKuMJNAAAABmJLR0QA/wD/AP+gvaeTAAAKVUlEQVR4nO3dW2wcVx0G8O/Mend9v6w3iZM6jl3nolx6SQgVoYiC0hQSqiZFqhBUICEeUHmI8oBkqY+8hPCAAKnvSEh94FYQ0KAKEFSIKC0lpA1NSHNxWjtOUl+zttd7m8ND1sY7u/Z4PHP+s2t/P2kfrPXOHu9+PnPm3EZprTWIhFhhF4DWFwaORDFwJIqBI1EMHIli4EgUA0eiGDgSxcCRKAaORDFwJKrO6wuUUibKsSS3oV5neZy/7/d5N14/D7f39/r7Xo8XNK+fF2s4EsXAkSgGjkR5bsM5BT2dzq0N4vV5v202r7/vt03l9fh+j+eV3zYiazgSxcCRKAaORPluwzkF3WYJ+vVe22xe+W2Dej2+dL+hX6zhSBQDR6IYOBIVeBtOmt9+NSe/bULTbcBaX0bMGo5EMXAkioEjUTXfhnPjt9/K7/Gl56dVO9ZwJIqBI1EMHIkKvA1X7f1EptdABN1mDLoNGPb3wxqORDFwJIqBI1G+23Bh9zNV+7pNJ+k2Yth/rxNrOBLFwJEoBo5EeW7Dhd2PY7rfy8n0GgW/7+8U9vfjhjUciWLgSBQDR6KMr0s13U8U9N4gXo/v9n5ej+f175Hud/TbRmQNR6IYOBLFwJGoqhtLNb1XRtCvd/K7h6+T1/KZXtfqt03MGo5ErflVW8lkEkeOHEFPT0/F5wcGBoy+v+nj1xrl9xbkQZ8ygjylnjp1CqdPn0Z9fb2nY1aTsJssTn6/L9/3aQh6fzfT/Vi14NixYzh79mzF5/z+Q4Y9Nss2XBU6efJk2EUwhoGrQgcPHgy7CMZ4bsOFPR1IenpSGGzbRiQSqficdLdR4LeK8hs4N0G30dzMH7/Wg7fSz1n68/WLp1QSxcCRKAaORBlf0+D3IsCrlZTvv2N/w4V7f8R03kYeMaS1QgYaaVth/M5OTAztBewolJUve61SQFM8gk2tcezZ3IwD29rQk2hArM7M/27YewgH3SZc80NblUykh3Bz8h1M5gqYthWmbQszsDFdsHDzgxw+vNSBQj6GSF3W8cryDz9iKWzf2IhnH+vCC5/cjEe6W2BV2eLjarIuA7csBQAaSmso2/mk879Zw7aBq7dT+OHtFF750w186dFN+O7Rfjy+rU2kuLWGbbgFxVrJ1lCF4kO7PVDyyGbzeO2fwzj+o/P4wR+uYSpdfkpe76quhjM92O9GASWh8qT462NTGXzvV5dx/U4KLx/fhW3JxtWXR3jNh9vr/Zan6gIXHg0NCzpfBxQUVPG0WnYW9eDVv3+EXM7Gyyd2YXtXc3BFrWEM3DytYFkF7Hwojiei3YhaUWgrjflTrQIApZAr2BhPZXHj3gzuTM6hYC+fyF+fH0KyJYaB53ahsyVm/M+odgxckbYjgJXH0QMJfKN3F5qjy58GMzkb7304hZ/+dRCvXxjBWMp5RQugWEH+9vwwdm9pwTc/32um8DUk8DUN0us4g1TIxWDn66CsssvTMvGohYP9HTjY34F3B/vw/deu4PV/jVT83bsTafz+7dvY292KJ3YkVlSW+b/b6+frdbBdemyVV6llFLT21jB+tLcdP/nWfrz0TD+illV29ao0cO7KKN78zz1kcgVD5a4NDFyJ1f+3J1vj+M7R7fjKk92LrnLthcdcJod3ro3j8lAqwPLWHgYuQFuTjXjh01txaGcnlP2g43jx4/3BKbx/ayrsYobKdxtOeq+OlfYrhTXv61O7kvjcvg24eH0cc9nS0+fw6AwuDU5gYnozOpqXv2Jd6u+Qno8YdL8na7iAxaMWDvQnsK+nDdC69GFrDI/OYnh0NuxihoaBM6BvUxP6NjbBsnXpQ2uMT81hPJUJu4ihYT+cAcm2eiRbYhWHxqZnc0jN5EIoVXUQX5e6Hu4J39IQxZZEI1rjUaTSpR3C6XQO6czKB/X97rcnvT+eG55SDZifpNkYK++Ty2YLyGTXb18cT6kGaa0BbZdM21RaV5jGuX4wcAZoDcykc0jP5aAcZ6RYnYV4tPKa0/Ug8DUNYe9PFnY/HADcn81iZHQGs7O5+QnEC5piETTG3QO31Fiqaaa/P9ZwBoxNzmFscg6qwtSl1sYoWhqiIZSqOjBwBty8ncLg8P2K3SKdLTF0tsVDKFV1YOACNj2bw1vv3cXl6xOL2m/zp0ege2MTHtrQFFr5wiZ+z3vTc/TD7od769JdnLs4gkIuX3Y1urWrGXv7OtDqMo4KrP5zkl43zHWpIbp6axK/fOMa3r0yWrHrY09fAnseXtkEzLWKgSuhVj0l7ubQfbzy6kWcfXOwYtiaG6P4xO4N2Nnb7quEtY6BW0xpIKKhnJ1nLv587iP8+GcXcOmDsf+HzXGIQ4904cn9m1EXWd+DO8bv0+A2h97rvaKM9cMpDSuWh7Js6HwEWKKrTGuNdKaAoZEU/vHvEfzuLzdw6eoocnl7yRGE7q4WfOEzPdi3o9NbmVYh6LHToOfDsYYrUhEbsC38/De38Iu334ClAMSzQHF9w/znnskUMJXKID2XX6jEFCoMShe/mPpYBM8ffhhHn+oT+CuqHwO3iNYKqXQaUx9/DJ2NwootP6tjccjK/u+1RkQpPP/Mdnz1ud1orOdHDTBwZdTCRja6fKRg8dml7KnSQfl4LIKvndiDb7/4OBLttXufiKCF3g/nt80Q/F4jxaDZFfYWcTn0fEl6t7bhpa/vx7NH+ld9kbDasdSg16WyH86wB/PWHqxB8LSZjQYS7fU4/sUdePHLe7F1S6u5Qtaw9Rk4paGs4gMPTodQxYUuSi/M8FhJDdfaEsfuHZ14+qk+PP3ZXmzeyE1rlrMuA9fVtAePJU5gztbIoQ5ZWyGrNDJaIXdoE+yuLVCFCBApnZmrNRCJWGior0Oiox59Pe3o7+1Aa8v6HYz3yvfN3coOGHAbbLX3dA97TNWvapjXt7gcS+H9UqmqMXAkioEjUb7XpTqZ7ldbizdzq2Sl+8MF/X34fT83rOFIFANHohg4EhV4P1zZGxgeC3STTqfR0NDg6TVrWdh7s6z5wCWTSRw+fBi9vb1IJBIYGBgoef7MmTMlPzufd+P2eufzTl7fzy8GziHwW14bvuoN+irStLDLwzYciQq8H86rsOfD+f2PNt2PZXpvEem9YljDkSgGjkQxcCTK+FVq0IJuU4R9FSzdZjXdBnfDGo5EMXAkioEjUaH3w7nxu27S6/Gke+KDPp7pfknOh6OawsCRKAaORInfL9VN0HsA+52t4lXYe6NU2/fhxBqORDFwJIqBI1GBb2Zjus1kuh/M9NinV26vD3u+nFes4UgUA0eiGDgSVfMbEvrdw9ZrGynoPXRNr2oLemzZb5uONRyJYuBIFANHomquDed3Xaffe395fT+noN8/6PmCftu0bljDkSgGjkQxcCTK87pU03vsVtvx/e6h65X0fD7pPZNZw5EoBo5EMXAkyvg9700zPd/M9DrWoNuIpu+zwH44qikMHIli4EhUze0PR7WNNRyJYuBIFANHohg4EsXAkSgGjkQxcCSKgSNRDByJYuBIFANHov4Hx3sQqVPmp/gAAAAASUVORK5CYII="
}
}
}
Request
POST api/private/transactions/token/createPaymentLink
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
product |
{PRODUCT} |
The product to be paid for |
amount |
number | The amount to pay for the product |
currency |
CURRENCY |
The currency |
merchant_external_id |
string | Merchant External ID |
redirectUrl |
string | Redirect url when the payment is completed |
customize |
{CUSTOMIZE} |
Object to apply some level of customizations to the payment link |
Product
| NAME | TYPE | DESCRIPTION |
|---|---|---|
name |
string | The name of the product |
description |
string | A brief description of the product |
Currency
CAD |
USD |
EUR |
Customize
| NAME | TYPE | DESCRIPTION |
|---|---|---|
toWalletAddress |
string | Wallet address to add the funds to |
price |
{PRICE} |
Object to configure the product price |
link |
{LINK} |
Object to configure the product link |
Price
| NAME | TYPE | DESCRIPTION |
|---|---|---|
allowCustomAmount |
boolean | Whether to allow a custom amount or not |
minAmount |
number | Minimum amount (Only effective if allowCustomAmount is true) |
maxAmount |
number | Maximum amount (Only effective if allowCustomAmount is true) |
Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
provider |
string | The payment link provider. Could be default or duc to use a DUC platform custom payment link |
allowPromoCode |
boolean | Whether to allow a promo code or not |
collectBillingAddress |
boolean | Whether to collect the customer billing address or not |
collectPhoneNumber |
boolean | Whether to collect the customer phone number or not |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
{PAYLOAD} |
Corresponding message |
Payload
| NAME | TYPE | DESCRIPTION |
|---|---|---|
message |
string | A brief instruction to follow |
link |
string | The payment link to complete the transaction |
qrCode |
string (base64) |
The QRCode (base64 image) for payment link |
Payment Link
P2P Transfer
Endpoint to send money to internal users of the platform.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/token/p2p"
payload = json.dumps({
"toAddress": "0x14A205B953359F24F41B9b029ee62dc791A07F50",
"amount": 100,
"currency": "USD",
"concept": "Testing 4",
"paymentLink": true,
"redirectUrl": "https://ducapp.net",
"externalID": "Ext-2adfdf5245339"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/token/p2p' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"toAddress": "0x14A205B953359F24F41B9b029ee62dc791A07F50",
"amount": 100,
"currency": "USD",
"concept": "Testing 4",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"externalID": "Ext-2adfdf5245339"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"toAddress": "0x14A205B953359F24F41B9b029ee62dc791A07F50",
"amount": 100,
"currency": "USD",
"concept": "Testing 4",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"externalID": "Ext-2adfdf5245339"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/token/p2p", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com).",
"paymentLink": {
"url": "https://pay.ducapp.com/JdxGxk",
"id": "plink_1MtBG0KHKfW45102wDSphKTh"
}
}
Request
POST /api/private/transactions/token/p2p
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
toAddress |
string | The receiver wallet address |
amount |
number | The the amount to send |
currency |
string | The the currency of the user |
concept |
string | A brief description |
merchant_external_id |
string | External id for the current merchant for this transaction |
redirectUrl |
string | Redirect url when the payment is completed |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Top up
Endpoint to send mobile recharge to one or multiple phone numbers.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/topup/send"
payload = json.dumps({
"product": 500,
"productId": "0",
"salePrice": 27.02,
"operatorId": 3645,
"receiverName": "Juan Perez",
"destinations": [
"+5352552615",
"+5356580949"
],
"currency": "CAD",
"scheduled": false,
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"externalID": "Ext-546sdfsdf636"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/topup/send' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"product": 500,
"productId": "0",
"salePrice": 27.02,
"operatorId": 3645,
"receiverName": "Juan Perez",
"destinations": [
"+5352552615",
"+5356580949"
],
"currency": "CAD",
"scheduled": false,
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"externalID": "Ext-546sdfsdf636"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"product": 500,
"productId": "0",
"salePrice": 27.02,
"operatorId": 3645,
"receiverName": "Juan Perez",
"destinations": [
"+5352552615",
"+5356580949"
],
"currency": "CAD",
"scheduled": false,
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"externalID": "Ext-546sdfsdf636"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/topup/send", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com).",
"paymentLink": {
"url": "https://pay.ducapp.com/oWGZyE",
"id": "plink_1MtBKuKHKfW45102BmBLbrjV"
}
}
}
Request
POST /api/private/transactions/topup/send
Host: backend.ducapp.net
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
product |
string | The product name |
productId |
string | The product id |
salePrice |
number | The sale price of the product |
operatorId |
string | The operator id of the product |
receiverName |
string | The name of the receiver person |
destinations |
[string] |
An array of phone numbers |
currency |
string | The account currency to be used |
scheduled |
boolean | (Optional) To indicate that the top up will be scheduled |
posted_date |
string | (Optional) Date for the top up to be processed (scheduled needs to be true) |
merchant_external_id |
string | External id for the current merchant for this transaction |
redirectUrl |
string | Redirect url when the payment is completed |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Confirm Quotation
Endpoint to confirm a previously requested transaction.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/confirm-send"
payload = json.dumps({
"quotation_id": "33904512",
"external_id": "AA00376852",
"credit_party_identifier": {
"msisdn": "488404618693"
},
"sender": {
"lastname": "Gonzalez Ramirez",
"firstname": "Ruben",
"date_of_birth": "1992-06-27",
"country_iso_code": "CAN"
},
"beneficiary": {
"lastname": "Barboza",
"firstname": "Lewis"
},
"sending_business": {},
"receiving_business": {},
"totalAmount": "103.18",
"currency": "USD",
"country_iso_code": "NPL",
"service_id": "1",
"payer_id": "467",
"amount": 100,
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "Ext-125678899987779"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/confirm-send' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"quotation_id": "33904512",
"external_id": "AA00376852",
"credit_party_identifier": {
"msisdn": "488404618693"
},
"sender": {
"lastname": "Gonzalez Ramirez",
"firstname": "Ruben",
"date_of_birth": "1992-06-27",
"country_iso_code": "CAN"
},
"beneficiary": {
"lastname": "Barboza",
"firstname": "Lewis"
},
"sending_business": {},
"receiving_business": {},
"totalAmount": "103.18",
"currency": "USD",
"country_iso_code": "NPL",
"service_id": "1",
"payer_id": "467",
"amount": 100,
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "Ext-125678899987779"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"quotation_id": "33904512",
"external_id": "AA00376852",
"credit_party_identifier": {
"msisdn": "488404618693"
},
"sender": {
"lastname": "Gonzalez Ramirez",
"firstname": "Ruben",
"date_of_birth": "1992-06-27",
"country_iso_code": "CAN"
},
"beneficiary": {
"lastname": "Barboza",
"firstname": "Lewis"
},
"sending_business": {},
"receiving_business": {},
"totalAmount": "103.18",
"currency": "USD",
"country_iso_code": "NPL",
"service_id": "1",
"payer_id": "467",
"amount": 100,
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "Ext-125678899987779"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/confirm-send", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com).",
"paymentLink": {
"url": "https://pay.ducapp.com/gXroOw",
"id": "plink_1MtBSCKHKfW45102wM0kXoOP"
}
}
}
Request
POST /api/private/transactions/cash-out/confirm-send
Host: backend.ducapp.net
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
quotation_id |
string | The id of the requested quotation |
external_id |
object | The external id of the requested quotation |
credit_party_identifier |
string | Dynamic fields to be completed by the user |
sender |
string | Dynamic fields to be completed by the user (Only for C2C transactions type) |
beneficiary |
string | Dynamic fields to be completed by the user (Only for C2C transactions type) |
sending_business |
string | Dynamic fields to be completed by the user (Only for B2B transactions type) |
receiving_business |
string | Dynamic fields to be completed by the user (Only for B2B transactions type) |
totalAmount |
string | The total amount to be paid by the user with the fee included |
currency |
string | The user's currency |
country_iso_code |
string | The ISO code of the country to send money to |
service_id |
string | The Id of the service of the selected country |
payer_id |
string | The Id of the payer of the selected service |
amount |
string | The amount entered by the user |
merchant_external_id |
string | External id for the current merchant for this transaction |
redirectUrl |
string | Redirect url when the payment is completed |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Email Money Transfer
Endpoint to send money via email address.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/email"
payload = json.dumps({
"amount": 100,
"currency": "EUR",
"concept": "Testing",
"emailToSend": "testing2@gmail.com",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "Ext-13sdsf45435sgfh41"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"amount": 100,
"currency": "EUR",
"concept": "Testing",
"emailToSend": "testing2@gmail.com",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "Ext-13sdsf45435sgfh41"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/email", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/email' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 100,
"currency": "EUR",
"concept": "Testing",
"emailToSend": "testing2@gmail.com",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "Ext-13sdsf45435sgfh41"
}'
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com).",
"paymentLink": {
"url": "https://pay.ducapp.com/StldYg",
"id": "plink_1MtBZ8KHKfW45102fdDcV2mD"
}
}
}
Request
POST /api/private/transactions/cash-out/email
Host: backend.ducapp.net
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
emailToSend |
string | The destination email |
amount |
number | The the amount to send |
currency |
string | The the currency of the user |
concept |
string | A brief description |
redirectUrl |
string | Redirect url when the payment is completed |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Home Delivery
Endpoint to send home delivery money.
var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"service": "deliveryEUR",
"amount": 112,
"currency": "USD",
"concept": "TRAVEL",
"deliveryAmount": 92,
"deliveryAddress": "principal calle 5 test",
"deliveryFirstName": "test uno",
"deliveryID": "25736757",
"deliveryPhone": "+53555555",
"deliveryArea": "La Habana",
"deliveryCity": "La Lisa",
"deliveryZona": "Habana",
"deliveryCountry": "Cuba",
"deliveryCurrency": "EUR",
"deliveryCountryCode": "CU",
"deliveryLastName": "test dos",
"deliverySecondLastName": "test tres",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "SM59sdfdf41499"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/delivery", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/delivery"
payload = json.dumps({
"service": "deliveryEUR",
"amount": 112,
"currency": "USD",
"concept": "TRAVEL",
"deliveryAmount": 92,
"deliveryAddress": "principal calle 5 test",
"deliveryFirstName": "test uno",
"deliveryID": "25736757",
"deliveryPhone": "+53555555",
"deliveryArea": "La Habana",
"deliveryCity": "La Lisa",
"deliveryZona": "Habana",
"deliveryCountry": "Cuba",
"deliveryCurrency": "EUR",
"deliveryCountryCode": "CU",
"deliveryLastName": "test dos",
"deliverySecondLastName": "test tres",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "SM59sdfdf41499"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/delivery' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"service": "deliveryEUR",
"amount": 112,
"currency": "USD",
"concept": "TRAVEL",
"deliveryAmount": 92,
"deliveryAddress": "principal calle 5 test",
"deliveryFirstName": "test uno",
"deliveryID": "25736757",
"deliveryPhone": "+53555555",
"deliveryArea": "La Habana",
"deliveryCity": "La Lisa",
"deliveryZona": "Habana",
"deliveryCountry": "Cuba",
"deliveryCurrency": "EUR",
"deliveryCountryCode": "CU",
"deliveryLastName": "test dos",
"deliverySecondLastName": "test tres",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "SM59sdfdf41499"
}'
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com).",
"paymentLink": {
"url": "https://pay.ducapp.com/FsMvOH",
"id": "plink_1MtBc9KHKfW45102BIWlGSJ7"
}
}
}
Request
POST /api/private/transactions/cash-out/delivery
Host: backend.ducapp.net
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
service |
SERVICES |
The service identifier |
amount |
number | The the amount to send |
currency |
string | The the currency of the user |
concept |
string | A brief description |
deliveryFirstName |
string | The beneficiary's first name |
deliveryLastName |
string | The beneficiary's lastname |
deliverySecondLastName |
string | The beneficiary's second lastname |
deliveryID |
string | The beneficiary's identification number |
deliveryPhone |
string | The beneficiary's phone number |
deliveryCountry |
string | The beneficiary's country |
deliveryCountryCode |
string | The beneficiary's country ISO code in alpha2 format |
deliveryArea |
string | The beneficiary's province (Defined in Get Regions endpoint response ) |
deliveryCity |
string | The beneficiary's municipality (Defined in Get Regions endpoint response ) |
deliveryZone |
string | The beneficiary's zone (Defined in Get Zones endpoint response ) |
deliveryAddress |
string | The beneficiary's address |
deliveryCurrency |
string | The beneficiary's currency |
deliveryAmount |
string | The amount to receive by the beneficiary |
senderName |
string | The name of the person who send the transaction |
senderLastName |
string | The lastname of the person who send the transaction |
senderDocumentType |
DOCUMENT TYPE |
The type of document of identification of the person who send the transaction |
senderDocumentNumber |
string | The identification number of the person who send the transaction |
senderNationalityCountry |
string | The nationality of the person who send the transaction in format ISO 3166 alpha3 |
senderBirthdate |
string | The birthdate of the person who send the transaction in format (yyyy-MM-dd) |
senderBirthCountry |
string | The birth country of the person who send the transaction in format ISO 3166 alpha3 |
senderSex |
GENDER |
The gender of the person who send the transaction |
senderAddress |
string | The address of the person who send the transaction |
senderCity |
string | The city name of the person who send the transaction |
senderPostalCode |
string | The postal code of the person who send the transaction |
senderProvince |
string | The province of the person who send the transaction |
senderCountry |
string | The resident country of the person who send the transaction in format ISO 3166 alpha3 |
receiverCity |
string | The city name of the person who receive the transaction |
receiverPhone2 |
string | Alternative phone number of the person who receive the transaction. Only if have a contactPhone and it's a different number |
receiverCountry |
string | The country of the person who receive the transaction in format ISO 3166 alpha3 |
merchant_external_id |
string | External id for the current merchant for this transaction |
redirectUrl |
string | Redirect url when the payment is completed |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Services
deliveryCUP |
deliveryUSD |
deliveryEUR |
Document Type
| NAME | DESCRIPTION |
|---|---|
PAS |
Passport |
RES |
National ID |
OTH |
Others |
EUI |
Resident card |
CED |
Cédula |
DRV |
Drive Licence |
Gender
M |
F |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Credit Card
Endpoint to Send money to MLC/CUP cuban cards.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/creditcard"
payload = json.dumps({
"cardNumber": "9225 1299 7929 0027",
"cardHolderName": "Deicy Johana Morales Cadavid",
"bankName": "BPA",
"contactPhone": "005353129327",
"service": "cardUSD",
"amount": 374.0,
"currency": "USD",
"concept": "Economic assistance",
"deliveryAmount": "350",
"deliveryCurrency": "USD",
"deliveryAddress": "Cll 48A #103BB31 23 , ESMERALDA, CAMAGUEY, Cuba",
"deliveryCountry": "Cuba",
"deliveryCountryCode": "CU",
"senderName": "Juan ",
"senderLastName": "Kiros ",
"senderDocumentType": "RES",
"senderDocumentNumber": "785487487968",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1989-12-08",
"senderBirthCountry": "AGO",
"senderSex": "M",
"senderAddress": "Cll 48A #103BB31 678 , Edmonton, Alberta, Canada",
"senderCountry": "CAN",
"senderProvince": "Alberta",
"senderCity": "Edmonton",
"senderPostalCode": "050032",
"receiverCity": "ESMERALDA",
"receiverCountry": "CUB",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "10171340fdfe42015"
})
headers = {
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'x-api-key': '<YOUR_API_KEY>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/creditcard' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"cardNumber": "9225 1299 7929 0027",
"cardHolderName": "Deicy Johana Morales Cadavid",
"bankName": "BPA",
"contactPhone": "005353129327",
"service": "cardUSD",
"amount": 374.0,
"currency": "USD",
"concept": "Economic assistance",
"deliveryAmount": "350",
"deliveryCurrency": "USD",
"deliveryAddress": "Cll 48A #103BB31 23 , ESMERALDA, CAMAGUEY, Cuba",
"deliveryCountry": "Cuba",
"deliveryCountryCode": "CU",
"senderName": "Juan ",
"senderLastName": "Kiros ",
"senderDocumentType": "RES",
"senderDocumentNumber": "785487487968",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1989-12-08",
"senderBirthCountry": "AGO",
"senderSex": "M",
"senderAddress": "Cll 48A #103BB31 678 , Edmonton, Alberta, Canada",
"senderCountry": "CAN",
"senderProvince": "Alberta",
"senderCity": "Edmonton",
"senderPostalCode": "050032",
"receiverCity": "ESMERALDA",
"receiverCountry": "CUB",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "10171340fdfe42015"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"cardNumber": "9225 1299 7929 0027",
"cardHolderName": "Deicy Johana Morales Cadavid",
"bankName": "BPA",
"contactPhone": "005353129327",
"service": "cardUSD",
"amount": 374.0,
"currency": "USD",
"concept": "Economic assistance",
"deliveryAmount": "350",
"deliveryCurrency": "USD",
"deliveryAddress": "Cll 48A #103BB31 23 , ESMERALDA, CAMAGUEY, Cuba",
"deliveryCountry": "Cuba",
"deliveryCountryCode": "CU",
"senderName": "Juan ",
"senderLastName": "Kiros ",
"senderDocumentType": "RES",
"senderDocumentNumber": "785487487968",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1989-12-08",
"senderBirthCountry": "AGO",
"senderSex": "M",
"senderAddress": "Cll 48A #103BB31 678 , Edmonton, Alberta, Canada",
"senderCountry": "CAN",
"senderProvince": "Alberta",
"senderCity": "Edmonton",
"senderPostalCode": "050032",
"receiverCity": "ESMERALDA",
"receiverCountry": "CUB",
"redirectUrl": "https://ducapp.net",
"paymentLink": true,
"merchant_external_id": "10171340fdfe42015"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/creditcard", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com).",
"paymentLink": {
"url": "https://pay.ducapp.com/jqseQF",
"id": "plink_1MtBfLKHKfW45102ky6GWtQO"
}
}
}
Request
POST /api/private/transactions/cash-out/creditcard
Host: backend.ducapp.net
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
service |
SERVICES |
The service identifier |
amount |
number | The the amount to send (Calculated Fee included) |
currency |
string | The the currency of the user |
concept |
string | A brief description |
cardNumber |
string | The beneficiary card number |
cardHolderName |
string | The beneficiary card name |
bankName |
string | The beneficiary bank name |
contactPhone |
string | The beneficiary phone number |
deliveryCurrency |
string | The beneficiary card currency |
deliveryCountry |
string | The beneficiary country |
deliveryAmount |
string | The amount to receive by the beneficiary |
deliveryAddress |
string | The beneficiarys address |
deliveryCountryCode |
string | The beneficiary alpha2 country iso code |
senderName |
string | The name of the person who send the transaction |
senderLastName |
string | The lastname of the person who send the transaction |
senderDocumentType |
DOCUMENT TYPE |
The type of document of identification of the person who send the transaction |
senderDocumentNumber |
string | The identification number of the person who send the transaction |
senderNationalityCountry |
string | The nationality of the person who send the transaction in format ISO 3166 alpha3 |
senderBirthdate |
string | The birthdate of the person who send the transaction in format (yyyy-MM-dd) |
senderBirthCountry |
string | The birth country of the person who send the transaction in format ISO 3166 alpha3 |
senderSex |
GENDER |
The gender of the person who send the transaction |
senderAddress |
string | The address of the person who send the transaction |
senderCity |
string | The city name of the person who send the transaction |
senderPostalCode |
string | The postal code of the person who send the transaction |
senderProvince |
string | The province of the person who send the transaction |
senderCountry |
string | The resident country of the person who send the transaction in format ISO 3166 alpha3 |
receiverCity |
string | The city name of the person who receive the transaction |
receiverPhone2 |
string | Alternative phone number of the person who receive the transaction. Only if have a contactPhone and it's a different number |
receiverCountry |
string | The country of the person who receive the transaction in format ISO 3166 alpha3 |
merchant_external_id |
string | External id for the current merchant for this transaction |
redirectUrl |
string | Redirect url when the payment is completed |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Services
cardCUP |
cardUSD |
Document Type
| NAME | DESCRIPTION |
|---|---|
PAS |
Passport |
RES |
National ID |
OTH |
Others |
EUI |
Resident card |
CED |
Cedula |
DRV |
Drive Licence |
Gender
M |
F |
Bank Name
Banco Popular de Ahorro |
Banco Metropolitano |
Banco de Crédito y Comercio BANDEC |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Crypto
Get Supported Coins
Endpoint to get the supported crypto coins by our platform.
It is recommended to use the endpoint
/api/v2/transactions/crypto/coins
instead of/api/private/transactions/crypto/coins, since v2 is the most up-to-date version.
curl --location --request GET 'https://backend.ducapp.net/api/v2/transactions/crypto/coins' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \import requests
import json
url = "https://backend.ducapp.net/api/v2/transactions/crypto/coins"
payload = json.dumps({})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
var raw = JSON.stringify({});
var requestOptions = {
method: "GET",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/v2/transactions/crypto/coins",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
[
{
"label": "Bitcoin",
"key": "bitcoin",
"symbol": "BTC"
},
{
"label": "Bitcoin Cash",
"key": "bitcoincash",
"symbol": "BCH"
},
{
"label": "Dai",
"key": "dai",
"symbol": "DAI"
},
{
"label": "Ethereum",
"key": "ethereum",
"symbol": "ETH"
}
]
Request
GET /api/private/transactions/crypto/coins
GET /api/v2/transactions/crypto/coins (Recomended)
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
None Required
Response Body
The response is an array [], where each element is a cryptocurrency object with the following properties:
| NAME | TYPE | DESCRIPTION |
|---|---|---|
label |
string | Full name of the cryptocurrency (e.g., Bitcoin) |
key |
string | Internal identifier / slug of the coin (e.g., ethereum, litecoin) |
symbol |
string | Short ticker symbol of the coin (e.g., BTC, ETH, LTC) |
Get Crypto Buy Price
Endpoint to get the approximated crypto buy price.
It is recommended to use the endpoint
/api/v2/transactions/crypto/price
instead of/api/private/transactions/crypto/price, since v2 is the most up-to-date version.
import requests
import json
url = "https://backend.ducapp.net/api/v2/transactions/crypto/price"
payload = json.dumps({
"amount": 10,
"crypto": "BTC",
"currency": "USD"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/v2/transactions/crypto/price' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 10,
"crypto": "BTC",
"currency": "USD"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
amount: 10,
crypto: "BTC",
currency: "USD",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/v2/transactions/crypto/price",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
{
"amount": "0.00009155"
}
Request
POST /api/private/transactions/crypto/price
POST /api/v2/transactions/crypto/price (Recomended)
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | The amount to calculate the approximated price |
crypto |
string | Symbol of the selected crypto currency |
currency |
string | The selected currency |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | The approximated price |
Create Charge
Endpoint to create a crypto charge.
It is recommended to use the endpoint
/api/v2/transactions/crypto/charge
instead of/api/private/transactions/crypto/charge, since v2 is the most up-to-date version.
import requests
import json
url = "https://backend.ducapp.net/api/v2/transactions/crypto/charge"
payload = json.dumps({
"name": "{{$randomFullName}}",
"description": "{{$randomPhrase}}",
"localPrice": {
"currency": "USD",
"amount": 10
},
"merchant_external_id": "Crypto-{{$randomUUID}}"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/v2/transactions/crypto/charge' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "{{$randomFullName}}",
"description": "{{$randomPhrase}}",
"localPrice": {
"currency": "USD",
"amount": 10
},
"merchant_external_id": "Crypto-{{$randomUUID}}"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
name: "{{$randomFullName}}",
description: "{{$randomPhrase}}",
localPrice: {
currency: "USD",
amount: 10,
},
merchant_external_id: "Crypto-{{$randomUUID}}",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/v2/transactions/crypto/charge",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response:
{
"data": {
"status": 201,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com).",
"paymentLink": {
"url": "https://commerce.coinbase.com/pay/9d060eb6-d4e9-4997-b05b-9114f5965b9e"
}
}
}
Request
POST /api/private/transactions/crypto/charge
POST /api/v2/transactions/crypto/charge (Recomended)
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
name |
string | Name of the product to buy |
description |
object | Description of the product to buy |
localPrice |
{LocalPrice} |
Local price information |
merchant_external_id |
string | External id for the current merchant for this transaction |
Local Price
| NAME | TYPE | DESCRIPTION |
|---|---|---|
currency |
string | Currency to be fund |
amount |
object | Amount to be fund |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Send Money
Get Countries
Endpoint to browse the available countries to send money.
import requests
url = "https://backend.ducapp.net/api/private/transactions/cash-out/countries"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN> '
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)curl --location --request GET 'https://backend.ducapp.net/api/private/transactions/cash-out/countries' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN> 'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN> ");
var urlencoded = new URLSearchParams();
var requestOptions = {
method: 'GET',
headers: myHeaders,
body: urlencoded,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/countries", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"statusText": "OK",
"status": 200,
"data": [
{
"iso_code": "AND",
"name": "Andorra"
},
{
"iso_code": "AUT",
"name": "Austria"
}
],
"pagination": {
"totalPages": "1",
"total": "45",
"perPage": "50",
"page": "1"
}
}
Request
GET /api/private/transactions/cash-out/countries
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
statusText |
string | Text that indicates the status of the request |
status |
number | The request status code |
data |
[Country] |
An array of counties object |
Country
| NAME | TYPE | DESCRIPTION |
|---|---|---|
iso_code |
string | The country ISO code |
name |
string | The country name |
Get Services
Endpoint to browse the available services by country.
var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN> ");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"country_iso_code": "NPL"
});
var requestOptions = {
method: 'GET',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/services", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));curl --location --request GET 'https://backend.ducapp.net/api/private/transactions/cash-out/services' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN> ' \
--header 'Content-Type: application/json' \
--data-raw '{
"country_iso_code": "NPL"
}'import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/services"
payload = json.dumps({
"country_iso_code": "NPL"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN> ',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"statusText": "OK",
"status": 200,
"data": [
{
"id": 1,
"name": "MobileWallet"
},
{
"id": 2,
"name": "BankAccount"
},
{
"id": 3,
"name": "CashPickup"
}
],
"pagination": {
"totalPages": "1",
"total": "3",
"perPage": "50",
"page": "1"
}
}
Request
GET /api/private/transactions/cash-out/services
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
country_iso_code |
string | The ISO code of the country to send money to |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
statusText |
string | Text that indicates the status of the request |
status |
number | The request status code |
data |
[Service] |
An array of services object |
Service
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
number | The service id |
name |
string | The service name |
Get Payers
Endpoint to browse the list of available payers by country services.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/payers"
payload = json.dumps({
"service_id": 1,
"country_iso_code": "NPL"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"service_id": 1,
"country_iso_code": "NPL"
});
var requestOptions = {
method: 'GET',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/payers", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));curl --location --request GET 'https://backend.ducapp.net/api/private/transactions/cash-out/payers' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"service_id": 1,
"country_iso_code": "NPL"
}
'
Example Response:
{
"statusText": "OK",
"status": 200,
"data": [
{
"country_iso_code": "NPL",
"currency": "NPR",
"id": 467,
"increment": 0.01,
"name": "eSewa",
"precision": 2,
"service": {
"id": 1,
"name": "MobileWallet"
},
"transaction_types": {
"C2C": {
"maximum_transaction_amount": null,
"minimum_transaction_amount": "100.00000000",
"credit_party_identifiers_accepted": [
"msisdn"
],
"required_documents": [],
"required_receiving_entity_fields": [
"lastname",
"firstname"
],
"required_sending_entity_fields": [
"lastname",
"firstname",
"date_of_birth",
"country_iso_code"
]
}
}
}
],
"pagination": {
"totalPages": "1",
"total": "1",
"perPage": "100",
"page": "1"
}
}
Request
GET /api/private/transactions/cash-out/payers
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
service_id |
number | The Id of the service of the selected country |
country_iso_code |
string | The ISO code of the country to send money to |
page |
number | (Optional) Number of the page |
per_page |
number | (Optional) Amount of result per page |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
statusText |
string | Text that indicates the status of the request |
status |
number | The request status code |
data |
[Payer] |
An array of payers object |
Payer
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | The payer id |
name |
string | The payer name |
transaction_types |
{Transaction Type} |
The payers associated transactions type (C2C\B2B) |
currency |
string | The payer currency |
Transaction Type
| NAME | TYPE | DESCRIPTION |
|---|---|---|
maximum_transaction_amount |
string | Maximum transaction amount allowed |
minimum_transaction_amount |
string | Minimum transaction amount allowed |
credit_party_identifiers_accepted |
[String] |
Dynamic set of required information field |
required_documents |
[String] |
Dynamic set of required information |
required_receiving_entity_fields |
[String] |
Dynamic set of required information |
required_sending_entity_fields |
[String] |
Dynamic set of required information |
Get Payer Details
Endpoint to a payer details by Id.
import requests
url = "https://backend.ducapp.net/api/private/transactions/cash-out/payers/3890"
payload = {}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/payers/3890", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));curl --location --request GET 'https://backend.ducapp.net/api/private/transactions/cash-out/payers/3890' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'
Example Response:
{
"statusText": "OK",
"status": 200,
"data": {
"country_iso_code": "HTI",
"currency": "HTG",
"id": 3890,
"increment": 0.01,
"name": "MonCash",
"precision": 2,
"service": {
"id": 1,
"name": "MobileWallet"
},
"transaction_types": {
"C2C": {
"maximum_transaction_amount": 100000,
"minimum_transaction_amount": 150,
"credit_party_identifiers_accepted": [
"msisdn"
],
"required_documents": [],
"required_receiving_entity_fields": [
"lastname",
"firstname"
],
"required_sending_entity_fields": [
"lastname",
"firstname",
"date_of_birth",
"country_iso_code",
"msisdn",
"address",
"code"
]
}
}
}
}
Request
GET /api/private/transactions/cash-out/payers/{identifier}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Path
| NAME | TYPE | DESCRIPTION |
|---|---|---|
identifier |
number | Payer id |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
statusText |
string | Text that indicates the status of the request |
status |
number | The request status code |
data |
Payer |
Payer object |
Payer
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | The payer id |
name |
string | The payer name |
transaction_types |
{Transaction Type} |
The payers associated transactions type (C2C\B2B) |
currency |
string | The payer currency |
Transaction Type
| NAME | TYPE | DESCRIPTION |
|---|---|---|
maximum_transaction_amount |
string | Maximum transaction amount allowed |
minimum_transaction_amount |
string | Minimum transaction amount allowed |
credit_party_identifiers_accepted |
[String] |
Dynamic set of required information field |
required_documents |
[String] |
Dynamic set of required information |
required_receiving_entity_fields |
[String] |
Dynamic set of required information |
required_sending_entity_fields |
[String] |
Dynamic set of required information |
Get Fee and Exchange Rate
Endpoint to get the current fee and exchange rate for the transaction.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/rate-fee"
payload = json.dumps({
"payer_id": "467",
"destinationAmount": 13876,
"mode": "DESTINATION_AMOUNT",
"transactionType": "C2C",
"currency": "USD"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/request-send' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"payer_id": "467",
"destinationAmount": 13876,
"mode": "DESTINATION_AMOUNT",
"transactionType": "C2C",
"currency": "USD"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"payer_id": "467",
"destinationAmount": 13876,
"mode": "DESTINATION_AMOUNT",
"transactionType": "C2C",
"currency": "USD"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/request-send", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"data": {
"rate": 137.9051,
"fee": {
"currency": "USD",
"amount": 3
},
"currencies": {
"from": "USD",
"to": "HTG"
}
}
}
Request
POST /api/private/transactions/cash-out/rate-fee
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
payer_id |
string | The Id of the payer of the selected service |
destinationAmount |
number | Amount to deliver |
mode |
string | `SOURCE_AMOUNT |
transactionType |
string | The type of transaction selected from those available by the payer |
sourceAmount |
number | The amount to deliver in the source currency |
sourceCurrency |
string | Currency of the sending user |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
rate |
number | Current exchange rate |
fee |
{Fee} |
Fee amount and currency |
currencies |
{Currencies} |
Currencies for the exchange rate |
Fee
| NAME | TYPE | DESCRIPTION |
|---|---|---|
currency |
string | The fee currency |
amount |
number | The fee amount |
Currencies
| NAME | TYPE | DESCRIPTION |
|---|---|---|
from |
string | The base currency |
to |
string | The destination currency |
Send
Endpoint to send the transaction.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/send"
payload = json.dumps({
"credit_party_identifiers_accepted": {
"msisdn": "3784046187654"
},
"required_sending_entity_fields": {
"lastname": "Gonzalez Rodriguez",
"firstname": "Ruben",
"date_of_birth": "1992-06-27",
"country_iso_code": "CAN",
"msisdn": "3784046187654",
"address": "Main 191",
"code": "80100"
},
"required_receiving_entity_fields": {
"lastname": "Bush",
"firstname": "Lewis"
},
"payer_id": "3890",
"transaction_type": "C2C",
"sourceCurrency": "USD",
"sourceAmount": 600,
"mode": "SOURCE_AMOUNT",
"destinationAmount": 35785543,
"purpose_of_remittance": "FAMILY_SUPPORT",
"merchant_external_id": "Ext-1234ffdfwadfsdffefed333634535678",
"paymentLink": true,
"redirectUrl": "https://ducapp.net"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/confirm-send' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"credit_party_identifiers_accepted": {
"msisdn": "3784046187654"
},
"required_sending_entity_fields": {
"lastname": "Gonzalez Rodriguez",
"firstname": "Ruben",
"date_of_birth": "1992-06-27",
"country_iso_code": "CAN",
"msisdn": "3784046187654",
"address": "Main 191",
"code": "80100"
},
"required_receiving_entity_fields": {
"lastname": "Bush",
"firstname": "Lewis"
},
"payer_id": "3890",
"transaction_type": "C2C",
"sourceCurrency": "USD",
"sourceAmount": 600,
"mode": "SOURCE_AMOUNT",
"destinationAmount": 35785543,
"purpose_of_remittance": "FAMILY_SUPPORT",
"merchant_external_id": "Ext-1234ffdfwadfsdffefed333634535678",
"paymentLink": true,
"redirectUrl": "https://ducapp.net"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"credit_party_identifiers_accepted": {
"msisdn": "3784046187654"
},
"required_sending_entity_fields": {
"lastname": "Gonzalez Rodriguez",
"firstname": "Ruben",
"date_of_birth": "1992-06-27",
"country_iso_code": "CAN",
"msisdn": "3784046187654",
"address": "Main 191",
"code": "80100"
},
"required_receiving_entity_fields": {
"lastname": "Bush",
"firstname": "Lewis"
},
"payer_id": "3890",
"transaction_type": "C2C",
"sourceCurrency": "USD",
"sourceAmount": 600,
"mode": "SOURCE_AMOUNT",
"destinationAmount": 35785543,
"purpose_of_remittance": "FAMILY_SUPPORT",
"merchant_external_id": "Ext-1234ffdfwadfsdffefed333634535678",
"paymentLink": true,
"redirectUrl": "https://ducapp.net"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/confirm-send", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/cash-out/send
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
credit_party_identifiers_accepted |
string | Dynamic fields to be completed by the user |
required_sending_entity_fields |
string | Dynamic fields to be completed by the user |
required_receiving_entity_fields |
string | Dynamic fields to be completed by the user |
required_documents |
string | Dynamic fields to be completed by the user |
sourceAmount |
number | The amount to send in the user currency |
sourceCurrency |
string | The user's currency |
mode |
string | `SOURCE_AMOUNT |
transaction_type |
string | The type of transaction selected from those available by the payer |
payer_id |
string | The Id of the payer of the selected service |
destinationAmount |
number | The amount to deliver in the destination currency |
location |
{Location} |
Information on the users GPS location at the time of the transaction |
creditCardNumber |
string | Information for payment, credit card number |
creditCardHolderName |
string | Information for payment, name that appears on the credit card |
expiryDate |
string | Information for payment, expiration date |
cvc |
string | Information for payment, cvc |
avs_street_name |
string | Information for payment, street name |
avs_street_number |
string | Information for payment, residence number |
avs_zipcode |
string | Information for payment, zip code |
email |
string | Email of the credit card owner |
phone |
string | Phone number of the credit card owner |
merchant_external_id |
string | External id for the current merchant for this transaction |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
redirectUrl |
string | URL to be redirected after the payment link confirmation |
purpose_of_remittance |
string | A brief description of the transaction purpose |
Location
| NAME | TYPE | DESCRIPTION |
|---|---|---|
latitude |
string | Latitude |
longitude |
string | Longitude |
timestamp |
string | Timestamp |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Send Money (Specific)
Get Zones
Endpoint to retrieve the available fee zones and their associated locations for a specific country.
It is recommended to use the endpoint
/api/v2/helpers/...
instead of/api/private/..., since v2 is the most up-to-date version.
curl --location --request GET 'https://backend.ducapp.net/api/v2/helpers/fees/getZones?countryCode=CU' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/v2/helpers/fees/getZones?countryCode=CU", requestOptions)
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
url = "https://backend.ducapp.net/api/v2/helpers/fees/getZones?countryCode=CU"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
Example Response:
{
"countryName": "Cuba",
"countryShortCode": "CU",
"zones": [
{
"name": "Habana",
"locations": [
"La Habana"
]
},
{
"name": "Provincias",
"locations": [
"Artemisa",
"Ciego de Ávila",
"Camagüey",
"Cienfuegos",
"Granma",
"Guantánamo",
"Isla de la Juventud",
"Las Tunas",
"Mayabeque",
"Pinar del Río",
"Sancti Spíritus",
"Santiago de Cuba",
"Villa Clara",
"Holguín",
"Matanzas"
]
}
]
}
Request
GET /api/private/CU/zones
GET /api/v2/helpers/fees/getZones?countryCode=CU (Recomended)
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Querry Parameters
| NAME | TYPE | REQUIRED | DESCRIPTION |
|---|---|---|---|
countryCode |
string | required | ISO 2-letter country code |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
countryName |
string | Full name of the country |
countryShortCode |
string | ISO 2-letter country code |
zones |
[Zone] |
Array of zones available in the country. |
Zone Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
name |
string | Zone name |
locations |
[string] | Array of locations included in the zone. |
Get Fee
Endpoint to calculate the fee and conversion rate for a specific service, country, and zone.
It is recommended to use the endpoint on
/api/v2/helpers/...
instead of/api/private/..., since v2 is the most up-to-date version.
import requests
url = "https://backend.ducapp.net/api/private/fees/cu/cardCUP/Provincias?amount=7499"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
curl --location --request GET 'https://backend.ducapp.net/api/private/fees/cu/cardCUP/Provincias?amount=7499' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/fees/cu/cardCUP/Provincias?amount=7499", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"countryName": "Cuba",
"countryShortCode": "CU",
"zoneName": "Provincias",
"service": "cardCUP",
"rangeMin": 6000.01,
"rangeMax": 12000,
"amountToDeliver": 7499,
"currencyToDeliver": "CUP",
"fee": 6,
"currencyFee": "USD"
}
Request
GET /api/private/fees/{countryCode}/{service}/{zoneName}?amount={amount}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Path Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
countryCode |
string | ISO code of the country |
service |
string | Service name (See below) |
zoneName |
string | Zone name within the country |
Querry Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | The transaction amount used to calculate the applicable fee |
Services Available (Cuba)
| NAME | |||
|---|---|---|---|
cardCUP |
cardUSD |
deliveryCUP |
deliveryUSD |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
countryName |
string | Full name of the country |
countryShortCode |
string | ISO short code of the country |
zoneName |
string | Zone name where the service applies |
service |
string | Service identifier |
rangeMin |
number / null | Minimum range amount |
rangeMax |
number / null | Maximum range amount |
amountToDeliver |
number | Same as amount |
currencyToDeliver |
string | Currency of the delivered amount, depends on the service name |
fee |
number | Calculated fee amount |
currencyFee |
string | Currency in which the fee is charged |
Get Fees
Endpoint to get all the fee dataset.
import requests
url = "https://backend.ducapp.net/api/v2/helpers/fees/getHole"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
curl --location --request GET 'https://backend.ducapp.net/api/v2/helpers/fees/getHole' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/v2/helpers/fees/getHole", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"results": {
"Habana": {
"cardCUP": [
{
"fromAmount": 0,
"toAmount": 6000,
"fee": 3,
"createdAt": "2022-09-29T15:38:51.773Z",
"updatedAt": "2022-11-18T15:22:35.099Z"
},
{
"fromAmount": 6000.01,
"toAmount": 12000,
"fee": 6,
"createdAt": "2022-09-29T15:38:51.777Z",
"updatedAt": "2022-09-29T15:38:51.777Z"
}
],
"deliveryCUP": [
{
"fromAmount": 0,
"toAmount": 6000,
"fee": 3,
"createdAt": "2022-09-29T15:40:18.988Z",
"updatedAt": "2022-11-18T15:22:00.879Z"
},
{
"fromAmount": 6000.01,
"toAmount": 12000,
"fee": 6,
"createdAt": "2022-09-29T15:40:18.990Z",
"updatedAt": "2022-09-29T15:40:18.990Z"
}
]
},
"Provincias": {
"deliveryUSD": [
{
"fromAmount": 0,
"toAmount": 100,
"fee": 12,
"createdAt": "2022-10-03T16:31:43.609Z",
"updatedAt": "2022-11-18T15:25:08.645Z"
},
{
"fromAmount": 100.01,
"toAmount": 150,
"fee": 18,
"createdAt": "2022-10-03T16:31:43.614Z",
"updatedAt": "2022-10-03T16:31:43.614Z"
}
],
"cardUSD": [
{
"fromAmount": 20.01,
"toAmount": 50,
"fee": 6,
"createdAt": "2023-03-16T20:28:58.800Z",
"updatedAt": "2023-03-16T20:28:58.800Z"
},
{
"fromAmount": 50.01,
"toAmount": 100,
"fee": 10,
"createdAt": "2023-03-16T20:28:58.802Z",
"updatedAt": "2023-03-16T20:28:58.802Z"
}
]
}
}
}
Request
GET /api/private/fees
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
[zoneName] |
{ZONE} |
Requested zone name |
Zone
| NAME | TYPE | DESCRIPTION |
|---|---|---|
[serviceName] |
{SERVICE} |
Latitude |
Service
| NAME | TYPE | DESCRIPTION |
|---|---|---|
[serviceName] |
[FEE] |
Latitude |
Fee
| NAME | TYPE | DESCRIPTION |
|---|---|---|
fromAmount |
number | Amount lower limit |
toAmount |
number | Amount upper limit |
fee |
number | Amount to pay |
createdAt |
Date | Fee creation date |
updatedAt |
Date | Fee update date |
Get Fee (v2)
Endpoint to calculate the fee and conversion rate for a specific service, country, and zone.
It is recommended to use this endpoint on
/api/v2/helpers/...
instead of/api/private/..., since v2 is the most up-to-date version.
curl --location --request GET 'https://backend.ducapp.net/api/v2/helpers/fees?amount=10¤cy=USD&service=deliveryEUR&zone=Habana&country=CU' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch("https://backend.ducapp.net/api/v2/helpers/fees?amount=10¤cy=USD&service=deliveryEUR&zone=Habana&country=CU", requestOptions)
.then((response) => response.json())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
url = "https://backend.ducapp.net/api/v2/helpers/fees?amount=10¤cy=USD&service=deliveryEUR&zone=Habana&country=CU"
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers)
print(response.text)
Example Response:
{
"countryName": "Cuba",
"countryShortCode": "CU",
"zoneName": "Habana",
"service": "deliveryEUR",
"rate": {
"amountFrom": 0.8407,
"amountTo": 1.1895,
"fromCurrency": "EUR",
"toCurrency": "USD",
"multiplier": 1
},
"toDelivery": {
"amount": 10,
"currency": "EUR"
},
"forSend": {
"amount": 11.9,
"currency": "USD"
},
"fee": {
"amount": 0,
"currency": "USD",
"value": {
"amount": 0,
"currency": "USD"
},
"margin": 1
},
"servicePrice": {
"amount": 11.9,
"currency": "USD"
},
"totalToPay": {
"amount": 11.9,
"currency": "USD"
},
"balance": {
"amount": 667.15,
"currency": "USD"
},
"toPay": {
"amount": 0,
"currency": "USD"
}
}
Request
GET /api/v2/helpers/fees?amount={payAmount}¤cy={payCurrency}&service={service}&zone={zone}&country={country}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Query Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | The transaction amount used to calculate the applicable fee |
currency |
string | The currency of the transaction amount |
service |
string | The service identifier |
zone |
string | The zone name within the country |
country |
string | The ISO country code |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
countryName |
string |
Full name of the destination country |
countryShortCode |
string |
ISO 2-letter country code |
zoneName |
string |
Name of the region or delivery zone |
service |
string |
Type of delivery or transfer service used |
rate |
{Rate} |
Exchange rate information between currencies |
toDelivery |
{ToDelivery} |
Amount and currency to deliever |
forSend |
{ForSend} |
Amount and currency required to send |
fee |
{fee} |
Fee and margin details for the transaction |
servicePrice |
{ServicePrice} |
Total price of the selected service |
totalToPay |
{TotalToPay} |
Total amount the user has to pay (same as ServicePrice) |
balance |
{Balance} |
User’s remaining balance after the transaction |
toPay |
{ToPay} |
Amount to pay in payCurrency (servicePrice - balance) |
Rate Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amountFrom |
number |
Base amount in the source currency |
amountTo |
number |
Converted amount in the target currency |
fromCurrency |
string |
ISO code of the source currency |
toCurrency |
string |
ISO code of the target currency |
multiplier |
number |
Multiplier applied to calculate the rate |
ToDelivery Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number |
Delivery amount |
currency |
string |
Currency of the delivery amount |
ForSend Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number |
Source amount in payCurrency |
currency |
string |
Currency of the payment |
Fee Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number |
Fee amount charged |
currency |
string |
Currency of the fee |
value |
object |
Fee value representation |
├─ amount |
number |
Fee amount value |
├─ currency |
string |
Currency of the fee value |
margin |
number |
Margin or profit percentage applied to the fee |
ServicePrice Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number |
Service cost amount in payCurrency |
currency |
string |
Currency of the service cost |
TotalToPay Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number |
Service cost amount in payCurrency |
currency |
string |
Currency of the service cost |
Balance Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number |
Remaining balance amount in payCurrency |
currency |
string |
Currency of the remaining balance |
ToPay Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number |
Amount to be paid in payCurrency |
currency |
string |
Currency of the payment |
Get Exchange Rate
Endpoint to get the current exchange rate of an specific currency
It is recommended to use the endpoint on
/api/v2/helpers/...
instead of/api/private/..., since v2 is the most up-to-date version.
import requests
url = "https://backend.ducapp.net/api/private/rates?base=usd"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
curl --location --request GET 'https://backend.ducapp.net/api/private/rates?base=usd' \
--header 'x-api-key: <YOUR_API_KEY>' \var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/rates?base=usd", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"base": "USD",
"rates": {
"USD": 1,
"CAD": 1.3459,
"CUP": 380,
"EUR": 0.8371
},
"date": "2025-09-25"
}
Request
GET /api/private/rates?serviceKey={serviceKey}&base={currency}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Query Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
serviceKey |
string | service Key |
base |
string | Base currency used for exchange rates. Accepted values: USD, CAD, CUP, EUR |
-
USD: (United States Dollar) -
CAD: (Canadian Dollar) -
CUP: (Cuban Peso) -
EUR: (Euro)
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
base |
string | The base currency used for the exchange rates |
rates |
object | Key-value pairs of exchange rates relative to the base currency |
├─ USD |
string | Exchange rate of USD against the base currency |
├─ CAD |
string | Exchange rate of CAD against the base currency |
├─ CUP |
string | Exchange rate of CUP against the base currency |
├─ EUR |
string | Exchange rate of EUR against the base currency |
date |
string | The date when the rates were last updated (format: YYYY-MM-DD) |
Get Exchange Rate (v2)
Endpoint to get the current exchange rate of an specific currency and its multipier
It is recommended to use the endpoint on
/api/v2/helpers/...
instead of/api/private/..., since v2 is the most up-to-date version.
curl --location --request GET 'https://backend.ducapp.net/api/v2/helpers/rates?base=USD' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/v2/helpers/rates?base=USD", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
url = "https://backend.ducapp.net/api/v2/helpers/rates?base=USD"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json',
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"base": "USD",
"rates": {
"USD": 1,
"CAD": 1.3459,
"CUP": 380,
"EUR": 0.8371
},
"date": "2025-09-25",
"multiplier": 1
}
Request
GET /api/v2/helpers/rates?serviceKey={serviceKey}&base={currency} /api/v2/helpers
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Query Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
serviceKey |
string | service Key |
base |
string | Base currency used for exchange rates. Accepted values: USD, CAD, CUP, EUR |
-
USD: (United States Dollar) -
CAD: (Canadian Dollar) -
CUP: (Cuban Peso) -
EUR: (Euro)
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
base |
string | The base currency used for the exchange rates (e.g., USD). |
rates |
object | Key-value pairs of exchange rates relative to the base currency. |
├─ USD |
string | Exchange rate of USD against the base currency. |
├─ CAD |
string | Exchange rate of CAD against the base currency. |
├─ CUP |
string | Exchange rate of CUP against the base currency. |
├─ EUR |
string | Exchange rate of EUR against the base currency. |
date |
string | The date when the rates were last updated (format: YYYY-MM-DD). |
multiplier |
string | The date when the rates were last updated (format: YYYY-MM-DD). |
Get Regions
Endpoint to get the region's info.
curl --location --request GET 'https://backend.ducapp.net/api/private/transactions/country-region' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/country-region", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
url = "https://backend.ducapp.net/api/private/transactions/country-region"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"data": {
"status": 200,
"payload": {
"countryName": "Cuba",
"countryShortCode": "CU",
"regions": [
{
"name": "Pinar del Río",
"shortCode": "01",
"municipalities": [
{
"name": "Pinar del Río",
"code": "M011100"
},
{
"name": "Consolación del Sur",
"code": "M011000"
},
{
"name": "San Juan y Martínez",
"code": "M011300"
},
{
"name": "Los Palacios",
"code": "M010900"
},
{
"name": "Sandino",
"code": "M010100"
},
{
"name": "Guane",
"code": "M011400"
},
{
"name": "La Palma",
"code": "M010500"
},
{
"name": "San Luis",
"code": "M011200"
},
{
"name": "Minas de Matahambre",
"code": "M010300"
},
{
"name": "Viñales",
"code": "M010400"
},
{
"name": "Mantua",
"code": "M010200"
}
]
},
{
"name": "Artemisa",
"shortCode": "02",
"municipalities": [
{
"name": "Artemisa",
"code": "M021900"
},
{
"name": "San Cristóbal",
"code": "M022100"
},
{
"name": "San Antonio",
"code": "M020500"
},
{
"name": "Bauta",
"code": "M020400"
},
{
"name": "Bahía Honda",
"code": "M022000"
},
{
"name": "Mariel",
"code": "M020100"
},
{
"name": "Caimito",
"code": "M020300"
},
{
"name": "Güira de Melena",
"code": "M021700"
},
{
"name": "Alquízar",
"code": "M021800"
},
{
"name": "Guanajay",
"code": "M020200"
},
{
"name": "Candelaria",
"code": "M022200"
}
]
}
]
}
}
}
Request
GET /api/private/transactions/country-region
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
object | Contains the status code and the payload information. |
data Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | HTTP-like status code of the request. |
payload |
object | Contains country information and regions. |
data.payload Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
countryName |
string | Full name of the country |
countryShortCode |
string | ISO short code of the country |
regions |
[region] |
List of regions within the country |
region Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
name |
string | Region name (e.g., "Pinar del Río"). |
shortCode |
string | Region short code (e.g., "01"). |
municipalities |
[municipality] |
List of municipalities belonging to the region. |
municipality Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
name |
string | Municipality name |
code |
string | Unique municipality code |
paymentPointCode |
number | Payment point code linked to the municipality (may not have it) |
Get Card Regex
Endpoint to get the card regex to check if card number is valid.
It is recommended to use the endpoint on
/api/v2/helpers/...
instead of/api/private/..., since v2 is the most up-to-date version.
import requests
url = "https://backend.ducapp.net/api/private/delivery-card-regex"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
curl --location --request GET 'https://backend.ducapp.net/api/private/delivery-card-regex' \
--header 'x-api-key: <YOUR_API_KEY>' \var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/delivery-card-regex", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"BPA_CARD": "^((92)\\d{0,2})(1299)\\d{0,8}?$",
"BANMET_CARD": "^((92)\\d{0,2})(9598)\\d{0,8}?$",
"CREDIT_CARD": "^((92)(27|24|01|02|04|05|06|07|08|09))(0699|9598|1299)\\d{8}?$",
"BANDEC_CARD": "^((92)\\d{0,2})(0699)\\d{0,8}?$",
"MLC_CREDIT_CARD": "^((92)(25|35))(0699|9598|1299)\\d{8}?$"
}
Request
GET /api/private/delivery-card-regex
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
BPA_CARD |
string | Regular expression for validating BPA card numbers |
BANMET_CARD |
string | Regular expression for validating BANMET card numbers |
CREDIT_CARD |
string | Regular expression for validating general credit card numbers |
BANDEC_CARD |
string | Regular expression for validating BANDEC card numbers |
MLC_CREDIT_CARD |
string | Regular expression for validating MLC credit card numbers |
Get Card Regex (v2)
Endpoint to get the card regex to check if card number is valid.
It is recommended to use this endpoint on
/api/v2/helpers/...
instead of/api/private/..., since v2 is the most up-to-date version.
import requests
url = "https://backend.ducapp.net/api/v2/helpers/regex/delivery-card"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
curl --location --request GET 'https://backend.ducapp.net/api/v2/helpers/regex/delivery-card' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/v2/helpers/regex/delivery-card", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"BPA_CARD": "^((92)\\d{0,2})(1299)\\d{0,8}?$",
"BANMET_CARD": "^((92)\\d{0,2})(9598)\\d{0,8}?$",
"CREDIT_CARD": "^((92)(27|24|01|02|04|05|06|07|08|09))(0699|9598|1299)\\d{8}?$",
"BANDEC_CARD": "^((92)\\d{0,2})(0699)\\d{0,8}?$",
"MLC_CREDIT_CARD": "^((92)(25|35))(0699|9598|1299)\\d{8}?$"
}
Request
GET /api/v2/helpers/regex/delivery-card
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
BPA_CARD |
string | Regular expression for validating BPA card numbers |
BANMET_CARD |
string | Regular expression for validating BANMET card numbers |
CREDIT_CARD |
string | Regular expression for validating general credit card numbers |
BANDEC_CARD |
string | Regular expression for validating BANDEC card numbers |
MLC_CREDIT_CARD |
string | Regular expression for validating MLC credit card numbers |
Credit Card
Endpoint to Send money to MLC/CUP cuban cards.
curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/creditcard' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"service": "cardUSD",
"amount": 224,
"currency": "USD",
"concept": "Family Support",
"cardNumber": "9225 1299 7929 0027",
"bankName": "Banco Popular de Ahorro",
"cardHolderName": "Juan Perez",
"contactPhone": "005353129327",
"deliveryAmount": "200",
"deliveryCurrency": "USD",
"deliveryCountry": "Cuba",
"deliveryCountryCode": "CU",
"senderName": "Ruben",
"senderLastName": "Gonzalez Ramirez",
"senderDocumentType": "PASSPORT",
"senderDocumentNumber": "C254362",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1966-03-11",
"senderBirthCountry": "CAN",
"senderSex": "M",
"senderAddress": "Some Address",
"senderCity": "Toronto",
"senderPostalCode": "KJ4345",
"senderProvince": "Ontario",
"senderCountry": "Canada",
"receiverCity": "Cardenas",
"receiverPhone2": "2444676867",
"receiverCountry": "CUB",
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+19058025826",
"location": {
"latitude": "35.92591105461136",
"longitude": "14.492235823330882",
"timestamp": "21:21:03.9132187"
},
"merchant_external_id": "Ext-12345471"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"service": "cardUSD",
"amount": 224,
"currency": "USD",
"concept": "Family Support",
"cardNumber": "9225 1299 7929 0027",
"bankName": "Banco Popular de Ahorro",
"cardHolderName": "Juan Perez",
"contactPhone": "005353129327",
"deliveryAmount": "200",
"deliveryCurrency": "USD",
"deliveryCountry": "Cuba",
"deliveryCountryCode": "CU",
"senderName": "Ruben",
"senderLastName": "Gonzalez Ramirez",
"senderDocumentType": "PASSPORT",
"senderDocumentNumber": "C254362",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1966-03-11",
"senderBirthCountry": "CAN",
"senderSex": "M",
"senderAddress": "Some Address",
"senderCity": "Toronto",
"senderPostalCode": "KJ4345",
"senderProvince": "Ontario",
"senderCountry": "Canada",
"receiverCity": "Cardenas",
"receiverPhone2": "2444676867",
"receiverCountry": "CUB",
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+19058025826",
"location": {
"latitude": "35.92591105461136",
"longitude": "14.492235823330882",
"timestamp": "21:21:03.9132187"
},
"merchant_external_id": "Ext-12345471"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/creditcard", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/creditcard"
payload = json.dumps({
"service": "cardUSD",
"amount": 224,
"currency": "USD",
"concept": "Family Support",
"cardNumber": "9225 1299 7929 0027",
"bankName": "Banco Popular de Ahorro",
"cardHolderName": "Juan Perez",
"contactPhone": "005353129327",
"deliveryAmount": "200",
"deliveryCurrency": "USD",
"deliveryCountry": "Cuba",
"deliveryCountryCode": "CU",
"senderName": "Ruben",
"senderLastName": "Gonzalez Ramirez",
"senderDocumentType": "PASSPORT",
"senderDocumentNumber": "C254362",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1966-03-11",
"senderBirthCountry": "CAN",
"senderSex": "M",
"senderAddress": "Some Address",
"senderCity": "Toronto",
"senderPostalCode": "KJ4345",
"senderProvince": "Ontario",
"senderCountry": "Canada",
"receiverCity": "Cardenas",
"receiverPhone2": "2444676867",
"receiverCountry": "CUB",
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+19058025826",
"location": {
"latitude": "35.92591105461136",
"longitude": "14.492235823330882",
"timestamp": "21:21:03.9132187"
},
"merchant_external_id": "Ext-12345471"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/cash-out/creditcard
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
service |
SERVICES |
The service identifier |
amount |
number | The the amount to send (Calculated Fee included) |
currency |
string | The the currency of the user |
concept |
string | A brief description |
cardNumber |
string | The beneficiary card number |
cardHolderName |
string | The beneficiary card name |
bankName |
string | The beneficiary bank name |
contactPhone |
string | The beneficiary phone number |
deliveryCurrency |
string | The beneficiary card currency |
deliveryCountry |
string | The beneficiary country |
deliveryAmount |
string | The amount to receive by the beneficiary |
deliveryAddress |
string | The beneficiarys address |
deliveryCountryCode |
string | The beneficiary alpha2 country iso code |
senderName |
string | The name of the person who send the transaction |
senderLastName |
string | The lastname of the person who send the transaction |
senderDocumentType |
DOCUMENT TYPE |
The type of document of identification of the person who send the transaction |
senderDocumentNumber |
string | The identification number of the person who send the transaction |
senderNationalityCountry |
string | The nationality of the person who send the transaction in format ISO 3166 alpha3 |
senderBirthdate |
string | The birthdate of the person who send the transaction in format (yyyy-MM-dd) |
senderBirthCountry |
string | The birth country of the person who send the transaction in format ISO 3166 alpha3 |
senderSex |
GENDER |
The gender of the person who send the transaction |
senderAddress |
string | The address of the person who send the transaction |
senderCity |
string | The city name of the person who send the transaction |
senderPostalCode |
string | The postal code of the person who send the transaction |
senderProvince |
string | The province of the person who send the transaction |
senderCountry |
string | The resident country of the person who send the transaction in format ISO 3166 alpha3 |
receiverCity |
string | The city name of the person who receive the transaction |
receiverPhone2 |
string | Alternative phone number of the person who receive the transaction. Only if have a contactPhone and it's a different number |
receiverCountry |
string | The country of the person who receive the transaction in format ISO 3166 alpha3 |
location |
{Location} |
Information on the users GPS location at the time of the transaction |
creditCardNumber |
string | Information for payment, credit card number |
creditCardHolderName |
string | Information for payment, name that appears on the credit card |
expiryDate |
string | Information for payment, expiration date |
cvc |
string | Information for payment, cvc |
avs_street_name |
string | Information for payment, street name |
avs_street_number |
string | Information for payment, residence number |
avs_zipcode |
string | Information for payment, zip code |
email |
string | Email of the credit card owner |
phone |
string | Phone number of the credit card owner |
merchant_external_id |
string | External id for the current merchant for this transaction |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Services
cardCUP |
cardUSD |
Document Type
| NAME | DESCRIPTION |
|---|---|
PAS |
Passport |
RES |
National ID |
OTH |
Others |
EUI |
Resident card |
CED |
Cedula |
DRV |
Drive Licence |
Gender
M: MaleF: Female
Bank Name
Banco Popular de AhorroBanco MetropolitanoBanco de Crédito y Comercio BANDEC
Location
| NAME | TYPE | DESCRIPTION |
|---|---|---|
latitude |
string | Latitude |
longitude |
string | Longitude |
timestamp |
string | Timestamp |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Home Delivery
Endpoint to send home delivery money.
var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"service": "deliveryUSD",
"deliveryAddress": "Calle Máximo Gómez, #15 e/ Calle Libertad y Calle Maceo",
"deliveryFirstName": "Juan",
"deliveryLastName": "Perez",
"deliverySecondLastName": "Perez",
"deliveryID": "00120814909",
"deliveryPhone": "005353129327",
"deliveryArea": "Sancti Spíritus",
"deliveryCity": "Trinidad",
"deliveryZone": "Provincias",
"amount": 209,
"deliveryAmount": "201",
"currency": "USD",
"concept": "Family Support",
"deliveryCurrency": "USD",
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"senderName": "Ruben",
"senderLastName": "Gonzalez Ramirez",
"senderDocumentType": "PASSPORT",
"senderDocumentNumber": "C254362",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1966-03-11",
"senderBirthCountry": "CAN",
"senderSex": "M",
"senderAddress": "Some Address",
"senderCity": "Toronto",
"senderPostalCode": "KJ4345",
"senderProvince": "Ontario",
"senderCountry": "Canada",
"receiverPhone2": "2444676867",
"receiverCountry": "CUB",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "8",
"avs_zipcode": "STJ3143",
"email": "john.doe@test.ducapp.net",
"phone": "+35699452438",
"location": {
"latitude": "35.92591105461136",
"longitude": "14.492235823330882",
"timestamp": "21:08:14.2556202"
},
"merchant_external_id": "Ext-6736222352"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/delivery", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/delivery"
payload = json.dumps({
"service": "deliveryUSD",
"deliveryAddress": "Calle Máximo Gómez, #15 e/ Calle Libertad y Calle Maceo",
"deliveryFirstName": "Juan",
"deliveryLastName": "Perez",
"deliverySecondLastName": "Perez",
"deliveryID": "00120814909",
"deliveryPhone": "005353129327",
"deliveryArea": "Sancti Spíritus",
"deliveryCity": "Trinidad",
"deliveryZone": "Provincias",
"amount": 209.0,
"deliveryAmount": "201",
"currency": "USD",
"concept": "Family Support",
"deliveryCurrency": "USD",
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"senderName": "Ruben",
"senderLastName": "Gonzalez Ramirez",
"senderDocumentType": "PASSPORT",
"senderDocumentNumber": "C254362",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1966-03-11",
"senderBirthCountry": "CAN",
"senderSex": "M",
"senderAddress": "Some Address",
"senderCity": "Toronto",
"senderPostalCode": "KJ4345",
"senderProvince": "Ontario",
"senderCountry": "Canada",
"receiverPhone2": "2444676867",
"receiverCountry": "CUB",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "8",
"avs_zipcode": "STJ3143",
"email": "john.doe@test.ducapp.net",
"phone": "+35699452438",
"location": {
"latitude": "35.92591105461136",
"longitude": "14.492235823330882",
"timestamp": "21:08:14.2556202"
},
"merchant_external_id": "Ext-6736222352"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/delivery' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"service": "deliveryUSD",
"deliveryAddress": "Calle Máximo Gómez, #15 e/ Calle Libertad y Calle Maceo",
"deliveryFirstName": "Juan",
"deliveryLastName": "Perez",
"deliverySecondLastName": "Perez",
"deliveryID": "00120814909",
"deliveryPhone": "005353129327",
"deliveryArea": "Sancti Spíritus",
"deliveryCity": "Trinidad",
"deliveryZone": "Provincias",
"amount": 209.0,
"deliveryAmount": "201",
"currency": "USD",
"concept": "Family Support",
"deliveryCurrency": "USD",
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"senderName": "Ruben",
"senderLastName": "Gonzalez Ramirez",
"senderDocumentType": "PASSPORT",
"senderDocumentNumber": "C254362",
"senderNationalityCountry": "CAN",
"senderBirthdate": "1966-03-11",
"senderBirthCountry": "CAN",
"senderSex": "M",
"senderAddress": "Some Address",
"senderCity": "Toronto",
"senderPostalCode": "KJ4345",
"senderProvince": "Ontario",
"senderCountry": "Canada",
"receiverPhone2": "2444676867",
"receiverCountry": "CUB",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "8",
"avs_zipcode": "STJ3143",
"email": "john.doe@test.ducapp.net",
"phone": "+35699452438",
"location": {
"latitude": "35.92591105461136",
"longitude": "14.492235823330882",
"timestamp": "21:08:14.2556202"
},
"merchant_external_id": "Ext-6736222352"
}'
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/cash-out/delivery
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
service |
SERVICES |
The service identifier |
amount |
number | The the amount to send |
currency |
string | The the currency of the user |
concept |
string | A brief description |
deliveryFirstName |
string | The beneficiarys first name |
deliveryLastName |
string | The beneficiarys lastname |
deliverySecondLastName |
string | The beneficiarys second lastname |
deliveryID |
string | The beneficiarys identification number |
deliveryPhone |
string | The beneficiarys phone number |
deliveryCountry |
string | The beneficiarys country |
deliveryCountryCode |
string | The beneficiarys country ISO code in alpha2 format |
deliveryArea |
string | The beneficiarys province (Defined in Get Regions endpoint response ) |
deliveryCity |
string | The beneficiarys municipality (Defined in Get Regions endpoint response ) |
deliveryZone |
string | The beneficiarys zone (Defined in Get Zones endpoint response ) |
deliveryAddress |
string | The beneficiarys address |
deliveryCurrency |
string | The beneficiarys currency |
deliveryAmount |
string | The amount to receive by the beneficiary |
senderName |
string | The name of the person who send the transaction |
senderLastName |
string | The lastname of the person who send the transaction |
senderDocumentType |
DOCUMENT TYPE |
The type of document of identification of the person who send the transaction |
senderDocumentNumber |
string | The identification number of the person who send the transaction |
senderNationalityCountry |
string | The nationality of the person who send the transaction in format ISO 3166 alpha3 |
senderBirthdate |
string | The birthdate of the person who send the transaction in format (yyyy-MM-dd) |
senderBirthCountry |
string | The birth country of the person who send the transaction in format ISO 3166 alpha3 |
senderSex |
GENDER |
The gender of the person who send the transaction |
senderAddress |
string | The address of the person who send the transaction |
senderCity |
string | The city name of the person who send the transaction |
senderPostalCode |
string | The postal code of the person who send the transaction |
senderProvince |
string | The province of the person who send the transaction |
senderCountry |
string | The resident country of the person who send the transaction in format ISO 3166 alpha3 |
receiverCity |
string | The city name of the person who receive the transaction |
receiverPhone2 |
string | Alternative phone number of the person who receive the transaction. Only if have a contactPhone and it's a different number |
receiverCountry |
string | The country of the person who receive the transaction in format ISO 3166 alpha3 |
location |
{Location} |
Information on the users GPS location at the time of the transaction |
creditCardNumber |
string | Information for payment, credit card number |
creditCardHolderName |
string | Information for payment, name that appears on the credit card |
expiryDate |
string | Information for payment, expiration date |
cvc |
string | Information for payment, cvc |
avs_street_name |
string | Information for payment, street name |
avs_street_number |
string | Information for payment, residence number |
avs_zipcode |
string | Information for payment, zip code |
email |
string | Email of the credit card owner |
phone |
string | Phone number of the credit card owner |
merchant_external_id |
string | External id for the current merchant for this transaction |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Services
deliveryCUP |
deliveryUSD |
deliveryEUR |
Document Type
| NAME | DESCRIPTION |
|---|---|
PAS |
Passport |
RES |
National ID |
OTH |
Others |
EUI |
Resident card |
CED |
Cedula |
DRV |
Drive Licence |
Gender
M |
F |
Location
| NAME | TYPE | DESCRIPTION |
|---|---|---|
latitude |
string | Latitude |
longitude |
string | Longitude |
timestamp |
string | Timestamp |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Send Money (Alternatives)
Email Money Transfer
Endpoint to send money via email address.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/email"
payload = json.dumps({
"amount": 100,
"currency": "EUR",
"concept": "EMT",
"location": {
"latitude": "-76.25804853625596",
"longitude": "20.888864980079234",
"timestamp": "1635185398"
},
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "TRuben Gonzalez Ramirezst",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+19058025826",
"emailToSend": "testing2@gmail.com",
"merchant_external_id": "Ext-12345346536541"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"amount": 100,
"currency": "EUR",
"concept": "EMT",
"location": {
"latitude": "-76.25804853625596",
"longitude": "20.888864980079234",
"timestamp": "1635185398"
},
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "TRuben Gonzalez Ramirezst",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+19058025826",
"emailToSend": "testing2@gmail.com",
"merchant_external_id": "Ext-12345346536541"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/cash-out/email", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/email' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 100,
"currency": "EUR",
"concept": "EMT",
"location": {
"latitude": "-76.25804853625596",
"longitude": "20.888864980079234",
"timestamp": "1635185398"
},
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+19058025826",
"emailToSend": "testing2@gmail.com",
"merchant_external_id": "Ext-12345346536541"
}'
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/cash-out/email
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
emailToSend |
string | The destination email |
amount |
number | The the amount to send |
currency |
string | The the currency of the user |
concept |
string | A brief description |
location |
{Location} |
Information on the users GPS location at the time of the transaction |
creditCardNumber |
string | Information for payment, credit card number |
creditCardHolderName |
string | Information for payment, name that appears on the credit card |
expiryDate |
string | Information for payment, expiration date |
cvc |
string | Information for payment, cvc |
avs_street_name |
string | Information for payment, street name |
avs_street_number |
string | Information for payment, residence number |
avs_zipcode |
string | Information for payment, zip code |
email |
string | Email of the credit card owner |
phone |
string | Phone number of the credit card owner |
merchant_external_id |
string | External id for the current merchant for this transaction |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Location
| NAME | TYPE | DESCRIPTION |
|---|---|---|
latitude |
string | Latitude |
longitude |
string | Longitude |
timestamp |
string | Timestamp |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
P2P Transfer
Endpoint to send money to internal users of the platform.
curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/token/p2p' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"amount": 1,
"currency": "USD",
"concept": "P2P Transfer",
"location": {
"latitude": "-76.25804853625596",
"longitude": "20.888864980079234",
"timestamp": "1635185398"
},
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+12345678901",
"externalID": "Ext-2542643735"
"toAddress": "0x14A205B953359F24F41B9b029ee62dc791A07F50",
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"amount": 1,
"currency": "USD",
"concept": "P2P Transfer",
"location": {
"latitude": "-76.25804853625596",
"longitude": "20.888864980079234",
"timestamp": "1635185398"
},
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+12345678901",
"externalID": "Ext-2542643735"
"toAddress": "0x14A205B953359F24F41B9b029ee62dc791A07F50",
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/token/p2p", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/token/p2p"
payload = json.dumps({
"amount": 1,
"currency": "USD",
"concept": "P2P Transfer",
"location": {
"latitude": "-76.25804853625596",
"longitude": "20.888864980079234",
"timestamp": "1635185398"
},
"creditCardNumber": "5454545454545454",
"creditCardHolderName": "Ruben Gonzalez Ramirez",
"expiryDate": "07/29",
"cvc": "123",
"avs_street_name": "Main Street",
"avs_street_number": "508",
"avs_zipcode": "80100",
"email": "john.doe@test.ducapp.net",
"phone": "+12345678901",
"externalID": "Ext-2542643735"
"toAddress": "0x14A205B953359F24F41B9b029ee62dc791A07F50",
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
Request
POST /api/private/transactions/token/p2p
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
toAddress |
string | The receiver wallet address |
amount |
number | The the amount to send |
currency |
string | The the currency of the user |
concept |
string | A brief description |
location |
{Location} |
Information on the users GPS location at the time of the transaction |
creditCardNumber |
string | Information for payment, credit card number |
creditCardHolderName |
string | Information for payment, name that appears on the credit card |
expiryDate |
string | Information for payment, expiration date |
cvc |
string | Information for payment, cvc |
avs_street_name |
string | Information for payment, street name |
avs_street_number |
string | Information for payment, residence number |
avs_zipcode |
string | Information for payment, zip code |
email |
string | Email of the credit card owner |
phone |
string | Phone number of the credit card owner |
merchant_external_id |
string | External id for the current merchant for this transaction |
paymentLink |
boolean | Whether to create a payment link or not, to complete the payment |
Location
| NAME | TYPE | DESCRIPTION |
|---|---|---|
latitude |
string | Latitude |
longitude |
string | Longitude |
timestamp |
string | Timestamp |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Payments
Create Payment Order
Endpoint to create a payment order. It could be completed via dynamic link or QR Code.
import requests
import json
url = "https://backend.ducapp.net/api/private/payments/order"
payload = json.dumps({
"toWalletAddress": "0x2485EAeF87343A2e51c9E52BDA02D51D9d51202E",
"amount": 1,
"currency": "USD",
"callbackUrl": "https://webhook.site/5f5351e3-4a49-4586-af1e-72b34307d7b6",
"expiryTime": {
"amount": 24,
"unit": "hours"
},
"description": "Testing",
"externalID": "Ext-13323521379524536",
"merchantId": "Merchant-c22682FE6724542"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/payments/order' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"toWalletAddress": "0x2485EAeF87343A2e51c9E52BDA02D51D9d51202E",
"amount": 1,
"currency": "USD",
"callbackUrl": "https://webhook.site/5f5351e3-4a49-4586-af1e-72b34307d7b6",
"expiryTime": {
"amount": 24,
"unit": "hours"
},
"description": "Testing",
"externalID": "Ext-13323521379524536",
"merchantId": "Merchant-c22682FE6724542"
}'var myHeaders = new Headers()
myHeaders.append('x-api-key', '<YOUR_API_KEY>')
myHeaders.append('Authorization', 'Bearer <YOUR_ACCESS_TOKEN>')
myHeaders.append('Content-Type', 'application/json')
var raw = JSON.stringify({
toWalletAddress: '0x2485EAeF87343A2e51c9E52BDA02D51D9d51202E',
amount: 1,
currency: 'USD',
callbackUrl: 'https://webhook.site/5f5351e3-4a49-4586-af1e-72b34307d7b6',
expiryTime: {
amount: 24,
unit: 'hours',
},
description: 'Testing',
externalID: 'Ext-13323521379524536',
merchantId: 'Merchant-c22682FE6724542',
})
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow',
}
fetch('https://backend.ducapp.net/api/private/payments/order', requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error))
Example Response:
{
"expiryTime": {
"amount": 24,
"unit": "hours"
},
"status": "pending",
"_id": "66de43968g2av16b2edd859z",
"merchantDd": "Ext-13323521379524536",
"externalID": "Ext-13323521379524536",
"toWalletAddress": "0x2485EAeF87343A2e51c9E52BDA02D51D9d51202E",
"amount": 1,
"currency": "USD",
"description": "Testing",
"createdAt": "2025-10-02T09:19:18.870Z",
"updatedAt": "2025-10-02T09:19:20.516Z",
"orderId": "OI0000000229",
"qrCode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUwAAAFMCAYAAACg...gAkASgRMAFAiYAKA0v8DEJvs1M02O2gAAAAASUVORK5CYII=",
"dynamicLink": "https://ducwallet.page.link/payment/1/USD/Testing/Ext-13323521379524536/OI0000000229/0x2485EAeF87343A2e51c9E52BDA02D51D9d51202E/DYNAMIC_PAYMENT",
"expiresAt": "2025-10-03T09:19:18.870Z",
"id": "66de43968g2av16b2edd859z"
}
Request
POST /api/private/payments/order
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
toWalletAddress |
string | Wallet address of the user who will receive the payment |
amount |
number | The amount of the payment (sender side) |
currency |
string | Currency code of the payment (USD,CAD,EUR,CUP) |
callbackUrl |
string | URL where the system will notify the status of the order once processed |
expiryTime |
object | Expiration configuration for the payment (see below) |
description |
string | Brief description of the payment |
externalID |
string | External ID for the payment/order |
merchantId |
string | Merchant id |
expiryTime Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
string | The amount of time until the order expires |
unit |
number | The time unit |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
expiryTime |
object | Expiry time of the payment order |
status |
string | State of the payment order |
_id |
string | Unique identifier of the operation in the data base |
merchantId |
string | Merchant Id |
externalID |
string | external ID used as payment reference |
toWalletAddress |
string | The wallet address of the user that is goint to receive the payment |
amount |
number | The amount of the payment |
currency |
string | The currency of the payment |
description |
string | A biref description of the payment |
expiresAt |
string | Payment expiration date |
externalID |
string | External ID |
status |
string | Initial status of the payment |
orderId |
string | Order ID |
qrCode |
string | QR Code to complete the payment |
dynamicLink |
string | Dynamic link to complet the payment |
expiryTime Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
string | The amount of time until the order expires |
unit |
number | The time unit |
Get Order Details
Endpoint to get the transaction order details
import requests
url = "https://backend.ducapp.net/api/private/payments/order/OI0000000229"
payload={}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)curl --location -g --request GET 'https://backend.ducapp.net/api/private/payments/order/OI0000000229' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>'var myHeaders = new Headers()
myHeaders.append('x-api-key', '<YOUR_API_KEY>')
myHeaders.append('Authorization', 'Bearer <YOUR_ACCESS_TOKEN>')
var requestOptions = {
method: 'GET',
headers: myHeaders,
redirect: 'follow',
}
fetch('https://backend.ducapp.net/api/private/payments/order/OI0000000229', requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error))
Example Response:
{
"status": "pending",
"externalID": "Ext-13323521379524536",
"toWalletAddress": "0x2485EAeF87343A2e51c9E52BDA02D51D9d51202E",
"amount": 1,
"currency": "USD",
"description": "Testing",
"orderId": "OI0000000229",
"dynamicLink": "https://ducwallet.page.link/payment/1/USD/Testing/Ext-13323521379524536/OI0000000229/0x2485EAeF87343A2e51c9E52BDA02D51D9d51202E/DYNAMIC_PAYMENT",
"qrCode": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUwAAAFMCAY...KA0v8DEJvs1M02O2gAAAAASUVORK5CYII=",
"expiresAt": "2023-01-23T02:29:39.765Z"
}
Request
GET /api/private/payments/order/{orderId}
Host: backend.ducapp.net
Headers:
Authorization: Bearer <YOUR_ACCESS_TOKEN>
x-api-key: <YOUR_API_KEY>
Request Path
| NAME | TYPE | DESCRIPTION |
|---|---|---|
orderId |
string | The order id |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
toWalletAddress |
string | The wallet address of the user that is goint to receive the payment |
amount |
number | The amount of the payment |
currency |
string | The currency of the payment |
expiresAt |
string | Payment expiration date |
description |
string | A biref description of the payment |
externalID |
string | External ID |
status |
string | Initial status of the payment |
orderId |
string | Order ID |
qrCode |
string | QR Code to complete the payment |
dynamicLink |
string | Dynamic link to complet the payment |
Order Status Changes
All status changes will be sent using a Web-hook, provided by the third party:
Example Payload:
{
"expiryTime": {
"amount": 24,
"unit": "hours"
},
"status": "confirmed",
"externalID": "PaymentOrder-24b2c4cc-e881-4242-972a-93ee271802bd",
"amount": 15.49,
"currency": "CAD",
"description": "We need to generate the back-end SCSI firewall!",
"callbackUrl": "https://webhook.site/461607fc-0f7a-49db-974b-8a6ae9d86ef1",
"createdAt": "2024-01-08T16:30:06.927Z",
"updatedAt": "2024-01-08T16:43:09.532Z",
"confirmedAt": "2024-01-08T16:43:09.532Z",
"expiresAt": "2024-01-09T16:30:06.927Z",
"id": "659c230e2b388a5a7d327561"
}
-
externalID: You should use this field to match the order sent. -
status:pending: The initial order status. When the order is first created this is the value of thestatusfield.confirmed: After the payment is completed using the dynamic link or QR code via DUC App application theconfirmedvalue will be sended.expired: After the valid time of the order has ended theexpiredstatus will be sended.
Top up
Get Operators
Endpoint to get the operators given a valid phone number.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/topup/operators"
payload = json.dumps({
"destination": "+5352552615",
"currency": "USD"
})
headers = {
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'x-api-key': '<YOUR_API_KEY>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/topup/operators' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"destination": "+5352552615",
"currency": "USD"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"destination": "+5352552615",
"currency": "USD"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/topup/operators", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"data": {
"operators": [
{
"id": 161,
"name": "CubaCel Cuba",
"countryName": "Cuba",
"countryIsoCode": "CUB",
"products": [
{
"id": 35718,
"name": "CubaCel Cuba 250 CUP",
"description": "250 CUP",
"operatorId": 161,
"operator": "CubaCel Cuba",
"serviceId": 1,
"service": "Mobile",
"label": "250 CUP (11.02 USD)",
"wholesalePrice": {
"amount": 13.18,
"currency": "CAD"
},
"salePrice": {
"amount": 11.02,
"currency": "USD"
},
"retailPrice": {
"amount": 15.36,
"currency": "CAD"
},
"source": {
"amount": 13.18,
"currency": "CAD"
},
"destination": {
"amount": 250,
"currency": "CUP"
},
"requiredFields": {
"creditPartyIdentifier": [
"mobileNumber"
],
"debitPartyIdentifier": [],
"statementIdentifier": [],
"beneficiary": [],
"sender": []
}
},
{
"id": 35719,
"name": "CubaCel Cuba 500 CUP",
"description": "500 CUP",
"operatorId": 161,
"operator": "CubaCel Cuba",
"serviceId": 1,
"service": "Mobile",
"label": "500 CUP (22.04 USD)",
"wholesalePrice": {
"amount": 26.36,
"currency": "CAD"
},
"salePrice": {
"amount": 22.04,
"currency": "USD"
},
"retailPrice": {
"amount": 30.71,
"currency": "CAD"
},
"source": {
"amount": 26.36,
"currency": "CAD"
},
"destination": {
"amount": 500,
"currency": "CUP"
},
"requiredFields": {
"creditPartyIdentifier": [
"mobileNumber"
],
"debitPartyIdentifier": [],
"statementIdentifier": [],
"beneficiary": [],
"sender": []
}
}
]
}
]
}
}
Request
POST /api/private/transactions/topup/operators
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
destination |
string | The phone number to get asociated operators |
currency |
string | The currency in which you want to display the prices of the products |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
operators |
[Operator] | Array of operators |
Operator
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | Opeartor Id |
name |
string | Opeartor name |
countryName |
string | Opeartor country name |
products |
[Product] | Array of products |
Product
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | Product Id |
name |
string | Product name |
service |
string | Product service name |
label |
string | Product label |
salePrice |
[SalePrice] | SalePrice obejct |
destination |
[Destination] | Destination obejct |
SalePrice
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | Product sale price amount |
currency |
string | Product sale price currency |
Destination
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | Product destination amount |
currency |
string | Product destination currency |
Top up
Endpoint to send mobile recharge to one or multiple phone numbers.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/topup/send"
payload = json.dumps({
"productId": 35718,
"receiverName": "John Doe",
"destinations": [
"+5352552615"
],
"currency": "USD",
"isScheduled": False,
"scheduledDate": None,
"paymentLink": True,
"merchant_external_id": "Top-Up-1"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/topup/send' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"productId": 35718,
"receiverName": "John Doe",
"destinations": [
"+5352552615"
],
"currency": "USD",
"isScheduled": false,
"scheduledDate": null,
"paymentLink": true,
"merchant_external_id": "Top-Up-1"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"productId": 35718,
"receiverName": "John Doe",
"destinations": [
"+5352552615"
],
"currency": "USD",
"isScheduled": false,
"scheduledDate": null,
"paymentLink": true,
"merchant_external_id": "Top-Up-1"
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/topup/send", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/topup/send
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
productId |
number | The product id |
receiverName |
string | Name of the beneficiary of the top up |
destinations |
[string] | Array of phone numbers |
currency |
string | The user currency |
isScheduled |
string | If the top up wants to be scheduled or not |
scheduledDate |
string | Schedule date |
paymentLink |
string | Whether to create a payment link or not, to complete the payment |
merchant_external_id |
boolean | External id for the current merchant for this transaction |
location |
{Location} |
Information on the users GPS location at the time of the transaction |
creditCardNumber |
string | Information for payment, credit card number |
creditCardHolderName |
string | Information for payment, name that appears on the credit card |
expiryDate |
string | Information for payment, expiration date |
cvc |
string | Information for payment, cvc |
avs_street_name |
string | Information for payment, street name |
avs_street_number |
string | Information for payment, residence number |
avs_zipcode |
string | Information for payment, zip code |
email |
string | Email of the credit card owner |
phone |
string | Phone number of the credit card owner |
- All phone numbers must be from the same operator
Location
| NAME | TYPE | DESCRIPTION |
|---|---|---|
latitude |
string | Latitude |
longitude |
string | Longitude |
timestamp |
string | Timestamp |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
number | The status of the transaction |
payload |
string | Corresponding message |
paymentLink |
{Payment Link} |
Payment Link Object |
Payment Link
| NAME | TYPE | DESCRIPTION |
|---|---|---|
url |
string | Payment link |
id |
string | Payment link Id |
Transactions
Get All Transactions
Retrieves a paginated list of transactions associated with the authenticated user. This endpoint allows clients to filter, sort, and paginate through transaction records while optionally including user information for each transaction.
When called, the endpoint:
1- Validates the request body to ensure correct pagination, filtering, and sorting options.
2- Appends the user filter automatically so that only the authenticated user’s transactions are returned.
3- Cleans each transaction’s metadata before returning the final result.
4- Returns paginated results including total count, page information, and item details.
curl --location --request POST 'https://backend.ducapp.net/api/v2/transactions/get-all' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--data-raw '{
"filter": {
"status": "queued"
}
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
var raw = JSON.stringify({
filter: {
status: "queued",
},
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/v2/transactions/get-all",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/v2/transactions/get-all"
payload = json.dumps({
"filter": {
"status": "queued"
}
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"count": 1,
"items": [
{
"_id": "68de2cfeb5bbcf602e3f5c13",
"transactionAmount": 7.83,
"transactionStatus": "queued",
"currency": "CAD",
"type": "CASH_OUT_TRANSACTION",
"images": [],
"balanceSender": 519.61,
"balanceReceiver": 74.1,
"sender": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82F",
"receiver": "0x946ec5B0fC2B78adaC1fC39DC2eE682ddFc391",
"owner": "fe66b9041016f12efgaa2e8d",
"concept": "FAMILY_SUPPORT",
"externalID": "SMC-CC-20251002T074252ls1dcwom",
"metadata": {
"deliveryCI": "03060970507",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "",
"deliveryCountryCode": "CU",
"deliveryCountry": "Cuba",
"deliveryArea": "Villa Clara",
"deliveryZone": "Santa Clara",
"deliveryCity": "Santa Clara",
"streetName": "Street",
"secondStreetName": "",
"houseNumber": "16",
"zipcode": "50110",
"email": "john.Doe@gmail.com",
"deliveryPhone": "+5354545454",
"contactPhone": "+5354545454",
"cardHolderName": "John Doe",
"contactName": "John Doe",
"deliveryAddress": "Street 16, ZIP: 50110, Santa Clara, Cuba",
"birthdate": "2002-09-09T00:00:00.000Z",
"senderName": "John",
"senderLastName": "Doe",
"senderDocumentType": "DNI",
"senderDocumentNumber": "03060970507",
"senderNationalityCountry": "CAN",
"senderBirthdate": "2002-09-09",
"senderBirthCountry": "CAN",
"senderSex": "",
"senderAddress": "16, Calle 5ta, ED 66, Apt 16, e/ H y J, reparto New 501100, Canada.",
"senderCountry": "CAN",
"senderProvince": "",
"senderCity": "",
"senderPostalCode": "501100",
"senderTelephone": "+5354545455",
"apiClientId": "55cda0c8d748ed486f2bdef2",
"externalID": "SMC-CC-20251002T074252ls1dcwom",
"deliveryAmount": 1375,
"deliveryCurrency": "CUP",
"cardNumber": "9204 1299 7001 4000",
"bankName": "BPA",
"totalAmount": 7.83,
"feeAmountInUserCurrency": 2.83,
"taxRate": 275,
"marginValue": 1,
"feeAmount": 2,
"method": "CREDIT_CARD_TRANSACTION",
"balanceSender": {
"pending": 527.44,
"queued": 519.61
},
"balanceReceiver": {
"pending": 8466.27,
"queued": 74.1
}
},
"createdAt": "2025-10-02T07:42:54.361Z",
"updatedAt": "2025-10-02T07:43:01.657Z",
"transactionID": "AA99680232",
"processedAt": "2025-10-02T07:42:56.632Z",
"transactionHash": "0x82e1b8c609b3285d1f1390574dfebf2d00c6319a2ec41e155b4b2f06d6b047d7",
"completedAt": null
}],
"pageInfo": {
"currentPage": 1,
"perPage": 10,
"itemCount": 1,
"pageCount": 1,
"hasPreviousPage": false,
"hasNextPage": true
}
}
Request
POST /api/v2/transactions/get-all?withRelatedMetadata={withRelatedMetadata}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Query Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
withRelatedMetadata |
boolean | Adds additional details to payment transactions where an inline payment was used |
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
page |
number | Page number to retrieve (1 by default) |
perPage |
number | Number of transactions per page (defaults to system configuration) |
filter |
object | Filters applied to the search |
sort |
object | Sorting options for the result set (defaults to most recent first) |
options |
object | Additional options for projection |
├─ projection |
object | Specifies which fields to include/exclude in the response |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
count |
number | Total number of transactions matching the query |
items |
[{Transaction}] |
List of transactions returned for the current page (see below) |
pageInfo |
{PageInfo} |
Pagination information for the response |
Transaction Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
_id |
string | Unique transaction identifier |
transactionAmount |
number | Amount of the transaction |
transactionStatus |
string | Current status of the transaction |
currency |
string | Currency used in the transaction |
type |
string | Type of transaction |
images |
array | Optional list of related images (can be empty) |
balanceSender |
number | Remaining balance of the sender after the transaction |
balanceReceiver |
number | Remaining balance of the receiver after the transaction |
sender |
string | Wallet address of the sender |
receiver |
string | Wallet address of the receiver |
owner |
string | Owner ID associated with the transaction |
concept |
string | Concept or reason for the transaction |
externalID |
string | External identifier associated with the transaction |
metadata |
{Metadata} |
Additional details related to the transaction (see below) |
createdAt |
string (ISO date) | Date and time when the transaction was created |
updatedAt |
string (ISO date) | Date and time when the transaction was last updated |
transactionID |
string | Internal transaction identifier |
processedAt |
string (ISO date) | Date when the transaction was processed |
transactionHash |
string | Hash of the transaction on the blockchain |
completedAt |
string | null |
Transaction.Metadata Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
deliveryCI |
string | Delivery recipient’s ID or identification number. |
deliveryContact |
string | First name of the delivery contact. |
deliveryLastName |
string | Last name of the delivery contact. |
deliverySecondLastName |
string | Second last name (if applicable). |
deliveryCountryCode |
string | ISO country code of the delivery destination. |
deliveryCountry |
string | Country of delivery. |
deliveryArea |
string | Province or area where delivery occurs. |
deliveryZone |
string | Delivery zone or district. |
deliveryCity |
string | City of delivery. |
streetName |
string | Street name for the delivery address. |
secondStreetName |
string | Secondary street or cross-street name. |
houseNumber |
string | House or apartment number. |
zipcode |
string | ZIP or postal code. |
email |
string | Contact email address. |
deliveryPhone |
string | Delivery contact’s phone number. |
contactPhone |
string | Additional contact phone number. |
cardHolderName |
string | Full name of the cardholder. |
contactName |
string | Name of the main contact for the transaction. |
deliveryAddress |
string | Full formatted delivery address. |
birthdate |
string (ISO date) | Birthdate of the sender. |
senderName |
string | First name of the sender. |
senderLastName |
string | Last name of the sender. |
senderDocumentType |
string | Type of document used by the sender (DNI, Passport) |
senderDocumentNumber |
string | Document number of the sender. |
senderNationalityCountry |
string | Sender’s nationality country code. |
senderBirthdate |
string | Birthdate of the sender (string format). |
senderBirthCountry |
string | Country where the sender was born. |
senderSex |
string | Sender’s gender. |
senderAddress |
string | Sender’s full address. |
senderCountry |
string | Sender’s country code. |
senderProvince |
string | Sender’s province or region. |
senderCity |
string | Sender’s city. |
senderPostalCode |
string | Sender’s postal code |
senderTelephone |
string | Sender’s telephone number |
apiClientId |
string | ID of the API client that originated the transaction |
externalID |
string | Same external reference as at the root level |
deliveryAmount |
number | Amount to deliver to the receiver |
deliveryCurrency |
string | Currency of the delivery amount |
cardNumber |
string | Masked or full card number used for payment |
bankName |
string | Name of the sender’s bank |
totalAmount |
number | Total transaction amount including fees |
feeAmountInUserCurrency |
number | Fee converted into the user’s currency |
taxRate |
number | Tax rate applied to the transaction |
marginValue |
number | Profit margin or conversion multiplier |
feeAmount |
number | Fee amount applied to the transaction |
method |
string | Type of transaction method |
balanceSender |
object | Sender’s balance state by transaction stage |
├─ pending |
number | Pending amount for sender |
├─ queued |
number | Queued amount for sender |
balanceReceiver |
object | Receiver’s balance state by transaction stage |
├─ pending |
number | Pending amount for receiver |
├─ queued |
number | Queued amount for receiver |
inlineTransactionMetadata |
object | Additional data given when the query parameter withRelatedMetadata is used |
inlineTransactionMetadata Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
type |
string |
Indicates the type of the related transaction |
transactionStatus |
string |
Current status of the related transaction |
paymentLinkInfo |
object |
Contains information about the payment link associated with the transaction |
├─ paymentProvider |
string |
The payment provider handling the link |
├─ paymentLinkUrl |
string |
The shortened or primary payment link URL. |
├─ paymentLinkLongUrl |
string |
The full or long version of the payment link URL, usually pointing directly to the payment processor |
├─ paymentLinkQRCode |
string |
QR code for the payment link |
PageInfo Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
currentPage |
number | Current page number |
perPage |
number | Number of items per page |
itemCount |
number | Total number of items returned in this response |
pageCount |
number | Total number of available pages |
hasPreviousPage |
boolean | Indicates if there is a previous page |
hasNextPage |
boolean | Indicates if there is a next page |
Get Transactions
Endpoint to get the user transactions as sender or receiver.
curl --location --request GET 'https://backend.ducapp.net/api/private/transactions?skip=0&limit=2' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"filter": {
"status": "queued"
}
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
filter: {
status: "queued",
},
});
var requestOptions = {
method: "GET",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/transactions?skip=0&limit=2",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/private/transactions?skip=0&limit=2"
payload = json.dumps({
"filter": {
"status": "queued"
}
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Example Response
{
"data": [
{
"_id": "68de2cfeb5bbcf602e3f5c13",
"transactionAmount": 7.83,
"transactionStatus": "queued",
"currency": "CAD",
"type": "CASH_OUT_TRANSACTION",
"images": [],
"balanceSender": 519.61,
"balanceReceiver": 74.1,
"sender": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82F",
"receiver": "0x946ec5B0fC2B78adaC1fC39DC2eE682ddFc391",
"owner": "fe66b9041016f12efgaa2e8d",
"concept": "FAMILY_SUPPORT",
"externalID": "SMC-CC-20251002T074252ls1dcwom",
"metadata": {
"deliveryCI": "03060970507",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "",
"deliveryCountryCode": "CU",
"deliveryCountry": "Cuba",
"deliveryArea": "Villa Clara",
"deliveryZone": "Santa Clara",
"deliveryCity": "Santa Clara",
"streetName": "Street",
"secondStreetName": "",
"houseNumber": "16",
"zipcode": "50110",
"email": "john.Doe@gmail.com",
"deliveryPhone": "+5354545454",
"contactPhone": "+5354545454",
"cardHolderName": "John Doe",
"contactName": "John Doe",
"deliveryAddress": "Street 16, ZIP: 50110, Santa Clara, Cuba",
"birthdate": "2002-09-09T00:00:00.000Z",
"senderName": "John",
"senderLastName": "Doe",
"senderDocumentType": "DNI",
"senderDocumentNumber": "03060970507",
"senderNationalityCountry": "CAN",
"senderBirthdate": "2002-09-09",
"senderBirthCountry": "CAN",
"senderSex": "",
"senderAddress": "16, Calle 5ta, ED 66, Apt 16, e/ H y J, reparto New 501100, Canada.",
"senderCountry": "CAN",
"senderProvince": "",
"senderCity": "",
"senderPostalCode": "501100",
"senderTelephone": "+5354545455",
"apiClientId": "55cda0c8d748ed486f2bdef2",
"externalID": "SMC-CC-20251002T074252ls1dcwom",
"deliveryAmount": 1375,
"deliveryCurrency": "CUP",
"cardNumber": "9204 1299 7001 4000",
"bankName": "BPA",
"totalAmount": 7.83,
"feeAmountInUserCurrency": 2.83,
"taxRate": 275,
"marginValue": 1,
"feeAmount": 2,
"method": "CREDIT_CARD_TRANSACTION",
"balanceSender": {
"pending": 527.44,
"queued": 519.61
},
"balanceReceiver": {
"pending": 8466.27,
"queued": 74.1
}
},
"createdAt": "2025-10-02T07:42:54.361Z",
"updatedAt": "2025-10-02T07:43:01.657Z",
"transactionID": "AA99680232",
"processedAt": "2025-10-02T07:42:56.632Z",
"transactionHash": "0x82e1b8c609b3285d1f1390574dfebf2d00c6319a2ec41e155b4b2f06d6b047d7",
"completedAt": null
}
]
}
Request
GET /api/private/transactions?skip={spik}&limit={limit}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Query Parameters
| NAME | TYPE | DESCRIPTION |
|---|---|---|
skip |
number | Page number |
limit |
number | Amount of records |
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
filter |
{Filter} |
The id of the requested quotation |
Filter
| NAME | TYPE | DESCRIPTION |
|---|---|---|
status |
string | Status code of the transaction |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
[Transaction] |
The status of the transaction |
Transaction
| NAME | TYPE | DESCRIPTION |
|---|---|---|
transactionAmount |
number | The amount of the transaction |
transactionStatus |
string | The status of the transaction |
currency |
string | The currency of the transaction |
type |
string | The type of the transaction |
concept |
string | The concept of the transaction |
transactionID |
string | The id of the transaction |
Get Transaction by ID
Endpoint to get transaction by id, externalId or transactionID
It is recommended to use the endpoint
/api/v2/transactions/{id}
instead of/api/private/transactions/{id}, since v2 is the most up-to-date version.
curl --location --request GET 'https://backend.ducapp.net/api/private/transactions/AA00376276' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--data-raw '{
"filter": {
"status": "queued"
}
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
var raw = JSON.stringify({
filter: {
status: "queued",
},
});
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/transactions/AA00376276",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/AA00376276"
payload = json.dumps({
"filter": {
"status": "queued"
}
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Example Response
{
"data": {
"_id": "68de2cfeb5bbcf602e3f5c13",
"transactionAmount": 7.83,
"transactionStatus": "queued",
"currency": "CAD",
"type": "CASH_OUT_TRANSACTION",
"images": [],
"balanceSender": 519.61,
"balanceReceiver": 74.1,
"sender": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82F",
"receiver": "0x946ec5B0fC2B78adaC1fC39DC2eE682ddFc391",
"owner": "fe66b9041016f12efgaa2e8d",
"concept": "FAMILY_SUPPORT",
"externalID": "SMC-CC-20251002T074252ls1dcwom",
"metadata": {
"deliveryCI": "03060970507",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "",
"deliveryCountryCode": "CU",
"deliveryCountry": "Cuba",
"deliveryArea": "Villa Clara",
"deliveryZone": "Santa Clara",
"deliveryCity": "Santa Clara",
"streetName": "Street",
"secondStreetName": "",
"houseNumber": "16",
"zipcode": "50110",
"email": "john.Doe@gmail.com",
"deliveryPhone": "+5354545454",
"contactPhone": "+5354545454",
"cardHolderName": "John Doe",
"contactName": "John Doe",
"deliveryAddress": "Street 16, ZIP: 50110, Santa Clara, Cuba",
"birthdate": "2002-09-09T00:00:00.000Z",
"senderName": "John",
"senderLastName": "Doe",
"senderDocumentType": "DNI",
"senderDocumentNumber": "03060970507",
"senderNationalityCountry": "CAN",
"senderBirthdate": "2002-09-09",
"senderBirthCountry": "CAN",
"senderSex": "",
"senderAddress": "16, Calle 5ta, ED 66, Apt 16, e/ H y J, reparto New 501100, Canada.",
"senderCountry": "CAN",
"senderProvince": "",
"senderCity": "",
"senderPostalCode": "501100",
"senderTelephone": "+5354545455",
"apiClientId": "55cda0c8d748ed486f2bdef2",
"externalID": "SMC-CC-20251002T074252ls1dcwom",
"deliveryAmount": 1375,
"deliveryCurrency": "CUP",
"cardNumber": "9204 1299 7001 4000",
"bankName": "BPA",
"totalAmount": 7.83,
"feeAmountInUserCurrency": 2.83,
"taxRate": 275,
"marginValue": 1,
"feeAmount": 2,
"method": "CREDIT_CARD_TRANSACTION",
"balanceSender": {
"pending": 527.44,
"queued": 519.61
},
"balanceReceiver": {
"pending": 8466.27,
"queued": 74.1
}
},
"createdAt": "2025-10-02T07:42:54.361Z",
"updatedAt": "2025-10-02T07:43:01.657Z",
"transactionID": "AA99680232",
"processedAt": "2025-10-02T07:42:56.632Z",
"transactionHash": "0x82e1b8c609b3285d1f1390574dfebf2d00c6319a2ec41e155b4b2f06d6b047d7",
"completedAt": null
}
}
Request
GET /api/private/transactions/{id}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Request Path
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | Id, externalId or transactionID |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
[Transaction] |
Transaction info |
Transaction
| NAME | TYPE | DESCRIPTION |
|---|---|---|
transactionAmount |
number | The amount of the transaction |
transactionStatus |
string | The status of the transaction |
currency |
string | The currency of the transaction |
type |
string | The type of the transaction |
concept |
string | The concept of the transaction |
transactionID |
string | The id of the transaction |
Get Transaction by ID (v2)
Endpoint to get transaction by id, externalId or transactionID
It is recommended to use this endpoint
/api/v2/transactions/{id}
instead of/api/private/transactions/{id}, since v2 is the most up-to-date version.
curl --location --request GET 'https://backend.ducapp.net/api/v2/transactions/AA00376276' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"filter": {
"status": "queued"
}
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
filter: {
status: "queued",
},
});
var requestOptions = {
method: "GET",
headers: myHeaders,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/v2/transactions/AA00376276",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
import json
url = "https://backend.ducapp.net/api/v2/transactions/AA00376276"
payload = json.dumps({
"filter": {
"status": "queued"
}
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
Example Response
{
"item": {
"_id": "68de2cfeb5bbcf602e3f5c13",
"transactionAmount": 7.83,
"transactionStatus": "queued",
"currency": "CAD",
"type": "CASH_OUT_TRANSACTION",
"images": [],
"balanceSender": 519.61,
"balanceReceiver": 74.1,
"sender": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82F",
"receiver": "0x946ec5B0fC2B78adaC1fC39DC2eE682ddFc391",
"owner": "fe66b9041016f12efgaa2e8d",
"concept": "FAMILY_SUPPORT",
"externalID": "SMC-CC-20251002T074252ls1dcwom",
"metadata": {
"deliveryCI": "03060970507",
"deliveryContact": "John",
"deliveryLastName": "Doe",
"deliverySecondLastName": "",
"deliveryCountryCode": "CU",
"deliveryCountry": "Cuba",
"deliveryArea": "Villa Clara",
"deliveryZone": "Santa Clara",
"deliveryCity": "Santa Clara",
"streetName": "Street",
"secondStreetName": "",
"houseNumber": "16",
"zipcode": "50110",
"email": "john.Doe@gmail.com",
"deliveryPhone": "+5354545454",
"contactPhone": "+5354545454",
"cardHolderName": "John Doe",
"contactName": "John Doe",
"deliveryAddress": "Street 16, ZIP: 50110, Santa Clara, Cuba",
"birthdate": "2002-09-09T00:00:00.000Z",
"senderName": "John",
"senderLastName": "Doe",
"senderDocumentType": "DNI",
"senderDocumentNumber": "03060970507",
"senderNationalityCountry": "CAN",
"senderBirthdate": "2002-09-09",
"senderBirthCountry": "CAN",
"senderSex": "",
"senderAddress": "16, Calle 5ta, ED 66, Apt 16, e/ H y J, reparto New 501100, Canada.",
"senderCountry": "CAN",
"senderProvince": "",
"senderCity": "",
"senderPostalCode": "501100",
"senderTelephone": "+5354545455",
"apiClientId": "55cda0c8d748ed486f2bdef2",
"externalID": "SMC-CC-20251002T074252ls1dcwom",
"deliveryAmount": 1375,
"deliveryCurrency": "CUP",
"cardNumber": "9204 1299 7001 4000",
"bankName": "BPA",
"totalAmount": 7.83,
"feeAmountInUserCurrency": 2.83,
"taxRate": 275,
"marginValue": 1,
"feeAmount": 2,
"method": "CREDIT_CARD_TRANSACTION",
"balanceSender": {
"pending": 527.44,
"queued": 519.61
},
"balanceReceiver": {
"pending": 8466.27,
"queued": 74.1
}
},
"createdAt": "2025-10-02T07:42:54.361Z",
"updatedAt": "2025-10-02T07:43:01.657Z",
"transactionID": "AA99660032",
"processedAt": "2025-10-02T07:42:56.632Z",
"transactionHash": "0x82e1b8c609b3285d1f1390574rfebf2d00c6319a1ec41e155b4b2f06d6b047d7",
"completedAt": null
}
}
Request
GET /api/v2/transactions/{id}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Path
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | Id, externalId or transactionID |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
item |
{Transaction} |
Transaction info |
Transaction Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
transactionAmount |
number | Total amount of the transaction |
transactionStatus |
string | Current status of the transaction |
currency |
string | Currency code |
type |
string | Type of transaction |
images |
array | Optional list of related images or documents |
balanceSender |
number | Sender’s balance after the transaction |
balanceReceiver |
number | Receiver’s balance after the transaction |
_id |
string | Internal document ID |
sender |
string | Blockchain address or identifier of the sender |
receiver |
string | Blockchain address or identifier of the receiver |
owner |
string | User ID of the transaction owner |
concept |
string | Category or purpose of the transaction |
externalID |
string | External reference identifier |
metadata |
{Metadata} |
Contextual and operational information about the transaction |
createdAt |
string (ISO 8601) | Creation timestamp |
updatedAt |
string (ISO 8601) | Last update timestamp |
transactionID |
string | Public transaction identifier |
processedAt |
string (ISO 8601) | Timestamp when the transaction was processed |
transactionHash |
string | Blockchain transaction hash |
completedAt |
string (ISO 8601) | Timestamp when the transaction was completed |
id |
string | Alias for _id |
Metadata Object
| NAME | TYPE | DESCRIPTION |
|---|---|---|
feeAmountInUserCurrency |
number | Transaction fee expressed in the user’s currency |
taxRate |
number | Tax rate applied to the transaction |
senderName |
string | Sender’s first name |
senderLastName |
string | Sender’s last name |
senderDocumentType |
string | Sender’s document type (DNI, Passport) |
senderDocumentNumber |
string | Sender’s document number |
senderBirthdate |
string (YYYY-MM-DD) | Sender’s date of birth |
senderAddress |
string | Sender’s address |
senderPostalCode |
string | Sender’s postal code |
senderTelephone |
string | Sender’s contact phone number |
apiClientId |
string | ID of the API client that initiated the transaction |
externalID |
string | External transaction ID (same as root-level externalID) |
deliveryContact |
string | Name of the recipient or delivery contact |
deliveryLastName |
string | Delivery contact’s last name |
deliverySecondLastName |
string | Delivery contact’s second last name |
deliveryCI |
string | Delivery contact’s identity number |
deliveryPhone |
string | Delivery contact’s phone number |
deliveryCountry |
string | Country where the delivery is made |
deliveryArea |
string | Area or province of delivery |
deliveryCity |
string | City of delivery |
deliveryAddress |
string | Detailed delivery address |
deliveryCountryCode |
string | ISO 3166-1 alpha-2 country code (e.g. CU) |
deliveryAmount |
number | Amount to be delivered to the recipient |
deliveryCurrency |
string | Currency code of the delivered amount |
marginValue |
number | Margin applied to the transaction |
feeAmount |
number | Transaction fee amount |
totalAmount |
number | Total amount including fees and taxes |
method |
string | Transaction method |
inlineTransactionID |
string | Internal reference transaction ID |
balanceReceiver |
{Balance} |
Detailed breakdown of receiver’s balance status |
balanceSender |
{Balance} |
Detailed breakdown of sender’s balance status |
BalanceObject
| NAME | TYPE | DESCRIPTION |
|---|---|---|
pending |
number | Amount pending confirmation. |
queued |
number | Amount queued for processing. |
processed |
number | Amount already processed. |
confirmed |
number | Amount fully confirmed on the blockchain. |
Token Exchange
Exchange tokens between two supported currencies directly within the user’s wallet.
curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/token/exchange' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"fromCurrency": "USD",
"toCurrency": "EUR",
"amount": 100,
"buyAmount": 92,
"walletAddress": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82Ff"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
fromCurrency: "USD",
toCurrency: "EUR",
amount: 100,
buyAmount: 92,
walletAddress: "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82Ff"
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/transactions/token/exchange",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
url = "https://backend.ducapp.net/api/private/transactions/token/exchange"
headers = {
"x-api-key": "<YOUR_API_KEY>"
"Authorization": "Bearer <YOUR_ACCESS_TOKEN>",
"Content-Type": "application/json",
}
payload = {
"fromCurrency": "USD",
"toCurrency": "EUR",
"amount": 100,
"buyAmount": 92,
"walletAddress": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82Ff"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
Example Responsee:
{
"data": {
"payload": ""
},
"transaction": {
"transactionAmount": 10,
"transactionStatus": "pending",
"currency": "USD",
"type": "TOKEN_EXCHANGE",
"images": [],
"balanceSender": 0,
"balanceReceiver": 0,
"_id": "08db250fb295fb4c286ec7e9",
"sender": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82Ff",
"receiver": "0xd80d2bA448F4383DFbeaF4bC545CCD66f0033643",
"owner": "5e67b9041016f12effaa2e8c",
"concept": "Tokens exchange operation",
"metadata": {
"apiClientId": "67b3f875bf525ceee591e898"
},
"createdAt": "2025-09-30T00:32:15.742Z",
"updatedAt": "2025-09-30T00:32:15.742Z",
"transactionID": "AA00680198",
"id": "08db250fb295fb4c286ec7e9"
}
}
Request
POST /api/private/transactions/token/exchange
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
fromCurrency |
string | The source currency to exchange from (USD, CAD, EUR, CUP) |
toCurrency |
string | The target currency to exchange to |
amount |
number | The amount in the source currency to be exchanged |
buyAmount |
number | The amount expected in the target currency |
walletAddress |
string | The wallet address initiating the exchange (user’s wallet by default) |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
object | Contains general response metadata |
├─ payload |
string | Optional message or information returned by the server |
transaction |
object | Contains detailed information about the executed token exchange transaction |
├─ transactionAmount |
number | The amount of tokens exchanged in the transaction |
├─ transactionStatus |
string | The current status of the transaction |
├─ currency |
string | The currency used in the transaction |
├─ type |
string | Indicates the transaction type (TOKEN_EXCHANGE) |
├─ images |
array | Reserved field for any images or related assets attached to the transaction |
├─ balanceSender |
number | The balance of the sender’s account after the transaction |
├─ balanceReceiver |
number | The balance of the receiver’s account after the transaction |
├─ _id |
string | Internal database identifier of the transaction record |
├─ sender |
string | Wallet address of the user initiating the exchange |
├─ receiver |
string | Wallet address receiving the exchanged tokens |
├─ owner |
string | Internal user ID associated with the transaction owner |
├─ concept |
string | Text description of the transaction purpose (“Tokens exchange operation.”) |
├─ metadata |
object | Additional contextual information related to the transaction |
│ ├─ apiClientId |
string | The client ID associated with the API call that initiated the exchange |
├─ createdAt |
string | Timestamp indicating when the transaction was created |
├─ updatedAt |
string | Timestamp indicating the last update to the transaction record |
├─ transactionID |
string | Unique human-readable transaction identifier for tracking |
├─ id |
string | Alias of _id |
Token Buy
Endpoint to purchase tokens directly from the platform using a registered credit card.
curl --location --request POST https://backend.ducapp.net/api/private/transactions/token/buy \
--header "x-api-key: <YOUR_API_KEY>" \
--header "Authorization: Bearer <YOUR_ACCESS_TOKEN>" \
--header "Content-Type: application/json" \
--data-raw '{
"amount": 100,
"currency": "USD",
"concept": "Buying DUC tokens",
"cvc": "123",
"walletAddress": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82Ff",
"expiryDate": "12/28",
"avs_street_name": "Main Street",
"avs_street_number": "123",
"avs_zipcode": "10001",
"location": {
"latitude": "35.92591105461136",
"longitude": "14.492235823330882",
"timestamp": "21:08:14.2556202"
},
"merchant_external_id": "e2f3c3a1-0a1b-4a6f-a23d-5d17cb9fbc92"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
amount: 100,
currency: "USD",
concept: "Buying DUC tokens",
cvc: "123",
walletAddress: "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82Ff",
expiryDate: "12/28",
avs_street_name: "Main Street",
avs_street_number: "123",
avs_zipcode: "10001",
location: {
latitude: "35.92591105461136",
longitude: "14.492235823330882",
timestamp: "21:08:14.2556202"
},
merchant_external_id: "e2f3c3a1-0a1b-4a6f-a23d-5d17cb9fbc92"
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/transactions/token/buy",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));import requests
url = "https://backend.ducapp.net/api/private/transactions/token/buy"
headers = {
"x-api-key": "<YOUR_API_KEY>",
"Authorization": "Bearer <YOUR_ACCESS_TOKEN>",
"Content-Type": "application/json"
}
data = {
"amount": 100,
"currency": "USD",
"concept": "Buying DUC tokens",
"cvc": "123",
"walletAddress": "0x8aa0E6cE31F2879b64f67c2291FF5A3B33B82Ff",
"expiryDate": "12/28",
"avs_street_name": "Main Street",
"avs_street_number": "123",
"avs_zipcode": "10001",
"location": {
"latitude": "35.92591105461136",
"longitude": "14.492235823330882",
"timestamp": "21:08:14.2556202"
},
"merchant_external_id": "e2f3c3a1-0a1b-4a6f-a23d-5d17cb9fbc92"
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
Example Response:
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@gmail.com)."
}
}
Request
POST /api/private/transactions/token/buy
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
amount |
number | Amount of tokens (or fiat equivalent) to purchase |
currency |
string | Currency used for the transaction |
concept |
string | Description or reason for the token purchase |
cvc |
string | Credit card security code |
walletAddress |
string | Wallet address that will receive the purchased tokens |
expiryDate |
string | Expiration date of the credit card (MM/YY format) |
avs_street_name |
string | Street name for address verification (AVS) |
avs_street_number |
string | Street number for address verification (AVS) |
avs_zipcode |
string | ZIP or postal code for address verification (AVS) |
location |
object | User’s geolocation at the time of purchase |
├─ latitude |
string | Latitude coordinate |
├─ longitude |
string | Longitude coordinate |
├─ timestamp |
string | Timestamp of when the transaction was initiated |
mcpRate |
number (optional) | Multi-currency pricing exchange rate, if applicable |
merchant_external_id |
string | Unique external transaction identifier provided by the merchant |
externalID |
string (optional) | Alias for merchant_external_id |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
object | Contains general response metadata |
├─ status |
number | HTTP-like status code |
├─ payload |
string | Human-readable message about the transaction state |
Send Notification
Creates and sends a notification to one or more users through the specified communication channel. The notification can be sent via Email, SMS, System, or Push message.
curl --location --request POST https://backend.ducapp.net/api/private/transaction/notification \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"subject": "System Update",
"body": "We have updated our platform with new features.",
"communicationType": "Email",
"receiversIDs": ["66de43d68f2a76b2edc859e2", "66de43d68f2a76b2edc859e3"]
}'fetch("https://backend.ducapp.net/api/private/transaction/notification", {
method: "POST",
headers: {
"x-api-key": "<YOUR_API_KEY>"
"Authorization": "Bearer <YOUR_ACCESS_TOKEN>",
"Content-Type": "application/json",
},
body: JSON.stringify({
subject: "System Update",
body: "We have updated our platform with new features.",
communicationType: "Email",
receiversIDs: ["66de43d68f2a76b2edc859e2", "66de43d68f2a76b2edc859e3"]
})
})
.then(res => res.json())
.then(console.log);import requests
url = "https://backend.ducapp.net/api/private/transaction/notification"
headers = {
"x-api-key": "<YOUR_API_KEY>"
"Authorization": "Bearer <YOUR_ACCESS_TOKEN>",
"Content-Type": "application/json",
}
data = {
"subject": "System Update",
"body": "We have updated our platform with new features.",
"communicationType": "Email",
"receiversIDs": ["66de43d68f2a76b2edc859e2", "66de43d68f2a76b2edc859e3"]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
Example Response:
{
"message": "Message successfully send"
}
Request
POST api/private/transaction/notification
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
subject |
string | Subject line or title of the notification |
body |
string | Main content of the notification |
type |
string | Type of message (Default: "regular") |
communicationType |
string | Type of communication channel ("Email", "SMS", "System", "Push") |
receiversIDs |
array | Array of receiver user IDs to whom the notification will be sent |
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
message |
string | Operation state message |
ITP Import
Endpoint to start the FTP scanning and batch transaction import process. Once initiated, the system scans an FTP source for pending transaction files and processes them automatically.
curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/ftp-import' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var requestOptions = {
method: 'POST',
headers: myHeaders,
redirect: 'follow'
};
fetch("https://backend.ducapp.net/api/private/transactions/ftp-import", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));import requests
url = "https://backend.ducapp.net/api/private/transactions/ftp-import"
payload = {}
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
Example Response:
{
"data": {
"message": "The FTP scanning process and the import of batch transactions has started, notifications will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/ftp-import
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
object | Contains the result message of the FTP import initiation |
├─ message |
string | Confirmation message indicating that the FTP import has started and that an email notification will be sent upon completion. |
Cancel Cash-out Transaction
Endpoint to cancel a cash-out transaction given an externalId.
import requests
import json
url = "https://backend.ducapp.net/api/private/transactions/cash-out/changeStatus"
payload = json.dumps({
"externalID": "Ext-546735635",
"description": "Cancel Cash-out Transaction"
})
headers = {
'x-api-key': '<YOUR_API_KEY>',
'Authorization': 'Bearer <YOUR_ACCESS_TOKEN>',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
curl --location --request POST 'https://backend.ducapp.net/api/private/transactions/cash-out/changeStatus' \
--header 'x-api-key: <YOUR_API_KEY>' \
--header 'Authorization: Bearer <YOUR_ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
"externalID": "Ext-546735635",
"description": "Testing"
}'var myHeaders = new Headers();
myHeaders.append("x-api-key", "<YOUR_API_KEY>");
myHeaders.append("Authorization", "Bearer <YOUR_ACCESS_TOKEN>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
externalID: "Ext-546735635",
description: "Testing",
});
var requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch(
"https://backend.ducapp.net/api/private/transactions/cash-out/changeStatus",
requestOptions
)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.log("error", error));
Example Response
{
"data": {
"status": 200,
"payload": "The transaction is being processed, a notify will be sent to your email (john.doe@test.ducapp.net)."
}
}
Request
POST /api/private/transactions/{id}
Host: backend.ducapp.net
Headers:
x-api-key: <YOUR_API_KEY>
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
Request Path
| NAME | TYPE | DESCRIPTION |
|---|---|---|
id |
string | Id, externalId or transactionID |
Request Body
None Required
Response Body
| NAME | TYPE | DESCRIPTION |
|---|---|---|
data |
[Transaction] |
The status of the transaction |
Transactions Error Status
| CODE | MESSAGE |
|---|---|
CREATED |
The transaction is created |
CONFIRMED |
The transaction is confirmed |
CONFIRMED-UNDER-REVIEW-SLS |
The transaction is under sanctions list screening for sender or beneficiary |
CONFIRMED-WAITING-FOR-PICKUP |
The transaction is available for cash pick up by the beneficiary. Applicable for universal cash pick up only |
REJECTED |
The transaction is rejected |
REJECTED-SLS-SENDER |
The transaction is rejected as the sender failed the sanctions list screening |
REJECTED-SLS-BENEFICIARY |
The transaction is rejected as the beneficiary failed the sanctions list screening |
REJECTED-INVALID-BENEFICIARY |
The transaction is rejected as the beneficiary account is invalid |
REJECTED-BARRED-BENEFICIARY |
The transaction is rejected as the beneficiary is blacklisted |
REJECTED-BARRED-SENDER |
The transaction is rejected as the sender is blacklisted |
REJECTED-INVALID-BENEFICIARY-DETAILS |
The transaction is rejected as the beneficiary details are invalid, e.g. name, email, phone number |
REJECTED-LIMITATIONS-ON-TRANSACTION-VALUE |
The transaction is rejected as the transaction value exceeds the transaction value limit |
REJECTED-LIMITATIONS-ON-SENDER-VALUE |
The transaction is rejected as the transaction value exceeds the value that the sender can send |
REJECTED-LIMITATIONS-ON-BENEFICIARY-VALUE |
The transaction is rejected as the transaction value exceeds the value that the beneficiary can receive |
REJECTED-LIMITATIONS-ON-ACCOUNT-VALUE |
The transaction is rejected as the transaction value exceeds the value that the account can receive |
REJECTED-LIMITATIONS-ON-SENDER-QUANTITY |
The transaction is rejected as the sender exceeded the number of transactions that the sender can send |
REJECTED-LIMITATIONS-ON-BENEFICIARY-QUANTITY |
The transaction is rejected as the beneficiary exceeded the number of transactions that the beneficiary can receive |
REJECTED-LIMITATIONS-ON-ACCOUNT-QUANTITY |
The transaction is rejected as the account exceeded the number of transactions that the account can receive |
REJECTED-COMPLIANCE-REASON |
The transaction is rejected due to compliance reason |
REJECTED-PAYER-CURRENTLY-UNAVAILABLE |
The transaction is rejected as the payer is either under payer maintenance or currently unavailable |
REJECTED-INSUFFICIENT-BALANCE |
The transaction is rejected due to insufficient balance on the pay-in partner’s account |
CANCELLED |
The transaction is cancelled upon request |
SUBMITTED |
The transaction is submitted to the pay-out partner for processing |
AVAILABLE |
The transaction is available for cash pick up by the beneficiary |
COMPLETED |
The transaction is completed and payout has been made to the beneficiary |
REVERSED |
The transaction is reversed |
DECLINED |
The transaction is declined by the pay-out partner |
DECLINED-SLS-SENDER |
The transaction is declined by the pay-out partner as the sender failed the sanctions list screening |
DECLINED-SLS-BENEFICIARY |
The transaction is declined by the pay-out partner as the beneficiary failed the sanctions list screening |
DECLINED-INVALID-BENEFICIARY |
The transaction is declined by the pay-out partner due to invalid beneficiary, e.g. bank account number |
DECLINED-BARRED-BENEFICIARY |
The transaction is declined by the pay-out partner as the beneficiary is blacklisted |
DECLINED-UNSUPPORTED-BENEFICIARY |
The transaction is declined by the pay-out partner as the beneficary does not allow overseas transaction or payer is unavailable for pay out |
DECLINED-INVALID-BENEFICIARY-DETAILS |
The transaction is declined by the pay-out partner as the beneficiary’s details is invalid, e.g. name or address |
DECLINED-INVALID-SENDER-DETAILS |
The transaction is declined by the pay-out partner as the sender details is in wrong format per pay-out partners’ rules on sender. eg: character type length |
DECLINED-LIMITATIONS-ON-TRANSACTION-VALUE |
The transaction is declined by the pay-out partner as the value exceeds the amount allowed per transaction |
DECLINED-LIMITATIONS-ON-SENDER-VALUE |
The transaction is declined by the pay-out partner as the transaction value exceeds the value that the sender can send per transaction |
DECLINED-LIMITATIONS-ON-BENEFICIARY-VALUE |
The transaction is declined by the pay-out partner as the transaction value exceeds the total value that the beneficiary can receive |
DECLINED-LIMITATIONS-ON-ACCOUNT-VALUE |
The transaction is declined by the pay-out partner as the transaction value exceeds the total value that the beneficiary can receive per account |
DECLINED-LIMITATIONS-ON-ACCOUNT-VALUE-DAILY |
The transaction is declined by the pay-out partner as the transaction value exceeds the total value that the beneficiary can receive per day |
DECLINED-LIMITATIONS-ON-ACCOUNT-VALUE-WEEKLY |
The transaction is been declined by the pay-out partner as the transaction value exceeds the total value that the beneficiary can receive per week |
DECLINED-LIMITATIONS-ON-ACCOUNT-VALUE-MONTHLY |
The transaction is declined by the pay-out partner as the transaction value exceeds the total value that the beneficiary can receive per month |
DECLINED-LIMITATIONS-ON-ACCOUNT-VALUE-YEARLY |
The transaction is declined by the pay-out partner as the transaction value exceeds the total value that the beneficiary can receive per year |
DECLINED-LIMITATIONS-ON-SENDER-QUANTITY |
The transaction is declined by the pay-out partner as the sender has exceeded the number of transactions that the sender can send |
DECLINED-LIMITATIONS-ON-BENEFICIARY-QUANTITY |
The transaction is declined by the pay-out partner as the beneficiary exceeds the total number of transactions that the beneficiary can receive |
DECLINED-LIMITATIONS-ON-ACCOUNT-QUANTITY |
The transaction is declined by the pay-out partner as the beneficiary’s account exceeds the total number of transactions that the account can receive |
DECLINED-DUPLICATED-TRANSACTION |
The transaction is declined by the pay-out partner due to duplication in the transaction |
DECLINED-CANCELLED |
The transaction is declined by the pay-out partner as the pay-in partner contacted support and asked for the transaction to be cancelled (this can only happen during the beneficiary registration time) |
DECLINED-REFUSED |
The transaction is declined by the pay-out partner as the beneficiary has actively refused to perform the required onboarding, the time has elapsed or the beneficiary was unresponsive |
DECLINED-COMPLIANCE-REASON |
The transaction is declined by the pay-out partner due to compliance reason |
DECLINED-INVALID-PURPOSE-OF-REMITTANCE |
The transaction is declined by the pay-out partner due to invalid purpose of remittance, e.g. pay-out partner does not allow gifts/donations |
DECLINED-PAYER-CURRENTLY-UNAVAILABLE |
The transaction is declined by the pay-out partner as their system are not available |
Web Hooks
Transaction Status Changes
All status changes in a transaction will be notified using a Web-hook, provided by the third party:
Example Payload:
{
"event": "GIFT_CARD_ADD_TOKEN",
"transaction": {
"transactionAmount": 10,
"transactionStatus": "confirmed",
"currency": "USD",
"type": "GIFT_CARD_ADD_TOKEN",
"concept": "transmitting the firewall won't do anything, we need to generate the back-end SQL sensor!",
"externalID": "GiftCard-CREDIT-9ae68789-5b74-4efc-bede-23de1792d34f",
"createdAt": "2024-01-06T00:34:12.930Z",
"updatedAt": "2024-01-06T00:39:43.786Z",
"transactionID": "AA00380577",
"completedAt": "2024-01-06T00:39:42.640Z"
}
}
-
externalID: You should use this field to keep track of the the transaction. -
status:pending: When a transaction is first created this is the value of thestatusfield. This is the initial transaction status.queued: The transaction is queued to be processed by an administrator. This is an intermediate status.processed: When an administrator send the transaction for processing. This is an intermediate status.confirmed: When the transaction is sent to delivery. This is a success final status.failed: The transaction failed because of some rule(min or max limits, other rules) or error. This is a failed final status.rejected: Rejected for some reason. An administrator have enough reasons to believe the transaction should be rejected. This is a failed final status.
Testing
Credit Card Success Payments
Credit card data sandbox. Testing porpouse only.
| Type | Card Number | CVC | Expiry Date |
|---|---|---|---|
| Visa | 4242424242424242 | Any 3 digits | Any future date |
| Visa (debit) | 4000056655665556 | Any 3 digits | Any future date |
| Mastercard | 5555555555554444 | Any 3 digits | Any future date |
| Mastercard (2-series) | 2233003122003222 | Any 3 digits | Any future date |
| Mastercard (debit) | 5200828282828210 | Any 3 digits | Any future date |
| Mastercard (prepaid) | 5105105105105100 | Any 3 digits | Any future date |
| American Express | 378282246310005 | Any 3 digits | Any future date |
| American Express | 371449635398431 | Any 3 digits | Any future date |
| Discover | 6011111111111117 | Any 3 digits | Any future date |
| Discover | 6011000990139424 | Any 3 digits | Any future date |
Credit Card Declined Payments
Credit card data sandbox. Testing porpouse only.
| Description | Card Number | Error Code | Declined Code |
|---|---|---|---|
| Generic decline | 4000000000000002 | card_declined | generic_decline |
| Insufficient funds decline | 4000000000009995 | card_declined | insufficient _funds |
| Lost card decline | 4000000000009987 | card_declined | lost_card |
| Stolen card decline | 4000000000009979 | card_declined | stolen_card |
| Expired card decline | 4000000000000069 | expired_card | n/a |
| Incorrect CVC decline | 4000000000000127 | incorrect_cvc | n/a |
| Processing error decline | 4000000000000119 | processing_error | n/a |
| Incorrect number decline | 4242424242424241 | incorrect_number | n/a |
Errors
Error Codes
The DUC API uses the following error codes:
| Error Code | Meaning |
|---|---|
| 400 | Bad Request -- The request could not be understood by the server due to malformed syntax. |
| 401 | Unauthorized -- Your API key is wrong. |
| 403 | Forbidden -- The endpoint requested is hidden for administrators only. |
| 404 | Not Found -- The specified endpoint could not be found. |
| 405 | Method Not Allowed -- You tried to access an endpoint with an invalid method. |
| 406 | Not Acceptable -- You requested a format that isn't JSON. |
| 410 | Gone -- The endpoint requested has been removed from our servers. |
| 429 | Too Many Requests -- You're requesting too many endpoints! Slow down! |
| 500 | Internal Server Error -- We had a problem with our server. Try again later. |
| 503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |
Error Messages
| MESSAGE |
|---|
| Unauthorized |
| Resource not found |
| Invalid parameter |
| Source country not authorized |
| Payer is inactive in your |
| Invalid payer |
| Payer is currently unavailable |
| Destination amount is invalid |
| Parameter page is outside of the page range |
| Destination currency not provided by payer |
| Transaction amount below minimum of the selected payer |
| Transaction amount exceeds maximum of the selected payer |
| Account is invalid |
| Transaction amount limit exceeded |
| Account quantity limit exceeded |
| Limit exceeded |
| External ID has already been used |
| Transaction has already been confirmed |
| Transaction can not be confirmed |
| Transaction can no longer be confirmed, quotation has expired |
| Transaction can not be confirmed, insufficient balance |
| Transaction can not be cancelled |
| Method is not supported by this payer |
| Method is currently unavailable |
| Attachment is too big |
| Max number of attachments reached |
| Adding attachment is not allowed after transaction is confirmed |
| Transaction attachment not found |
| Attachment file type is invalid |
| Quotation not found |
| Quotation has expired |
| Transaction not |
| Unexpected error, please contact our support team |
Error Examples
Invalid Client
Missing or incorrect api key credentials.
Associated endpoints: All endpoints
{
"error": "INVALID_CLIENT",
"message": "INVALID_CLIENT_ERROR",
"statusCode": 401
}
Invalid Token
Missing or expired Authorization header.
Associated endpoints: All endpoints
{
"name": "UnauthorizedError",
"message": "jwt expired",
"code": "invalid_token",
"status": 401,
"inner": {
"name": "TokenExpiredError",
"message": "jwt expired",
"expiredAt": "2022-02-11T22:34:54.000Z"
}
}
Pending Operations
The User has pending operations and has to wait for it to finish.
Associated endpoints: All endpoints
{
"error": "PENDING_OPERATION_ERROR",
"message": "You have pending operations, please wait or contact the support team.",
"statusCode": 412
}
Wrong type or missing required field
Incorrect type or missing required field.
Associated endpoints: All endpoints
{
"error": "BAD_REQUEST",
"message": "BAD_REQUEST",
"statusCode": 400
}
Wrong App version
App version is out of date.
Associated endpoints:
- POST
/api/private/users/register
{
"error": "BAD_REQUEST",
"message": "You have an older version. Please update from ducapp.com",
"statusCode": 400
}
Invalid email/phone
The email or phone provided is invalid or is already registered.
Associated endpoints:
- POST
/api/private/users/register
{
"error": "BAD_REQUEST",
"message": "The email or telephone provided is invalid or already exists in the system",
"statusCode": 400
}
Invalid pattern image
The base64 string of the image field does not correspond with a face pattern.
Associated endpoints:
- POST
/api/private/users/register
{
"error": "BAD_REQUEST",
"message": "No faces in the image",
"statusCode": 400
}
Missing required fields
The call is missing required fields
Associated endpoints:
- POST
/api/private/users/register
{
"error": "BAD_REQUEST",
"message": "Missing required fields",
"statusCode": 400
}
Invalid activation code
The activation code provided is invalid.
Associated endpoints:
- POST
/api/private/users/verify
{
"error": "BAD_REQUEST",
"message": "Invalid activation code",
"statusCode": 400
}
Invalid user ID format
The ID format sent is invalid
Associated endpoints:
- POST
/api/private/users/verify
{
"error": "BAD_REQUEST",
"message": "Cast to ObjectId failed for value \"621fcfaab0002e5f8c21bea\" at path \"_id\" for model \"User\"",
"statusCode": 400
}
Wrong credentials
The credentials provided do not correspond with the registered user.
Associated endpoints:
- POST
/api/auth/login
{
"error": "BAD_CREDENTIALS",
"message": "You have provided an incorrect email, phone and/or an incorrect password",
"statusCode": 401
}
Wrong credit card
Wrong credit card, either invalid or in use by another user.
Associated endpoints:
- POST
/api/private/transactions/cash-out/confirm-send - POST
/api/private/transactions/cash-out/creditcard - POST
/api/private/transactions/cash-out/delivery - POST
/api/private/transactions/token/p2p
{
"error": "BAD_REQUEST",
"message": "Customer vault can not be persisted on database",
"statusCode": 400
}
Incorrect Credit Card Number.
Associated endpoints:
- POST
/api/private/transactions/token/buy
Wrong credit card response
{
"error": "BAD_REQUEST",
"message": "Customer not approved by Your card number is incorrect.",
"statusCode": 400
}
Missing email field.
Associated endpoints:
- POST
/api/private/transactions/cash-out/confirm-send
Wrong credit card response
{
"error": "BAD_REQUEST",
"message": "Customer can't be created: Missing field email.",
"statusCode": 400
}
Invalid operation fee
The field amount and deliveryAmount did not correspond according to the fee and the currency exchange rate.
Associated endpoints:
- POST
/api/private/transactions/cash-out/creditcard - POST
/api/private/transactions/cash-out/delivery
{
"error": "BAD_REQUEST",
"message": "Invalid operation fee received, please check your data.",
"statusCode": 400
}
Invalid or not supported coin
The field amount and deliveryAmount did not correspond according to the fee and the currency exchange rate.
Associated endpoints:
- POST
/api/private/transactions/cash-out/confirm-send - POST
/api/private/transactions/cash-out/creditcard - POST
/api/private/transactions/cash-out/delivery - POST
/api/private/transactions/token/p2p
{
"error": "BAD_REQUEST",
"message": "Invalid or not supported coin codename provided",
"statusCode": 400
}
Invalid transaction amount
Invalid transaction amount received.
Associated endpoints:
- POST
/api/private/transactions/cash-out/confirm-send - POST
/api/private/transactions/cash-out/creditcard - POST
/api/private/transactions/cash-out/delivery - POST
/api/private/transactions/token/p2p
{
"error": "BAD_REQUEST",
"message": "Invalid transaction amount received, please check your data",
"statusCode": 400
}
Invalid externalID
The externalID provided for the transaction order already exists.
Associated endpoints:
- POST
/api/private/payments/order
{
"error": "BAD_REQUEST",
"message": "The externalID provided for the transaction order already exists.",
"statusCode": 400
}
Invalid wallet address
The wallet address of the recipient of the transaction order provided is invalid.
Associated endpoints:
- POST
/api/private/payments/order
{
"error": "BAD_REQUEST",
"message": "The wallet address of the recipient of the transaction order provided is invalid.",
"statusCode": 400
}
The receiver wallet address in invalid, either the format is incorrect or does not exist.
Associated endpoints:
- POST
/api/private/transactions/token/p2p - POST
/api/private/balance
Invalid wallet address response
{
"error": "BAD_REQUEST",
"message": "The receiver wallet address in invalid",
"statusCode": 400
}
Transactions to the same wallet address are forbidden.
Associated endpoints:
- POST
/api/private/transactions/token/p2p
Invalid wallet address response
{
"error": "BAD_REQUEST",
"message": "Transactions to the same wallet address are forbidden",
"statusCode": 400
}
Invalid transaction oder
The transaction order has not been found.
Associated endpoints:
- POST
/api/private/payments/order/:identifier
{
"error": "NOT_FOUND",
"message": "The transaction order has not been found.",
"statusCode": 404
}
Invalid currency
The name of the currency is invalid.
Associated endpoints:
- GET
/api/private/rates?base={currency}
{
"error": "BAD_REQUEST",
"message": "Validation error. Invalid coin codename",
"statusCode": 400
}
Invalid fee amount
The amount field is required and must be greater than zero.
Associated endpoints:
- GET
/api/private/fees/cu/deliveryCUP/Habana?amount={amount}
{
"error": "BAD_REQUEST",
"message": "The <<amount>> is required and must be greater than zero.",
"statusCode": 400
}
Invalid transaction
Not transaction match with filter criteria.
Associated endpoints:
- GET
/api/private/transactions - GET
/api/private/transactions/:identifier
{
"error": "BAD_REQUEST",
"message": "Not transaction match with filter criteria",
"statusCode": 400
}
User low trust level
The user does not meet the required trust level to make a transaction.
Associated endpoints: All endpoints that create a transaction.
{
"error": "BAD_REQUEST",
"message": "Please complete your profile and contact support@ducapp.com",
"statusCode": 400
}
Denied by a Rule
A system rule prevents the user from performing the transaction.
Note: The error message may vary.
Associated endpoints: All endpoints that create a transaction.
{
"error": "BAD_REQUEST",
"message": "Temporary, max limit is $600 in 7 days",
"statusCode": 400
}
Cancel Transaction
The current transaction status is incorrect.
Associated endpoints:
- POST
/api/private/transactions/cash-out/changeStatus
{
"error": "BAD_REQUEST",
"message": "You are trying to update a payment with incorrect status",
"statusCode": 400
}

