Vote Rewards API
Players vote for your server on MT2LIST and get rewarded in-game. Simple REST API, no C++ client code needed. Free for all server owners.
How It Works
Three simple steps to connect MT2LIST to your game database.
Player opens vote link
Your game client or website shows a link like: metin2-pserver.de/server/your-server?player_id=PLAYER_NAME. The player clicks and votes.
Your server checks the API
A simple HTTP request: GET /api/v1/vote/check?player_id=PlayerName with your X-API-Key header. Returns true or false.
Grant the reward
If voted = true, give the player their reward. Each vote auto-claims on the first check to prevent duplicate rewards.
Partner Benefits
Add a backlink to MT2LIST on your website to unlock Partner status and all these perks for free.
Vote Rewards API
Full REST API access. Players vote, your server grants in-game rewards automatically.
15% Ranking Boost
Partner servers get a 15% vote multiplier for ranking calculations, boosting visibility.
Partner Badge
Gold Partner badge displayed on your server listing. Instantly builds trust with new players.
Analytics Dashboard
See votes per day, unique voters, peak hours, and top voters. Data-driven strategy.
Embeddable Widget
Interactive vote widget for your website showing current rank, total votes, and instant voting.
Webhooks
Instant push notifications when players vote. Real-time rewards without polling.
What You Get: API Panel Preview
This is what the API settings panel looks like. Everything is self-service.
Quick Start Integration
Implement vote validation in less than 5 minutes using simple HTTP requests.
Step 1: Direct players to your voting link
Append ?player_id=PLAYER_NAME to your voting link so we can log the vote under their username.
https://metin2-pserver.de/server/your-server?player_id=PLAYER_NAME
Step 2: Check if player voted
Make an HTTP GET request to our check endpoint, passing their name and your API Key.
GET /api/v1/vote/check?player_id=PlayerName HTTP/1.1
Host: metin2-pserver.de
X-API-Key: m2p_live_YOUR_API_KEY
Step 3: Response & Reward
We return a JSON payload. If voted is true, award your player. We will automatically reset their vote status until the cooldown expires (12 hours).
{
"voted": true,
"player_id": "PlayerName",
"cooldown_hours": 12,
"voted_at": "2026-10-05T07:48:00Z",
"next_vote_at": "2026-10-05T19:48:00Z",
"already_claimed": false
}
The first check claims the vote. Later checks inside the same cooldown return voted: false with already_claimed: true. Without a vote in the cooldown window, voted_at and next_vote_at are null.
{
"voted": false,
"player_id": "PlayerName",
"cooldown_hours": 12,
"voted_at": "2026-10-05T07:48:00Z",
"next_vote_at": "2026-10-05T19:48:00Z",
"already_claimed": true
}
HTTP 401 {"error": "invalid_api_key"}
missing, unknown or inactive key
HTTP 422 {"error": "player_id_required"}
player_id empty or longer than 32 characters
HTTP 401 {"error": "invalid_signature"}
bad X-Signature, or X-Timestamp more than 5 minutes off
Step 4: Sign your requests (optional)
Send the current Unix time as X-Timestamp and X-Signature = hex(hmac_sha256(api_key, "<timestamp>\n<player_id>")). Signed requests are checked whenever X-Signature is present and become mandatory when you enable "Require signature" in the panel. The timestamp may be at most 5 minutes off.
GET /api/v1/vote/check?player_id=PlayerName HTTP/1.1
Host: metin2-pserver.de
X-API-Key: m2p_live_YOUR_API_KEY
X-Timestamp: 1790000000
X-Signature: hex(hmac_sha256(api_key, "1790000000\nPlayerName"))
Code examples
API_KEY="m2p_live_YOUR_API_KEY"
PLAYER="PlayerName"
TS=$(date +%s)
SIG=$(printf '%s\n%s' "$TS" "$PLAYER" | openssl dgst -sha256 -hmac "$API_KEY" -hex | sed 's/^.* //')
curl -s "https://metin2-pserver.de/api/v1/vote/check?player_id=$PLAYER" \
-H "X-API-Key: $API_KEY" \
-H "X-Timestamp: $TS" \
-H "X-Signature: $SIG"
<?php
$apiKey = 'm2p_live_YOUR_API_KEY';
$player = 'PlayerName';
$ts = time();
$signature = hash_hmac('sha256', $ts . "\n" . $player, $apiKey);
$ch = curl_init('https://metin2-pserver.de/api/v1/vote/check?player_id=' . rawurlencode($player));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $apiKey,
'X-Timestamp: ' . $ts,
'X-Signature: ' . $signature,
],
]);
$result = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($status !== 200) {
error_log('vote check failed: ' . ($result['error'] ?? $status));
} elseif ($result['voted']) {
give_vote_reward($player);
} elseif ($result['already_claimed']) {
echo "Reward already claimed, next vote at {$result['next_vote_at']}";
}
import hashlib, hmac, time
import requests
API_KEY = "m2p_live_YOUR_API_KEY"
player = "PlayerName"
ts = str(int(time.time()))
signature = hmac.new(API_KEY.encode(), f"{ts}\n{player}".encode(), hashlib.sha256).hexdigest()
r = requests.get(
"https://metin2-pserver.de/api/v1/vote/check",
params={"player_id": player},
headers={"X-API-Key": API_KEY, "X-Timestamp": ts, "X-Signature": signature},
timeout=5,
)
result = r.json()
if result.get("voted"):
give_vote_reward(player)
elif result.get("already_claimed"):
print("Already claimed, next vote at", result["next_vote_at"])
import { createHmac } from 'node:crypto';
const API_KEY = 'm2p_live_YOUR_API_KEY';
const player = 'PlayerName';
const ts = Math.floor(Date.now() / 1000).toString();
const signature = createHmac('sha256', API_KEY).update(`${ts}\n${player}`).digest('hex');
const res = await fetch(`https://metin2-pserver.de/api/v1/vote/check?player_id=${encodeURIComponent(player)}`, {
headers: { 'X-API-Key': API_KEY, 'X-Timestamp': ts, 'X-Signature': signature },
});
const result = await res.json();
if (result.voted) {
await giveVoteReward(player);
} else if (result.already_claimed) {
console.log('Already claimed, next vote at', result.next_vote_at);
}
local http = require("socket.http")
local ltn12 = require("ltn12")
local json = require("cjson")
local API_KEY = "m2p_live_YOUR_API_KEY"
local player = "PlayerName"
local body = {}
local _, status = http.request({
url = "https://metin2-pserver.de/api/v1/vote/check?player_id=" .. player,
headers = { ["X-API-Key"] = API_KEY },
sink = ltn12.sink.table(body),
})
if status == 200 then
local result = json.decode(table.concat(body))
if result.voted then
give_vote_reward(player)
end
end
Why MT2LIST?
Modern, secure, and built specifically for private server developers.
| Feature | MT2LIST API | Competitors (metin2.gg) |
|---|---|---|
| Integration Mode | Pure REST API (HTTP GET) | C++ client modifications required |
| Security Standard | HMAC-SHA256 Custom Headers | Outdated, unsafe MD5 hashing |
| API Flexibility | Polling + Real-time Webhooks | Confusing manual polling files |
| Key Management | Self-service developer panel | Manual configuration request via Forum |
| Partner Perks | 15% Ranking Boost + Gold Badge | No visibility multipliers |
| Vote Cooldown | 12 Hours (Optimal for engagement) | 24 Hours (Forces drop-off) |
Get Started in 5 Minutes
Free for everyone. No payment, no trial.
-
1
-
2
Claim & verify ownership
Add a quick DNS TXT record or include a verified meta tag on your portal.
-
3
Add a backlink to MT2LIST
Paste our verified partner badge or simple text link onto your official homepage.
-
4
Generate your API key
Click 'Generate Key' inside your developer dashboard tab.
-
5
Integrate the API
Implement a simple HTTP check. PHP, Python, and Lua examples are available.
Frequently Asked Questions
Answers to common technical and integration queries.
Yes, the API is 100% free. All we ask is that you keep our backlink active on your homepage to maintain Partner status.
No client modifications are required. The API is entirely web-based and handles verification server-side.
Because it's a standard REST API, you can use any language that supports HTTP requests, including PHP, Python, Go, and Lua.
No. Our database marks each vote as 'claimed' upon your first API check, completely preventing double-claim exploits.
You must place a small, visible text link or one of our native embeddable widgets on your server's index page.
Your ranking boost multiplier and Partner badge will be paused. The API key will function, but with standard status limits.
Ready to integrate?
Unlock the 15% rank boost multiplier, live status widgets, and automate custom rewards for your players.