Overview
lola is the conversational send handoff. The chat already asked who receives and how they get paid. The widget asks how the sender pays, shows a binding quote, runs CIP only if needed, creates the operation, and sends the user back to WhatsApp.
Identity is Family A: referenceId is the WhatsApp sender (wa:<E.164>). The same number always maps to the same User (saved cards, CIP status). There is no Clerk bind and no isolated payer.
Your partner allowedFlows must include lola. Discover with GET /partner/flows.
Create example
SetBASE_URL from Partner API overview.
config must include amount, amountAnchor, corridor, currencies, and recipient.payoutMethod. Do not send prices, capabilityKey, or funding instrument ids.
Payout type reuses the fund-request discriminator: bank_account | card | cash | mobile_wallet | home_delivery.
Optional senderUserData prefills CIP / summary sender rows (name, dob, id, address). Optional returnToChatUrl must be https (typically wa.me). It is used on success and Cancel — not the partner sessionExpiredRedirectUrl (that stays for 410/409 dead links).
Create is rejected with 422 ROUTE_NOT_AVAILABLE when the catalog has no available, quotable capability for that payout.
The payout must name its catalog payer: cash.payer, mobileWallet.carrier, or bankAccount.payer for bank_account (bankAccount.bankCode is still read when payer is absent). Without it, create is rejected with 422 PAYER_REQUIRED. The route never falls back to a default payer.
One payment per link
A Lola link can create one operation. After that payment:- Reopening the URL still claims with HTTP 200. Session
configincludesusage.state: "consumed"plusoperationId/consumedAt, and still includesreturnToChatUrl. For cash deposit, the widget resumes the how-to + store map (read-only — no second payment). For card (and other funding), it shows that the link was already used and offers Return to chat. - A second
POST /widget/links/:linkId/operationsreturns 409LINK_ALREADY_USED. You also receive webhooklink.reuse_blockedso the assistant can mint a new link.
externalId / intention). GET /partner/links/{linkId} exposes consumedAt and consumedOperationId when the payment landed.
This cap is Lola-only. Other flows keep unlimited operations on the same magic link.
Cancel
If the user taps Cancel on the summary, the widget callsPOST /widget/links/:linkId/cancel. You receive webhook link.cancelled. The link is not revoked: the same URL still opens until TTL. Ask whether they want another link or help; do not treat the link as dead.
Related
Create links
Shared envelope and flow discriminator.
Webhook events
link.cancelled, link.reuse_blocked, operation.*.