Callback System
Receive real-time deposit and withdraw transaction status updates with the MVPAY callback system.
Callback notifications only accept HTTP 200 OK response as successful. All responses other than 200 trigger retry attempts.
How It Works
When a transaction status changes, MVPAY sends an HTTP POST request to your specified callback URLs.
Callback Types
- Deposit Callback — URL updated via
/api/updateCallbackUrlDeposit - Withdraw Callback — URL updated via
/api/updateCallbackUrlWithdraw
Delivery Policy
- Timeout: 15 seconds
- Success Criteria: HTTP 200 OK
- Retry Attempts: 5 times
- Intervals: 5s → 10s → 20s → 40s → 80s (exponential backoff)
- Maximum Duration: ≈155s (≈2.5 minutes)
Example Callback Payload
{
"amount": 100,
"userID": "2",
"name": "test_user",
"userName": "2",
"processID": "TEST-PROCESS-ID-T1",
"trackingID": "WD2509100038039988",
"type": "withdraw",
"status": "success",
"hash": "9252c360abc7e6c5509ec72dc3b79404"
}
Payload Fields
| Field | Type | Example | Description |
|---|---|---|---|
| hash | string | "9252c360abc7e6..." | MD5 hex of processID|amount|userID|type|apiKey (sent in body). |
| amount | number | 100 | Transaction amount. Concatenated as string when hashing. |
| userID | string | "2" | Your integration user ID. Used in hash. |
| name | string | "test_user" | User name / full name. |
| userName | string | "2" | Username / nickname. |
| processID | string | "TEST-PROCESS-ID-T1" | Transaction reference. Use in idempotency matching. |
| trackingID | string | "WD2509100038039988" | MVPAY tracking number. |
| type | string | "withdraw" | Type (e.g., "deposit", "withdraw"). Used in hash. |
| status | string | "success" | Result (typically "success" or "failed"). |
- The hash field is MD5 of
processID|amount|userID|type|apiKey, sent in the request body. - For hash verification and security recommendations, see: Callback Security.
URL Configuration
Update Deposit URL
info
- Method: PUT
- Endpoint: https://app.mvpay.xyz/api/updateCallbackUrlDeposit
- Header: mvpayApiToken, Content-Type: application/json
- 🟢 Node.js
- 🐘 PHP
- 🔷 C#
- 🐍 Python
- ☕ Java
const fetch = require("node-fetch");
const response = await fetch("https://app.mvpay.xyz/api/updateCallbackUrlDeposit", {
method: "PUT",
headers: {
mvpayApiToken: "YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ callback_url: "https://yoursite.com/deposit-webhook" }),
});
const data = await response.json();
console.log(data);
<?php
$data = [
'callback_url' => 'https://yoursite.com/deposit-webhook'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.mvpay.xyz/api/updateCallbackUrlDeposit');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'mvpayApiToken: YOUR_API_TOKEN',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("mvpayApiToken", "YOUR_API_TOKEN");
var data = new {
callback_url = "https://yoursite.com/deposit-webhook"
};
var json = JsonConvert.SerializeObject(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("https://app.mvpay.xyz/api/updateCallbackUrlDeposit", content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
import requests
import json
url = "https://app.mvpay.xyz/api/updateCallbackUrlDeposit"
headers = {
"mvpayApiToken": "YOUR_API_TOKEN",
"Content-Type": "application/json"
}
data = {
"callback_url": "https://yoursite.com/deposit-webhook"
}
response = requests.put(url, headers=headers, json=data)
print(response.json())
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import com.fasterxml.jackson.databind.ObjectMapper;
var client = HttpClient.newHttpClient();
var objectMapper = new ObjectMapper();
var data = Map.of("callback_url", "https://yoursite.com/deposit-webhook");
var json = objectMapper.writeValueAsString(data);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://app.mvpay.xyz/api/updateCallbackUrlDeposit"))
.header("mvpayApiToken", "YOUR_API_TOKEN")
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(json))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Update Withdraw URL
info
- Method: PUT
- Endpoint: https://app.mvpay.xyz/api/updateCallbackUrlWithdraw
- Header: mvpayApiToken, Content-Type: application/json
- 🟢 Node.js
- 🐘 PHP
- 🔷 C#
- 🐍 Python
- ☕ Java
const fetch = require("node-fetch");
const response = await fetch("https://app.mvpay.xyz/api/updateCallbackUrlWithdraw", {
method: "PUT",
headers: {
mvpayApiToken: "YOUR_API_TOKEN",
"Content-Type": "application/json",
},
body: JSON.stringify({ callback_url: "https://yoursite.com/withdraw-webhook" }),
});
const data = await response.json();
console.log(data);
<?php
$data = [
'callback_url' => 'https://yoursite.com/withdraw-webhook'
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://app.mvpay.xyz/api/updateCallbackUrlWithdraw');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'mvpayApiToken: YOUR_API_TOKEN',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
var client = new HttpClient();
client.DefaultRequestHeaders.Add("mvpayApiToken", "YOUR_API_TOKEN");
var data = new {
callback_url = "https://yoursite.com/withdraw-webhook"
};
var json = JsonConvert.SerializeObject(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PutAsync("https://app.mvpay.xyz/api/updateCallbackUrlWithdraw", content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
import requests
import json
url = "https://app.mvpay.xyz/api/updateCallbackUrlWithdraw"
headers = {
"mvpayApiToken": "YOUR_API_TOKEN",
"Content-Type": "application/json"
}
data = {
"callback_url": "https://yoursite.com/withdraw-webhook"
}
response = requests.put(url, headers=headers, json=data)
print(response.json())
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import com.fasterxml.jackson.databind.ObjectMapper;
var client = HttpClient.newHttpClient();
var objectMapper = new ObjectMapper();
var data = Map.of("callback_url", "https://yoursite.com/withdraw-webhook");
var json = objectMapper.writeValueAsString(data);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://app.mvpay.xyz/api/updateCallbackUrlWithdraw"))
.header("mvpayApiToken", "YOUR_API_TOKEN")
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(json))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());