Check for a vote
GET https://www.runetopic.com/api/v1/votes/check.php?player=Alex{
"success": true,
"available": true,
"vote": {"id": 125534, "player": "Alex", "site": "runetopic", "voted_at": "2026-08-11 20:45:00"}
}Download the Java 8+ vote JAR or use normal HTTPS callbacks. Generate a server-specific token in your owner dashboard and keep it on the private game-server process. Store delivery remains disabled while it is tested.
Generate a token at Owner dashboard → Integration. It is shown once and stored by RuneTopic only as a SHA-256 hash. Regenerating revokes the previous token immediately.
Authorization: Bearer rt_live_YOUR_SERVER_TOKEN
Accept: application/jsonKeep the token in your server's environment or private configuration. Do not ship it in a public client, launcher or repository.
GET https://www.runetopic.com/api/v1/votes/check.php?player=Alex{
"success": true,
"available": true,
"vote": {"id": 125534, "player": "Alex", "site": "runetopic", "voted_at": "2026-08-11 20:45:00"}
}POST https://www.runetopic.com/api/v1/votes/claim.php
Content-Type: application/json
{"player":"Alex","vote_id":125534}The claim is locked and changed once. Repeating it returns HTTP 409 already_claimed; two game worlds cannot grant the same reward.
Choose the method in your owner dashboard. RuneTopic sends only the configured method; it does not switch from GET to POST after an error because that can create duplicate rewards.
https://your-server.com/vote/callback?
username=Alex&playerName=Alex&serverID=143&site=runetopic&voteID=125534Content-Type: application/x-www-form-urlencoded
username=Alex&server_id=143&site_id=runetopic&vote_id=125534&test=0POST field names use username, server_id, site_id, vote_id and test.
If your saved GET URL contains postback=, RuneTopic fills that value with the player name and also adds the documented fields. Placeholders {username}, {server_id}, {vote_id} and {site_id} are supported.
A 2xx response is accepted unless the body explicitly returns 0, -1, false, failed, error, or JSON with "success": false. Network and 5xx failures are retried once using the same method. 4xx responses are not retried. Timeout is 8 seconds by default.
Callback URLs must use HTTPS on port 443. RuneTopic resolves the host before delivery and rejects private, loopback, link-local and reserved destinations.
Open callback testerLive purchase claims remain disabled. The JAR reserves store-delivery classes for future compatibility, but server owners should not build a production store fulfilment flow yet.
RuneTopicClient client = RuneTopicClient.builder()
.serverId(143)
.apiToken(System.getenv("RUNETOPIC_API_TOKEN"))
.build();
VoteClaimResult result = client.votes().claimSync("Alex");
for (Reward reward : result.rewards()) {
reward.grantWith(gameServer::executeCommand);
}The JAR leases the reward first, executes your configured commands, and acknowledges only after command execution succeeds. An unacknowledged lease becomes available for retry.
Default limit is 60 API requests per minute per server/IP. Responses include a request_id for staff support. Do not log bearer tokens, put them in URLs, accept a player name without validating it, or grant before a successful atomic claim.