Skip to main content
The Bonum admin surface gives Droplinked operators two capabilities:
  1. Manual reconciliation — one-shot recovery for orders stuck in PENDING because the sandbox (or, occasionally, prod) failed to fire a settlement webhook.
  2. Per-merchant configuration — onboard a Bonum-MoR or Bonum-Direct merchant by writing their terminal credentials directly, without an env-flag round-trip.
All admin endpoints below require:
  • JWT with role = SUPER_ADMIN
  • IpAllowlistGuard — caller IP must be in the operator allowlist
  • GeoBlockGuard — caller geo must be permitted (GCC/US/EU by default)
Calls that miss any of the three return 403.

When to use

POST /admin/bonum/reconcile/:transactionId

Manually reconciles a single Bonum transaction. Bypasses the BONUM_RECONCILIATION_ENABLED env flag — this endpoint is intended for stuck-order recovery, so the flag check is intentionally skipped. Accepts either:
  • The Bonum invoice ID (24-char alphanumeric returned by POST /orders/v2/create-payment-intent)
  • Our internal order ObjectId (24-char hex)
The handler resolves the supplied ID to the canonical BonumTransaction, calls Bonum’s /api/payment-log/read to refetch settlement state, then writes through to the order and unified-transaction projection.

Authentication

Path parameters

Request body

Empty — POST with no body.

Response — 200 OK

Error responses

Example

The Bonum sandbox at testpsp.bonum.mn does not fire webhooks reliably. The reconcile endpoint is the canonical recovery path for sandbox testing — keep its URL bookmarked next to your Bonum sandbox test script.

PUT /admin/bonum/config/:merchantId

Upserts the per-merchant Bonum configuration. When a BonumConfig row exists for a merchant, the BonumPaymentStrategy uses it instead of the global env defaults. checksumKey is encrypted at rest with the platform KMS key. The plaintext value is required on write — it cannot be recovered after storage. mode and apiBaseUrl are validated together: mode = production requires a production-origin apiBaseUrl (no testpsp.* host); mode = sandbox rejects production hosts.

Authentication

Path parameters

Request body

Response — 200 OK

Error responses

Operator playbook — “Tugsjargal sent prod creds, how do I onboard them?”

1

Confirm the receipt

Verify the merchantId and terminalId in 1Password / Slack DM with Tugsjargal. Do not accept creds via email plaintext.
2

Write the config

3

Verify storage

GET /admin/bonum/config/<merchantId> — confirm mode=production, apiBaseUrl=https://psp.bonum.mn, and checksumKey=***. No operator action elsewhere is required; the next intent created for this merchant will route through the prod Bonum endpoint with the new terminal.
4

Smoke test

Create a 100 MNT test intent for the merchant, complete the payment via Bonum, confirm via GET /admin/bonum/config/<merchantId> does not change, and check the order moves to SETTLED within one webhook cycle.

GET /admin/bonum/config/:merchantId

Reads the per-merchant Bonum configuration. checksumKey is always masked to the literal string "***" in the response — it is never returned in plaintext.

Authentication

Path parameters

Response — 200 OK

Response — 404 Not Found

Returned when no BonumConfig row exists for the merchant. Means the merchant is on env defaults (BONUM_API_BASE_URL, BONUM_MERCHANT_KEY, etc.).

Example

DELETE /admin/bonum/config/:merchantId

Removes the per-merchant Bonum configuration. From the next intent onward, the merchant falls back to env defaults.

Authentication

Path parameters

Response — 200 OK

Error responses

Example