Welcome back
Recent License Keys
View all| License Key | Application | Status | Expiration | HWID Lock | Actions |
|---|---|---|---|---|---|
| Loading keys... | |||||
Quick Actions
Applications
License Keys
| License Key | Application | Status | Duration / Expiration | HWID Lock | Note | Actions | |
|---|---|---|---|---|---|---|---|
| Loading keys... | |||||||
Hardware ID Manager
Active Hardware Bindings
0 Bound Devices| License Key | Application | Hardware ID (Minimal Hash) | Last Active | Resets | Platform / IP | Action |
|---|---|---|---|---|---|---|
| No locked hardware records found. | ||||||
Activity Logs
| Timestamp | Event | Application | License Key | HWID / IP Hint | Message |
|---|---|---|---|---|---|
| Loading logs... | |||||
Client Integration & SDK
Simple 3-Line Setup
Just like KeyAuth, define your program credentials and initialize. skCrypt or string encryption can be added easily if you want protection against memory inspection:
// Standard KeyAuth-style structure
std::string name = "Temp Woofer v2";
std::string ownerid = "usr_xxxxxx";
std::string version = "1.0";
std::string url = "https://jauth.site/api/v1/";
std::string path = ""; // optional
JAuth::api jauth(name, ownerid, version, url);
jauth.init();
if (jauth.license(user_key)) {
// Authenticated! HWID bound & subscription verified.
}
usr_xxxx
https://jauth.site/api/v1/
#include <iostream>
#include "jauth.hpp"
// Define application configuration
std::string name = "Temp Woofer v2";
std::string ownerid = "YOUR_OWNER_ID";
std::string version = "1.0";
std::string url = "https://jauth.site/api/v1/";
std::string path = "";
JAuth::api jauth(name, ownerid, version, url);
int main() {
std::cout << "[*] Connecting to JAuth..." << std::endl;
if (!jauth.init()) {
std::cout << "[-] Failed to connect: " << jauth.response.message << std::endl;
system("pause");
return 0;
}
std::string key;
std::cout << "[?] Enter License Key: ";
std::cin >> key;
if (jauth.license(key)) {
std::cout << "[+] Logged in successfully!" << std::endl;
std::cout << "[+] Tier: " << jauth.response.tier << std::endl;
std::cout << "[+] Days Left: " << jauth.response.daysleft << std::endl;
std::cout << "[+] Locked HWID: " << jauth.response.hwid << std::endl;
// Run your protected program code here
} else {
std::cout << "[-] Authentication Failed: " << jauth.response.message << std::endl;
}
system("pause");
return 0;
}
from jauth import JAuth
# Configure your application
name = "Temp Woofer v2"
ownerid = "YOUR_OWNER_ID"
version = "1.0"
url = "https://jauth.site/api/v1/"
jauth = JAuth(name=name, ownerid=ownerid, version=version, url=url)
if not jauth.init():
print("[-] Initialization failed!")
exit()
license_key = input("Enter License Key: ").strip()
if jauth.license(license_key):
print(f"[+] Login Successful! Tier: {jauth.data.get('tier')} | Days Left: {jauth.data.get('daysleft')}")
# Run protected program
else:
print(f"[-] Authentication Failed: {jauth.error_message}")
using System;
using System.Threading.Tasks;
using JAuth;
class Program
{
static async Task Main(string[] args)
{
string name = "Temp Woofer v2";
string ownerid = "YOUR_OWNER_ID";
string version = "1.0";
string url = "https://jauth.site/api/v1/";
api jauth = new api(name, ownerid, version, url);
Console.WriteLine("[*] Initializing JAuth...");
if (!await jauth.InitAsync())
{
Console.WriteLine("[-] Init failed: " + jauth.ErrorMessage);
return;
}
Console.Write("Enter License Key: ");
string key = Console.ReadLine();
if (await jauth.LicenseAsync(key))
{
Console.WriteLine("[+] Authenticated successfully!");
// Run your program
}
else
{
Console.WriteLine("[-] Authentication failed: " + jauth.ErrorMessage);
}
}
}
local JAuth = require(script.JAuth)
local Players = game:GetService("Players")
local name = "Temp Woofer v2"
local ownerid = "YOUR_OWNER_ID"
local version = "1.0"
local url = "https://jauth.site/api/v1/"
local jauth = JAuth.new(name, ownerid, version, url)
local initialized, err = jauth:init()
if not initialized then
warn("JAuth init failed:", err)
return
end
local function verifyPlayerKey(player, licenseKey)
local success, result = jauth:license(player, licenseKey)
if success then
print(player.Name .. " validated key successfully!")
return true
else
warn("Key failed for " .. player.Name .. ":", result)
return false
end
end
# 1. Initialize
curl -X POST https://jauth.site/api/v1/init \
-H "Content-Type: application/json" \
-d '{
"name": "Temp Woofer v2",
"ownerid": "YOUR_OWNER_ID",
"version": "1.0"
}'
# 2. Authenticate License Key
curl -X POST https://jauth.site/api/v1/license \
-H "Content-Type: application/json" \
-d '{
"name": "Temp Woofer v2",
"ownerid": "YOUR_OWNER_ID",
"key": "JAUTH-XXXX-XXXX-XXXX",
"hwid": "SAFE_MACHINE_HASH_12345"
}'
Documentation
1. System Architecture & Overview
JAuth is an ultra-lightweight, high-performance software licensing and hardware lock authentication platform designed as a modern alternative to KeyAuth. It is built to operate with zero external server costs on Cloudflare's free global edge network (Cloudflare Pages, Workers, and D1 SQLite) or self-hosted locally on Node.js.
Zero Telemetry Privacy
No invasive file collection, private registry scanning, or intrusive telemetry. Safe minimal hardware IDs only.KeyAuth-Compatible Syntax
Drop-in structure withname, ownerid, version, and url parameters.
100% Free Hosting
Built for Cloudflare D1 (5,000,000 queries/day free) and Cloudflare Pages edge isolates.2. Applications & Secrets
Inside your JAuth account, you can create multiple distinct applications (e.g. Temp Woofer v2, Game Loader Pro, Discord Bot). Each application has:
- Name: The display name of your program (e.g.
Temp Woofer v2). - App ID: A unique system identifier (e.g.
app_1d37460c91a59523). - App Secret: A cryptographic 32-byte secret (e.g.
sec_...) used to sign response payloads and secure admin operations. - HWID Lock Policy: Toggle whether licenses in this application are locked to specific machines or can be freely transferred.
3. License Keys & Expiration Cycles
JAuth supports both first-use activation and fixed-date expiration:
- First-Use Activation (Default): The key is generated with a duration (e.g. 30 days). The countdown timer does NOT start until the customer enters it into your program for the first time.
- Fixed Expiration: The countdown begins immediately upon generation.
- Lifetime: The key never expires.
- Adding Time: You can extend any key by adding days or hours in real time from the dashboard.
- Pausing & Banning: Paused keys can be unpaused anytime. Banned keys record a permanent ban reason and reject all incoming auth requests.
4. Hardware Locking & HWID Resets
To prevent key sharing without collecting invasive user data, JAuth hashes minimal machine properties into a safe string:
// Example minimal Windows HWID generator:
DWORD serialNum = 0;
GetVolumeInformationA("C:\\", NULL, 0, &serialNum, NULL, NULL, NULL, 0);
char hwid[64];
sprintf_s(hwid, "JAUTH-%08X-PC", serialNum);
When a customer gets a new PC or replaces hardware components, simply navigate to HWID Manager or License Keys and click Reset HWID. The key will cleanly bind to their new machine on their next launch.
5. REST API Reference
| Endpoint | Method | Required Body Fields | Description |
|---|---|---|---|
/api/v1/init |
POST | name, ownerid, version |
Initializes client session, verifies application status. |
/api/v1/license |
POST | name, ownerid, key, hwid |
Authenticates license key, verifies expiry, and locks HWID. |
/api/v1/check |
POST | name, ownerid |
Fast heartbeat / session validity check. |
6. Deploying to Cloudflare (Free Hosting)
JAuth is 100% pre-configured for free deployment to Cloudflare using Wrangler CLI:
- Log in:
npx wrangler login - Create free D1 database:
npx wrangler d1 create jauth-db - Run database schema:
npm run cf:db - Deploy worker and frontend:
npm run deploy:cf - Attach your domain
jauth.sitein the Cloudflare dashboard under Workers > Custom Domains!