RanglisteNeue ServerVote Rewards API
RanglisteNeue ServerVote Rewards API
Login
Eintragen
METIN2.GG
Login
Eintragen

Kategorien

  • Metin2 PvP Server
  • Metin2 PvM Server
  • Metin2 Oldschool Server
  • Metin2 Newschool Server
  • Metin2 Low Rate Server
  • Metin2 Mid Rate Server
  • Metin2 High Rate Server
  • Metin2 Middleschool Server
  • Metin2 Easy Server
  • Metin2 Hard Server

Top Listen

  • Beste Metin2 Private Server in 2026
  • Metin2 P Server 2026
  • Metin2 P Server Liste 2026
  • Metin2 Topliste 2026
  • Metin2 Server Liste 2026
  • Metin2 Private Server Rankings 2026
  • Neue Metin2 Private Server in 2026
  • Meistgewählte Metin2 Server in 2026
  • Metin2 Server die heute öffnen
  • Metin2 Server die diese Woche öffnen
  • Metin2 Server 2026
  • Metin2 PServer Deutsch 2026
  • Metin2 PvP Server 2026
  • Metin2 Privat Server 2026
  • Metin2 Middleschool Server 2026
  • Metin2 P Server Liste 2026
  • Metin2 Top PServer 2026
  • Metin2 Rangliste 2026
  • Metin2 Bestenliste 2026
  • MT2 PServer 2026
  • Metin2 PServer Liste 2026

Schnellzugriff

  • Server Rankings
  • Server eintragen
  • Vote Rewards API
  • PvP Server
  • Oldschool Server
  • Neue Server 2026
  • Blog
  • Beste Metin2 PServer in 2026: Ranking & Vergleich
METIN2.GG

© 2026 Metin2.gg — Nicht verbunden mit Webzen Inc.

Über unsDatenschutzKontaktAGB
Startseite/Vote Rewards/Integrationsleitfaden

Vote Rewards API Integrationsleitfaden

Alles, was du brauchst, um deinen Metin2 Server mit dem metin2.gg Vote Rewards System zu verbinden — mit kopierfertigen Code-Beispielen für jedes gängige Setup.

So funktioniert es

Die metin2.gg Vote Rewards API ermöglicht deinem Metin2 Server automatisch zu erkennen, wenn Spieler abstimmen, und Belohnungen im Spiel zu vergeben. Der Ablauf ist einfach: Spieler stimmen auf metin2.gg mit ihrem Charakternamen ab, und dein Server fragt unsere API ab, um diese Stimmen zu prüfen und einzulösen.

Es gibt zwei Integrationsmodi — wähle den, der zu deinem Setup passt:

Player
Votes on metin2.gg
metin2.gg
Records vote
Your Server
Grants reward

Polling (Empfohlen)

Dein Server ruft regelmäßig unsere API auf, um nach neuen Stimmen zu suchen. Am einfachsten zu implementieren — funktioniert mit jedem Metin2 Server-Setup. Füge einfach eine HTTP-Anfrage zu deinem Spielserver-Code hinzu.

Webhooks (Fortgeschritten)

metin2.gg sendet eine Benachrichtigung an deinen Server, sobald ein Spieler abstimmt. Echtzeit, erfordert aber einen öffentlich zugänglichen HTTPS-Endpunkt auf deiner Seite.

Authentifizierung

Alle API-Anfragen erfordern einen API-Schlüssel, der über den X-API-Key Header gesendet wird. Schlüssel haben das Format mg_live_... und werden in deinem Server-Panel generiert.

HTTP
X-API-Key: mg_live_5bef...1a70

Dein API-Schlüssel ist an einen Server gebunden und wird nur einmal bei der Generierung angezeigt. Wenn du ihn verlierst, generiere einen neuen im Panel (der alte Schlüssel wird sofort ungültig).

So erhältst du deinen API-Schlüssel

  1. 1Gehe zu Mein Panel → Meine Server. Klicke auf den Namen deines Servers, um die Verwaltungsseite zu öffnen.
  2. 2Verifiziere auf der Verwaltungsseite die Inhaberschaft (DNS TXT-Eintrag oder Meta-Tag), falls noch nicht geschehen.
  3. 3Füge einen Backlink zu metin2.gg auf der Website deines Servers hinzu, um den Partner-Status freizuschalten.
  4. 4Klicke auf der Verwaltungsseite deines Servers auf den Button "API-Einstellungen". Klicke dann auf "API-Schlüssel generieren" und kopiere ihn — er wird nur einmal angezeigt.
Zum PanelNoch keinen Server? Jetzt einreichen

Vote-Status prüfen

Prüfe, ob ein bestimmter Spieler eine nicht eingelöste Stimme hat. Wenn eine ausstehende Stimme existiert, wird sie automatisch eingelöst (als verwendet markiert), damit dieselbe Stimme nicht zweimal eingelöst werden kann.

HTTP
GET /api/v1/vote/check?player_id=PlayerName HTTP/1.1
Host: metin2.gg
X-API-Key: mg_live_YOUR_KEY_HERE

Query-Parameter

ParameterTypeRequiredDescription
player_idstringYesDer Charaktername, den der Spieler beim Abstimmen verwendet hat. Groß-/Kleinschreibung wird ignoriert.

Antwort

Spieler hat eine nicht eingelöste Stimme (jetzt eingelöst)

JSON
{
  "voted": true,
  "player_id": "PlayerName",
  "vote_id": "550e8400-e29b-41d4-a716-446655440000",
  "voted_at": "2026-03-02T14:30:00Z"
}

Keine ausstehende Stimme für diesen Spieler

JSON
{
  "voted": false
}

Nicht eingelöste Stimmen auflisten

Alle nicht eingelösten Stimmen für deinen Server abrufen. Nützlich für Stapelverarbeitung — zum Beispiel ein Cron-Job, der alle 5 Minuten läuft und Belohnungen für alle ausstehenden Stimmen auf einmal vergibt.

HTTP
GET /api/v1/vote/unclaimed?limit=50 HTTP/1.1
Host: metin2.gg
X-API-Key: mg_live_YOUR_KEY_HERE

Query-Parameter

ParameterTypeRequiredDescription
limitintegerNoMaximale Anzahl der zurückgegebenen Stimmen (1–100, Standard 50).

Antwort

JSON
{
  "votes": [
    {
      "vote_id": "550e8400-e29b-41d4-a716-446655440000",
      "player_id": "PlayerName",
      "voted_at": "2026-03-02T14:30:00Z"
    },
    {
      "vote_id": "660e8400-e29b-41d4-a716-446655440001",
      "player_id": "AnotherPlayer",
      "voted_at": "2026-03-02T14:32:00Z"
    }
  ],
  "total": 2
}

Stimmen stapelweise einlösen

Mehrere Stimmen in einer Anfrage als eingelöst markieren. Verwende dies nach der Verarbeitung von Stimmen vom Unclaimed-Endpunkt.

HTTP
POST /api/v1/vote/claim HTTP/1.1
Host: metin2.gg
Content-Type: application/json
X-API-Key: mg_live_YOUR_KEY_HERE

{
  "vote_ids": [
    "550e8400-e29b-41d4-a716-446655440000",
    "660e8400-e29b-41d4-a716-446655440001"
  ]
}

Anfragekörper (JSON)

ParameterTypeRequiredDescription
vote_idsstring[]YesArray von Vote-UUIDs zum Einlösen. Maximal 100 pro Anfrage.

Antwort

JSON
{
  "claimed": 2,
  "failed": 0
}

Webhooks

Anstatt zu pollen, kannst du Echtzeit-Push-Benachrichtigungen erhalten, wenn ein Spieler abstimmt. Konfiguriere deine Webhook-URL im Server-Panel unter API-Einstellungen.

Webhook-Payload

HTTP
POST https://your-server.com/api/vote-webhook HTTP/1.1
Content-Type: application/json
X-Metin2GG-Signature: a1b2c3d4e5f6...

{
  "event": "vote.created",
  "vote_id": "550e8400-e29b-41d4-a716-446655440000",
  "server_id": "your-server-uuid",
  "player_id": "PlayerName",
  "voted_at": "2026-03-02T14:30:00Z",
  "timestamp": "2026-03-02T14:30:01Z"
}

Signatur verifizieren

Jede Webhook-Anfrage enthält einen X-Metin2GG-Signature Header mit einem HMAC-SHA256 Hex-Digest des rohen Anfragekörpers, signiert mit deinem API-Secret. Überprüfe immer diese Signatur, bevor du dem Payload vertraust.

Pythonverify_webhook.py
import hmac
import hashlib

def verify_webhook(request_body: bytes, signature: str, secret: str) -> bool:
    """Verify the X-Metin2GG-Signature header."""
    expected = hmac.new(
        secret.encode("utf-8"),
        request_body,
        hashlib.sha256,
    ).hexdigest()
    return hmac.compare_digest(expected, signature)

# Usage in your webhook handler:
# body = request.body  (raw bytes)
# sig  = request.headers["X-Metin2GG-Signature"]
# if not verify_webhook(body, sig, "your_api_secret"):
#     return HttpResponse(status=403)
PHPverify_webhook.php
<?php
function verifyWebhook(string $body, string $signature, string $secret): bool {
    $expected = hash_hmac('sha256', $body, $secret);
    return hash_equals($expected, $signature);
}

// Usage in your webhook handler:
// $body = file_get_contents('php://input');
// $sig  = $_SERVER['HTTP_X_METIN2GG_SIGNATURE'] ?? '';
// if (!verifyWebhook($body, $sig, 'your_api_secret')) {
//     http_response_code(403);
//     exit('Invalid signature');
// }

Metin2 Integration: Python-Befehl

Lege dieses Skript in das Python-Befehlssystem deines Spielservers. Wenn ein Spieler /reward im Spiel eingibt, prüft es metin2.gg auf eine ausstehende Stimme und vergibt die Belohnung.

Pythonvote_reward.py
# vote_reward.py — Drop into your game server's command scripts
# Works with Python 2.7+ (common in Metin2 servers)
import json
import os

METIN2GG_API_KEY = "mg_live_YOUR_KEY_HERE"
METIN2GG_API_URL = "https://metin2.gg/api/v1/vote/check"

def check_vote(player_name):
    """Check if player has a pending vote and auto-claim it."""
    url = "%s?player_id=%s" % (METIN2GG_API_URL, player_name)

    # Method 1: Use urllib2 (Python 2) or urllib.request (Python 3)
    try:
        try:
            import urllib2
            req = urllib2.Request(url)
            req.add_header("X-API-Key", METIN2GG_API_KEY)
            resp = urllib2.urlopen(req, timeout=5)
            data = json.loads(resp.read())
        except ImportError:
            import urllib.request
            req = urllib.request.Request(url)
            req.add_header("X-API-Key", METIN2GG_API_KEY)
            resp = urllib.request.urlopen(req, timeout=5)
            data = json.loads(resp.read().decode("utf-8"))

        return data.get("voted", False)
    except Exception:
        pass

    # Method 2: Fallback to curl (works even with broken SSL)
    try:
        cmd = 'curl -s -H "X-API-Key: %s" "%s"' % (METIN2GG_API_KEY, url)
        raw = os.popen(cmd).read()
        data = json.loads(raw)
        return data.get("voted", False)
    except Exception:
        return None

# Example usage in your game command handler:
# def cmd_reward(player):
#     result = check_vote(player.GetName())
#     if result is True:
#         player.GiveItem(50011, 10)  # Example: 10x Dragon God Coins
#         player.ChatInfoMessage("Vote reward claimed!")
#     elif result is False:
#         player.ChatInfoMessage("No pending vote. Vote at metin2.gg!")
#     else:
#         player.ChatInfoMessage("Could not reach metin2.gg. Try again.")

Metin2 Integration: Quest-Datei (Lua)

Diese Quest-Datei erstellt eine NPC-Interaktion, bei der Spieler ihren Vote-Status prüfen können. Sie ruft einen serverseitigen Befehl auf, der die Python-Vote-Prüfung auslöst.

Luavote_reward.quest
quest vote_reward begin
    state start begin
        when login or letter begin
            send_letter("Vote Reward")
        end

        when button or info begin
            say_title("Vote Reward")
            say("")
            say("Vote for our server on metin2.gg")
            say("and claim your reward here!")
            say("")

            local s = select("Check My Vote", "How to Vote", "Close")

            if s == 1 then
                -- Triggers the Python command that checks the API
                cmdchat("checkvote "..pc.get_name())
            elseif s == 2 then
                say_title("How to Vote")
                say("")
                say("1. Open metin2.gg in your browser")
                say("2. Find our server page")
                say("3. Enter your character name")
                say("4. Click the Vote button")
                say("5. Come back here to claim your reward!")
                say("")
            end
        end
    end
end

Metin2 Integration: PHP Web-Panel

Wenn dein Server ein Web-Panel (PHP-basiert) hat, verwende dieses Snippet, um Stimmen vom Panel aus zu prüfen und einzulösen. Funktioniert mit jeder PHP 7+ Umgebung mit cURL.

PHPcheck_vote.php
<?php
/**
 * check_vote.php — Vote check for PHP-based web panels
 * Requires PHP 7.0+ with cURL extension
 */

$apiKey    = "mg_live_YOUR_KEY_HERE";
$playerName = $_GET["player"] ?? "";

if (empty($playerName)) {
    echo json_encode(["error" => "Missing player name"]);
    exit;
}

// Check vote status
$ch = curl_init(
    "https://metin2.gg/api/v1/vote/check?player_id=" . urlencode($playerName)
);
curl_setopt_array($ch, [
    CURLOPT_HTTPHEADER     => ["X-API-Key: $apiKey"],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT        => 10,
    CURLOPT_SSL_VERIFYPEER => true,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode !== 200) {
    echo json_encode(["error" => "API returned HTTP $httpCode"]);
    exit;
}

$data = json_decode($response, true);

if ($data["voted"] ?? false) {
    // Player has voted — grant reward via your game DB
    // Example: INSERT INTO player.reward_queue (player, item_vnum, count) ...
    echo json_encode([
        "success" => true,
        "message" => "Vote reward granted!",
        "vote_id" => $data["vote_id"],
    ]);
} else {
    echo json_encode([
        "success" => false,
        "message" => "No pending vote found.",
    ]);
}

Rate Limits & Fehlercodes

Die API erzwingt Rate Limits, um eine faire Nutzung sicherzustellen. Aktuelle Limits:

  • 60 requests per minute per API key
  • 1,000 requests per hour per API key
StatusBeschreibung
200 OKAnfrage erfolgreich.
400 Bad RequestFehlende oder ungültige Parameter. Überprüfe das player_id oder vote_ids Format.
401 UnauthorizedFehlender oder ungültiger API-Schlüssel. Stelle sicher, dass du den X-API-Key Header einfügst.
403 ForbiddenAPI-Zugang ist deaktiviert — normalerweise weil der Backlink entfernt wurde. Füge den Backlink wieder hinzu und prüfe erneut.
404 Not FoundDer Endpunkt existiert nicht. Überprüfe den URL-Pfad.
429 Too Many RequestsRate Limit überschritten. Warte und versuche es nach dem Retry-After Header-Wert (in Sekunden) erneut.
500 Internal Server ErrorEtwas ist auf unserer Seite schiefgelaufen. Versuche es nach ein paar Sekunden erneut.

Wiederholungsstrategie

On 429 errors, read the Retry-After header (value in seconds) and wait before retrying. For 500 errors, retry with exponential backoff (1s, 2s, 4s).

Fehlerbehebung FAQ

Ich bekomme bei jeder Anfrage 401 Unauthorized

Stelle sicher, dass du den API-Schlüssel im X-API-Key Header sendest (nicht als Query-Parameter oder im Body). Der Schlüssel muss mit mg_live_ beginnen.

Die API sagt voted: false, aber der Spieler behauptet, er hat abgestimmt

Der Spieler hat möglicherweise abgestimmt, ohne seinen Charakternamen einzugeben, oder einen anderen Namen verwendet. Überprüfe die Vote-Link-URL — sie muss ?player_id=GENAUER_NAME enthalten. Namen sind nicht case-sensitiv.

Ich bekomme 403 Forbidden

Dein API-Zugang ist pausiert, wahrscheinlich weil der Backlink zu metin2.gg von deiner Website entfernt wurde. Füge ihn wieder hinzu und klicke im Panel auf 'Jetzt prüfen', um erneut zu verifizieren.

Kann ich die API ohne echte Stimmen testen?

Derzeit gibt es keinen Sandbox-Modus. Stimme auf deiner eigenen Server-Auflistung mit einem Test-Charakternamen ab, um die Integration End-to-End zu überprüfen.

Mein Python-Skript kann keine Verbindung herstellen (Timeout oder SSL-Fehler)

Die meisten Metin2 Server verwenden Python 2.7, das veraltete SSL-Zertifikate hat. Verwende den os.popen('curl ...') Fallback, der im Python-Beispiel gezeigt wird, oder aktualisiere das Python CA-Bundle deines Servers.

Wie oft sollte ich die API pollen?

Für den /check Endpunkt (pro Spieler): Rufe ihn auf, wenn der Spieler seine Belohnung anfordert (z.B. /reward Befehl). Für /unclaimed (Stapel): Alle 3–5 Minuten per Cron ist ideal. Nicht öfter als einmal pro Minute pollen.

Können mehrere Server einen API-Schlüssel teilen?

Nein. Jeder API-Schlüssel ist an eine Server-Auflistung gebunden. Wenn du mehrere Server betreibst, generiere für jeden einen separaten Schlüssel von der jeweiligen Panel-Seite.

Was passiert, wenn mein Webhook-Endpunkt nicht erreichbar ist?

metin2.gg wiederholt fehlgeschlagene Webhook-Zustellungen bis zu 5 Mal mit exponentiellem Backoff. Wenn alle Versuche fehlschlagen, bleibt die Stimme nicht eingelöst und kann weiterhin über die Polling-Endpunkte abgerufen werden.

Bereit zur Integration?

Füge deinen Server zu metin2.gg hinzu, generiere einen API-Schlüssel und belohne Wähler in Minuten.

Server einreichenZum Panel

Inhaltsverzeichnis

  • So funktioniert es
  • Authentifizierung
  • Vote-Status prüfen
  • Nicht eingelöste Stimmen auflisten
  • Stimmen stapelweise einlösen
  • Webhooks
  • Metin2 Integration: Python-Befehl
  • Metin2 Integration: Quest-Datei (Lua)
  • Metin2 Integration: PHP Web-Panel
  • Rate Limits & Fehlercodes
  • Fehlerbehebung FAQ