Quickstart: license your first app
From zero to a working, device-locked license check in about five minutes.
1. Create an account
Sign up free with Google, Discord or e-mail. Turn on two-factor authentication when the dashboard suggests it — it takes a minute and protects every key you issue.
2. Add a product
In Products, add the app or tool you sell. We generate its product ID for you — a random value such as k7x3m9qp2wvn that is unique across the whole service and never changes. It is what your software sends with each check; copy it from the product’s page.
3. Generate keys
Open Keys → Generate. Pick the product, how many keys, and the validity: no expiry, a fixed date, or “N days after first activation”. Add your customer’s e-mail and we send them the key straight away, then remind them two days before it expires and again when it has.
Leave the Public key switch off for normal keys, which lock to the first device that activates them. Switch it on for a key with no device binding — any number of people can use it at once, which suits a free tier, a team licence or a beta. See key types.
4. Add the SDK
Download the client for your language (see SDKs & API wrapper: a single file for Python and Node.js, a small package for Go and Rust), and copy the public key shown on the guide page — it is not secret, and the SDK uses it to verify every answer.
Python
from license_client import LicenseClient
client = LicenseClient(
base_url="https://license.foliox.sbs",
product="YOUR_PRODUCT_ID",
public_key_b64=PUBLIC_KEY,
)
result = client.check(license_key) # activates on first run, verifies after
if not result.valid:
raise SystemExit(f"Not licensed: {result.reason}")
Node.js
const { LicenseClient } = require('./licenseClient');
const client = new LicenseClient({ baseUrl: 'https://license.foliox.sbs', product: 'YOUR_PRODUCT_ID', publicKeyB64: PUBLIC_KEY });
const result = await client.check(licenseKey);
if (!result.valid) throw new Error('Not licensed: ' + result.reason);
Go
client, err := licenseclient.New("https://license.foliox.sbs", "YOUR_PRODUCT_ID", publicKey)
if err != nil { log.Fatal(err) }
result := client.Check(licenseKey)
if !result.Valid { log.Fatalf("not licensed: %s", result.Reason) }
Rust
let client = LicenseClient::new("https://license.foliox.sbs", "YOUR_PRODUCT_ID", PUBLIC_KEY)?;
let result = client.check(license_key);
if !result.valid { eprintln!("not licensed: {:?}", result.reason); std::process::exit(1); }
5. Try it
- Run your app with a fresh key — it activates and binds to your computer.
- Run it again — it verifies. In the dashboard the key now shows Active, bound to one device.
- Revoke the key in the dashboard and run again — the app is refused with
revoked. - Restore it, or use Reset device to move it to another computer.
Offline behaviour
If the license service can’t be reached, the SDK keeps your app running from its last signed “valid” answer for up to 72 hours, then fails closed. See the security model.
What next?
- Create keys automatically from your store: Automation API.
- Understand plans and limits: Accounts & plans.
- Every endpoint and reason code: API reference.