Bulk operations
Change or remove many keys of one software in a single call.
Each action changes every key that matches the filter and answers with the count.
Keep in mind
- Filters
- Pass an optional
filterobject withgame,key_type,activeandstatusto narrow the keys. - Extending
- Only activated, time-limited keys move. Unused and lifetime keys are skipped, paused keys stay paused.
- Deleting everything
delete-keyswithkind=allalso needsconfirm=I_KNOW_WHAT_I_AM_DOING.
Reset keys HWID
https://dev.mod.wtf/api/v2/action
methodreset-keys-hwid
Reset devices for all matching keys.
Body
-
soft_idinteger requiredID of a software you own
-
filterobject optionalObject {game?, key_type?, active?, status?}
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-keys-hwid",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "reset-keys-hwid",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}'
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-keys-hwid",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}),
});
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-keys-hwid',
'soft_id' => 123,
'filter' => [
'game' => 'standoff2',
],
]),
]);
$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-keys-hwid",
"soft_id": 123,
"filter": {
"game": "standoff2",
},
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"affected": 42
}
}
{
"ok": false,
"error": "not_found",
"message": "soft not found or not yours"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Pause keys
https://dev.mod.wtf/api/v2/action
methodpause-keys
Pause matching keys (active=0).
Body
-
soft_idinteger requiredID of a software you own
-
filterobject optionalThe same filter object as reset-keys-hwid
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": "pause-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "pause-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}'
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": "pause-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}),
});
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' => 'pause-keys',
'soft_id' => 123,
'filter' => [
'game' => 'standoff2',
],
]),
]);
$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": "pause-keys",
"soft_id": 123,
"filter": {
"game": "standoff2",
},
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"affected": 42,
"active": 0
}
}
{
"ok": false,
"error": "not_found",
"message": "soft not found or not yours"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Resume keys
https://dev.mod.wtf/api/v2/action
methodresume-keys
Resume matching keys (active=1).
Body
-
soft_idinteger requiredID of a software you own
-
filterobject optionalObject {game?, key_type?, active?, status?}
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": "resume-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "resume-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}'
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": "resume-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}),
});
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' => 'resume-keys',
'soft_id' => 123,
'filter' => [
'game' => 'standoff2',
],
]),
]);
$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": "resume-keys",
"soft_id": 123,
"filter": {
"game": "standoff2",
},
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"affected": 42,
"active": 1
}
}
{
"ok": false,
"error": "not_found",
"message": "soft not found or not yours"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Extend keys
https://dev.mod.wtf/api/v2/action
methodextend-keys
Add or subtract days from activated, time-limited keys. Paused keys stay paused. Unactivated and lifetime keys are skipped.
Body
-
soft_idinteger requiredID of a software you own
-
daysinteger required-3650 to 3650, excluding zero
-
filterobject optionalThe same filter object as reset-keys-hwid
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": "extend-keys",
"soft_id": 123,
"days": 7,
"filter": {
"game": "standoff2"
}
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "extend-keys",
"soft_id": 123,
"days": 7,
"filter": {
"game": "standoff2"
}
}'
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": "extend-keys",
"soft_id": 123,
"days": 7,
"filter": {
"game": "standoff2"
}
}),
});
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' => 'extend-keys',
'soft_id' => 123,
'days' => 7,
'filter' => [
'game' => 'standoff2',
],
]),
]);
$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": "extend-keys",
"soft_id": 123,
"days": 7,
"filter": {
"game": "standoff2",
},
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"days_applied": 7,
"affected": 42
}
}
{
"ok": false,
"error": "validation",
"message": "days must be a non-zero integer between -3650 and 3650"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Delete keys
https://dev.mod.wtf/api/v2/action
methoddelete-keys
Delete matching keys. kind=all requires confirm.
Body
-
soft_idinteger requiredID of a software you own
-
kindstring requiredExpired, blocked, inactive, unused or all
-
confirmstring optionalRequired only for kind=all, value
I_KNOW_WHAT_I_AM_DOING -
filterobject optionalObject {game?, key_type?, active?, status?}, applied on top of kind
Errors it can return
Deleting every key
kind=all removes every key of the software and needs confirm=I_KNOW_WHAT_I_AM_DOING. It cannot be undone.
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-keys",
"soft_id": 123,
"kind": "expired"
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "delete-keys",
"soft_id": 123,
"kind": "expired"
}'
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-keys",
"soft_id": 123,
"kind": "expired"
}),
});
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-keys',
'soft_id' => 123,
'kind' => 'expired',
]),
]);
$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-keys",
"soft_id": 123,
"kind": "expired",
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"deleted": 15,
"kind": "expired"
}
}
{
"ok": false,
"error": "confirmation_required",
"message": "to delete ALL keys for this soft, pass confirm=I_KNOW_WHAT_I_AM_DOING"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Block keys
https://dev.mod.wtf/api/v2/action
methodblock-keys
Block matching keys (status=0). Blocked keys are refused by Connect.
Body
-
soft_idinteger requiredID of a software you own
-
filterobject optionalSame structure as above
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-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "block-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}'
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-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}),
});
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-keys',
'soft_id' => 123,
'filter' => [
'game' => 'standoff2',
],
]),
]);
$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-keys",
"soft_id": 123,
"filter": {
"game": "standoff2",
},
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"affected": 42,
"status": 0
}
}
{
"ok": false,
"error": "not_found",
"message": "soft not found or not yours"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}
Unblock keys
https://dev.mod.wtf/api/v2/action
methodunblock-keys
Unblock matching keys (status=1).
Body
-
soft_idinteger requiredID of a software you own
-
filterobject optionalSame structure as above
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-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}
curl -sS -X POST 'https://dev.mod.wtf/api/v2/action' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_API_KEY",
"method": "unblock-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}'
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-keys",
"soft_id": 123,
"filter": {
"game": "standoff2"
}
}),
});
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-keys',
'soft_id' => 123,
'filter' => [
'game' => 'standoff2',
],
]),
]);
$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-keys",
"soft_id": 123,
"filter": {
"game": "standoff2",
},
},
timeout=10,
)
result = response.json()
{
"ok": true,
"data": {
"affected": 42,
"status": 1
}
}
{
"ok": false,
"error": "not_found",
"message": "soft not found or not yours"
}
{
"ok": false,
"error": "unauthorized",
"message": "Invalid or missing api_key"
}