DEVELOPER PORTAL

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.

01

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.

02

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.

03

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.

COMING SOON

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.

Panel > My Server > API Settings
Server ID: -
API ACTIVE PARTNER STATUS BACKLINK: VERIFIED Last checked: -

API Key

Use this key in your HTTP request headers to authenticate with the vote verification API. Keep it confidential.

m2p_live_••••••••••••••••••••••••••••••••
Login

Log in as a server owner to see and manage your API key. Register

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.

URL Link
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.

HTTP GET Request
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).

JSON Response
{
  "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.

Already claimed
{
  "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
}
Errors
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.

Signed Request
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

cURL
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
<?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']}";
}
Python
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"])
Node.js
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);
}
Lua
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. 1

    Submit your server

    Add your server listing to MT2LIST. It only takes 2 minutes.

    Submit Server
  2. 2

    Claim & verify ownership

    Add a quick DNS TXT record or include a verified meta tag on your portal.

  3. 3

    Add a backlink to MT2LIST

    Paste our verified partner badge or simple text link onto your official homepage.

  4. 4

    Generate your API key

    Click 'Generate Key' inside your developer dashboard tab.

  5. 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.