Audio plugins

License your VST, AU, and CLAP plugins

Lock each license to a machine, so keys cannot be shared across studios. A single check when your plugin opens confirms the license. Works with JUCE, iPlug2, or any framework.

C++ (cURL)
// Validate on plugin instantiation
// Use any HTTP library (cURL, JUCE URL, WinHTTP)
std::string body = R"({
  "license_key": ")" + userKey + R"(",
  "plugin_slug": "my-synth"
})";

auto response = httpPost(
  "https://api.licensr.app/v1/license/validate",
  {"Content-Type: application/json",
   "Authorization: Bearer " + PLUGIN_API_KEY},
  body);

auto json = parse(response);
if (!json["valid"].get<bool>()) {
  disableAudioProcessing();
}

Works with any audio framework

JUCE (C++)
iPlug2 (C++)
Dplug (D)
Rust + vst3-sys
AudioKit (Swift)
Any HTTP language

Why seat-mode for audio plugins

Machine-locked activations

Each seat binds to a unique machine identifier. A producer with 2 studio machines uses 2 of their 3 seats. Sharing the key with a friend hits the cap.

Fast validation, no latency in the audio thread

Call validate once on instantiation (editor open). Cache the result locally. Never call from the real-time audio callback.

Graceful offline handling

Fetch a short-lived, signed license token while online and verify it locally (fully offline, no SDK) against the per-plugin JWKS. Refresh it on a periodic heartbeat; only block once the token expires beyond your chosen TTL.

Branded customer portal

When a producer gets a new machine, they sign in on a branded page with your logo and deactivate the old seat themselves. No support ticket needed.

Subscription or perpetual

Sell monthly or annual subscriptions for ongoing updates, or one-time and lifetime purchases. The license state machine handles both.

Official SDK

Official C++ SDK: zero dependencies, audio-thread safe

CMake FetchContent from github.com/tekunodev/licensr-cpp (pin a release tag when one is published). Async validate/activate on a background worker; Client::snapshot() is the real-time read path that never blocks or allocates. Optional JUCE module ships a ready-made activation UI.

validate.cpp
$ CMake FetchContent → github.com/tekunodev/licensr-cpp
#include <licensr/licensr.h>

licensr::ClientConfig config;
config.api_key = "pk_live_...";
config.plugin_slug = "my-synth";
licensr::Client client(config);

client.validate(userKey, [](auto result) {
  if (result.ok() && result.value().valid) {
    unlockFullFeatures();
  }
});

// Audio thread: never blocks, never allocates
// if (auto s = client.snapshot()) use(s->valid);

Ready to license your audio plugin?

Free tier available. Drop in the C++ SDK, or call the REST API directly; same contract either way.