Skip to main content

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 contains kyc_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:
  1. Complete verification and retry. Open the returned kyc_url, finish the identity flow, then call /send-payment again with a fresh x402 payment. The payout dispatches once the wallet is verified.
  2. Recover the funds. If you don’t want to verify, call POST /withdraw to send the credited USDC back to the wallet.
Verification is per-wallet and one-time: once a wallet is verified, future /send-payment calls go straight through.

Sending a payment

Venmo:
PayPal:

Response (verified wallet)

A dispatched payout answers 202 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.
Two ids are in play. handle is the phone number or email you pay: pass it as recipient_id to /send-payment. The entry’s own recipient_id is an opaque id for the saved entry: it is what POST and DELETE /payment-recipients take, and what the recipient_id filter on /get-payment-status matches. Passing it to /send-payment does not send to the saved person.
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

Fee structure

KYC verification is per-wallet. If you switch wallets, the new wallet has to complete its own verification before it can send Venmo or PayPal payouts.