Files
english/.opencode/skills/payment-integration/references/creem/licensing.md
2026-04-12 01:06:31 +07:00

3.1 KiB

Creem.io Licensing

Software licensing with device activation management.

License Flow

purchase → license_key issued → activate device → validate → deactivate

Activate License

Register a device against a license key:

// POST /v1/licenses/activate
const activation = await creem.licenses.activate({
  license_key: 'XXXX-XXXX-XXXX-XXXX',
  instance_id: 'device_fingerprint_123',  // Unique device identifier
  instance_name: 'MacBook Pro'            // Optional friendly name
});

// Returns: {
//   id: 'act_xxx',
//   license_key: '...',
//   instance_id: '...',
//   activated_at: '...',
//   valid_until: '...'
// }

Validate License

Check if license is active for specific device:

// POST /v1/licenses/validate
const validation = await creem.licenses.validate({
  license_key: 'XXXX-XXXX-XXXX-XXXX',
  instance_id: 'device_fingerprint_123'
});

// Returns: {
//   valid: true,
//   license_key: '...',
//   product_id: 'prod_xxx',
//   customer_id: 'cus_xxx',
//   expires_at: '2025-01-15T00:00:00Z',
//   activations_used: 2,
//   activations_limit: 5
// }

Deactivate License

Remove device activation to free slot:

// POST /v1/licenses/deactivate
await creem.licenses.deactivate({
  license_key: 'XXXX-XXXX-XXXX-XXXX',
  instance_id: 'device_fingerprint_123'
});

Client-Side Implementation

// Desktop app example (Electron, Tauri, etc.)
class LicenseManager {
  constructor(apiKey) {
    this.apiKey = apiKey;
    this.instanceId = this.getDeviceFingerprint();
  }

  getDeviceFingerprint() {
    // Generate unique device ID (machine ID, hardware hash, etc.)
    return require('node-machine-id').machineIdSync();
  }

  async activate(licenseKey) {
    const response = await fetch('https://api.creem.io/v1/licenses/activate', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        license_key: licenseKey,
        instance_id: this.instanceId,
        instance_name: os.hostname()
      })
    });
    return response.json();
  }

  async validate(licenseKey) {
    const response = await fetch('https://api.creem.io/v1/licenses/validate', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        license_key: licenseKey,
        instance_id: this.instanceId
      })
    });
    const data = await response.json();
    return data.valid;
  }
}

Activation Limits

Configure per product - limits simultaneous device activations:

const product = await creem.products.create({
  name: 'Desktop App License',
  price: 4900,
  currency: 'usd',
  license_config: {
    activations_limit: 3  // Max 3 devices per license
  }
});

License Events (Webhooks)

  • license.activated - Device activated
  • license.deactivated - Device deactivated
  • license.expired - License expired (subscription ended)

See references/creem/webhooks.md for webhook handling.