Already activated? Returns existing activation (200 OK, not error).
Error Responses
{"error":{"code":"seat_limit_exceeded","message":"All seats are in use. Deactivate another device first.","details":{"seat_limit":3,"active_seats":3}}}
Error Codes
Code
HTTP
Meaning
license_not_found
404
License key doesn't exist
expired
422
License has expired
revoked
422
License has been revoked
seat_limit_exceeded
422
All seats are in use
Device ID Best Practices
The device_id should be:
Unique — Different for each device
Stable — Doesn't change across restarts or OS updates
Private — Not personally identifiable
Platform-Specific Approaches
Platform
Recommended Source
macOS
IOPlatformUUID via IOKit
Windows
Win32_ComputerSystemProduct.UUID via WMI
Linux
/etc/machine-id
iOS/Android
Vendor identifier or identifierForVendor
Cross-platform
SHA-256 hash of combined hardware identifiers
Typical Flow
1. User enters license key
2. Validate license (optional but recommended)
3. Generate device identifier
4. Call activate endpoint
5. Store activation locally (for offline grace periods)
6. Enable app features