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:

LimitFree planPremium
Pools per server5Unlimited
Unclaimed keys per server5,000Unlimited
Posted claim buttons1Unlimited

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.

Servers that were already past a limitServers that had more than five pools, more than 5,000 unclaimed keys, a grant role or more than one claim button before premium launched are grandfathered. Their limits are lifted and those features keep working, for free, permanently. They do not get the new premium rules below without buying premium. /premium shows the plan your server is on.

What premium adds

FeatureWhereWhat it does
Account age rulePool page, premium rulesRefuse claims from Discord accounts younger than N days.
Membership age rulePool page, premium rulesRefuse claims from members who joined your server less than N days ago.
Scheduled dropsPool page, premium rulesAn open time and a close time. Claims outside the window are refused with the time shown.
CooldownPool page, premium rulesMinimum seconds between two claims by one member from the same pool.
Daily limitPool page, premium rulesMaximum claims by one member from the pool in a rolling 24 hours.
Low stock thresholdPool page, premium rulesPick the percentage that triggers the low stock warning instead of the fixed 10.
Whitelist-only poolsPool page, whitelistOnly members on the pool's list may claim. Paste ids in bulk.
Custom key messagesPool page, premium rulesYour own wording for the claim reply and for the grant DM, per pool.
Grant rolesPool settingsGive a role automatically when a key is issued from the pool.
Analytics and exportActivity pageClaims per day, per pool conversion, and a CSV of every claim.
HTTP webhooksWebhooks pageSigned POSTs to your endpoint when a key is claimed or a pool runs low or dry.
Bulk grant preview/grantrole dry_run:TrueSee member and key counts without granting anything.

Buying premium

  1. 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.

  2. 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.

  3. 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:

PlaceholderBecomes
{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.

Posting to a Discord channelPaste a Discord channel webhook URL (Channel settings, Integrations, Webhooks, Copy Webhook URL) and KeyBot sends each event as a formatted message in that channel instead of the JSON below. It names the pool, the member and the key id, never the key itself, and never pings anyone.
HeaderValue
X-KeyBot-Eventclaim, low_stock or empty
X-KeyBot-Signaturesha256= followed by the hex HMAC-SHA256 of the raw request body, keyed with the webhook's secret
X-KeyBot-DeliveryA 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 /premium says 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.