POST
/
v3
/
createPayoutRequest
curl --request POST \
  --url https://doc-api.oppiwallet.com/api/v3/createPayoutRequest \
  --header 'signatureToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
  --header 'Content-Type: application/json' \
  --data '{
    "currency": "6698aec7f188ae24c673da1c",
    "amount": "0.01",
    "address": "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
    "orderId": "order_12345"
  }'
const axios = require('axios');

let data = JSON.stringify({
  "currency": "6698aec7f188ae24c673da1c",
  "amount": "0.01",
  "address": "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
  "orderId": "order_12345"
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://doc-api.oppiwallet.com/api/v3/createPayoutRequest',
  headers: { 
    'signatureToken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlcmlNilsInR5cCI6IkpsdfsdfHJlcXVlc3QiLCJpYXQiOjE3MTUxNTM2NTQsImV4cCI6MTcxNTE1MzcwOSwia2V5Ijoicmh0TmJELU9yTFQteFp3M3QtMkpFWnR4Iiwic2lnbmF0dXJlU3RyaW5nIjoiMWVjY2M1NDc0YWZiMzU4NDExNDEzNjBkOGQ0MDBlMWYxOWIzNRjYzVkM2YxNTRjNmQ5YjViNSJ9.JuF7d8Oc4EyMvm7s5g3CN9L9Wbl_TFI_yO8jt20dvHw',
    'Content-Type': 'application/json'
  },
  data: data
};

axios.request(config)
  .then((response) => {
    console.log(JSON.stringify(response.data));
  })
  .catch((error) => {
    console.log(error);
  });
import requests

url = "https://doc-api.oppiwallet.com/api/v3/createPayoutRequest"

headers = {
    "signatureToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "Content-Type": "application/json"
}

data = {
    "currency": "6698aec7f188ae24c673da1c",
    "amount": "0.01",
    "address": "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
    "orderId": "order_12345"
}

response = requests.post(url, headers=headers, json=data)
print(response.json())
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {
	url := "https://doc-api.oppiwallet.com/api/v3/createPayoutRequest"

	data := map[string]string{
		"currency": "6698aec7f188ae24c673da1c",
		"amount":   "0.01",
		"address":  "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
		"orderId":  "order_12345",
	}

	jsonData, _ := json.Marshal(data)

	req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	req.Header.Add("signatureToken", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(string(body))
}
<?php
$curl = curl_init();

$data = [
    "currency" => "6698aec7f188ae24c673da1c",
    "amount" => "0.01",
    "address" => "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
    "orderId" => "order_12345"
];

curl_setopt_array($curl, [
  CURLOPT_URL => "https://doc-api.oppiwallet.com/api/v3/createPayoutRequest",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_HTTPHEADER => [
    "signatureToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "Content-Type: application/json"
  ],
  CURLOPT_POSTFIELDS => json_encode($data),
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
?>
const axios = require('axios');

let data = JSON.stringify({
  "currency": "6698aec7f188ae24c673da1c",
  "amount": "0.01",
  "address": "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
  "orderId": "order_12345"
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://doc-api.oppiwallet.com/api/v3/createPayoutRequest',
  headers: { 
    'signatureToken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlcmlNilsInR5cCI6IkpsdfsdfHJlcXVlc3QiLCJpYXQiOjE3MTUxNTM2NTQsImV4cCI6MTcxNTE1MzcwOSwia2V5Ijoicmh0TmJELU9yTFQteFp3M3QtMkpFWnR4Iiwic2lnbmF0dXJlU3RyaW5nIjoiMWVjY2M1NDc0Iiwic2lnbmF0dXJlU3RyaW5nIjoiMWVjY2M1NDc0YWZiMzU4NDExNDEzNjBkOGQ0MDBlMWYxOWIzNRjYzVkM2YxNTRjNmQ5YjViNSJ9.JuF7d8Oc4EyMvm7s5g3CN9L9Wbl_TFI_yO8jt20dvHw',
    'Content-Type': 'application/json'
  },
  data: data
};

axios.request(config)
  .then((response) => {
    console.log(JSON.stringify(response.data));
  })
  .catch((error) => {
    console.log(error);
  });
{
  "message": "Your withdrawal request has been sent successfully.",
  "transactionId": "0866f8-4a53-4579-9274-351ec868a627"
}
{
  "message": "Error message"
}
{
  "message": "Your withdrawal transaction has failed.",
  "transactionId": "0866f8-4a53-4579-9274-351ec868a627"
}

Instructions

Source Code

Required Stuff

  • Linux Server
  • Node JS (v18.19.1 or later)

Setup

  • Open config.json file and replace mnemonic, apiKey, encKey, verificationHost, allowedIps .
  • Execute pair.js file using: node pair.js. It will install required packages.
  • Next you need to start crypto.ts on your server.

Verify Host

To ensure maximum security and authenticity for automatic withdrawals, Oppi Payments uses an Origin Verification mechanism. When a withdrawal request is initiated, it is first received by our server. From there, our server securely forwards the verification request back to your configured verificationHost (your system) for confirmation. This loop ensures that the request was indeed initiated by your system and has not been tampered with, providing authenticity, security, and trust.

Verification Request Payload

Our server will POST the following JSON payload to your verificationHost endpoint:
{
  "Process": "CyrptoCheck",
  "Currency": "USDT_TRX",
  "Amount": "100.50",
  "Address": "TXyz123...receiverAddress",
  "OrderId": "ORD_12345",
  "TransactionId": "TXN_67890"
}

Expected Responses

Your system must verify the transaction details (e.g., matching the OrderId, Amount, and Address in your database) and return one of the following responses: Success Response: If the request is authentic and approved, return:
{
  "Status": true,
  "Address": "TXyz..."
}
Failure Response: If the request cannot be verified or is rejected, return:
{
  "Status": false,
  "Address": "TXyz...",
  "Message": "Some reason"
}

Authentication

signatureToken
string
required
A JWT token required for API authentication. Generate JWT token as explained in section Generate JWT Token using following ${currency}#${amount}#${address}#${orderId}.

Headers

Content-Type
string
required
Must be set to application/json.

Request Body

currency
string
required
Assets Currency id.
amount
string
required
Provide amount for transaction.
address
string
required
The external address where funds will be sent.
orderId
string
required
Include the orderId in your request for reference.
curl --request POST \
  --url https://doc-api.oppiwallet.com/api/v3/createPayoutRequest \
  --header 'signatureToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
  --header 'Content-Type: application/json' \
  --data '{
    "currency": "6698aec7f188ae24c673da1c",
    "amount": "0.01",
    "address": "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
    "orderId": "order_12345"
  }'
const axios = require('axios');

let data = JSON.stringify({
  "currency": "6698aec7f188ae24c673da1c",
  "amount": "0.01",
  "address": "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
  "orderId": "order_12345"
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://doc-api.oppiwallet.com/api/v3/createPayoutRequest',
  headers: { 
    'signatureToken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlcmlNilsInR5cCI6IkpsdfsdfHJlcXVlc3QiLCJpYXQiOjE3MTUxNTM2NTQsImV4cCI6MTcxNTE1MzcwOSwia2V5Ijoicmh0TmJELU9yTFQteFp3M3QtMkpFWnR4Iiwic2lnbmF0dXJlU3RyaW5nIjoiMWVjY2M1NDc0YWZiMzU4NDExNDEzNjBkOGQ0MDBlMWYxOWIzNRjYzVkM2YxNTRjNmQ5YjViNSJ9.JuF7d8Oc4EyMvm7s5g3CN9L9Wbl_TFI_yO8jt20dvHw',
    'Content-Type': 'application/json'
  },
  data: data
};

axios.request(config)
  .then((response) => {
    console.log(JSON.stringify(response.data));
  })
  .catch((error) => {
    console.log(error);
  });
import requests

url = "https://doc-api.oppiwallet.com/api/v3/createPayoutRequest"

headers = {
    "signatureToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "Content-Type": "application/json"
}

data = {
    "currency": "6698aec7f188ae24c673da1c",
    "amount": "0.01",
    "address": "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
    "orderId": "order_12345"
}

response = requests.post(url, headers=headers, json=data)
print(response.json())
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"io/ioutil"
)

func main() {
	url := "https://doc-api.oppiwallet.com/api/v3/createPayoutRequest"

	data := map[string]string{
		"currency": "6698aec7f188ae24c673da1c",
		"amount":   "0.01",
		"address":  "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
		"orderId":  "order_12345",
	}

	jsonData, _ := json.Marshal(data)

	req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
	req.Header.Add("signatureToken", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(string(body))
}
<?php
$curl = curl_init();

$data = [
    "currency" => "6698aec7f188ae24c673da1c",
    "amount" => "0.01",
    "address" => "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
    "orderId" => "order_12345"
];

curl_setopt_array($curl, [
  CURLOPT_URL => "https://doc-api.oppiwallet.com/api/v3/createPayoutRequest",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_HTTPHEADER => [
    "signatureToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "Content-Type: application/json"
  ],
  CURLOPT_POSTFIELDS => json_encode($data),
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
?>
const axios = require('axios');

let data = JSON.stringify({
  "currency": "6698aec7f188ae24c673da1c",
  "amount": "0.01",
  "address": "0xb6b5E02EBf4d20......3AfAbA034f2F8D8D07",
  "orderId": "order_12345"
});

let config = {
  method: 'post',
  maxBodyLength: Infinity,
  url: 'https://doc-api.oppiwallet.com/api/v3/createPayoutRequest',
  headers: { 
    'signatureToken': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlcmlNilsInR5cCI6IkpsdfsdfHJlcXVlc3QiLCJpYXQiOjE3MTUxNTM2NTQsImV4cCI6MTcxNTE1MzcwOSwia2V5Ijoicmh0TmJELU9yTFQteFp3M3QtMkpFWnR4Iiwic2lnbmF0dXJlU3RyaW5nIjoiMWVjY2M1NDc0Iiwic2lnbmF0dXJlU3RyaW5nIjoiMWVjY2M1NDc0YWZiMzU4NDExNDEzNjBkOGQ0MDBlMWYxOWIzNRjYzVkM2YxNTRjNmQ5YjViNSJ9.JuF7d8Oc4EyMvm7s5g3CN9L9Wbl_TFI_yO8jt20dvHw',
    'Content-Type': 'application/json'
  },
  data: data
};

axios.request(config)
  .then((response) => {
    console.log(JSON.stringify(response.data));
  })
  .catch((error) => {
    console.log(error);
  });

Response

Returns a success message upon successful request.
message
string
required
Success message for the withdrawal request.
transactionId
string
required
Unique identifier for the transaction.
{
  "message": "Your withdrawal request has been sent successfully.",
  "transactionId": "0866f8-4a53-4579-9274-351ec868a627"
}
{
  "message": "Error message"
}
{
  "message": "Your withdrawal transaction has failed.",
  "transactionId": "0866f8-4a53-4579-9274-351ec868a627"
}