License migration
Honor legacy product licenses inside Moonbase — point us at a validation endpoint and we'll convert legacy license files into Moonbase activations on demand.
Written By Tobias Lønnerød Madsen
License migration lets you accept license files generated by your old licensing system inside Moonbase, without forcing customers to re-purchase. When a customer activates with a legacy license, Moonbase POSTs the license bytes to your endpoint, you validate it and reply with what the activation should look like, and Moonbase issues a native activation record.

When does migration trigger?
Whenever a customer's installed product attempts to activate using a license file Moonbase doesn't recognise. Moonbase forwards the raw license payload to your validation endpoint, and if you accept it, Moonbase creates a real activation that behaves like any other Moonbase license going forward.
What you need to provide
License validation endpoint — a URL Moonbase POSTs each unrecognised license to.
API key — a shared secret Moonbase sends in every request so your backend can authorise the call.
Endpoint contract
Request: POST <validation_endpoint>
Headers: api-key: <your_api_key>, Content-Type: <the license file's content type>
Body: the raw bytes of the license file. Moonbase doesn't parse it — it forwards exactly what the client sent, with the original content type, so your endpoint can decode whatever format your old system produced (XML, binary blob, signed JSON, etc.).
Response:
200 OKwith JSON body if the license is valid:
{
"trial": false,
"productId": "moonbase-product-id-this-license-belongs-to",
"customerId": "optional-moonbase-customer-id",
"customerEmail": "optional-customer-email",
"activationMethod": "Online | Offline | ...",
"deviceSignature": "signature-uniquely-identifying-the-device",
"deviceName": "human-readable-device-name",
"expiresAt": "2026-12-31T00:00:00Z (or null for no expiry)"
}Any non-2xx status code — Moonbase rejects the activation with an "Invalid license" error to the customer.
Field meanings
trial — whether the activation is a trial license. Trials behave the same as paid activations but are flagged in Moonbase reporting.
productId — the Moonbase product ID this license should activate. The legacy license must map to a product that already exists in Moonbase.
customerId / customerEmail — optional. If you can identify which Moonbase customer (or which email) owns the legacy license, include one or both; Moonbase will associate the activation with them.
activationMethod — how the device was activated (online vs offline). Use the same value as you'd use in a native Moonbase activation.
deviceSignature, deviceName — identifying the device the legacy license is bound to. Moonbase uses these to deduplicate and to show the device in the customer's portal.
expiresAt — the legacy license's expiry, in ISO-8601 format. Use
nullfor perpetual licenses.
Disabling migration
Toggle License migration is enabled off and save. Existing migrated activations remain valid; only future legacy license activations are blocked.
Common questions
What if my legacy license format includes the product mapping? Decode it on your side and return the matching productId. Moonbase doesn't try to interpret the bytes.
How do I rotate the API key? Update the value in this form and save. Have your backend accept both the old and new key for a short overlap if you can't atomically switch.