Online Licensing
SimpleMMO Bot uses online activation to verify that a license is active and used within its device allowance.
How activation works
- The app reads the license key and creates a privacy-conscious device identifier.
- It sends the key, app version, and device identifier to the license service over HTTPS.
- The server checks status, expiration, product, and device allowance.
- The server returns a digitally signed decision.
- The app verifies the signature before continuing.
The production validation endpoint is:
https://license.topup.eu.org/v1/check
Purchase a license
Ready to purchase a license or need help choosing one? Contact us through any of the channels below.
Check license status
Use this read-only endpoint to inspect a license without activating a new device or updating its last-check timestamp.
https://license.topup.eu.org/v1/license-status
Request body
| Field | Type | Required | Description |
|---|---|---|---|
license_key |
string |
Yes | License key in the format issued by the distributor. Whitespace is trimmed and letters are normalized to uppercase. |
Request examples
curl -X POST "https://license.topup.eu.org/v1/license-status" \
-H "Content-Type: application/json" \
-d '{"license_key":"SMMO-XXXXX-XXXXX-XXXXX-XXXXX"}'import requests
response = requests.post(
"https://license.topup.eu.org/v1/license-status",
json={"license_key": "SMMO-XXXXX-XXXXX-XXXXX-XXXXX"},
timeout=15,
)
response.raise_for_status()
license_status = response.json()
print(license_status)const response = await fetch("https://license.topup.eu.org/v1/license-status", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
license_key: "SMMO-XXXXX-XXXXX-XXXXX-XXXXX",
}),
});
if (!response.ok) {
throw new Error(`License status request failed: ${response.status}`);
}
const licenseStatus = await response.json();
console.log(licenseStatus);<?php
$curl = curl_init("https://license.topup.eu.org/v1/license-status");
curl_setopt_array($curl, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode([
"license_key" => "SMMO-XXXXX-XXXXX-XXXXX-XXXXX",
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
]);
$response = curl_exec($curl);
$statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false || $statusCode < 200 || $statusCode >= 300) {
throw new RuntimeException("License status request failed.");
}
$licenseStatus = json_decode($response, true, flags: JSON_THROW_ON_ERROR);
print_r($licenseStatus);Invoke-RestMethod -Uri "https://license.topup.eu.org/v1/license-status" -Method Post -ContentType "application/json" -Body '{"license_key":"SMMO-XXXX-XXXX-XXXX-XXXX"}'Response status reference
HTTP success and license validity are separate signals. A 200 OK response means the lookup completed successfully; always inspect the JSON status and active fields before deciding whether the license is usable.
| HTTP | API status | Active | Meaning |
|---|---|---|---|
| 200 OK | active | Yes | The key exists, is enabled, and has not expired. |
| 200 OK | not_found | No | The lookup completed, but the supplied key is unknown. |
| 200 OK | revoked | No | The key exists but is inactive or revoked. |
| 200 OK | expired | No | The key exists, but its expiration time has passed. |
| 204 No Content | — | — | Successful browser CORS preflight from the official site; no response body. |
| 400 Bad Request | invalid_request | No | The JSON body is invalid or license_key is missing. |
| 403 Forbidden | — | — | A browser preflight came from an origin that is not allowed. |
| 404 Not Found | — | — | The request used an endpoint path that does not exist. |
| 500 Server Error | — | — | The license service encountered an unexpected internal error. |
Response examples
200 OKActive licenseThe license can be used.
{
"ok": true,
"active": true,
"status": "active",
"message": "License is active.",
"license": {
"key_masked": "SMMO••••X7K9",
"created_at": "2026-07-01T08:30:00.000Z",
"expires_at": "2026-08-01T08:30:00.000Z",
"expires_in_days": 12,
"max_devices": 1,
"active_devices": 1
}
}200 OKLicense not foundThe lookup succeeded, but the key is unknown.
{
"ok": true,
"active": false,
"status": "not_found",
"message": "License key was not found."
}200 OKRevoked licenseThe key exists but has been disabled.
{
"ok": true,
"active": false,
"status": "revoked",
"message": "License is inactive or revoked.",
"license": {
"key_masked": "SMMO••••X7K9",
"created_at": "2026-07-01T08:30:00.000Z",
"expires_at": "2026-08-01T08:30:00.000Z",
"expires_in_days": 12,
"max_devices": 1,
"active_devices": 1
}
}200 OKExpired licenseThe key exists, but its access period has ended.
{
"ok": true,
"active": false,
"status": "expired",
"message": "License has expired.",
"license": {
"key_masked": "SMMO••••X7K9",
"created_at": "2026-06-01T08:30:00.000Z",
"expires_at": "2026-07-01T08:30:00.000Z",
"expires_in_days": 0,
"max_devices": 1,
"active_devices": 1
}
}400 Bad RequestInvalid requestThe required license key was not supplied.
{
"ok": false,
"active": false,
"status": "invalid_request",
"message": "license_key is required."
}404 Not FoundUnknown routeThe endpoint URL is incorrect.
{
"message": "Not found"
}500 Server ErrorInternal errorThe service could not complete the request.
{
"message": "Internal license server error"
}Activation validation response
The bot itself uses POST /v1/check. That endpoint returns a signed envelope for both accepted and rejected license decisions. A 200 OK response alone does not mean the license is valid: the client verifies the Ed25519 signature, decodes the signed payload, and continues only when valid is true.
| HTTP | Signed field | Result |
|---|---|---|
200 OK |
valid: true |
License accepted; the bot may continue. |
200 OK |
valid: false |
License rejected because of invalid data, unknown key, revoked/expired status, or device limit. |
404 Not Found |
— | Validation URL is incorrect. |
500 Server Error |
— | Signing, database, or service failure; the bot stops safely. |
Online-only behavior
An internet connection is required at startup and during runtime. There is no offline grace period. If the service cannot be reached or a signed validation fails, the bot does not continue running.
Device limits
A license can allow one or more devices. A new computer or VPS may consume an activation slot. Contact the distributor for a device reset before migrating when your allowance is full.
Common messages
| Message | Meaning |
|---|---|
| License key not found | The key is incorrect or not registered. |
| License expired | The subscription period has ended. |
| License revoked | The key has been disabled. |
| Device limit reached | All activation slots are in use. |
| Server unavailable | DNS, internet, firewall, or service availability prevented validation. |
| Invalid signature | The response could not be authenticated; use an official current release. |
Protect your key
Treat a license key like a purchase credential. Do not post it in screenshots, logs, GitHub issues, or public chat. A leaked key may be revoked or consume device slots.