---
title: "Send a payment via Venmo or PayPal"
method: GET
path: "/send-payment"
---

# Send a payment via Venmo or PayPal

`GET /send-payment`

## Request

- Base URL: `https://laso.finance`
- URL: `https://laso.finance/send-payment`
- Auth: none declared

Pay USDC to send money to a Venmo or PayPal recipient. The x402 USDC price is the requested amount plus a 4.9% fee (with a \$1.50 minimum fee). On-chain payment credits the calling wallet's Laso account balance via the standard deposit webhook; the callable then debits the gross amount and dispatches the payout.

**Asynchronous.** A dispatched payout answers `202 Accepted`, not `200`: the payment is recorded and handed to the payout provider, which settles it afterwards. Poll the returned `status_url` (`GET /get-payment-status?payment_id=...`) until `state` reaches a terminal value rather than treating the 202 as money received. A `200` means the opposite: nothing was dispatched because identity verification is required.

**KYC required.** The first time a wallet sends a Venmo or PayPal payout it must complete identity verification. If the wallet is not yet verified the response returns `kyc_required: true` and a `kyc_url` — open the URL, complete the flow, and retry. If you don't want to proceed, the credited account balance can be withdrawn with `POST /withdraw`.

**Recipient details.** For Venmo, `recipient_id` is the recipient's 10-digit U.S. phone number, and the first and last name are optional. No email is needed. For PayPal, `recipient_id` is the recipient's PayPal email, which also serves as `recipient_email` (so `recipient_email` is optional), and the first and last name are required.

**Fee:** 4.9% with a \$1.50 minimum (included in the USDC price).

## Query parameters

- `amount` number, required
- `platform` 'venmo' | 'paypal', required
- `recipient_id` string, required
- `recipient_first_name` string
- `recipient_last_name` string
- `recipient_email` string, email

## Response `200`

Identity verification is required, so no payout was dispatched. The x402 payment you made was still credited to your Laso account balance: complete the flow at `kyc_url` and retry, or call `POST /withdraw` to pull the USDC back to your wallet.

- object
  - `auth` AuthCredentials
    - `id_token` string: ID token — use as Bearer token for Laso Finance APIs
    - `refresh_token` string: Use with POST /auth (grant_type=refresh_token) to get a new id_token when it expires
    - `expires_in` string: Token lifetime in seconds
  - `callable_base_url` string
  - `user_id` string
  - `kyc_required` true
  - `kyc_url` string: URL the wallet owner must open to complete identity verification. No payout was sent, but the x402 payment you made was still credited to your Laso account balance. After verifying, retry /send-payment to dispatch the payout, or call POST /withdraw to pull the credited USDC back to your wallet.
  - `message` string: Human-readable explanation of the KYC requirement and how to recover the credited funds via retry or POST /withdraw.
  - `platform` 'venmo' | 'paypal'
  - `amount` number
  - `recipient_id` string

## Other responses

- `202`: Payout accepted. The payment is recorded and dispatched to the payout provider, which settles it afterwards, so this response reports that the request was accepted, not that the recipient has the money. Poll `status_url` (also returned in the `Location` header) until `state` reaches a terminal value.
- `400`: Invalid or missing parameters, or no payer address.
- `402`: Payment required. The payment details are base64-encoded in the `PAYMENT-REQUIRED` response header and echoed as JSON in the response body. A **second** 402 on the paid retry means something different: the payment was refused, either at verification (most often an underfunded wallet) or at on-chain settlement. That response body is not empty and carries no `accepts` — it is the x402 settlement-failure shape `{"success": false, "errorReason": "...", "errorMessage": "..."}`, plus `x_laso_guidance` when a concrete next step applies. Distinguish the two by body: a challenge carries `accepts`, a failure carries `success: false`. The usual cause is an underfunded wallet, and the usual cause of that is the fee being charged **on top of** `amount` on routes that add one (a wallet holding exactly \$2,000 cannot send a \$2,000 bank payment; `/get-card` adds no fee, so it costs exactly `amount`). Nothing is charged for a failed settlement, so retrying with a smaller amount is safe.

---

[API](https://skmtc.dev/laso/apis/laso-finance-x402-api.md) · [All operations](https://skmtc.dev/laso/apis/laso-finance-x402-api/llms.txt) · [OpenAPI document](https://skmtc.dev/laso/apis/laso-finance-x402-api/revisions/ff8ce20b49ba?raw)
