Production License Control
Overview
Recent Licenses
Newest generated keys and customer status.
Risk Signals
Verification anomalies and conflict alerts.
License Registry
Create, suspend, revoke, and reset customer activations.
| License | Product | Buyer | Status | Activation | Expires |
|---|
Products
Resources sold on BuildByBit or used privately.
BuiltByBit Purchase Sync
Match each product to a marketplace resource ID, then import active purchases as licenses.
Verification Flow
How a buyer becomes a valid licensed user.
Leaked Build Watermark Scanner
Upload or drop a leaked .jar or .zip build to extract embedded buyer watermarks and identify who leaked it.
Scans binary byte-arrays for BuiltByBit user watermarks and license tokens
BuiltByBit User #0000
Matched license: LM-XXXX-XXXX | Product: Plugin
Leak Watch Signals
Track suspicious license sharing, impossible activations, and leaked builds.
Protection Rules
Controls that should become backend-enforced policies.
Verification Activity
Audit-friendly event stream for license checks and admin actions.
Studio Branding & White-Labeling
Customize the dashboard name, public customer portal, and self-service policies.
Verification Policy Defaults
Defaults for API responses and customer activation behavior.
Admin Profile & Password
Change your active administrator email address and login password.
Administrator Accounts
Add co-owners or staff members who can manage licenses and products.
How Aether License Manager Works
Enterprise-grade anti-piracy runtime built on high-speed edge compute and cryptographic signatures.
Client computes a hardware fingerprint (CPU ID + Motherboard UUID + MAC/IP) and sends it with the buyer's license key.
Server checks the license status, expiration, and binds the fingerprint. If the customer exceeds activation limits, verification is rejected.
Server signs response with the product's private signing secret. Client caches verification for 12–24h so temporary network drops don't interrupt gameplay or usage.
Live API Endpoints for Integration
| Endpoint | Method | Auth | Purpose |
|---|---|---|---|
/api/verify |
POST |
Public (Signed payload) | Called by customer plugins/software on startup and hourly heartbeat |
/api/portal/lookup |
POST |
Customer Key / Delivery Key | Customer self-service portal to check status and active bindings |
/api/portal/reset |
POST |
Customer Key / Delivery Key | Self-service hardware reset when a customer moves to a new host/VPS |
/api/admin/licenses |
POST |
Admin Bearer Token | Automated license issuance via market webhooks or custom bots |
How to License Products in a ZIP Release
Step-by-step instructions for distributing downloadable plugins, bots, scripts, or desktop software in ZIP archives.
-
Step 1: Create your Product in the Dashboard
Navigate to the Products tab, click Create Product. Enter your product name (e.g.Aether Factions), choose activation limit (e.g.1for single server), and save. Copy the generated Signing Secret and keep it safe. -
Step 2: Add the License Checker to your Source Code
Add one of the drop-in client classes from the Code SDKs tab into your codebase. Set the verification URL to:Config Endpointhttps://aether-license-manager.pages.dev/api/verify -
Step 3: Allow Buyer to Input their License Key
In your distribution ZIP, include a configuration file (e.g.config.ymlorlicense.json) where buyers paste their key:config.yml# ========================================== # License Configuration # ========================================== license: key: "LM-XXXX-XXXX-XXXX-XXXX" # Self-Service Hardware Reset Portal: # https://aether-license-manager.pages.dev/portal.html -
Step 4: Watermark the Build Before Zipping
Before packaging the final ZIP for the buyer, inject a buyer watermark (their BuiltByBit member ID or license key prefix) into the file (e.g., insidebuild-info.jsonor an obfuscated class constant). If this file is ever leaked on forums or Discord, you can drop the leaked binary into the Security -> Leaked Binary Scanner to identify who leaked it! -
Step 5: Bundle and Deliver
Zip your build:YourProduct.jar(or.exe/.zip)config.ymlREADME.txtwith instructions & portal link
Selling on Any Marketplace
Seamlessly integrate with BuiltByBit, Polymart, Tebex, SpigotMC, Gumroad, CodeCanyon, or custom webshops.
Option A: BuiltByBit (BBB) Native Sync
BuiltByBit is natively supported. BuiltByBit purchases can be automatically fetched or synced into active licenses.
- Find your BuiltByBit Resource ID (from your resource URL e.g.
builtbybit.com/resources/12345/-> ID is12345). - In the Products tab, edit your product and set the BuiltByBit Resource ID.
- Under Marketplace, click Run Sync to import purchases or allow automatic verification via BuiltByBit Buyer ID tokens.
Option B: Webhook Integration for Polymart, Tebex, Gumroad & Custom Stores
When a customer purchases on any marketplace, configure their webhook to call your License Manager API to instantly generate a license key:
curl -X POST https://aether-license-manager.pages.dev/api/admin/licenses \
-H "Authorization: Bearer YOUR_ADMIN_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"productId": "prd_your_product_id",
"buyerLabel": "customer@email.com",
"plan": "lifetime",
"activationLimit": 1
}'
Response returned from Webhook:
{
"ok": true,
"message": "License generated successfully.",
"license": {
"id": "lic_99f4d1e28ba1",
"key": "LM-883A-KD92-M82L-99AQ",
"keyPrefix": "LM-883A-KD",
"buyerLabel": "customer@email.com",
"productName": "Aether Core",
"activationLimit": 1,
"plan": "lifetime"
}
}
You can immediately display license.key on your checkout thank-you screen or include it in the automated confirmation email.
Manual Licensing & Customer Support
How to generate custom licenses, handle server migration requests, and revoke keys during disputes.
1. Issuing a Manual Key
Click the New License button in the top navigation. Select your product, type the customer's Discord username or email, choose a plan (Lifetime, Monthly, or Trial), and set the allowed server count.
Copy the generated LM-XXXX-XXXX-XXXX-XXXX key and send it to the buyer via Discord DM, ticket, or email.
2. Server Moves & Hardware Resets
When a buyer changes hosting providers, their server IP/fingerprint changes. They don't need to open a support ticket!
Direct them to the Customer Portal (/portal.html). They paste their license key and click Reset Activations. Alternatively, you can click the Reset button in the Licenses table.
3. Dispute / Refund / Chargeback Protection
If a buyer charges back or violates your terms of service:
Locate their key in the Licenses table and click Suspend. Their software will instantly stop working on its next hourly verification heartbeat!
Ready-to-Use Client SDKs
Drop-in implementations for Java (Minecraft Spigot / Paper / Velocity), Node.js, Python, PHP, and C#.
1. Java (Minecraft Plugins & Standalone Apps)
Asynchronously checks validity on server startup, calculates SHA-256 machine hash, and disables the plugin if invalid.
package com.aether.license;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
public class LicenseChecker {
private static final String VERIFY_URL = "https://aether-license-manager.pages.dev/api/verify";
public static boolean verify(String productSlug, String licenseKey) {
try {
String fingerprint = getMachineFingerprint();
String payload = String.format(
"{\"productSlug\":\"%s\",\"licenseKey\":\"%s\",\"fingerprint\":\"%s\"}",
productSlug, licenseKey, fingerprint
);
HttpURLConnection conn = (HttpURLConnection) new URL(VERIFY_URL).openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("User-Agent", "Aether-LicenseGuard/2.0");
conn.setDoOutput(true);
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
try (OutputStream os = conn.getOutputStream()) {
os.write(payload.getBytes(StandardCharsets.UTF_8));
}
if (conn.getResponseCode() != 200) return false;
StringBuilder response = new StringBuilder();
try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String line;
while ((line = br.readLine()) != null) response.append(line);
}
return response.toString().contains("\"valid\":true");
} catch (Exception e) {
return false; // Fail closed on connection error
}
}
private static String getMachineFingerprint() {
try {
String raw = System.getProperty("os.name") + System.getProperty("user.name") + Runtime.getRuntime().availableProcessors();
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest(raw.getBytes(StandardCharsets.UTF_8));
StringBuilder hex = new StringBuilder();
for (byte b : hash) hex.append(String.format("%02x", b));
return hex.toString();
} catch (Exception e) {
return "hw_unknown";
}
}
}
2. Node.js / TypeScript / Electron
import os from 'node:os';
import crypto from 'node:crypto';
export async function verifyLicense(productSlug, licenseKey) {
const fingerprint = crypto
.createHash('sha256')
.update(os.hostname() + ':' + os.platform() + ':' + os.cpus().length)
.digest('hex');
const res = await fetch('https://aether-license-manager.pages.dev/api/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ productSlug, licenseKey, fingerprint }),
});
const data = await res.json().catch(() => ({}));
return data.valid === true;
}
3. Python (CLI, Discord Bots & Web Apps)
import hashlib
import platform
import urllib.request
import json
def verify_license(product_slug: str, license_key: str) -> bool:
fingerprint = hashlib.sha256(f"{platform.node()}:{platform.system()}".encode()).hexdigest()
url = "https://aether-license-manager.pages.dev/api/verify"
payload = json.dumps({
"productSlug": product_slug,
"licenseKey": license_key,
"fingerprint": fingerprint
}).encode('utf-8')
req = urllib.request.Request(url, data=payload, headers={'Content-Type': 'application/json'})
try:
with urllib.request.urlopen(req, timeout=5) as response:
result = json.loads(response.read().decode())
return result.get("valid") is True
except Exception:
return False
Enterprise Anti-Leak Watermarking Guide
How to track buyer identities and catch anyone who leaks your software on the internet.
How to Catch a Leaker:
- 1. Discover Leaked File: When you see your software leaked on a forum, Discord, or leak site, download the leaked
.jar,.zip, or.exefile. - 2. Drop in Security Tab: Open the Security view in this dashboard and drag the leaked file into the Binary Watermark Scanner.
- 3. Instant Identification: The scanner scans the file binaries, extracts token patterns (BuiltByBit user IDs, delivery keys, and license prefixes), and matches them with your live database.
- 4. 1-Click Ban: The leaker's profile, purchase date, and buyer label are revealed. Click Suspend Leaker License to immediately kill their license worldwide and report them to BuiltByBit!
Recommended Obfuscators:
- Java / Minecraft: ProGuard, Zelix KlassMaster (ZKM), Stringer, or Bento.
- JavaScript / Node.js: JavaScript-Obfuscator, pkg, or bytecode packing via
bytenode. - Python: PyArmor or Nuitka (compiles Python code to native C binaries).