PayShap Use Cases
PayShap is a South African real-time interbank low-value payment scheme operated through the South African Reserve Bank (SARB). Eclipse integrates with PayShap via Standard Bank (SBSA) as the sponsoring bank, using the ZA_SBSA_PAYSHAP gateway.
Eclipse supports the full PayShap workflow:
- Send — debit a wallet and push funds to a PayShap recipient using either their bank account number or their PayShap proxy ID (phone number or custom identifier)
- Receive — register a wallet as a PayShap-reachable destination by linking a proxy identifier to it, so other banks can resolve and credit it
Prerequisites:
- A valid JWT for API calls
- An active ZAR wallet funded with sufficient balance
- The following tenant config keys provisioned by the EFT onboarding team:
| Config key | Purpose |
|---|---|
sbsa.payshap.config.clientId | OAuth client ID for SBSA PayShap API |
sbsa.payshap.config.clientSecret | OAuth client secret |
sbsa.payshap.config.tokenUrl | SBSA OAuth token endpoint |
sbsa.payshap.config.paymentScope | OAuth scope for payment calls |
sbsa.payshap.config.proxyScope | OAuth scope for proxy resolution calls |
sbsa.payshap.config.xibmclientid | IBM API Gateway client ID |
sbsa.payshap.config.xibmclientsecret | IBM API Gateway client secret |
sbsa.payshap.config.initgPtyNm | Initiating party name (your organisation) |
sbsa.payshap.config.initgPtyId | Initiating party ID (registration number) |
sbsa.payshap.config.initgPtyIssr | Issuer of the party ID (e.g. CIPC) |
sbsa.payshap.config.initgPtyAccountNumber | SBSA settlement account number |
sbsa.payshap.proxy.management.configs.clientId | OAuth client ID for proxy management API |
sbsa.payshap.proxy.management.configs.clientSecret | OAuth client secret for proxy management API |
payshap.proxy.config.payshapProxyDomain | Domain used when registering proxies (e.g. standardbank) |
Sending via PayShap (Withdrawal)
Debit a wallet and send funds to a PayShap recipient. Two routing modes are supported:
| Mode | When to use |
|---|---|
| Proxy-based | You know the recipient's PayShap proxy ID (phone number or custom identifier) |
| Account-based | You know the recipient's bank account number and branch code directly |
Send to a proxy ID
POST /eclipse-conductor/rest/v1/tenants/{tenantId}/wallets/{walletId}/withdrawals
Authorization: Bearer {jwt}
Content-Type: application/json{
"type": "ZA_SBSA_PAYSHAP",
"amount": 250.00,
"payshapId": "+27821234567@standardbank",
"description": "Payment to supplier",
"externalUniqueId": "payshap-wdr-00000001",
"callbackUrl": "https://your-system.example.com/webhooks/withdrawal"
}| Field | Required | Description |
|---|---|---|
type | Yes | Must be ZA_SBSA_PAYSHAP |
amount | Yes | Amount in ZAR (major currency unit) |
payshapId | Yes (proxy mode) | Proxy identifier in proxyId@domain format. Phone numbers must be in E.164 format (+27...). Custom identifiers use the same @domain suffix |
description | No | Appears on the wallet statement |
externalUniqueId | Yes | Your unique reference — duplicates are rejected |
callbackUrl | No | Eclipse will POST the final result here when the withdrawal reaches a terminal state |
Send to a bank account directly
POST /eclipse-conductor/rest/v1/tenants/{tenantId}/wallets/{walletId}/withdrawals
Authorization: Bearer {jwt}
Content-Type: application/json{
"type": "ZA_SBSA_PAYSHAP",
"amount": 250.00,
"accountNumber": "1234567890",
"branchCode": "051001",
"accountName": "Sipho Dlamini",
"description": "Payment to supplier",
"externalUniqueId": "payshap-wdr-00000002",
"callbackUrl": "https://your-system.example.com/webhooks/withdrawal"
}Response
{
"withdrawalId": 8829301,
"externalUniqueId": "payshap-wdr-00000001",
"status": "PENDING",
"amount": 250.00,
"currency": "ZAR",
"gateway": "ZA_SBSA_PAYSHAP",
"type": "WALLET",
"created": "2026-05-19T10:00:00.000Z"
}The initial status is always PENDING. PayShap withdrawals are asynchronous — the final SUCCESSFUL or ERROR result is delivered via the callbackUrl if provided, or polled via GET .../withdrawals/{withdrawalId}.
Terminal statuses: SUCCESSFUL, ERROR, TIMEOUT, CANCELLED.
On-us detection: If the payshapId or accountNumber resolves to another wallet on the same Eclipse tenant, the transfer settles immediately without routing through SBSA.
Proxy resolution: For proxy-based withdrawals, Eclipse initiates an async proxy resolution with SBSA. Resolution typically completes within 120 seconds. The withdrawal remains PENDING until the proxy resolves and the payment is confirmed.
Sending via PayShap (Payment)
The same outbound PayShap payment can also be initiated through the payments endpoint. Use this when your integration uses the payments flow rather than the withdrawals flow.
POST /eclipse-conductor/rest/v1/tenants/{tenantId}/wallets/{walletId}/payments
Authorization: Bearer {jwt}
Content-Type: application/json{
"type": "ZA_SBSA_PAYSHAP",
"paymentData": "+27821234567@standardbank",
"amount": 250.00,
"currency": "ZAR",
"externalUniqueId": "payshap-pay-00000001",
"callbackUrl": "https://your-system.example.com/webhooks/payment"
}For account-based payments, omit paymentData and provide accountNumber and branchCode in additionalFields.
The response, async behaviour, and on-us detection are the same as the withdrawal flow above.
PayShap Proxy Management
Register a wallet as a PayShap-reachable destination by linking a proxy identifier to it. Once registered, other banks can resolve the proxy and send funds directly to the wallet without needing the account number.
Two proxy sub-types are supported:
subType | Identifier format | Example |
|---|---|---|
PHONE | E.164 phone number | +27821234567 |
CUSTOM | Any agreed custom identifier | sipho.dlamini.ref |
List proxies on a wallet
GET /eclipse-conductor/rest/v1/tenants/{tenantId}/wallets/{walletId}/proxies
?type=PAYSHAP
Authorization: Bearer {jwt}[
{
"proxyIdentifier": "+27821234567",
"type": "PAYSHAP",
"subType": "PHONE",
"accountNumber": "1234567890"
}
]Register a proxy
POST /eclipse-conductor/rest/v1/tenants/{tenantId}/wallets/{walletId}/proxies
Authorization: Bearer {jwt}
Content-Type: application/json{
"proxyIdentifier": "+27821234567",
"type": "PAYSHAP",
"subType": "PHONE"
}Eclipse registers the proxy with SBSA and links it to the wallet's settlement account. The payshap.proxy.config.payshapProxyDomain tenant config key controls the domain used during registration.
Response: 201 Created with the created proxy object including the resolved accountNumber.
Get a proxy by identifier
GET /eclipse-conductor/rest/v1/tenants/{tenantId}/wallets/{walletId}/proxies/{proxyIdentifier}
?type=PAYSHAP
Authorization: Bearer {jwt}Response: the proxy object for the given identifier.
Update a proxy
PUT /eclipse-conductor/rest/v1/tenants/{tenantId}/wallets/{walletId}/proxies/{proxyIdentifier}
Authorization: Bearer {jwt}
Content-Type: application/json{
"proxyIdentifier": "+27829876543",
"type": "PAYSHAP",
"subType": "PHONE"
}The {proxyIdentifier} path parameter is the existing registered identifier. If the new proxyIdentifier differs from the existing one, Eclipse de-registers the old proxy and registers the new one with SBSA. If only the account linkage needs updating, the identifier can remain the same.
Delete a proxy
DELETE /eclipse-conductor/rest/v1/tenants/{tenantId}/wallets/{walletId}/proxies/{proxyIdentifier}
Authorization: Bearer {jwt}Response: 204 No Content. The proxy is de-registered from SBSA and unlinked from the wallet. Subsequent inbound PayShap payments addressed to this proxy will no longer resolve to the wallet.
Updated about 7 hours ago
