Send money
Diagram source
%% remit-flow.mmd
flowchart TD
A["ClickPesa payout · TZS<br/>POST /mcp"]
B["Read: list_banks · list_lipa_providers<br/>get_balance: float, not a transfer max<br/>get_rates"]
C["Preview, free: check_recipient · check_bank<br/>check_lipa · quote_tzs"]
D["send_tzs → HTTP 402: orderId + pay offers"]
E["get_payment: exact frozen amount,<br/>address + QR, unpaid order only"]
F["Customer pays once, exact frozen amount:<br/>Base USDC or EURC · BTC on-chain · Lightning<br/>Bank order: Base USDC only"]
G["Server verifies: Base watcher · BTC watcher<br/>Lightning watcher, preimage checked<br/>or native proof on send_tzs retry"]
H["payment_verified"]
I["Mobile money, Lipa / TanQR:<br/>automatic payout"]
J["Bank: manual approval"]
K["Float enough: pay now, else<br/>payout_scheduled, scheduler retries"]
L["get_order: read-only status,<br/>never confirms a payment"]
A --> B --> C --> D --> E --> F --> G --> H
H --> I
H --> J --> K
I --> L
K --> L
classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
class A h
%% remit-flow-mobile.mmd
flowchart TD
A["ClickPesa payout · TZS<br/>POST /mcp"]
B["Read:<br/>list_banks<br/>list_lipa_providers<br/>get_balance: float,<br/>not a transfer max<br/>get_rates"]
C["Preview, free:<br/>check_recipient<br/>check_bank<br/>check_lipa<br/>quote_tzs"]
D["send_tzs<br/>HTTP 402:<br/>orderId + pay offers"]
E["get_payment:<br/>exact frozen amount,<br/>address + QR,<br/>unpaid order only"]
F["Customer pays once,<br/>exact frozen amount:<br/>Base USDC or EURC<br/>BTC on-chain<br/>Lightning<br/>Bank order:<br/>Base USDC only"]
G["Server verifies:<br/>Base watcher<br/>BTC watcher<br/>Lightning watcher,<br/>preimage checked<br/>or native proof<br/>on send_tzs retry"]
H["payment_verified"]
I["Mobile,<br/>Lipa,<br/>TanQR:<br/>automatic<br/>payout"]
J["Bank:<br/>manual<br/>approval"]
K["Float enough:<br/>pay now; else<br/>payout_scheduled,<br/>scheduler<br/>retries"]
L["get_order:<br/>read-only status,<br/>never confirms<br/>a payment"]
A --> B --> C --> D --> E --> F --> G --> H
H --> I
H --> J --> K
I --> L
K --> L
classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
class A h
%% remit-zap.mmd
flowchart TD
A["ZapRemit · Lightning<br/>POST /mcp"]
B["Catalog:<br/>zapremit_countries<br/>zapremit_methods<br/>zapremit_options<br/>zapremit_rates"]
C["zapremit_quote:<br/>quote expires,<br/>then a new quote"]
D["zapremit_payment:<br/>one provider<br/>Lightning invoice<br/>+ QR, same invoice<br/>on repeat calls"]
E["Customer pays<br/>provider invoice<br/>from own wallet;<br/>server never pays it"]
F["zapremit_order:<br/>authenticated<br/>provider status;<br/>form polls 5 s"]
G["Funding proven by<br/>funded, processing,<br/>completed, refunding<br/>or refunded;<br/>separate from<br/>delivery status"]
H["Terminal:<br/>completed, expired<br/>or refunded.<br/>Invoice + QR only<br/>while pending,<br/>unpaid, unexpired"]
A --> B --> C --> D --> E --> F --> G --> H
subgraph CL["Collect TZS"]
OB["POST /mcp<br/>request_tzs:<br/>USSD prompt,<br/>owner approves<br/>with PIN; funds go<br/>to ClickPesa account"]
OC["get_request:<br/>status by ref"]
OB --> OC
end
subgraph RT["Router, optional"]
OE["POST /mcp<br/>route_price<br/>route_pay:<br/>external x402<br/>service; L402<br/>Lightning proof"]
OF["Off unless<br/>router configured:<br/>router_off"]
OE --> OF
end
CL ~~~ RT
classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
class A h
%% remit-zap-mobile.mmd
flowchart TD
A["ZapRemit · Lightning · POST /mcp"]
B["Catalog: zapremit_countries · zapremit_methods<br/>zapremit_options · zapremit_rates"]
C["zapremit_quote: quote expires, then a new quote"]
D["zapremit_payment: one provider Lightning invoice<br/>+ QR, same invoice on repeat calls"]
E["Customer pays provider invoice from own wallet;<br/>server never pays it"]
F["zapremit_order: authenticated provider status;<br/>form polls 5 s"]
G["Funding proven by funded, processing, completed,<br/>refunding or refunded; separate from delivery status"]
H["Terminal: completed, expired or refunded.<br/>Invoice + QR only while pending, unpaid, unexpired"]
A --> B --> C --> D --> E --> F --> G --> H
classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
class A h
%% remit-ops-mobile.mmd
flowchart TD
A["Collect TZS · POST /mcp"]
B["request_tzs: USSD prompt, owner approves<br/>with PIN; funds go to ClickPesa account"]
C["get_request: status by ref"]
D["Router, optional · POST /mcp"]
E["route_price · route_pay: external x402 service;<br/>L402 Lightning proof"]
F["Off unless router configured: router_off"]
A --> B --> C
C ~~~ D
D --> E --> F
classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
class A,D h
remit-flow.mmd · remit-flow-mobile.mmd · remit-zap.mmd · remit-zap-mobile.mmd · remit-ops-mobile.mmd1. Enter the recipient. 2. Confirm. 3. Pay the exact amount shown. 4. Keep the order link to track it.
Advanced: tools used
This page calls the public MCP tools on POST /mcp: list_banks, list_lipa_providers, send_tzs, get_payment, get_order. The payout runs only after the payment is verified. Bank payouts also need admin approval.
Start another transfer