Online Licensing

SimpleMMO Bot uses online activation to verify that a license is active and used within its device allowance.

How activation works

  1. The app reads the license key and creates a privacy-conscious device identifier.
  2. It sends the key, app version, and device identifier to the license service over HTTPS.
  3. The server checks status, expiration, product, and device allowance.
  4. The server returns a digitally signed decision.
  5. 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.

POST https://license.topup.eu.org/v1/license-status
AuthenticationNone
Content typeapplication/json
OperationRead only

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"}'
Never expose a real license key in public source code, browser-side JavaScript, screenshots, or GitHub issues.

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.

HTTPAPI statusActiveMeaning
200 OKactiveYesThe key exists, is enabled, and has not expired.
200 OKnot_foundNoThe lookup completed, but the supplied key is unknown.
200 OKrevokedNoThe key exists but is inactive or revoked.
200 OKexpiredNoThe key exists, but its expiration time has passed.
204 No ContentSuccessful browser CORS preflight from the official site; no response body.
400 Bad Requestinvalid_requestNoThe JSON body is invalid or license_key is missing.
403 ForbiddenA browser preflight came from an origin that is not allowed.
404 Not FoundThe request used an endpoint path that does not exist.
500 Server ErrorThe 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.