Staging documentation

Verifiable Credentials as a Service untuk ijazah & sertifikat.

Dokumentasi Sahih untuk demo staging: konsep produk, alur issuer, alur verifier, API quickstart, security model, dan checklist menuju production/mainnet.

Overview

Sahih adalah SaaS multi-tenant untuk menerbitkan dan memverifikasi kredensial digital seperti ijazah, sertifikat pelatihan, sertifikat event, dan dokumen institusi. Tagline: Pastikan keasliannya.

Public verify

Verifier scan QR atau memasukkan Credential ID untuk melihat status kredensial.

Issuer dashboard

Tenant menerbitkan batch, melihat QR/link, dan mengunduh PDF/ZIP.

On-chain anchor

Merkle root di-anchor ke Polygon Amoy sehingga bukti bisa dicek publik.

Merkle proofGasless untuk tenantPostgres persistencePolygon Amoy staging

Pricing MVP

Model Sahih memakai hybrid subscription + kuota kredensial + overage: tenant membayar paket bulanan, mendapat kuota sertifikat/kredensial, lalu dikenakan biaya tambahan jika melewati kuota.

Free / Trial

Rp0/bulan
50 kredensial/bulan
Demo & validasi.

Starter

Rp199.000/bulan
500 kredensial/bulan
Overage Rp500/kredensial.

Pro

Rp499.000/bulan
5.000 kredensial/bulan
Overage Rp200/kredensial.

Business

Rp1.499.000/bulan
25.000 kredensial/bulan
Overage Rp100/kredensial.

Enterprise

Mulai Rp3.000.000/bulan
Custom quota, SLA, API integration, procurement.

Catatan: harga adalah pricing awal MVP/staging dan dapat disesuaikan setelah validasi pasar. Enterprise tetap bisa memakai invoice manual/custom.

Quickstart issuer

  1. Buka Issuer Dashboard.
  2. Klik Buat demo untuk membuat tenant staging dan mendapat API key.
  3. Masukkan daftar penerima secara manual atau tempel CSV format recipient,docType.
  4. Klik Terbitkan & anchor on-chain. Sahih akan membuat Merkle root dan mengirim transaksi anchor ke Amoy.
  5. Bagikan link/QR credential, atau unduh PDF per kredensial maupun ZIP batch.
Catatan staging: API key demo dibuat untuk uji coba. Jangan gunakan data produksi atau dokumen sensitif asli di environment ini.

Verifier flow

1. Scan QR

QR pada PDF mengarah ke URL public verify seperti /v/:credentialId.

2. Cek status

Halaman menampilkan valid, revoked, invalid, atau not found.

3. Baca bukti

Verifier dapat melihat Merkle root, anchor tx, validitas off-chain, dan validitas on-chain.

Public verifier tidak membutuhkan login. PDF/ZIP tetap tenant-scoped karena memuat PII penerima. Nama penerima pada halaman verify publik disamarkan sebagian secara default untuk melindungi privasi dan mencegah panen data massal.

API endpoints

Base API staging:

https://api.sahihcert.id
GET/health
POST/v1/tenants
POST/v1/auth/register
POST/v1/auth/login
POST/v1/auth/mfa/verify
POST/v1/auth/mfa/setup
POST/v1/auth/mfa/enable
GET/v1/auth/me
POST/v1/auth/logout
GET/v1/plans
GET/v1/subscription
GET/v1/api-keys
POST/v1/api-keys
POST/v1/api-keys/:id/revoke
GET/v1/audit-logs
GET/v1/signer/status
POST/v1/batches
GET/v1/verify/:id
POST/v1/credentials/:id/revoke
GET/v1/credentials/:id/pdf
GET/v1/batches/:root/pdf.zip

Contoh issue batch

curl -X POST https://api.sahihcert.id/v1/batches \ -H 'content-type: application/json' \ -H 'x-api-key: sk_test_...' \ -d '{ "docTypeDefault": "Ijazah S1", "documents": [ { "recipient": "Budi Santoso" }, { "recipient": "Siti Aminah", "docType": "Sertifikat Pelatihan" } ] }'

Contoh verify publik

curl https://api.sahihcert.id/v1/verify/<credential-id>

Security model

Tenant isolation

Endpoint issuer membutuhkan API key. PDF/ZIP dan revoke wajib tenant-scoped.

API key hashing

API key disimpan sebagai hash SHA-256 di Postgres; plaintext dikembalikan sekali saat tenant dibuat.

Merkle double-hash leaf

Leaf hash dibuat dengan desain anti-ambiguity dan diverifikasi byte-compatible dengan contract.

On-chain roles

Contract memakai AccessControl, Pausable, revocation batch/leaf, dan owner/issuer role.

Private key policy: jangan pernah mengirim seed phrase/private key di chat. Staging saat ini memakai signer testnet. Production/mainnet wajib KMS/HSM dan contract owner multisig.

Abuse protection: staging API menerapkan rate limit dasar per IP/tenant untuk pembuatan tenant, anchoring batch, public verify, artifact PDF/ZIP, dan API key management.

Public verify hardening: nama penerima disamarkan sebagian secara default (PII redaction), respons verify tidak di-cache (Cache-Control: no-store), terdapat penalti enumerasi yang memblokir IP yang melakukan probe Credential ID tidak dikenal secara beruntun, dan ada batas throughput global untuk membatasi scraping massal.

Gas safety: API mengecek saldo signer sebelum anchoring. Jika saldo native token di bawah ambang aman, anchoring ditolak sementara agar gas tidak terkuras habis.

Production / mainnet readiness checklist

  • Contract source verified di explorer. Staging contract sudah verified: 0x2fe5e62...6Cc1f1 ↗.
  • Contract owner dipindah ke multisig, bukan EOA pribadi.
  • Platform signer memakai KMS/HSM dengan policy minimum privilege.
  • Rate limit API, audit log, alerting, gas monitor, dan backup Postgres aktif.
  • API key lifecycle: rotate, revoke, scoped permissions.
  • Privacy review: minimisasi PII, redaction public verify jika diperlukan.
  • Staging → production environment dipisah total.
  • Mainnet deployment hanya setelah approval eksplisit Boss.
Status sekarang: Sahih staging sudah live, contract Amoy sudah anchor/verify on-chain, dashboard issuer sudah dapat issue batch, PDF, ZIP, dan public verification.