Running keys
Premium
KeyBot is free, and stays free. Premium is for the servers that outgrow it: bigger inventories, launches that need anti-alt rules and exact timing, and studios that want the data. $3.00 USD buys 30 days for one server.
The free plan
Every server gets all of this without paying anything:
| Limit | Free plan | Premium |
|---|---|---|
| Pools per server | 5 | Unlimited |
| Unclaimed keys per server | 5,000 | Unlimited |
| Posted claim buttons | 1 | Unlimited |
Limits are checked when you add something, never after the fact. If you are under the cap you can keep going; if you are at it, the next pool, import or button post tells you and points at the Premium page. Nothing you already have is ever removed.
/premium shows the plan your server is on.What premium adds
| Feature | Where | What it does |
|---|---|---|
| Account age rule | Pool page, premium rules | Refuse claims from Discord accounts younger than N days. |
| Membership age rule | Pool page, premium rules | Refuse claims from members who joined your server less than N days ago. |
| Scheduled drops | Pool page, premium rules | An open time and a close time. Claims outside the window are refused with the time shown. |
| Cooldown | Pool page, premium rules | Minimum seconds between two claims by one member from the same pool. |
| Daily limit | Pool page, premium rules | Maximum claims by one member from the pool in a rolling 24 hours. |
| Low stock threshold | Pool page, premium rules | Pick the percentage that triggers the low stock warning instead of the fixed 10. |
| Whitelist-only pools | Pool page, whitelist | Only members on the pool's list may claim. Paste ids in bulk. |
| Custom key messages | Pool page, premium rules | Your own wording for the claim reply and for the grant DM, per pool. |
| Grant roles | Pool settings | Give a role automatically when a key is issued from the pool. |
| Analytics and export | Activity page | Claims per day, per pool conversion, and a CSV of every claim. |
| HTTP webhooks | Webhooks page | Signed POSTs to your endpoint when a key is claimed or a pool runs low or dry. |
| Bulk grant preview | /grantrole dry_run:True | See member and key counts without granting anything. |
Buying premium
- Open your server in the dashboard
Go to the dashboard, pick the server, then Premium in the side rail. Anyone who can manage the server in the dashboard can buy premium for it.
- Choose how much time
From 1 to 12 blocks of 30 days at $3.00 USD each. Tick the confirmation and continue to the Team Hydra checkout, where you pay by card or PayPal.
- Come back to the dashboard
The checkout returns you to the Premium page with premium already active. The invoice number is shown there and in your purchase history.
- Time stacks. Buying while premium is active adds to the current end date, so renewing early never wastes a day.
- There is no subscription. Nothing renews on its own and there is nothing to cancel. You are reminded 7 days before the end, 3 days before, and when it ends, by DM to whoever bought it and in the server's log channel.
- Per server. Premium belongs to the server it was bought for.
- Refunds are handled by Team Hydra support. Ask in the support server with your invoice number.
When premium ends
Nothing is deleted. Premium features switch off and the free limits come back into force:
- Pools beyond the free limit pause. The five oldest stay claimable; the rest refuse claims with a message saying why, and everything in them is untouched.
- Pools that use whitelist, account age, membership age, schedule, cooldown or daily limit rules also pause, rather than silently dropping the protection and handing keys to the people the rule was meant to exclude. Clearing the rules from the pool page unpauses it on the free plan.
- Custom messages, analytics, webhooks, grant roles and the low stock threshold stop applying.
- Buying premium again restores all of it immediately.
Custom key messages
Each pool can carry two templates: the ephemeral reply a member sees after /claim or a claim button, and the direct message sent by /grant and /grantrole. Both must contain {key}. These placeholders are filled in:
| Placeholder | Becomes |
|---|---|
{key} | The key itself. |
{game} | The pool's game. |
{pool} | The pool's name. |
{type} | Steam or Custom. |
{user} | A mention of the member. |
{server} | The server name. |
{redeem} | For Steam pools, a line with the activation link. Empty for custom pools. |
An empty template means the standard wording, which is:
Here's your {type} key
`{key}`{redeem}Webhooks
Add up to ten https:// endpoints per server on the Webhooks page and pick the events each should receive. KeyBot POSTs a JSON body and signs it, so your endpoint can be sure the call came from KeyBot.
| Header | Value |
|---|---|
X-KeyBot-Event | claim, low_stock or empty |
X-KeyBot-Signature | sha256= followed by the hex HMAC-SHA256 of the raw request body, keyed with the webhook's secret |
X-KeyBot-Delivery | A unique id for this delivery, the same across both attempts |
Body
{
"event": "claim",
"guild_id": "123456789012345678",
"pool": { "id": "…", "name": "Launch keys", "game": "My Game", "type": "steam" },
"user_id": "234567890123456789",
"key_id": 4821,
"at": "2026-09-23T14:02:11.000Z"
}Stock events carry keys_left and total instead of user_id and key_id. The body never includes a key value: key_id is enough to find the row in the claims export. A claim event is sent for /claim, claim buttons and /grant; a bulk /grantrole run sends only the stock events.
Verifying
import crypto from "node:crypto";
const expect = "sha256=" + crypto.createHmac("sha256", SECRET).update(rawBody).digest("hex");
const ok = expect === req.headers["x-keybot-signature"];- Respond with any 2xx within 10 seconds. A timeout, a 5xx or a 429 is retried once, then dropped; any other 4xx is dropped straight away.
- A webhook that fails 50 times in a row is disabled. Re-enable it on the Webhooks page once the endpoint is fixed.
- Deliveries only happen while the server is premium. The hooks are kept when it lapses and resume when it is renewed.
Hydra One
Hydra One is Team Hydra's bundle: one subscription on teamhydra.dev makes every Team Hydra bot premium on one server. KeyBot, Zira, Zira Music, HepBoat and Hydra Modmail, all at once, plus whatever we build next. Overbuilt on purpose.
- Everything on this page, switched on. A covered server gets full KeyBot Premium. Its Premium page shows Covered by Hydra One instead of the purchase form, and
/premiumsays the same. - Paid time is paused, not spent. If the server already had KeyBot Premium when Hydra One arrived, the days that were left (rounded up to whole days) are frozen and come back when Hydra One ends.
- KeyBot not in the server yet? Invite it. Coverage switches on by itself, usually at once and always within 15 minutes.
- Reminders come from teamhydra.dev while Hydra One covers the server. KeyBot stays quiet.
- When it ends, any paused paid time picks up where it left off. With none left, the server goes back to the free plan under the rules above: nothing is deleted.
The /premium command
Anyone in the server can run /premium. It shows whether the server is free, premium (and until when), or grandfathered, lists what premium includes, and links to the purchase page. The reply is ephemeral.