
Validierte Aktionen
Serverseitig geprüfte Läufe für Ranglisten und Spielwährung, ohne eigenen Servercode. Einmal-Tickets pro Lauf, Regeln nur auf dem Server, Eingabe-Logs der Top-Läufe und Moderation begrenzen, was ein Cheater gewinnen kann. Nur in der Cloud, nicht im selbst gehosteten simpleServer.
Einmal-Tickets pro Lauf
Jeder Lauf beginnt mit einem Server-Ticket, das an den Spieler, die Rangliste und einen Server-Seed gebunden ist. Ein Ticket zählt genau einmal, auch ein abgelehnter Lauf verbraucht es, damit niemand deine Grenzen mit einem Ticket abtasten kann.
Regeln nur auf dem Server
Score-Grenzen, Mindestdauer, Score pro Sekunde, Stage-Regeln und Währungsgrenzen pro Lauf liegen auf dem Server. Sie erscheinen nie in App-Antworten oder Fehlermeldungen, und Währung schreibt nur der Server.
Eingabe-Logs und Moderation
Für Top-Läufe und markierte Läufe fordert der Server das Eingabe-Log des Spiels an. Einen verdächtigen Lauf kannst du mit Seed und Log selbst nachspielen und dann entscheiden, was damit passiert.
Schnelle Integration
Schalte validierte Einreichungen für eine Rangliste ein und lege deine Serverregeln unter Validierte Aktionen fest. Danach verfolgst du die geprüften Läufe und sichtest die Nachweise der Top-Läufe im Dashboard.
// Unity C#: Validated Actions
// Dashboard: turn on "Validated submissions only" for the leaderboard "weekly"
var va = ValidatedActionsManager.Instance;
// Round start: single-use ticket plus server seed
var run = await va.StartRun("weekly");
if (run == null) { Debug.Log(va.LastErrorCode); return; } // e.g. RUN_RATE_LIMITED
var random = new System.Random(run.seed);
// ... play, record the inputs into inputLog (byte[]) ...
// Round end: score plus input log (the SDK sends its SHA-256 hash)
var result = await va.SubmitValidated(18250, inputLog);
if (result == null)
{
Debug.Log($"{va.LastErrorCode}, run kept: {va.HasActiveRun}"); // e.g. DURATION_TOO_SHORT
}# REST API: Validated Actions (needs the player's session token)
# Start a run: returns runId, a single-use ticket, seed and expiresAt
curl -X POST https://eu.horizon.pm/api/v1/app/validated-actions/runs \
-H "X-API-Key: YOUR_API_KEY" \
-H "Authorization: Bearer SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{"userId":"USER_ID","leaderboardKey":"weekly"}'
# Submit the run: score plus the SHA-256 hex of the input log
curl -X POST https://eu.horizon.pm/api/v1/app/validated-actions/submit \
-H "X-API-Key: YOUR_API_KEY" \
-H "Authorization: Bearer SESSION_TOKEN" \
-H "Content-Type: application/json" \
-d '{"userId":"USER_ID","ticket":"TICKET","leaderboardKey":"weekly","score":18250,"inputLogHash":"SHA256_HEX"}'
# Rejected runs answer 422 with a code, e.g. TICKET_EXPIRED or DURATION_TOO_SHORTHäufig gestellte Fragen
Bereit zur Integration?
Starte noch heute mit horizOn. Free Tier inklusive.


