Documentation menu▾

Keygate documentation

An open source, self hosted license server: issue license keys, check them in your app, sell with Stripe and ship updates from your own server.

These pages follow the path most people take: get a server running, decide how you want to sell, add the license check to your app, then connect payments and updates. If you write your own client, the API reference has the details.

Start here

Building with Electron, Tauri, .NET, Python or Swift? The framework guides have complete code you can copy: Electron, Tauri, .NET, Python and Swift. Moving from another licensing system? Read Migrating to Keygate.

How it fits together

Almost everything in Keygate is built from four things.

  • Product. What you sell, such as a desktop app or a web service. Its type (desktop, SaaS or hybrid) decides whether a license is counted by device, by team member or by both.
  • Plan. How you sell the product: a subscription, a perpetual license or a trial. A subscription can be sold per seat, with the buyer choosing how many, and a trial can move to a free plan when it ends instead of expiring. The plan holds the Stripe price, the number of devices and people a license may have and the features it unlocks. See Licensing models.
  • License. What a customer owns. Keygate creates one when a checkout completes, when you issue it from the dashboard or when your own backend asks for one through the API. Every license has a key like KG-ABCD2345-EFGH6789-JKLM2345-NPQR6789, with a prefix you can choose per product, and on a license shared by a team every member gets a key of their own.
  • Activation. One device or one user on a license. If a license allows three devices, a fourth activation is refused until the customer frees one.

Around these sit the things that make licensing workable from day to day: a customer portal where people manage their own licenses and billing, emails for keys and reminders, webhooks for your other systems, an audit log, and release hosting for apps that update themselves.

Two APIs

Keygate has two APIs, and they are meant for different callers.

The license API lives under /api/v1/license and is what your app talks to. It takes no API key. The license key in the request is the credential, because anything you ship inside an app can be pulled out of it, a secret key included.

The admin API lives under /api/v1/admin and is for your own servers, for example a billing system that creates licenses. It takes an API key made in the dashboard and sent as Authorization: Bearer kg_live_.... The API reference covers both.

New to licensing?

Three short articles cover the background: how license keys work, node locked vs floating licenses and whether to build your own license server.

Getting help

Most setup problems are covered in Troubleshooting.

Questions and ideas belong in GitHub Discussions, bugs in the issue tracker. The source code is on GitHub, and so are the release notes for every version.

Last updated October 26, 2026