Configure reload-bonus tiers (merchant control plane)
Operator endpoint: configure the reload-bonus tiers for a wallet program, the amount-banded promotional bonus a merchant grants on a top-up (for example, ‘top up QAR 50+ get 10% bonus’). Each tier is { min_topup_minor, max_topup_minor?, bonus_type (PERCENTAGE | FIXED_AMOUNT), bonus_value }; tiers must not overlap and percentages are 0-100. Money is minor-units integers throughout. Config is forward-looking only: it governs future top-ups and never retroactively re-grants. The bonus this config produces accrues as a promotional grant (promo balance that expires and is never cashable), distinct from the customer’s actual cashable balance. Requires the enterprise-admin integrations permission.
Authorizations
Partner API key (platform- or merchant-scoped). Contract key-enforces context.merchant_id.
Headers
Partner-generated UUID; the ONE dedup key for all mutating endpoints. 24h TTL. Same key + same payload -> byte-identical replay; same key + different payload -> IDEMPOTENCY_KEY_REUSED (422).
Body
Body for POST /topup/reload-bonus/config. Forward-looking only (never retroactive).
Canonical request context, shared across all partner domains. merchant_id is key-enforced to a merchant the calling credential is authorized for (a platform-scoped credential acts only on its own tenants), so it is never a free-text trust field: a merchant_id outside the credential's authority is rejected rather than honored.
The wallet program these tiers govern.
3"QAR"
Non-overlapping bonus bands.
1Common request metadata shared across all Partner API domains. partner_request_id is a correlation identifier only: it appears in logs and responses for tracing but is never used as the deduplication key. Request deduplication is keyed exclusively on the Idempotency-Key header.
How long an accrued bonus grant lives before expiring (days). Drives expires_at.
x >= 1Response
Reload-bonus config saved (governs future top-ups only).
The standard response envelope that every enveloped endpoint serializes through. ok is a boolean discriminator: when ok is true, the typed result is carried in data; when ok is false, a typed error object is returned instead. The meta object is uniform across the entire API surface.
The uniform response metadata block returned on every response. data_completeness_score is computed per call and reports the completeness of the returned data. decision_trace_id is present on responses that carry decision or insight output and can be used to correlate the response with its reasoning. capabilities is an additive, response-level array of hints advertising features the caller may use, and may be extended over time without notice.
Persisted reload-bonus config.
The typed error object returned with every non-2xx response. code is a string enum (for example WALLET_PROGRAM_AMBIGUOUS, CREDENTIAL_TYPE_UNSUPPORTED, INSUFFICIENT_FUNDS, IDEMPOTENCY_KEY_REUSED, CURRENCY_NOT_SUPPORTED), never a bare HTTP status number. Inspect code for programmatic branching, not the HTTP status. Some codes echo the valid set in details so clients can present or reconcile the accepted values: for example CREDENTIAL_TYPE_UNSUPPORTED lists the supported credential types, CURRENCY_NOT_SUPPORTED lists the supported ISO-4217 currencies, and WALLET_PROGRAM_AMBIGUOUS lists the candidate wallet_program_id values that matched the request.