Infrastructure · FX engine

Foreign exchange,
priced and locked.

Conversion is not a feature bolted onto a wallet — it is part of the money layer. Rates are sourced independently and checked before they are used, a quote holds its price for a defined window, and the conversion behind it can be claimed exactly once.

Currencies
EGPEgyptian PoundLive rate
USDUS DollarLive rate
AEDUAE DirhamLive rate
EUREuroLive rate
GBPPound SterlingLive rate
SARSaudi RiyalLedger only

Six currencies are held and settled. Five of them carry live rates across the engine’s tracked pairs; the Saudi Riyal is held and settled without a live pair.

SourcesTwo, independently checked
QuoteLocked for a fixed window
ExecutionClaimed exactly once
SpreadConfigured, not fixed
A conversion

Two sides, one held price.

A conversion is a pair, not a journey. What matters is the middle — what was locked, for how long, and what happens when the window closes before it is used.

FromSource walletThe balance the amount is taken from
The quotePriced, then held
Rate
Resolved mid
Spread
From your rules
State
Pending → consumed
Window
Fixed, then expires
ToDestination walletThe balance the converted amount lands in

No rate, spread or amount appears in this diagram. Both are configuration and market data — a plausible-looking figure here would be a price BINK had not agreed to.

The path

Rate to ledger.

A conversion is five distinct stages, and each one can fail closed. Nothing moves until the stage before it has committed.

  1. RateSourced, checkedIndependent providers, screened for plausibility.
  2. QuotePricedMid-rate plus the spread your rules resolve to.
  3. LockHeld brieflyThe price is fixed for a short, defined window.
  4. ConvertClaimed onceA quote can be consumed exactly one time.
  5. LedgerPostedBalanced legs, with the spread recorded apart.
Rate resolution

Where a rate comes from.

The engine tries four answers in order and stops at the first one it can stand behind. Degrading is explicit: the further down this list a rate comes from, the louder the system is about it.

BINK publishes no spread figure, no refresh latency and no execution-speed claim on this page. Spread is configuration, not a headline number.

A published rate
Where an administrator has fixed a rate for a pair, that rate is used, and the intervention is written to an append-only audit record.
A current rate
Otherwise the most recent tick is used, provided it is recent enough to be considered current.
A recent rate
If no current tick exists, an older one may still be used — and using it raises an alert rather than passing silently.
A derived rate
If a pair has no direct tick at all, it is derived through USD from the two legs that do.
What the engine does

Defensive by construction.

Most of the engine exists to refuse a bad price rather than to publish a fast one.

Two independent sources

Rates are polled from a primary commercial feed and cross-referenced against the European Central Bank’s published reference rates.

Plausibility guard

A tick that moves too far from the previous observation for the same pair is rejected rather than published. A bad upstream print does not become your price.

Provider circuit breaker

Each source carries a health score that rises and falls with its behaviour. A failing provider is taken out of rotation and retried periodically, not hammered.

Spread you configure

Spread is a stored rule, resolvable by currency, by direction, by customer tier and by region. The most specific matching rule wins; a default applies when none does.

Recorded history

Open, high, low and close are captured hourly and daily per pair, so a rate used on any past conversion can be placed in context.

Alerting on your terms

A target can be set above or below the current level for a pair, and is evaluated on each refresh cycle.

Operational detail

How it behaves.

Quote lifetime
A quote is issued, held for a fixed window, and then expires. Its state is explicit — pending, consumed or expired — and an expiry sweep runs on a schedule.
Exactly-once
Execution claims the quote atomically before any balance moves, and releases the claim if the conversion does not complete. One quote can never fund two conversions.
Movement guard
If the market has moved materially between the quote and its execution, the conversion is refused rather than filled at a price that no longer holds.
Staleness block
A conversion will not execute against a rate that has aged past its limit. A published override is exempt, because it was set deliberately.
Spread resolution
Stored rules are scored for specificity — base currency, quote currency, customer tier, then region — and the highest-scoring rule is applied symmetrically around the mid-rate.
Before the money
Every conversion passes the account’s compliance state, a fraud check, and a check that the currency is permitted for the account’s region.
The posting
A conversion writes balanced ledger legs across the source wallet, the destination wallet and the platform accounts, with the spread attributed to its own account.
Integration

What this looks like to build against.

The shape of the API follows the shape of the guarantee: if a price is going to be honoured, holding it has to be a real object with a real lifetime.

Quote, then convert
A conversion is two calls: one that prices and holds, and one that executes against that hold. The price you were shown is the price that runs.
The hold is real
A quote is a stored object with a state, not a number returned and forgotten. It can be consumed once, and the claim is taken before any balance moves.
Refusals are typed
An expired quote, a stale rate and a market that moved too far are distinct outcomes, so a client can tell "try again" apart from "re-quote".
Rules, not requests
Spread is resolved from stored rules by currency, direction, tier and region. It is not a parameter a caller can set on the way in.
In practice

What the lock is for.

Hold a price for a checkout

Show a customer a converted total and honour it for the length of the window, rather than re-pricing between the screen and the confirmation.

Settle in a second currency

Take a payment in one currency and settle it in another, with the conversion resolved as part of the settlement rather than as a separate reconciliation problem.

Price by segment

Apply a different spread to a customer tier or a region by adding a more specific rule — the most specific match wins without touching the others.

Watch a level

Set a target above or below the current rate for a pair and be told when it is reached, evaluated on each refresh cycle.

In the platform

What FX touches.

Conversion is rarely the whole job. These are the surfaces on either side of it.

Infrastructure

Every surface.

FX engine

Hold a price. Then honour it.

Quote, lock and convert through one API — with the spread you set and a record of every rate you used.