Payout to PayID

DEVELOPER GUIDE

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.

Float Account Funds leave your Zepto account
→
NPP Payment is processed in real time
→
Recipient PayID Email, mobile number or ABN
1

Create the PayOut

Provide the amount, your Float Account and the recipient's PayID.

POST /payments/payouts
2

Zepto processes it

Zepto resolves the PayID and sends the payment to the recipient via NPP.

npp.credit.outbound
3

Receive the outcome

Use the finalised webhook to determine the final outcome of the PayOut.

payments_payout.finalised

Before 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

Email alias_email
Mobile alias_phone
+61-411222333
ABN alias_abn
12345678901
ⓘ
Amounts are in cents

50000 represents a PayOut of $500.00.

↗
Recipient-visible description

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
    }
  }
}
FieldPurpose
uidYour unique identifier for the PayOut. Use a new UID for each payment.
client_idIdentifies the client on your Zepto account that the PayOut is attributed to.
amountAmount to send, in cents.
debtor.identityIdentifies the Zepto Float Account the funds will leave.
creditor.identityIdentifies the recipient and their PayID.
creditor.channelsUse npp.credit.outbound for a standard PayOut to PayID.
priorityControls 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.

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.

scheduled → queued → processing → settled

A PayOut ultimately reaches one of three final states: settled, failed or cancelled.

You can retrieve the latest state using GET /payments/payouts/{uid}.

StatusMeaning
scheduledWaiting for its scheduled processing time.
queuedQueued for processing.
processingCurrently being processed.
settledThe funds are available to the recipient.
failedThe PayOut could not be completed. Check errors for the reason.
cancelledThe 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.finalised

body.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
!
Don't treat 201 as payment confirmation

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.

AmountErrorSimulation
105ZIS05Over per-transaction limit
202ZID02Insufficient funds
206ZID06Debtor account debit blocked
301ZIC01PayID cannot be resolved
302ZIC02Recipient account closed
303ZIC03Intermittent outage at the target institution
304ZIC04Recipient account blocked
306ZIC06Recipient blocked by their financial institution
ⓘ
Sandbox only

Amount-based simulations apply only in Sandbox. In Production, these amounts are processed as ordinary payment values.


Integration Checklist

✓ Send Zepto-API-Version: 20270101.
✓ Generate a unique uid for each PayOut.
✓ Supply the correct PayID type: alias_email, alias_phone or alias_abn.
✓ Use npp.credit.outbound as the creditor channel.
✓ Use normal priority by default.
✓ Listen for payments_payout.finalised before treating the PayOut as final.
✓ Test failure scenarios in Sandbox before going live.

Did this page help you?