- Manual reconciliation — one-shot recovery for orders stuck in
PENDINGbecause the sandbox (or, occasionally, prod) failed to fire a settlement webhook. - 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 allowlistGeoBlockGuard— caller geo must be permitted (GCC/US/EU by default)
403.When to use
POST /admin/bonum/reconcile/:transactionId
Manually reconciles a single Bonum transaction. Bypasses theBONUM_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)
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
PUT /admin/bonum/config/:merchantId
Upserts the per-merchant Bonum configuration. When aBonumConfig 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 noBonumConfig 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
Related
- Bonum integration guide — payment flow, prefix registry, sandbox test plan.
- Telr admin endpoints — same reconcile pattern for the GCC PSP.
- Aggregate merchant provisioner — bulk provisioning that may include Bonum config.