Skip to main content

Migrate

Migrate from Cryptlex to Licentric

A four-phase CSV migration — export, prepare, dry-run import, cutover — built on the shipping POST /api/v1/migrations/import endpoint. Honest about where Cryptlex stays the better fit (native LexActivator SDKs, on-prem LexFloatServer, ISO 27001).

Cryptlex facts verified 2026-06-03 from cryptlex.com/pricing, docs.cryptlex.com (LexActivator + LexFloatServer), and github.com/cryptlex/lexactivator-dotnet. Licentric claims are true-shipped only.

Why migrate

Why teams move from Cryptlex to Licentric

  • You want license keys + Stripe billing in one product with zero webhook glue code.
  • You ship AI agents and need per-agent token budgets, identity, or MCP auth.
  • You ship in containers (Docker, Kubernetes) and want native logical-ID fingerprinting instead of hardware-only fingerprints that break in containers.
  • You want a free tier large enough for a real product launch (100 active licenses vs Cryptlex's 10 activations).
  • You're cost-sensitive at scale — Licentric's paid tiers start at $5/mo vs Cryptlex's $100/mo Startup tier at comparable volume.
  • You want a built-in end-user self-service portal (magic-link auth) on every tier.
  • You want offline files signed with Ed25519 (FIPS 186-5, deterministic, 64-byte signatures).
  • You want compliance scaffolding for the EU AI Act (phased enforcement starting August 2026).

What's preserved

What's preserved across the migration

  • Customer email + status preserved. status=active stays active; suspended stays suspended; revoked remains revoked (terminal-state guarded).
  • Expiry + activation allowance preserved. The Cryptlex expiry maps to license.expiresAt and the per-license activation allowance maps to maxActivations on the imported record (confirm whether your export column is the cap or the used count before importing).
  • Metadata preserved. Any per-license JSON metadata you carry across is stored verbatim on the Licentric license.metadata field.
  • Customers get a NEW Licentric-format key. Unlike a same-key swap, the generic import generates a fresh Licentric key per record and emails it to the customer with an activation link — your old Cryptlex key hash is retained only on metadata.migratedFromOldKeyHash for idempotent re-runs, never returned in plaintext.
  • Audit history export — hold Cryptlex's activity logs as a CSV alongside Licentric's new append-only audit trail. We do not import historical Cryptlex audit rows into Licentric (separate retention contracts); export them once at cutover and archive.

Procedure

Step-by-step migration procedure

Phase 1: Export from Cryptlex (CSV)

Export your licenses as a CSV from the Cryptlex dashboard. Cryptlex is a CSV-export supported platform in the Licentric migration guide — the columns we map are license key, product, user email, status, and activation count. There is no Cryptlex-specific API-import endpoint; the CSV path is the supported route. Stage everything behind dryRun first.

# Download your licenses as a CSV from the Cryptlex dashboard
# (Cryptlex: Products → Licenses → Export). You'll get columns like:
#   license key, product, user email, status, activation count
#
# Then convert each row into a migration record (see Phase 2) and POST it
# to the generic import endpoint with dryRun first.

Phase 2: Prepare records (field mapping)

The mapping is mechanical. Each Cryptlex license row becomes one migration record. Map the Cryptlex license key to oldKey, the user email to email, the Cryptlex product/plan name to plan (resolved to a Licentric policy UUID via planMappings), the expiry to expiresAt, and the activation allowance to maxActivations (verify your export column is the cap, not the used count). The schema below is verified against migrationImportSchema.

# Cryptlex CSV column        →   Licentric migration record field
# ─────────────────────         ───────────────────────────────────
# license.key               →   record.oldKey       (kept as a hash; NEW key issued)
# license.user.email        →   record.email
# license.product / plan    →   record.plan         (→ policy via planMappings)
# license.status            →   (active / suspended / revoked, terminal-guarded)
# license.expiry            →   record.expiresAt    (ISO 8601, optional)
# license.activation allow. →   record.maxActivations (int, optional — confirm cap vs used)
# license.metadata          →   record.metadata     (JSON, preserved)

Phase 3: Import into Licentric (dry-run, then commit)

POST your records to the shipping generic import endpoint. dryRun: true validates the input, the plan mappings, and the duplicate check WITHOUT persisting anything or sending email — preview a large migration before committing. The endpoint caps at 1000 records per request and is idempotent: re-running the same input returns the existing licenseId for already-migrated records. When the dry-run looks right, flip dryRun to false to issue the new keys + activation emails.

curl -X POST https://www.licentric.com/api/v1/migrations/import \
  -H "Authorization: Bearer lk_live_your_licentric_key" \
  -H "Content-Type: application/json" \
  -d '{
    "productId": "your-licentric-product-uuid",
    "planMappings": { "Cryptlex Pro": "your-licentric-policy-uuid" },
    "integratorName": "Your Company",
    "activationUrl": "https://app.yourcompany.com/activate",
    "records": [
      { "email": "user@example.com", "oldKey": "CRYPTLEX-KEY-HERE", "plan": "Cryptlex Pro" }
    ],
    "dryRun": true
  }'

Phase 4: Cutover

Once every record has been imported and your customers have received their new keys, flip your application's validation target to Licentric. Because customers hold a NEW key, coordinate the cutover with the activation email so they re-activate against Licentric. Keep your Cryptlex account in read-only for 30 days as a safety net before final cancellation.

# After cutover, your validation path is simply:
result = client.validate(
    key=license_key,
    fingerprint=client.fingerprint(),
)
if not result.valid:
    raise PermissionError(result.code)

Code diff

Cryptlex LexActivator → Licentric validate()

Cryptlex's primary integration is the native, compiled LexActivator library — not a REST SDK. So the “before” below is the actual LexActivator C# call shape (verified against docs.cryptlex.com and cryptlex/lexactivator-dotnet), and the “after” is the Licentric REST SDK extracted from the published source (sdks/python/licentric/client.py and sdks/typescript/src/client.ts).

Before — Cryptlex (C#)

// BEFORE — Cryptlex LexActivator (native compiled library; C#)
// Verified against docs.cryptlex.com + github.com/cryptlex/lexactivator-dotnet
LexActivator.SetProductData("PASTE_CONTENT_OF_PRODUCT.DAT_FILE");
LexActivator.SetProductId("PASTE_PRODUCT_ID", LexActivator.PermissionFlags.LA_USER);
LexActivator.SetLicenseKey(productKey);
int status = LexActivator.ActivateLicense();           // hits /v3/activations
bool isValid = status == LexStatusCodes.LA_OK;
// On subsequent runs you verify locally with IsLicenseGenuine():
//   int s = LexActivator.IsLicenseGenuine();  // LA_OK == genuinely activated

After — Licentric (Python)

# AFTER — Licentric Python SDK (sdks/python/licentric, verified against client.py)
from licentric import Licentric

client = Licentric(api_key="lk_live_your_key_here")
result = client.validate(
    key=license_key,
    fingerprint=client.fingerprint(),
)
is_valid = result.valid  # ValidationResult with .code, .license, .machine

After — Licentric (TypeScript)

// AFTER — Licentric TypeScript SDK (sdks/typescript, verified against client.ts)
import { Licentric, fingerprint } from "@licentric/sdk";

const client = new Licentric({ apiKey: "lk_live_your_key_here" });
const result = await client.validate({
  key: licenseKey,
  fingerprint: await fingerprint(),
});
const isValid = result.valid;

Strategy

Dry-run-first import (no surprise charges to customers)

Because the generic importer issues a NEW Licentric key per record and emails each customer, you do NOT want a blind run. Always dryRun: true first: it validates every record, the plan mappings, and the duplicate check, and returns the would-be result WITHOUT persisting anything or sending a single email. Inspect that preview, fix any unmapped plans, then commit.

The mapping and import flow are the same the in-product migration guide ships — a single source of truth so this page never drifts from the canonical sample. Cryptlex is one of its listed CSV-export supported platforms.

Rollback

Rollback path back to Cryptlex

The migration is reversible until you cancel Cryptlex. Because the import generates new keys rather than swapping them in place, the cleanest safety net is to keep both systems live during a 30-day window:

  1. Hold your Cryptlex account in read-only for 30 days after cutover — your old keys still validate there.
  2. Export licenses from Licentric (Dashboard → Settings → Export Data, or GET /api/v1/licenses?limit=200 cursor-paginated) if you need the new-key records back.
  3. If Licentric doesn't fit, point your application's validation back at LexActivator (your Cryptlex keys were never deactivated) and stop sending activation emails.
  4. Cancel your Licentric subscription via the customer portal. No long-term contract; month-to-month.

Honest

Real-talk: when migration ISN'T worth it

Keep Cryptlex if any of these describe you. Migration is a real engineering cost and the wrong call if your constraints lean Cryptlex's way.

  • You ship native desktop/embedded software in C++, C#, Delphi, Swift, or Objective-C and need LexActivator's compiled-library SDKs. Licentric ships Python + TypeScript only (Go in-repo, not yet published) — no compiled native library.
  • You need advanced hardware fingerprinting (CPU serial, MAC, disk binding) for strong anti-piracy on traditional desktop installs. Cryptlex's LexActivator has deeper native hooks here.
  • You rely on Cryptlex's on-premise LexFloatServer for floating licenses leased inside your customer's local network. Licentric has no equivalent on-premise float server today.
  • You require ISO 27001 certification evidence today. Cryptlex is ISO 27001 certified; Licentric is uncertified today (pursuing SOC 2 in 2026-Q4).
  • You're in a vertical (CAD/CAM, engineering, native gaming, embedded) where Cryptlex has documented adoption and a multi-year track record, and procurement requires that maturity.
  • You have an existing Cryptlex integration and the migration cost outweighs the difference — especially since Cryptlex keys are reissued (not preserved) on import.

Founder commitment

Founder-direct migration call — free for the first 50 customers

VISION.md states the operating principle plainly: “Personally onboard first 50 customers. Set up monetization in their codebase on the spot.” If you are evaluating a Cryptlex-to-Licentric migration, you are in that group.

Book a 30-minute migration call with the founder. We walk through your Cryptlex CSV export, run the import in dry-run mode against your real account, map your plans to Licentric policies, and queue the cutover. No sales pitch — just the work.