Connect settings
Request fields, response templates, signature, messages, game profiles, CipherLink and the public page.
Each call works on one endpoint, main or test, and one game profile, default unless profile is sent.
Keep in mind
Get connect
https://dev.mod.wtf/api/v2/action
methodget-connect
Read the Connect settings of an endpoint and game profile: request fields, response templates, signature, IP guard, CipherLink and messages.
Body
-
soft_idinteger requiredID of a software you own
-
endpointstring optionalMain or test, default main
-
profileoptionalGame profile ID, default
default
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-connect",
"soft_id": 123,
"endpoint": "main"
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "get-connect",
"soft_id": 123,
"endpoint": "main"
}'
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-connect",
"soft_id": 123,
"endpoint": "main"
}),
});
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-connect',
'soft_id' => 123,
'endpoint' => 'main',
]),
]);
$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-connect",
"soft_id": 123,
"endpoint": "main",
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"soft_id": 123,
"endpoint": "main",
"profile": "default",
"request_game": "game",
"request_key": "user_key",
"request_serial": "serial",
"signature_enabled": true,
"one_hwid_per_ip": false
}
}
{
"ok": false,
"error": "not_found",
"message": "game profile not found"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Update connect
https://dev.mod.wtf/api/v2/action
methodedit-connect
Change request fields, templates, signature, IP guard or CipherLink. Send only the fields to change.
Body
-
soft_idinteger requiredID of a software you own
-
endpointstring optionalMain or test
-
profileoptionalGame profile ID
-
request_gameoptionalField name
-
request_keyoptionalField name
-
request_serialoptionalField name
-
request_game_enabledoptionalBoolean
-
request_custom_fieldsoptionalList of field names
-
success_templateoptionalObject or JSON string
-
error_templateoptionalObject or JSON string
-
signature_enabledoptionalBoolean
-
signature_sourceoptionalString
-
token_algorithmoptionalString
-
connect_secretoptional16-128 characters
-
reset_connect_secretoptionalBoolean
-
one_hwid_per_ipboolean optionalBoolean
-
connect_cipher_enabledoptionalBoolean, needs CipherLink keys
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-connect",
"soft_id": 123,
"one_hwid_per_ip": true
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "edit-connect",
"soft_id": 123,
"one_hwid_per_ip": true
}'
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-connect",
"soft_id": 123,
"one_hwid_per_ip": true
}),
});
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-connect',
'soft_id' => 123,
'one_hwid_per_ip' => true,
]),
]);
$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-connect",
"soft_id": 123,
"one_hwid_per_ip": True,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"message": "Request and response saved.",
"soft_id": 123,
"endpoint": "main",
"one_hwid_per_ip": true
}
}
{
"ok": false,
"error": "validation",
"message": "Request field names must be unique."
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Update connect messages
https://dev.mod.wtf/api/v2/action
methodedit-connect-messages
Change the refusal messages of an endpoint and game profile.
Body
-
soft_idinteger requiredID of a software you own
-
endpointstring optionalMain or test
-
profileoptionalGame profile ID
-
err_key_not_foundstring optionalConnect text for a key that does not exist
-
err_key_on_pausestring optionalConnect text for a paused key
-
err_key_blockedstring optionalConnect text for a blocked key
-
err_expire_keystring optionalConnect text for an expired key
-
err_device_max_slotsstring optionalConnect text for a key whose device slots are all taken
-
ip_device_limitoptionalString
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-connect-messages",
"soft_id": 123,
"err_key_blocked": "Your key is blocked"
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "edit-connect-messages",
"soft_id": 123,
"err_key_blocked": "Your key is blocked"
}'
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-connect-messages",
"soft_id": 123,
"err_key_blocked": "Your key is blocked"
}),
});
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-connect-messages',
'soft_id' => 123,
'err_key_blocked' => 'Your key is blocked',
]),
]);
$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-connect-messages",
"soft_id": 123,
"err_key_blocked": "Your key is blocked",
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"soft_id": 123,
"endpoint": "main",
"messages": {
"err_key_blocked": "Your key is blocked"
}
}
}
{
"ok": false,
"error": "validation",
"message": "Fill in every error message with 1-255 characters."
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Create game profile
https://dev.mod.wtf/api/v2/action
methodcreate-game-profile
Add a game profile with its own fields, templates and messages.
Body
-
soft_idinteger requiredID of a software you own
-
endpointstring optionalMain or test
-
namestring requiredLowercase letters and numbers
-
valuestring requiredValue the mod sends in the game field
-
copy_fromoptionalProfile to copy, default
default
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-game-profile",
"soft_id": 123,
"name": "pubg",
"value": "pubg"
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "create-game-profile",
"soft_id": 123,
"name": "pubg",
"value": "pubg"
}'
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-game-profile",
"soft_id": 123,
"name": "pubg",
"value": "pubg"
}),
});
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-game-profile',
'soft_id' => 123,
'name' => 'pubg',
'value' => 'pubg',
]),
]);
$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-game-profile",
"soft_id": 123,
"name": "pubg",
"value": "pubg",
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"soft_id": 123,
"endpoint": "main",
"profile": "pubg"
}
}
{
"ok": false,
"error": "validation",
"message": "A game with this client value already exists."
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Delete game profile
https://dev.mod.wtf/api/v2/action
methoddelete-game-profile
Delete a game profile.
Body
-
soft_idinteger requiredID of a software you own
-
endpointstring optionalMain or test
-
profilestring requiredGame profile ID
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-game-profile",
"soft_id": 123,
"profile": "pubg"
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "delete-game-profile",
"soft_id": 123,
"profile": "pubg"
}'
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-game-profile",
"soft_id": 123,
"profile": "pubg"
}),
});
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-game-profile',
'soft_id' => 123,
'profile' => 'pubg',
]),
]);
$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-game-profile",
"soft_id": 123,
"profile": "pubg",
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"profile": "pubg",
"deleted": true
}
}
{
"ok": false,
"error": "not_found",
"message": "game profile not found"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Rotate cipher keys
https://dev.mod.wtf/api/v2/action
methodrotate-cipher-keys
Generate CipherLink keys and turn CipherLink on. Replacing existing keys needs confirm=true; old builds stop passing validation.
Body
-
soft_idinteger requiredID of a software you own
-
endpointstring optionalMain or test
-
confirmstring optionalBoolean, required when keys exist
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": "rotate-cipher-keys",
"soft_id": 123
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "rotate-cipher-keys",
"soft_id": 123
}'
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": "rotate-cipher-keys",
"soft_id": 123
}),
});
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' => 'rotate-cipher-keys',
'soft_id' => 123,
]),
]);
$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": "rotate-cipher-keys",
"soft_id": 123,
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"replaced": false,
"client": {
"aes_key": "<AES_KEY>",
"aes_iv": "<AES_IV>",
"public_key": "<PEM>"
}
}
}
{
"ok": false,
"error": "confirmation_required",
"message": "keys exist; send confirm=true to replace them, existing builds will stop passing validation"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Update connect page
https://dev.mod.wtf/api/v2/action
methodedit-connect-page
Change the public page at the Connect URL. To upload background or music, send multipart/form-data with the method in the query string: POST /api/v2/action?method=edit-connect-page.
Body
-
soft_idinteger requiredID of a software you own
-
endpointstring optionalMain or test
-
enabledboolean optionalBoolean
-
titlestring optionalUp to 100 characters
-
descriptionoptionalUp to 2000 characters
-
linksobject optionalList of {text, url}, up to 10
-
music_loopoptionalBoolean
-
music_volumeoptional0-100
-
backgroundoptionalImage file
-
musicoptionalAudio file
-
remove_backgroundoptionalBoolean
-
remove_musicoptionalBoolean
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-connect-page",
"soft_id": 123,
"enabled": true,
"title": "My mod",
"links": [
{
"text": "Telegram",
"url": "https://t.me/example"
}
]
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "edit-connect-page",
"soft_id": 123,
"enabled": true,
"title": "My mod",
"links": [
{
"text": "Telegram",
"url": "https://t.me/example"
}
]
}'
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-connect-page",
"soft_id": 123,
"enabled": true,
"title": "My mod",
"links": [
{
"text": "Telegram",
"url": "https://t.me/example"
}
]
}),
});
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-connect-page',
'soft_id' => 123,
'enabled' => true,
'title' => 'My mod',
'links' => [
[
'text' => 'Telegram',
'url' => 'https://t.me/example',
],
],
]),
]);
$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-connect-page",
"soft_id": 123,
"enabled": True,
"title": "My mod",
"links": [
{
"text": "Telegram",
"url": "https://t.me/example",
},
],
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"soft_id": 123,
"endpoint": "main",
"enabled": true,
"title": "My mod"
}
}
{
"ok": false,
"error": "validation",
"message": "Each link needs a valid label and an HTTP or HTTPS URL."
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}