1. Connect and load the catalog
Check API access and your server IP allowlist in your profile. Add the site URL, username and API key in DHRU. Verify accountinfo first, then imeiservicelist / serverservicelist / remoteservicelist.
Zero-code integration for your Dhru Fusion panels or high-performance REST API endpoints for your custom PHP applications.
Values to enter under 'Suppliers / API Server' in your Dhru Fusion admin panel.
Dhru Fusion automatically appends /api/index.php to the URL in the background. In your Dhru Panel's API URL field, enter only your base domain URL without /api/index.php.
Account balance and details
{ SUCCESS: [{ AccoutInfo: { credit, currency } }] }
Active services and required fields
{ SUCCESS: [{ LIST: { Category: { SERVICES: { } } } }] }
Submit a new order
{ SUCCESS: [{ REFERENCEID: "full-order-uuid" }] }
Query order status and result
{ SUCCESS: [{ STATUS: 4, CODE: "RESULT" }] }
Personal USDT address and verification data
{ SUCCESS: [{ ADDRESS, CURRENCY, NETWORKS, GENERATION, SALT, FACTORY, IMPLEMENTATION, INITCODEHASH }] }
Incoming payments to the personal address and their status
LIMIT defaults to 50. SINCE is Unix seconds or an ISO 8601 date with its zone; it returns payments changed at or after it, oldest change first, so use the last entry's UPDATED as your next SINCE. AMOUNT is what arrived; where the network cost is deducted (by default every network but BSC) the amount credited is lower by the network cost and the move fee. The unique key is ID (or TXID with LOGINDEX)
LIMIT (1-50) · SINCE · TXID
{ SUCCESS: [{ DEPOSITS: { ID: { ID, TXID, LOGINDEX, NETWORK, CHAINID, AMOUNT, CURRENCY, STATUS, CONFIRMATIONS, DATE, UPDATED } } }] }
STATUS: SEEN | CONFIRMING | CREDITED | HELD | BELOW_MIN | WRONG_NETWORK
| Action | Description | Response data | Status |
|---|---|---|---|
| accountinfo | Account balance and details | { SUCCESS: [{ AccoutInfo: { credit, currency } }] } | Active |
| imeiservicelist / serverservicelist / remoteservicelist | Active services and required fields | { SUCCESS: [{ LIST: { Category: { SERVICES: { } } } }] } | Active |
| placeimeiorder / placeserverorder | Submit a new order | { SUCCESS: [{ REFERENCEID: "full-order-uuid" }] } | Active |
| getimeiorder / getserverorder | Query order status and result | { SUCCESS: [{ STATUS: 4, CODE: "RESULT" }] } | Active |
| getdepositaddress | Personal USDT address and verification data | { SUCCESS: [{ ADDRESS, CURRENCY, NETWORKS, GENERATION, SALT, FACTORY, IMPLEMENTATION, INITCODEHASH }] } | Per account |
| getdepositsLIMIT (1-50) · SINCE · TXID | Incoming payments to the personal address and their statusLIMIT defaults to 50. SINCE is Unix seconds or an ISO 8601 date with its zone; it returns payments changed at or after it, oldest change first, so use the last entry's UPDATED as your next SINCE. AMOUNT is what arrived; where the network cost is deducted (by default every network but BSC) the amount credited is lower by the network cost and the move fee. The unique key is ID (or TXID with LOGINDEX) | { SUCCESS: [{ DEPOSITS: { ID: { ID, TXID, LOGINDEX, NETWORK, CHAINID, AMOUNT, CURRENCY, STATUS, CONFIRMATIONS, DATE, UPDATED } } }] }STATUS: SEEN | CONFIRMING | CREDITED | HELD | BELOW_MIN | WRONG_NETWORK | Per account |
Per-account actions return an error while the personal USDT address is not enabled for your account.
FACTORY, IMPLEMENTATION and INITCODEHASH must equal the values below, and ADDRESS must match this calculation. Keep these values and the first ADDRESS you receive in your own system; if any of them differs, do not send.
These are contract addresses; do not send payments to them. Send only to the ADDRESS that getdepositaddress returns.
ADDRESS == keccak256(0xff ++ FACTORY ++ SALT ++ INITCODEHASH)[12:] GENERATION 1 FACTORY 0xE126D3e733a1A7a80e592527Cf90D2a1Cf7Aa9Fb IMPLEMENTATION 0x6A86F3b37D235bEEde0a455935530593a2A56A51 INITCODEHASH 0xf3df90581a9c492a338e9e5a97e77a2c7e158fbedebc2be2f7ef21293a0b4629
Check API access and your server IP allowlist in your profile. Add the site URL, username and API key in DHRU. Verify accountinfo first, then imeiservicelist / serverservicelist / remoteservicelist.
Import fieldname, fieldtype, required and fieldoptions from Requires.Custom. Use fieldname, not the label. CUSTOM can describe the main IMEI input; keep it separate from extra custom fields. Use getimeiservicedetails for details. If quick import omits fields, resync the service details.
Submit the full service ID, a valid QNT and required fields. Store the complete REFERENCEID; the 8-character display ID is not an API lookup key. Poll getimeiorder. SUCCESS means accepted; check STATUS for delivery.
Keep parameters.client_request_id stable for the same logical order. Do not submit a new request ID after a timeout; reconcile the existing order first. Honor 429 / Retry-After and back off polling.
Keep keys out of browser JavaScript and public repositories; use server-to-server HTTPS. Allowlist your integration server's public IP, not the browser IP. Redact keys, passwords and signed customer files from logs.
HTTP 200 alone is not success: inspect ERROR / SUCCESS. Fill the named missing fields. Show the actual explanation for credit or service availability errors. Catalog prices can change; use the amount accepted for the order.
0Received / pending
1Processing
3Rejected / refunded
4Completed
This is a template: replace fields with your service contract. Running it can create a paid order. Verify accountinfo first. Existing XML DHRU clients are also supported.
<?php
$fields = ['PRODUCTID' => 'example', 'IMEI1' => 'YOUR_IMEI'];
$parameters = [
'ID' => 'FULL_SERVICE_ID',
'QNT' => 1,
'CUSTOMFIELD' => base64_encode(json_encode($fields)),
'client_request_id' => 'YOUR_UNIQUE_REQUEST_ID'
];
$body = http_build_query([
'username' => getenv('RESELLER_USERNAME'),
'apiaccesskey' => getenv('RESELLER_API_KEY'),
'action' => 'placeimeiorder', 'requestformat' => 'JSON',
'parameters' => base64_encode(json_encode($parameters))
]);
$ch = curl_init('https://imeiveserver.com/api/index.php');
curl_setopt_array($ch, [CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body, CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 60]);
$response = curl_exec($ch);
if ($response === false) throw new RuntimeException('Transport error; reconcile before retry');
$result = json_decode($response, true, 512, JSON_THROW_ON_ERROR);
curl_close($ch);
// Inspect ERROR / SUCCESS; persist the complete REFERENCEID.
?>