Collect on a schedule, with a mandate the customer controls.
A mandate says who may debit an account, for how much, and how often. Your business creates the request; the customer authorises it in Olympus Web Banking, or a bank mandate is registered with signed evidence. Every debit after that runs through Olympus’s own authorisation, rules and retry engines before it ever touches a rail.
| Description | Method | Status | Amount |
|---|---|---|---|
| Customer payment | Payment link | Settled | +4,250.00 |
| Payroll - March | Bulk payment | Approved | −38,400.00 |
| Stationery supplier | Bank transfer | Sent | −1,180.50 |
| Invoice 1042 | Invoice | Pending | +12,600.00 |
| Office rent | Scheduled | Sent | −9,500.00 |
Illustrative interface.
One mandate. Many debits.
Mandate
Who may debit an account, the most it may take per debit, and how often. The customer authorises it, or it never runs.
Collection
Your intent to collect a specific amount, one-off or on a recurring schedule. Retries create a new attempt, never a duplicate charge.
Rules
Limits and approval thresholds at the platform, business, customer or account level, so an out-of-pattern debit is held, not just sent.
Nothing is debited on trust.
Every debit is checked against the mandate’s own limits, the rules that apply to it, the account’s available balance and its recent activity, and is either sent, held for a second approval, or declined — with a reason recorded either way. A revoked or expired mandate can never be used again.
- Per-debit, daily and monthly limits, on the mandate or the account
- Approval thresholds, with maker-checker review
- A full, auditable reason for every decision
| Status | Meaning |
|---|---|
| authorized | The customer said yes, or your business registered the mandate. Ready to send. |
| submitted | Sent to the payment rail. |
| successful | Collected. Funds are not yet available to withdraw. |
| settled | Collected and settled. Now part of your available balance. |
| failed | Did not go through. A retryable reason is retried automatically; others are not. |
| returned | A collected debit was returned by the customer’s bank. |
Subscriptions, rent, fees — or a thousand at once.
Set a frequency and Olympus creates each collection on schedule, retries the ones that fail in a way that can succeed, and stops after too many failures in a row instead of trying forever. Submit a batch to collect from many customers in one call; one failure in the batch never corrupts the rest.
- Daily to annual schedules, paused or resumed without losing the mandate
- Configurable retry policy, by failure reason
- Bulk collections with per-item status
# Create a payment link (sandbox key)
curl -X POST https://merchant.olympuspay.co/api/v1/payment-links \
-H "Authorization: Bearer olp_test_…" \
-H "Idempotency-Key: 7f3c1a52-order-1042" \
-H "Content-Type: application/json" \
-d '{
"title": "Invoice 1042",
"amount": 126.00,
"currency": "BWP",
"returnUrl": "https://example.com/thanks"
}'const res = await fetch("https://merchant.olympuspay.co/api/v1/payment-links", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OLYMPUS_KEY}`,
"Idempotency-Key": "7f3c1a52-order-1042",
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "Invoice 1042",
amount: 126.00,
currency: "BWP",
}),
});
const link = await res.json();// 200 OK - the payment link object (fields shown are illustrative)
{
"id": "…",
"title": "Invoice 1042",
"amount": 126,
"currency": "BWP",
"url": "https://…"
}Provider status is not financial truth.
A debit the rail has accepted, or even cleared, is not yet money your business can withdraw — that only happens once it settles and Olympus has matched it to a real settlement. Every debit keeps an internal reference through mandate, clearing reference and settlement, so nothing is ever assumed.
function verify(rawBody, headers, secret) {
const ts = headers["x-olympus-timestamp"];
const sig = headers["x-olympus-signature"];
// HMAC-SHA256 over "{timestamp}.{raw body}", hex encoded
const expected = hmacSha256Hex(secret, `${ts}.${rawBody}`);
// Also reject old timestamps to stop replays
return constantTimeEqual(sig, expected);
}Customers see every debit order in Web Banking.
Who can debit me
Every active, pending and revoked mandate against every account, in one place.
Before it happens
Upcoming debits, with the amount and the business collecting.
Their own limits
A customer can set a lower cap than the mandate allows, or require their own approval on every debit.
What is available.
Set up your first mandate.
Test the full lifecycle in the sandbox before a customer ever authorises anything real.