Payment On Behalf Of (POBO)
Payment On Behalf Of (POBO) lets one beneficiary — the sponsor — fund a payment that is executed through another beneficiary's account. This is useful when a single funding entity backs payments for many downstream accounts, such as corporate spend management, marketplace settlements, or paying vendors on a customer's behalf.
A POBO payment involves three parties:
- Sponsor (payor): Your integrator's main beneficiary — the account that funds POBO payments. It is established when your integrator is onboarded, and there is one per integrator. You reference it with the
payorIdfield on the simulation. - Beneficiary: The beneficiary the payment runs through, identified by
beneficiaryId, exactly as in a standard payment. - Recipient: The external destination that receives the funds, identified by
recipientId.
You turn any payment into a POBO payment by setting payorId to your main beneficiary on the simulation. When payorId is present and differs from the beneficiary the payment runs through, Caliza treats the payment as POBO and funds it from your main beneficiary — there is no separate endpoint.
How it works
Under the hood, Caliza processes a POBO payment in two legs:
- Internal transfer — Caliza moves the funds from the sponsor to the beneficiary.
- External payout — Caliza executes the payment from the beneficiary to the recipient, just like a standard payment.
You only make the API calls described below; both legs are handled automatically once you execute the payment.
The external payout starts once the internal transfer between the sponsor and the beneficiary has settled. As a result, immediately after you execute a POBO payment its status may briefly reflect the internal transfer before the external payout begins. Track the payment status as you would for any payment (see Track the payment status).
Simulate a POBO payment
To simulate a POBO payment, send a standard simulation request and add the payorId field set to your main beneficiary's ID. Make sure to replace:
YOUR_TOKENwith your actual API token.beneficiaryIdwith the ID of the beneficiary the payment runs through.payorIdwith the ID of your main beneficiary (the sponsor funding the payment).
See an example request below:
curl -s --location --request POST 'https://api.sandbox.caliza.com/core-api/v2/simulations' \
--header "Authorization: Bearer YOUR_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"from": {
"currencyCode": "USDC",
"value": 500
},
"to": {
"currencyCode": "USD"
},
"beneficiaryId": "69261109adcc7b2db705a123",
"payorId": "69261109adcc7b2db705a999",
"recipientId": "12ace467-8189-42ec-8b21-0a5bf7cd7f5e",
"payout": "WIRE"
}'Where:
from: An object containing details about the source of funds, including currency code and value.to: An object containing details about the destination of funds, including currency code.beneficiaryId: The ID of the beneficiary the payment runs through.payorId: Your integrator's main beneficiary ID — the sponsor account that funds the payment. Setting this field to a value that differs frombeneficiaryIdis what makes the payment a POBO payment.recipientId: The ID of the recipient where the funds will be sent.payout: The payout rail used for the transaction (e.g., "WIRE").
The response echoes the payorId back and otherwise matches a standard simulation:
{
"id": "34c9dfe7-12da-4119-8beb-4db895c01a47",
"integratorId": "6920925fdbadfe09b1bf9e5e",
"beneficiaryId": "69261109adcc7b2db705a123",
"payorId": "69261109adcc7b2db705a999",
"from": {
"currencyCode": "USDC",
"value": 500.00
},
"to": {
"currencyCode": "USD",
"value": 495.00
},
"flowOfFundsId": "55b778b2-1d8e-48fb-8229-0386d0f33fe0",
"transactionDetails": {
"conversionDetails": {
"effectiveTransactionValue": 495.00,
"marketExchangeRate": 1.00
},
"feeDetails": {
"totalFees": {
"currencyCode": "USDC",
"value": 5.00
}
}
},
"executed": false,
"guaranteedRate": true,
"rateValidityInMinutes": 15,
"expiresAt": "2025-11-27T15:00:00Z",
"createdDate": "2025-11-27T14:45:00Z",
"lastModifiedDate": "2025-11-27T14:45:00Z"
}Where:
id: The unique identifier for the simulation.integratorId: The ID of the integrator associated with the simulation.beneficiaryId: The ID of the beneficiary the payment runs through.payorId: Your integrator's main beneficiary ID — the sponsor account funding the payment.from: An object containing details about the source of funds, including currency code and value.to: An object containing details about the destination of funds, including currency code and value.flowOfFundsId: The unique identifier for the flow of funds associated with the simulation.transactionDetails: An object containing details about the transaction, including conversion details and fee details.executed: A boolean indicating whether the simulation has been executed.guaranteedRate: A boolean indicating whether the rate is guaranteed.rateValidityInMinutes: The validity period of the rate in minutes.expiresAt: The expiration date and time of the simulation.createdDate: The date and time when the system created the simulation.lastModifiedDate: The date and time when the system last modified the simulation.
Execute the POBO payment
Once you have a POBO simulation, execute it exactly as you would a standard payment — pass the simulationId to POST /v1/payments. The payorId carried by the simulation is applied automatically, so the execution request is unchanged.
Make sure to replace YOUR_TOKEN with your actual API token and simulationId with the ID of the POBO simulation you want to execute:
curl 'https://api.sandbox.caliza.com/core-api/v1/payments' \
--header 'Authorization: Bearer YOUR_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"simulationId": "{{simulationId}}",
"beneficiaryIp": "{{beneficiaryIp}}"
}'Where:
simulationId: The ID of the POBO simulation you want to execute.beneficiaryIp: The IP address of the beneficiary initiating the payment.
The response is the same TransactionResponse returned by a standard payment, and includes the payorId:
{
"id": "5d097212-9902-4d86-beec-c578640105f4",
"simulationId": "34c9dfe7-12da-4119-8beb-4db895c01a47",
"integratorId": "6920925fdbadfe09b1bf9e5e",
"beneficiaryId": "69261109adcc7b2db705a123",
"payorId": "69261109adcc7b2db705a999",
"status": "PROCESSING",
"from": {
"currencyCode": "USDC",
"value": 500.00
},
"to": {
"currencyCode": "USD",
"value": 495.00
},
"createdDate": "2025-11-27T15:00:00Z",
"lastModifiedDate": "2025-11-27T15:00:00Z"
}Where:
id: The unique identifier for the payment.simulationId: The ID of the simulation associated with the payment.beneficiaryId: The ID of the beneficiary the payment runs through.payorId: Your integrator's main beneficiary ID — the sponsor account funding the payment.status: The current status of the payment (e.g., PROCESSING, SUCCEEDED).from: An object containing details about the source of funds, including currency code and value.to: An object containing details about the destination of funds, including currency code and value.
POBO payments support the same supporting-document workflow as standard payments. You can attach documents at execution time with
POST /v1/payments/:withDocuments. See Payments for details.
Track the payment status
Check the status of a POBO payment the same way you check any payment, using its ID.
See the example request below:
curl --location --globoff 'https://api.sandbox.caliza.com/core-api/v1/payments/{{payment_id}}' \
--header 'Authorization: Bearer YOUR_TOKEN'Where payment_id is the ID of the payment you want to check.
The response should look like this:
{
"id": "5d097212-9902-4d86-beec-c578640105f4",
"simulationId": "34c9dfe7-12da-4119-8beb-4db895c01a47",
"integratorId": "6920925fdbadfe09b1bf9e5e",
"beneficiaryId": "69261109adcc7b2db705a123",
"payorId": "69261109adcc7b2db705a999",
"status": "SUCCEEDED",
"from": {
"currencyCode": "USDC",
"value": 500.00
},
"to": {
"currencyCode": "USD",
"value": 495.00
},
"createdDate": "2025-11-27T15:00:00Z",
"lastModifiedDate": "2025-11-27T15:05:00Z",
"settledAt": "2025-11-27T15:05:00Z"
}Because a POBO payment is processed as an internal transfer followed by an external payout, the payment reaches a completed state only after the external payout settles. If you poll or receive webhooks shortly after execution, allow for the brief internal-transfer step before the external payout begins.
Webhook events for POBO payments
POBO payments emit the same webhook events as standard payments — most notably TRANSACTION_COMPLETED when the payment finishes. See Webhook events for payments for the event structure and field descriptions.
Related Articles
Updated about 1 month ago
