Authentication

Qrisy API mendukung dua metode autentikasi: JWT (dashboard) dan API License Key (SDK/server).

API License Key (Recommended for SDK)

Gunakan header x-license-key untuk autentikasi server-to-server. Key berformat qs_live_xxx (production) atau qs_test_xxx (sandbox).

# cURL
curl -H "x-license-key: qs_live_xxx" https://api.qrisy.id/api/profile
// Node.js
const qrisy = new Qrisy({ licenseKey: 'qs_live_xxx' });
# Python
qrisy = Qrisy(license_key="qs_live_xxx")
// PHP
$qrisy = new Qrisy(licenseKey: 'qs_live_xxx');

Scopes

API key dapat dibatasi dengan scopes. Default: semua scopes.

ScopeAkses
generatePOST /api/generate/qris, /v2/qris
checkPOST /api/generate/check-status
listGET /api/generate/list
cancelPOST /api/generate/cancel-status
webhookCRUD /api/webhook/*
profileGET /api/profile

Key Reveal-Once

API key hanya ditampilkan SEKALI saat dibuat. Simpan di tempat aman (env variable / password manager). Key tidak bisa dilihat lagi — hanya prefix (qs_live_xxxx) yang tampil di dashboard.

JWT Bearer Token (Dashboard Sessions)

Untuk dashboard web, Qrisy menggunakan JWT access token (15 menit TTL) + refresh token rotation (30 hari).

curl -H "Authorization: Bearer eyJhbG..." https://api.qrisy.id/api/profile

Token didapat dari POST /api/auth/login atau POST /api/auth/register. Refresh via POST /api/auth/refresh.

Token Rotation

Setiap refresh menghasilkan access token + refresh token BARU. Refresh token lama di-revoke. Ini mencegah replay attack bila refresh token intercept.

Rate Limiting

Default: 120 request/menit per identity (API key atau user). Public endpoints punya limit lebih ketat:

  • POST /api/public/transactions — 30/min per IP
  • GET /api/public/transactions/:id/sse — 60/min per IP
  • POST /api/auth/register — 5/min per IP
  • POST /api/auth/login — 10/min per IP

Headers: x-ratelimit-limit, x-ratelimit-remaining, x-ratelimit-reset.