On this page
No Headings
Last updated: September 10, 2026
You can use this pattern to send payouts to multiple recipients with a single API call.
Useful resource: PayPal Postman collection
Ensure to review the following information before you send payouts.
PayPal does not have a published rate-limiting policy. To ensure site security and stability for merchants, we might temporarily apply rate limiting if we see unusual or abusive traffic. We hold the rate limit until we know the traffic is safe. For Payouts API, we allow 400 POST requests per minute. If you get an HTTP 429 Too Many Requests - RATE_LIMIT_REACHED message, you have exceeded the rate limit. If this affects your integration, contact Merchant Technical Support.
You can use webhooks for status updates instead of repeated API calls through polling and reuse OAuth 2.0 access tokens (till their expiry time) to avoid unnecessary requests.
You can use the PayPal Payouts SDK as an alternative to direct API integration. The SDK provides methods for authentication, request construction, and error handling in multiple programming languages. For more information, see Payouts SDK.

You can use the procedures in this section to send payouts using the Payouts API.
Use a valid access token and make a POST call to the /v1/payments/payouts endpoint.
PayPal-Request-Id header parameter to implement idempotency.Include the following parameters:
| Parameter | Action |
|---|---|
sender_batch_headerRequired, object | Use the sender_batch_id within this header to prevent duplicate requests. |
items.amountRequired, object | To pay a recipient in their local currency, set the currency parameter to the local currency code. PayPal converts the payment to the specified currency and applies conversion fees. When you retrieve the payout details, the response shows the funding source, payout amount, fees, and other currency conversion details. For a sample request and response for cross-currency payouts, see Pay recipients in their local currency.Review country exclusions and restrictions before sending cross-currency payouts. |
items.receiverRequired, string | Pass the value that identifies the recipient. For example, user@example.com, +15555550123, @venmousername, PAYPALUSERID123 |
items.recipient_typestring | For Venmo payouts, set the recipient type to USER_HANDLE and pass the handle in items.receiver. Possible values: PHONE, EMAIL, USER_HANDLE, PAYPAL_IDDefault value: EMAIL If you set the recipient type in sender_batch_header, all items use that type unless you override it per item. |
items.recipient_walletstring | Set the recipient wallet type. Possible values:
|
For information on all parameters, see the API reference.
curl -X POST https://api-m.sandbox.paypal.com/v1/payments/payouts \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ACCESS-TOKEN' \
-H 'PayPal-Request-Id: REQUEST-ID' \
-d '{
"sender_batch_header": {
"sender_batch_id": "Batch-123",
"email_subject": "You have a payout!"
},
"items": [
{
"recipient_type": "EMAIL",
"amount": {
"value": "10.00",
"currency": "USD"
},
"receiver": "recipient@example.com",
"note": "Thank you for your business!",
"sender_item_id": "ITEM-ID-1"
},
{
"recipient_type": "PHONE",
"amount": {
"value": "10.00",
"currency": "USD"
},
"receiver": "+15555550123",
"note": "Thanks for using Venmo!",
"sender_item_id": "ITEM-ID-2"
}
]
}'{
"batch_header": {
"payout_batch_id": "3TRXJ4Z8XJ8QY",
"batch_status": "PENDING",
"sender_batch_header": {
"sender_batch_id": "Batch-123",
"email_subject": "You have a payout!"
},
},
"links": [
{
"href": "https://api-m.sandbox.paypal.com/v1/payments/payouts/3TRXJ4Z8XJ8QY",
"rel": "self",
"method": "GET",
"encType": "application/json"
}
]
}A successful call returns a 201 Created response. The response includes the following parameters:
| Parameter | Description | Further action |
|---|---|---|
batch_header.payout_batch_id | Unique ID for the payout batch. | Use this ID to track or reference the batch in future API calls. |
batch_header.batch_status | Status of the payout batch. Possible values: SUCCESS, PENDING, PROCESSING, DENIED, CANCELED. | PayPal may process the batch immediately or later. If the status is PENDING, check again later. To retry after a server error (such as HTTP 5xx), send the request again with the same sender_batch_id within 30 days. |
batch_header.sender_batch_header | Metadata of the payout batch that the sender originally provided in the payout request. | You can use it to match the response with your original request parameters. |
links | URLs to get batch or item status. | Use these URLs to check the status of the batch or individual items. |
After placing the payouts request, you can code your app to track the payout status by polling for updates or using webhooks.
Use a valid access token and make a GET call to the /v1/payments/payouts/{ID} endpoint.
Path parameter: ID is the payout_batch_id returned in the Create payout batch response.
curl -X GET https://api-m.sandbox.paypal.com/v1/payments/payouts/MJ77GF8MQ2TF6 \
-H 'Authorization: Bearer ACCESS-TOKEN' \
-H 'Content-Type: application/json'{
"total_items": 3,
"total_pages": 1,
"batch_header": {
"payout_batch_id": "MJ77GF8MQ2TF6",
"batch_status": "SUCCESS",
"time_created": "2023-04-10T20:16:44Z",
"time_completed": "2023-04-10T20:16:45Z",
"sender_batch_header": {
"sender_batch_id": "Payouts_1681157804",
"email_subject": "You have a payout!",
"email_message": "You have received a payout! Thanks for using our service!"
},
"funding_source": "BALANCE",
"amount": {
"currency": "USD",
"value": "60.00"
},
"fees": {
"currency": "USD",
"value": "0.50"
}
},
"items": [
{
"payout_item_id": "CX64X3KPCVYLC",
"transaction_id": "4XH44110EC095525K",
"activity_id": "0KJ317812H109105P",
"transaction_status": "UNCLAIMED",
"payout_item_fee": {
"currency": "USD",
"value": "0.25"
},
"payout_batch_id": "MJ77GF8MQ2TF6",
"payout_item": {
"recipient_type": "EMAIL",
"amount": {
"currency": "USD",
"value": "10.00"
},
"note": "Thanks for your patronage!",
"receiver": "recipient@example.com",
"sender_item_id": "201403140001",
"recipient_wallet": "PAYPAL"
},
"time_processed": "2023-04-10T20:16:45Z",
"links": [
{
"href": "https://api.sandbox.paypal.com/v1/payments/payouts-item/CX64X3KPCVYLC",
"rel": "item",
"method": "GET"
}
]
},
{
"payout_item_id": "S697W7QJMAEX4",
"transaction_id": "0FY48488BY887313U",
"transaction_status": "UNCLAIMED",
"payout_item_fee": {
"currency": "USD",
"value": "0.25"
},
"payout_item": {
"recipient_type": "PHONE",
"amount": {
"currency": "USD",
"value": "20.00"
},
"note": "Thanks for your support!",
"receiver": "15562941698",
"sender_item_id": "201403140002",
"recipient_wallet": "PAYPAL"
},
"time_processed": "2023-04-10T20:16:45Z"
},
{
"payout_item_id": "J64P4FHTAY7UN",
"transaction_status": "FAILED",
"payout_item_fee": {
"currency": "USD",
"value": "0.00"
},
"payout_item": {
"recipient_type": "PAYPAL_ID",
"amount": {
"currency": "USD",
"value": "30.00"
},
"note": "Thanks for your patronage!",
"receiver": "invalid@example.com",
"sender_item_id": "201403140003",
"recipient_wallet": "PAYPAL"
},
"errors": {
"name": "RECEIVER_ACCOUNT_INVALID",
"message": "Receiver's account is invalid."
}
}
],
"links": [
{
"href": "https://api.sandbox.paypal.com/v1/payments/payouts/MJ77GF8MQ2TF6?page_size=1000&page=1",
"rel": "self",
"method": "GET"
}
]
}A successful call returns a 200 OK response. The response includes the following parameters:
| Parameter | Description | Action |
|---|---|---|
batch_header.batch_status | Status of the payout batch. Possible values:
| If the status is PENDING or PROCESSING, check again later. If the status is DENIED or CANCELED, review the error message or reason and resubmit if needed. For real-time updates about payout events, use webhooks. |
batch_header.sender_batch_header | Metadata of the payout batch that the sender originally provided in the payout request. | You can use it to match the response with your original request parameters. |
items | Array of payout items with details for each item. | Use the payout_item_id to track the status of each payout item. |
links | URLs to get batch or item status. | You can use them to poll for updates. |
Webhook events are external events that your app does not know about unless it receives event notifications. For example, a payout processed or completed is a webhook event. You can subscribe to such events and register a callback (listener) URL. When the event occurs, PayPal sends a notification to the registered callback URL. You can code your app to perform relevant actions based on the event notification it receives.
To handle webhook events:
For more information, see Webhooks overview and Webhooks integration guide.
PayPal uses standard HTTP status codes to indicate the result of an API request:
2xx: Success4xx: Incorrect request (for example, missing parameter)5xx: PayPal server errorWhen an API call returns an error, the response includes a JSON body with the error details and HATEOAS links to help you diagnose and resolve issues. In your app code, include the logic to review the error code, message, and related links to determine the cause. Implement actions based on the error processing. For more information, see API responses.
Use the PayPal sandbox environment to ensure your integration works as expected and meets all business and technical requirements before you go live.
Testing your Payouts API integration involves:
To simulate Payouts API responses, inject test values in the request payload or as a path parameter in the request URL. These methods allow you to trigger specific error responses without creating actual payouts.
| Trigger | Test value | Simulated error response |
|---|---|---|
| items[0]/note | ERRPYO002 | SENDER_EMAIL_UNCONFIRMED |
curl -X POST https://api-m.sandbox.paypal.com/v1/payments/payouts \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer ACCESS-TOKEN' \
-d '{
"sender_batch_header":
{
"sender_batch_id": "1524086406556",
"email_subject": "This email is related to simulation"
},
"items": [
{
"recipient_type": "EMAIL",
"receiver": "payouts-simulator-receiver@paypal.com",
"note": "ERRPYO002",
"sender_item_id": "15240864065560",
"amount":
{
"currency": "USD",
"value": "1.00"
}
}
]
}'{
"name": "SENDER_EMAIL_UNCONFIRMED",
"message": "Authorization error occurred",
"debug_id": "ca787bdf80d7a",
"information_link": "https://developer.paypal.com/docs/api/payments.payouts-batch/v1/#errors"
}