Send with ZapRemit
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. Choose country and method. 2. Fill in the recipient. 3. Get a quote. 4. Confirm and pay the Lightning invoice.
Advanced: tools and raw data
Lists come live from zapremit_countries, zapremit_methods and zapremit_options. Get quote calls zapremit_quote, the invoice comes from zapremit_payment, and status from zapremit_order. The amount defaults to the payout currency; SAT is optional. The review and status boxes show the raw JSON the tools return.
Review quote
The provider quote expires quickly. Request the invoice only if the payout above is correct.