Skip to main content
Sourced directly from the bot’s command handlers (keyauth_bot/cogs/licops.py for /license, keyauth_bot/cogs/licadmin.py for /licops). This page is maintained by hand — if a command here looks out of date, the source is the final authority.
Permission is the License Operations capability checked when the command actually runs — see Installation & Permissions and License Operations for how capabilities resolve. Configured admins and the guild owner hold every capability automatically. Both command groups also require a Discord-visible Manage Server by default to appear at all, which server admins can loosen per role in Discord’s Integrations settings — that only controls visibility, not whether the command is allowed to run.

Lookup & customer records

identifier accepts a license key, KeyAuth username, Discord mention/ID, or hardware ID. Opens the action panel — see Panel actions below.Rate-limited to 10 uses per 60 seconds per user.Permission: license.viewExample: /license lookup identifier:@SomeUser
identifier accepts a Discord mention/ID or a KeyAuth username. Returns a rolled-up support profile with buttons to open the full license panel and, with license.view_history, its history.Permission: license.viewExample: /license customer identifier:@SomeUser
status is one of: Active, Expired, Disabled, Revoked. Runs against the local mirror, not a live KeyAuth call, because KeyAuth’s fetchallkeys has no server-side filter or cursor. page defaults to 1.Permission: license.viewExample: /license search status:Active expires_in_days:7

Account linking

reset_hwid defaults to true and is recommended. Syncs roles onto the new owner and off the old one on success.
This moves the Discord association only. KeyAuth-side account ownership is unchanged — KeyAuth’s API has no true transfer operation. See What KeyAuth cannot do for why.
Permission: license.transferExample: /license transfer identifier:SomeUser to:@NewOwner reason:Account sold reset_hwid:True

Configuration

Reset policy

Permission: license.admin
Every argument is optional — omitted ones keep their current value. max_resets:0 means unlimited.Permission: license.adminExample: /licops policy set max_resets:2 window_days:30 cooldown_hours:72

Role mappings

subscription must match the KeyAuth subscription name exactly. All three boolean flags default to true. Refused if role sits at or above the bot’s own highest role.Permission: license.role_syncExample: /licops roles map subscription:premium role:@Premium
Permission: license.role_syncExample: /licops roles unmap subscription:premium
Permission: license.view
Permission: license.role_syncExample: /licops roles sync member:@SomeUser

Capability grants

capability autocompletes against the 17 valid capability keys — see License Operations for the full list.Permission: license.adminExample: /licops permissions grant role:@Support capability:license.hwid_reset
Permission: license.adminExample: /licops permissions revoke role:@Support capability:license.hwid_reset
Permission: license.view
preset is one of: Support (view, history, notes, HWID reset, link), Manager (adds unlink, HWID override, extend, set-expiration, enable/disable, and role sync). Neither preset includes anything destructive — revoke, delete, transfer, view_sensitive, bulk, and admin are always granted explicitly.Permission: license.adminExample: /licops permissions preset role:@Support preset:Support

Operations

limit defaults to 25 and is capped at 200 (each account checked spends API budget). sync_roles defaults to true. Refuses to start a second run while one is already in progress, and stops immediately — rather than spending remaining budget — if it hits KeyAuth’s rate limit.Permission: license.bulkExample: /licops reconcile limit:50
Reports the application name, mirrored license count, scheduled sweep interval, alert status, HWID checking status, and the most recent reconciliation run.Permission: license.view
operation is one of: Expiring soon report, Orphaned link report, Role reconciliation. execute defaults to false, which previews the operation — including its API cost — instead of running it.
There is deliberately no bulk delete and no bulk revoke. A mistyped filter should not be able to destroy a customer base.
Permission: license.bulkExample: /licops bulk operation:Expiring soon report

Panel actions

The /license lookup panel carries buttons for hardware ID, extend, history, notes, refresh, disable/enable, revoke, and reveal. Only actions the viewer may perform are rendered — but that’s a UX convenience, not the control: every capability is re-checked server-side on press, and the account is re-read rather than trusted from the button itself, since a button’s custom_id is client-visible and technically client-modifiable. Consequential actions — disable, revoke — always require confirmation and a reason captured in a modal.