Lewati ke isi

Aktivasi, validasi & deaktivasi

Semua endpoint: POST, body JSON, header Content-Type: application/json, dan X-Berlanggan-Secret bila produk mewajibkannya. Selalu balas HTTP 200.

POST /v1/activate

Daftarkan satu perangkat dan terbitkan token aktivasi.

Request

{
  "license_key": "XXXX-XXXX-XXXX",
  "fingerprint": "sha256-dari-hardware-id",
  "machine_name": "DESKTOP-01"
}
  • fingerprint — hash stabil per perangkat yang kamu hitung sendiri (mis. SHA-256 dari machine-id + disk serial). Harus konsisten antar-panggilan.
  • machine_name — opsional, tampil di dashboard pengguna.

Response — berhasil

{
  "status": "active",
  "token": "<token bertanda tangan>",
  "expires_at": "2026-07-01T00:00:00Z",
  "token_expires_at": "2026-07-01T00:00:00Z",
  "license_expires_at": "2027-06-01T00:00:00Z",
  "grace_days": 3,
  "entitlements": { "MAX_AGENTS": 10, "WHATSAPP": true },
  "entitlement": { "license_id": "…", "fingerprint": "…", "product_id": "…", "status": "active", "entitlements": { "MAX_AGENTS": 10 } },
  "entitlement_signature": "base64-ed25519"
}

Response — gagal

{ "status": "seat_full", "message": "All seats are in use" }

Simpan token secara lokal (terenkripsi bila memungkinkan). Perlakukan respons dengan entitlement_signature kosong sebagai tidak tepercaya bila build kamu punya public key — lihat Verifikasi tanda tangan entitlement.

POST /v1/validate (heartbeat)

Pengecekan berkala. Memvalidasi token dan mengembalikan token baru yang diperpanjang.

Request

{
  "license_key": "XXXX-XXXX-XXXX",
  "fingerprint": "sha256-dari-hardware-id",
  "token": "<token terakhir>"
}

Response — sama bentuknya dengan activate. Selalu ganti token lokal dengan token terbaru dari respons.

Jika status bukan active/grace, terapkan pembatasan sesuai tabel status di Ringkasan. Jika request gagal karena jaringan, jangan langsung mengunci — hormati grace_days (lihat Heartbeat & masa tenggang offline).

POST /v1/deactivate

Lepaskan seat perangkat ini (mis. saat uninstall atau ganti komputer).

Request

{ "license_key": "XXXX-XXXX-XXXX", "fingerprint": "sha256-dari-hardware-id" }

Response

{ "status": "deactivated" }

Setelah ini, seat bebas dipakai perangkat lain. Token lokal tidak lagi valid.

POST /v1/operation-authorize

Minta izin jangka pendek untuk operasi premium yang dikonfigurasi penerbit (mis. ekspor massal, fitur terukur).

Request

{
  "license_key": "XXXX-XXXX-XXXX",
  "fingerprint": "sha256-dari-hardware-id",
  "token": "<token aktif>",
  "operation": "bulk_export",
  "request_hash": "sha256-payload-opsional"
}

Response

{
  "status": "authorized",
  "authorization": { "operation": "bulk_export", "expires_at": "…" },
  "authorization_signature": "base64-ed25519"
}

Verifikasi authorization_signature dengan cara yang sama seperti entitlement_signature.

Rate limiting

Dibatasi per kunci dan per IP. Saat kena limit, status = rate_limited — lakukan exponential backoff. Heartbeat yang wajar (harian sampai beberapa jam sekali) tidak akan kena limit.