LicenPro
DocumentationFloating license

Floating license

Floating (and Concurrent) licenses represent seats: a maximum number of simultaneous active users/machines enforced through activations and session heartbeats to the API. They are inherently online-oriented — the pool is authoritative on the server.

Max seats

MaxActiveUsersCount on create.

Heartbeat

SDK session keeps seat claimed.

Dashboard

See active sessions vs cap.

Floating vs Concurrent

Both are modeled in the API enum as distinct values (Floating and Concurrent) and map to SDK types FloatingLicense and ConcurrentLicense with the same seat concept (MaxActiveUsersCount). Product documentation usually treats them as sibling “network seat” models; pick the enum your business rules expect when creating licenses.

How it works

Each checkout occupies capacity until the session ends or the heartbeat times out. The SDK’s LicenseClient.ValidateAsync path participates in activation + session management so the server can reject a seat when the pool is full.

Creating a floating license (dashboard / API)

  1. POST /api/Licenses with type: "Floating" (or "Concurrent"), maxActiveUsersCount set to the pool size, issuedTo (org or label), softwareReleaseId, optional entitlements.
  2. Distribute license key + license.bin to the customer environment.
  3. Monitor usage under product Sessions / Activations in the dashboard.

REST API

  • GET /api/Licenses/{licenseKey}/activations — activation snapshot (anonymous).
  • GET /api/Licenses/status/{licenseKey} — includes seat-oriented fields in the returned payload where applicable.
  • Vendor JWT routes for revoke/transfer when you need administrative overrides.

SDK integration

Validate like any other type; keep the client alive for ConnectSessionAsync / heartbeat while the app holds a seat. Heartbeat interval is driven by SDK configuration (SdkSettings.HeartbeatIntervalMinutes / manager defaults), not a fake SessionHeartbeatInterval property on LicenseClientOptions.

using LicenPro.SDK;
using LicenPro.SDK.Enums;

await using var client = new LicenseClient(new LicenseClientOptions {
    LicenseFilePath = "license.bin",
    PublicKey = publicKeyBase64,
    LicenseKey = floatingKey,
    ExpectedLicenseType = LicenseType.Floating
});

var result = await client.ValidateAsync();
if (!result.IsValid)
    return;

await client.ConnectSessionAsync();
// On app exit: await client.DisposeAsync();
Offline use

Floating/concurrent licensing cannot be truthfully enforced without periodic server contact. Offline-only mode is not a supported primary mode for seat pools; use perpetual or node-locked models if you must work air-gapped.