Client accounts
Create and manage the Admin and Reseller accounts under your software.
You see only the accounts you created, one software at a time.
Keep in mind
- Status and expiry
status1 is active and 0 blocked. An active account can still be past itsexpiration_date.- Levels
level2 is Admin, 3 is Reseller.- Software
- Pass
soft_idto work in another software you own. Without it the actions use your main software.
List users
https://dev.mod.wtf/api/v2/action
methodget-users
Client accounts created by you. status: 1 not blocked, 0 blocked; check expiration_date for expiry.
Body
-
qstring optionalSubstring search
-
levelinteger optionalFilter by role: 2 Admin, 3 Reseller
-
statusoptionalFilter: 1 normal, 0 blocked
-
limitinteger optionalNumber of records to return, 1..200, default 50
-
offsetinteger optionalNumber of records to skip for pagination
-
soft_idinteger optionalID of a software you own; your main software when omitted
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "get-users"
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "get-users"
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "get-users"
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'get-users',
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "get-users",
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"total": 8,
"limit": 50,
"offset": 0,
"items": [
{
"id": 50,
"username": "myreseller1",
"fullname": "Reseller One",
"email": "res@example.com",
"level": 3,
"level_label": "Reseller",
"status": 1,
"saldo": 1000,
"uplink": "JohnDoe",
"soft": 123,
"created_at": "2025-03-01 09:00:00",
"expiration_date": "2026-03-01 09:00:00",
"telegram": null,
"telegram_id": null
}
]
}
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Create user
https://dev.mod.wtf/api/v2/action
methodcreate-user
Create a client account. Software and uplink are assigned automatically.
Body
-
usernamestring required4-25 alphanumeric chars
-
passwordstring required8-128 chars
-
levelinteger optional2 Admin or 3 Reseller, default 2
-
emailstring optionalUp to 40 characters; a placeholder address is generated when omitted
-
fullnamestring optionalUp to 155 characters: letters, digits, spaces, periods, apostrophes and hyphens
-
saldointeger optionalStarting balance, default 0
-
expiration_datestring optionalYYYY-MM-DD HH:MM:SS
-
expiration_daysinteger optional0 to 18250. Admin and Reseller accounts default to 30 days
-
soft_idinteger optionalID of a software you own; your main software when omitted
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "create-user",
"username": "newrep1",
"password": "abcd1234",
"level": 3
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "create-user",
"username": "newrep1",
"password": "abcd1234",
"level": 3
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "create-user",
"username": "newrep1",
"password": "abcd1234",
"level": 3
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'create-user',
'username' => 'newrep1',
'password' => 'abcd1234',
'level' => 3,
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "create-user",
"username": "newrep1",
"password": "abcd1234",
"level": 3,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"id": 50,
"username": "newrep1",
"fullname": "",
"email": "ub5559fdd95b1@m.dk",
"level": 3,
"level_label": "Reseller",
"status": 1,
"saldo": 0,
"uplink": "JohnDoe",
"soft": 123,
"created_at": "2025-06-01 12:00:00",
"expiration_date": "2025-07-01 12:00:00",
"telegram": null,
"telegram_id": null
}
}
{
"ok": false,
"error": "duplicate",
"message": "username already taken"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Get user
https://dev.mod.wtf/api/v2/action
methodget-user
Client account details.
Body
-
user_idinteger requiredClient account ID
-
soft_idinteger optionalID of a software you own; your main software when omitted
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "get-user",
"user_id": 50
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "get-user",
"user_id": 50
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "get-user",
"user_id": 50
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'get-user',
'user_id' => 50,
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "get-user",
"user_id": 50,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"id": 50,
"username": "myreseller1",
"fullname": "Reseller One",
"email": "res@example.com",
"level": 3,
"level_label": "Reseller",
"status": 1,
"saldo": 1000,
"uplink": "JohnDoe",
"soft": 123,
"created_at": "2025-03-01 09:00:00",
"expiration_date": "2026-03-01 09:00:00",
"telegram": null,
"telegram_id": null
}
}
{
"ok": false,
"error": "not_found",
"message": "user not found or not in your downline"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Update user
https://dev.mod.wtf/api/v2/action
methodedit-user
Update one of your client accounts.
Body
-
user_idinteger requiredClient account ID
-
fullnamestring optionalUp to 155 characters: letters, digits, spaces, periods, apostrophes and hyphens
-
emailstring optionalUp to 40 characters
-
telegramstring optional1 to 32 letters, digits or underscores. Leading @ is optional; an empty value clears the field
-
statusoptional1 active, 0 blocked
-
saldointeger optionalNew balance
-
expiration_datestring optionalYYYY-MM-DD HH:MM:SS
-
levelinteger optional2 Admin or 3 Reseller
-
soft_idinteger optionalID of a software you own; your main software when omitted
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "edit-user",
"user_id": 50,
"fullname": "Updated Name",
"saldo": 1000
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "edit-user",
"user_id": 50,
"fullname": "Updated Name",
"saldo": 1000
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "edit-user",
"user_id": 50,
"fullname": "Updated Name",
"saldo": 1000
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'edit-user',
'user_id' => 50,
'fullname' => 'Updated Name',
'saldo' => 1000,
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "edit-user",
"user_id": 50,
"fullname": "Updated Name",
"saldo": 1000,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"id": 50,
"username": "myreseller1",
"fullname": "Updated Name",
"email": "res@example.com",
"level": 3,
"level_label": "Reseller",
"status": 1,
"saldo": 1000,
"uplink": "JohnDoe",
"soft": 123,
"created_at": "2025-03-01 09:00:00",
"expiration_date": "2026-03-01 09:00:00",
"telegram": null,
"telegram_id": null
}
}
{
"ok": false,
"error": "forbidden_soft",
"message": "Soft Owner may only assign users to their own soft"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Delete user
https://dev.mod.wtf/api/v2/action
methoddelete-user
Delete a client account.
Body
-
user_idinteger requiredClient account ID
-
soft_idinteger optionalID of a software you own; your main software when omitted
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "delete-user",
"user_id": 50
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "delete-user",
"user_id": 50
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "delete-user",
"user_id": 50
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'delete-user',
'user_id' => 50,
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "delete-user",
"user_id": 50,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"deleted": true,
"id": 50
}
}
{
"ok": false,
"error": "self_destroy",
"message": "cannot delete yourself"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Block user
https://dev.mod.wtf/api/v2/action
methodblock-user
Block: status=0, the user can no longer sign in.
Body
-
user_idinteger requiredClient account ID
-
soft_idinteger optionalID of a software you own; your main software when omitted
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "block-user",
"user_id": 50
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "block-user",
"user_id": 50
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "block-user",
"user_id": 50
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'block-user',
'user_id' => 50,
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "block-user",
"user_id": 50,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"id": 50,
"status": 0
}
}
{
"ok": false,
"error": "self_block",
"message": "cannot change your own status"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Unblock user
https://dev.mod.wtf/api/v2/action
methodunblock-user
Unblock: status=1.
Body
-
user_idinteger requiredClient account ID
-
soft_idinteger optionalID of a software you own; your main software when omitted
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "unblock-user",
"user_id": 50
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "unblock-user",
"user_id": 50
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "unblock-user",
"user_id": 50
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'unblock-user',
'user_id' => 50,
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "unblock-user",
"user_id": 50,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"id": 50,
"status": 1
}
}
{
"ok": false,
"error": "not_found",
"message": "user not found or not in your downline"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Kick user sessions
https://dev.mod.wtf/api/v2/action
methodkick-user-sessions
Reset quick-login tokens and require the user to sign in again.
Body
-
user_idinteger requiredClient account ID
-
soft_idinteger optionalID of a software you own; your main software when omitted
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "kick-user-sessions",
"user_id": 50
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "kick-user-sessions",
"user_id": 50
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "kick-user-sessions",
"user_id": 50
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'kick-user-sessions',
'user_id' => 50,
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "kick-user-sessions",
"user_id": 50,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"id": 50,
"sessions_kicked": 3
}
}
{
"ok": false,
"error": "not_found",
"message": "user not found or not in your downline"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Reset user password
https://dev.mod.wtf/api/v2/action
methodreset-user-password
Create a one-hour password reset link for an Admin or Reseller you created.
Body
-
user_idinteger requiredClient account ID
-
soft_idinteger optionalID of a software you own; default is your main software
Errors it can return
POST /api/v2/action HTTP/1.1
Host: dev.mod.wtf
Content-Type: application/json
Accept: application/json
{
"api_key": "YOUR_API_KEY",
"method": "reset-user-password",
"user_id": 50
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "reset-user-password",
"user_id": 50
}'
const response = await fetch("https://dev.mod.wtf/api/v2/action", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
"api_key": "YOUR_API_KEY",
"method": "reset-user-password",
"user_id": 50
}),
});
const result = await response.json();
$ch = curl_init('https://dev.mod.wtf/api/v2/action');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'api_key' => 'YOUR_API_KEY',
'method' => 'reset-user-password',
'user_id' => 50,
]),
]);
$result = json_decode(curl_exec($ch), true);
import requests
response = requests.post(
"https://dev.mod.wtf/api/v2/action",
json={
"api_key": "YOUR_API_KEY",
"method": "reset-user-password",
"user_id": 50,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"id": 50,
"reset_url": "https://mod.wtf/auth/reset-password?uid=50#token=<TOKEN>",
"expires_in_seconds": 3600
}
}
{
"ok": false,
"error": "not_found",
"message": "user not found or not in your downline"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}