Overview
Your agent can send a payout to a Venmo or PayPal recipient using the/send-payment endpoint. The payment is funded with USDC on Base or Solana via x402 and delivered to the recipient’s Venmo or PayPal account.
The endpoint requires identity verification (KYC) on the wallet that pays for the request. Check GET /get-kyc-status first (it’s free): if the wallet isn’t verified yet, complete verification before paying for a send. If you call /send-payment from an unverified wallet, the response returns kyc_url instead of dispatching the payout, and the USDC you already paid is credited to your account balance — verify and call again to send, or withdraw it back with POST /withdraw.
How it works
1
Agent calls /send-payment
Your agent makes an x402 request to
GET /send-payment with the platform,
recipient details, and amount. The x402 USDC price is the requested amount
plus a 4.9% fee (with a $1.50 minimum).2
Laso checks the wallet's KYC status
If the wallet is already verified, Laso debits the credited account balance
and dispatches the payout. If not, the response returns
kyc_required: true
and a kyc_url.3
(If needed) Complete KYC and retry
Open the
kyc_url, complete the flow, then call /send-payment again with
a fresh x402 payment to send the payout.4
Funds arrive
Venmo and PayPal payouts typically settle within minutes once dispatched.
Confirm with
GET /get-payment-status (free).A
kyc_required response still settles your payment, which credits your Laso
account balance, and you can recover the funds with POST /withdraw. An error
response on an x402 payment means nothing settled, so the USDC is still in
your wallet. MPP settles before the route runs, so the same error leaves it in
your account balance.If verification is required
When the response containskyc_required: true, the payout was not sent, but
the USDC you paid was still credited to the calling wallet’s Laso account balance.
You have two ways forward, and no funds are at risk either way:
- Complete verification and retry. Open the returned
kyc_url, finish the identity flow, then call/send-paymentagain with a fresh x402 payment. The payout dispatches once the wallet is verified. - Recover the funds. If you don’t want to verify, call
POST /withdrawto send the credited USDC back to the wallet.
/send-payment calls go straight through.
Sending a payment
Venmo:Response (verified wallet)
A dispatched payout answers202 Accepted, not 200. The payment is recorded and handed to the payout provider, which settles it afterwards, so the 202 means the request was accepted rather than that the recipient has the money. A 200 here means the opposite: nothing was dispatched because identity verification is required.
Response (unverified wallet)
Check the payout’s status
/send-payment answers 202 Accepted as soon as the payout is dispatched (state: "in-process"), not when the money lands. Its status_url is the free follow-up for that exact payout, and it points at GET /get-payment-status with the payout’s payment_id already filled in. You can also call that route yourself: pass payment_id for one payout, recipient_id (from GET /payment-recipients) for one recipient’s history, or nothing to list every payout the account has sent, newest first.
Poll every few minutes while a payout is
queued, awaiting-funding or in-process, or register a webhook to be told when it completes. state is absent on payouts sent before state tracking existed.
Saved recipients
Laso keeps a list of the Venmo and PayPal recipients this account has paid before, so your agent can turn “send $20 to Jane” into a payout without asking for the phone number or email again.GET /payment-recipients lists them (free, Bearer token). Add include_archived=true to include archived entries.
display_name is the label the account owner chose, so use it when confirming an amount with them; name is the recipient’s own name on the platform. When two entries have similar names, total_sent and last_sent_timestamp help tell them apart, and asking beats guessing.
To rename or archive an entry, send POST /payment-recipients with platform, the entry’s recipient_id, and at least one of display_name or archived. Archiving hides the entry from the default list and keeps its history, so prefer it over deleting:
DELETE /payment-recipients with the same platform and recipient_id (in the query string or the JSON body) removes the entry. Payment history is kept, but the removal cannot be undone through the API, so confirm before removing someone your human did not ask you to remove.
Tell your agent
Send $25 via Venmo
Send $25 via Venmo
Send $50 via PayPal
Send $50 via PayPal
Pay someone I have paid before
Pay someone I have paid before