1. Customer purchases on Permisoft
Checkout runs on our platform. We issue a unique one-time licence key and email the buyer.
Permisoft is the system of record for perpetual licence keys. Your software never mints keys — you validate and track keys we issue on each purchase, and customers activate through our public API.
Checkout runs on our platform. We issue a unique one-time licence key and email the buyer.
Integrate @permisoft/client or call POST /api/keys/activate with the key and a stable machine ID. The key binds to one machine.
After approval you receive a ps_live_… API key. Validate keys and pull sales stats—never mint keys yourself.
Internal runbook for testing your own product: see docs/VENDOR_ONBOARDING.md in the repo.
Every paid order creates exactly one key in Permisoft. Keys are uppercase, segmented, and include a checksum. Your publisher prefix is assigned at approval (from your studio slug).
Example: MYAPP-A3B7-K9D2-M4F8-42
Audience: Desktop app / installer on the customer machine
Auth: None (rate limited by IP)
POST https://permisoft-uwpbvkfyka-uw.a.run.app/api/keys/activate
Content-Type: application/json
{
"key": "MYAPP-A3B7-K9D2-M4F8-42",
"machineId": "stable-hardware-id-from-your-app",
"machineLabel": "Paul's MacBook (optional)",
"productSlug": "myapp-myproduct (optional, for extra validation)"
}Success
{
"valid": true,
"message": "Activation successful",
"scope": "PRODUCT",
"productSlug": "myapp-myproduct",
"activationToken": "eyJ...",
"tokenExpiresAt": "2026-06-01T00:00:00.000Z",
"publisherSlug": "myapp"
}Error codes
Use @permisoft/client activateOnline(apiBaseUrl, { key, machineId }) — caches JWT for offline grace.
Audience: Your backend, license server, or support tooling
Auth: Authorization: Bearer ps_live_… or ps_test_…
POST https://permisoft-uwpbvkfyka-uw.a.run.app/api/v1/publisher/keys/validate
Authorization: Bearer ps_live_xxxxxxxx
Content-Type: application/json
{ "key": "MYAPP-A3B7-K9D2-M4F8-42" }Responses
{ "valid": false, "reason": "invalid_format" }{ "valid": false, "reason": "not_found" }{
"valid": true,
"status": "UNUSED" | "ACTIVATED" | "REVOKED",
"product": { "id": "...", "slug": "...", "name": "..." },
"activated": true,
"activatedAt": "2026-05-20T12:00:00.000Z",
"keyMasked": "MYAPP-****-****-****-42",
"sandbox": false
}Auth: Authorization: Bearer ps_live_… (scope stats:read)
GET https://permisoft-uwpbvkfyka-uw.a.run.app/api/v1/publisher/stats?from=2026-05-01&to=2026-05-31&productId=optional-cuid
{
"publisherSlug": "myapp",
"platformFeePercent": 5,
"totals": {
"unitsSold": 12,
"grossCents": 48000,
"platformFeeCents": 2400,
"netPublisherCents": 45600,
"pendingPayoutCents": 45600
},
"keysIssuedByProduct": [{ "productId": "...", "count": 12 }],
"sales": [{ "orderId": "...", "grossCents": 4000, "platformFeeCents": 200, ... }]
}