Script licenses

Sell access to paid scripts with HWID binding, device limits, leak alerts, and a paid update channel — without KeyAuth-style per-seat pricing.

What you get

Create a product

Dashboard → Licenses → Create product. Set SKU, name, max devices (1–10), and duration in days (0 = lifetime).

Issue or auto-deliver

Manual: Licenses → Issue license, pick the product, optionally bind a Roblox user ID.

On purchase: Auto-Delivery → generate API key, select the license product, attach to a webhook with a storefront adapter. Purchases create both the key and entitlement.

Verify endpoint

POST https://developer.nexrbx.com/api/developer/licenses/verify

{
  "key": "nex_dev_…",
  "hwid": "device-fingerprint",
  "robloxUserId": "123456789"
}

The legacy /api/developer/api-keys/verify endpoint still works and returns license metadata when the key has an entitlement.

Successful response

{
  "success": true,
  "valid": true,
  "keyName": "Pro Script license",
  "product": { "sku": "pro-script", "name": "Pro Script Access" },
  "maxDevices": 1,
  "devicesUsed": 1,
  "expiresAt": "2026-06-22T00:00:00.000Z",
  "update": {
    "version": "1.2.0",
    "downloadUrl": "https://…",
    "changelog": "Bug fixes"
  }
}

Common failure reasons: device_limit, user_mismatch, expired, revoked, quota_exceeded.

Storefront adapters

Webhook proxy → Settings → Storefront adapter. Pick Gumroad, Sellix, SellAuth, PayPal, or Roblox commerce. Incoming payloads are normalized to event, userId, and email before auto-delivery runs.

Roblox verify example

local HttpService = game:GetService("HttpService")
local VERIFY_URL = "https://developer.nexrbx.com/api/developer/licenses/verify"

local function verifyNexLicense(key, hwid, userId)
  local ok, response = pcall(function()
    return HttpService:PostAsync(
      VERIFY_URL,
      HttpService:JSONEncode({
        key = key,
        hwid = hwid,
        robloxUserId = userId and tostring(userId) or nil
      }),
      Enum.HttpContentType.ApplicationJson
    )
  end)
  if not ok then return false end
  local data = HttpService:JSONDecode(response)
  return data.valid == true
end