Payout to PayID
PayOut to PayID
Send real-time payments to recipient's PayID using the New Payments Platform (NPP).
How it works
PayOut to PayID lets you pay a recipient using a PayID instead of collecting their BSB and account number. Supply the recipient details directly in the PayOut request and Zepto sends the payment from your Float Account via NPP.
Create the PayOut
Provide the amount, your Float Account and the recipient's PayID.
POST /payments/payoutsZepto processes it
Zepto resolves the PayID and sends the payment to the recipient via NPP.
npp.credit.outboundReceive the outcome
Use the finalised webhook to determine the final outcome of the PayOut.
payments_payout.finalisedBefore you start
You'll need a Zepto Float Account configured for payments, a valid API access token, and the client ID that the PayOut should be attributed to.
Minimum API Version
PayOut to PayID is supported in Zepto-API-Version: 20270101 and onward. Ensure you are integrating with this version as a minimum.
Step 1 - Create a PayOut
Create a PayOut with your Float Account as the debtor and the PayID recipient as the creditor. For a standard PayID payment, supply exactly one creditor channel with the type npp.credit.outbound.
Choose the PayID type
50000 represents a PayOut of $500.00.
The creditor.channels[].description is visible to
both you and the recipient and can contain up to 280 characters.
Successful response
A successfully created PayOut returns 201 Created.
An immediate PayOut will normally enter the processing lifecycle
with a status such as queued.
{
"amount": 50000,
"description": "Supplier payment",
"priority": "normal",
"debtor": {
"identity": {
"type": "inline",
"account_identifier": {
"type": "bban",
"value": "802919-12345678"
}
}
},
"creditor": {
"identity": {
"type": "inline",
"party_name": "End User",
"account_identifier": {
"type": "alias_email",
"value": "[email protected]"
}
},
"channels": [
{
"type": "npp.credit.outbound",
"description": "Invoice 1042"
}
]
},
"uid": "payout-uid-001",
"client_id": "019b76da-a800-7c5e-8f3a-9d21e4b7c012"
}{
"data": {
"uid": "payout-uid-001",
"client_id": "019b76da-a800-7c5e-8f3a-9d21e4b7c012",
"amount": 50000,
"status": "queued",
"initiation_type": "payout",
"creditor": {
"identity": {
"type": "inline",
"party_name": "End User",
"account_identifier": {
"type": "alias_email",
"value": "[email protected]"
}
},
"channels": [
{
"type": "npp.credit.outbound",
"description": "Invoice 1042"
}
]
},
"description": "Supplier payment",
"priority": "normal",
"errors": [],
"scheduled_after": null,
"timing": {
"added_at": "2026-01-01T00:00:00Z",
"queued_at": "2026-01-01T00:00:00Z",
"finalised_at": null
}
}
}| Field | Purpose |
|---|---|
| uid | Your unique identifier for the PayOut. Use a new UID for each payment. |
| client_id | Identifies the client on your Zepto account that the PayOut is attributed to. |
| amount | Amount to send, in cents. |
| debtor.identity | Identifies the Zepto Float Account the funds will leave. |
| creditor.identity | Identifies the recipient and their PayID. |
| creditor.channels | Use npp.credit.outbound for a standard PayOut to PayID. |
| priority | Controls whether processing is optimised for throughput or latency. |
Choose a processing priority
Priority controls how Zepto schedules the PayOut for processing.
Use normal for most payments.
normal
Recommended
Optimised for throughput. PayOuts are processed in batches alongside other payments. Use this for most supplier payments, refunds, payroll and scheduled disbursements.
high
Optimised for latency. The PayOut skips batching and is processed individually. Reserve this for genuinely time-critical experiences such as instant withdrawals.
Schedule a PayOut
If the PayOut should be processed later, include scheduled_after. You can schedule a PayOut up to one week in advance.
{
"...": "...",
"priority": "normal",
"scheduled_after": "2026-01-03T00:00:00Z"
}Scheduled PayOuts require normal priority
scheduled_after cannot be used with priority: high. A scheduled PayOut remains in scheduled until it is ready to be queued.
Step 2 – Track the PayOut Lifecycle
PayOuts are processed asynchronously. A successful create request confirms that Zepto accepted the PayOut—it does not mean the recipient has received the funds.
A PayOut ultimately reaches one of three final states:
settled, failed or
cancelled.
You can retrieve the latest state using
GET /payments/payouts/{uid}.
| Status | Meaning |
|---|---|
| scheduled | Waiting for its scheduled processing time. |
| queued | Queued for processing. |
| processing | Currently being processed. |
| settled | The funds are available to the recipient. |
| failed | The PayOut could not be completed. Check errors for the reason. |
| cancelled | The scheduled PayOut was cancelled. |
Step 3 – Receive the final outcome via webhook
The Payments API publishes webhooks to notify your application of asynchronous events on the payments you initiate. Each webhook is delivered as a POST request to a URL registered against your Zepto account, with a JSON body describing the event.
Payout lifecycle
Every payout ends with a single payments_payout.finalised event. Statuses on the left, the webhook on the right:
payout ─┬─► settled ───────────────────────────────► payments_payout.finalised
│
├─► cancelled ─────────────────────────────► payments_payout.finalised
│
└─► failed ──► any debited funds returned ─► payments_payout.finalisedbody.status tells you how the payout ended: settled when the funds are available to the creditor, cancelled when the payout was cancelled, or failed with the reasons in body.errors.
For a failed payout, payments_payout.finalised is only sent once any funds debited for it are back in the debtor's account, so it is always safe to retry the payout or arrange a fallback payment when it arrives. Until then, fetching the payout may already show status: failed with timing.finalised_at still null; finalised_at is set when payments_payout.finalised is sent.
{
"data": {
"uid": "payout-uid-123",
"type": "payments_payout.finalised",
"published_at": "2026-05-07T02:34:57Z",
"metadata": { "order_id": "abc-123" },
"body": {
"status": "failed",
"errors": [
{
"code": "ZIS99",
"title": "Unknown Payment Error",
"detail": "An unknown error occurred while processing the payment. Please contact Zepto for assistance."
}
]
}
}
}Error handling
Your integration should handle both synchronous API errors and payment failures that occur asynchronously after the PayOut has been accepted.
| Prefix | Source | Example |
|---|---|---|
ZIS |
Shared / request | ZIS03 — Duplicate UID |
ZID |
Debtor | ZID02 — Insufficient funds |
ZIC |
Creditor | ZIC01 — PayID could not be resolved |
PayID resolution or downstream processing can still fail after the PayOut has been created. Use the finalised webhook to determine the final outcome.
Sandbox Simulations
Sandbox lets you trigger deterministic payment failures by sending specific amounts. Use these simulations to test how your integration handles different PayOut outcomes.
| Amount | Error | Simulation |
|---|---|---|
| 105 | ZIS05 | Over per-transaction limit |
| 202 | ZID02 | Insufficient funds |
| 206 | ZID06 | Debtor account debit blocked |
| 301 | ZIC01 | PayID cannot be resolved |
| 302 | ZIC02 | Recipient account closed |
| 303 | ZIC03 | Intermittent outage at the target institution |
| 304 | ZIC04 | Recipient account blocked |
| 306 | ZIC06 | Recipient blocked by their financial institution |
Amount-based simulations apply only in Sandbox. In Production, these amounts are processed as ordinary payment values.
Integration Checklist
Zepto-API-Version: 20270101.
uid for each PayOut.
alias_email, alias_phone or
alias_abn.
npp.credit.outbound as the creditor channel.
normal priority by default.
payments_payout.finalised before treating
the PayOut as final.
Updated about 2 hours ago
