curl --request DELETE \
--url https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId} \
--header 'API-KEY: <api-key>' \
--header 'Api-Version: <api-version>'import requests
url = "https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}"
headers = {
"Api-Version": "<api-version>",
"API-KEY": "<api-key>"
}
response = requests.delete(url, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {'Api-Version': '<api-version>', 'API-KEY': '<api-key>'}
};
fetch('https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"API-KEY: <api-key>",
"Api-Version: <api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("Api-Version", "<api-version>")
req.Header.Add("API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}")
.header("Api-Version", "<api-version>")
.header("API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Api-Version"] = '<api-version>'
request["API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "snd_9Bv2Lq7Rk4Xn1Pz6Tm3W",
"type": "BUSINESS",
"firstName": "Acme Trading Pte Ltd",
"lastName": null,
"businessName": "Acme Trading Pte Ltd",
"email": "finance@acmetrading.sg",
"phone": "+6567890123",
"governmentId": "201912345K",
"governmentIdType": "BUSINESS_REGISTRATION",
"governmentIdIssueCountry": "SGP",
"nationality": "SGP",
"occupation": null,
"gender": null,
"sourceOfFunds": "BUSINESS_INCOME",
"remark": "Supplier payments",
"governmentIdIssueDate": null,
"governmentIdExpiryDate": null,
"businessRegistrationNumber": "201912345K",
"incorporationDate": "02-05-2019",
"businessRegistrationCountry": "SGP",
"businessStructure": "Pte Ltd.",
"relationshipToCustomer": "SUPPLIER"
}{
"code": 400,
"message": "Rail not supported for POBO",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "ERRTXN_1001",
"message": "Rail not supported for POBO",
"field": null
}
]
}{
"data": null,
"code": 401,
"message": "Authentication Failed!",
"status": "Error",
"errors": [
{
"code": "401",
"message": "Authentication Failed!",
"field": "Authentication Failed!"
}
]
}{
"data": null,
"code": 403,
"message": "API key does not have 'pobo' permission",
"status": "Error",
"errors": [
{
"code": "403",
"message": "API key does not have 'pobo' permission",
"field": "API key does not have 'pobo' permission"
}
]
}{
"code": 404,
"message": "Resource not found",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "NOT_FOUND",
"message": "Resource not found",
"field": null
}
]
}{
"data": null,
"code": 429,
"message": "Rate limit exceeded, please retry later",
"status": "Error",
"errors": [
{
"code": "429",
"message": "Rate limit exceeded, please retry later",
"field": "Rate limit exceeded, please retry later"
}
]
}{
"code": 500,
"message": "Unexpected error",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "INTERNAL_ERROR",
"message": "Unexpected error",
"field": null
}
]
}{
"data": null,
"code": 502,
"message": "Upstream service error",
"status": "Error",
"errors": null
}Delete sender
Delete a sender by its snd_ reference id. Returns the sender object as it was before deletion. Later reads of that id fail.
curl --request DELETE \
--url https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId} \
--header 'API-KEY: <api-key>' \
--header 'Api-Version: <api-version>'import requests
url = "https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}"
headers = {
"Api-Version": "<api-version>",
"API-KEY": "<api-key>"
}
response = requests.delete(url, headers=headers)
print(response.text)const options = {
method: 'DELETE',
headers: {'Api-Version': '<api-version>', 'API-KEY': '<api-key>'}
};
fetch('https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"API-KEY: <api-key>",
"Api-Version: <api-version>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("Api-Version", "<api-version>")
req.Header.Add("API-KEY", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}")
.header("Api-Version", "<api-version>")
.header("API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-sandbox.endl.io/api/v0/pobo/senders/{senderId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Api-Version"] = '<api-version>'
request["API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "snd_9Bv2Lq7Rk4Xn1Pz6Tm3W",
"type": "BUSINESS",
"firstName": "Acme Trading Pte Ltd",
"lastName": null,
"businessName": "Acme Trading Pte Ltd",
"email": "finance@acmetrading.sg",
"phone": "+6567890123",
"governmentId": "201912345K",
"governmentIdType": "BUSINESS_REGISTRATION",
"governmentIdIssueCountry": "SGP",
"nationality": "SGP",
"occupation": null,
"gender": null,
"sourceOfFunds": "BUSINESS_INCOME",
"remark": "Supplier payments",
"governmentIdIssueDate": null,
"governmentIdExpiryDate": null,
"businessRegistrationNumber": "201912345K",
"incorporationDate": "02-05-2019",
"businessRegistrationCountry": "SGP",
"businessStructure": "Pte Ltd.",
"relationshipToCustomer": "SUPPLIER"
}{
"code": 400,
"message": "Rail not supported for POBO",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "ERRTXN_1001",
"message": "Rail not supported for POBO",
"field": null
}
]
}{
"data": null,
"code": 401,
"message": "Authentication Failed!",
"status": "Error",
"errors": [
{
"code": "401",
"message": "Authentication Failed!",
"field": "Authentication Failed!"
}
]
}{
"data": null,
"code": 403,
"message": "API key does not have 'pobo' permission",
"status": "Error",
"errors": [
{
"code": "403",
"message": "API key does not have 'pobo' permission",
"field": "API key does not have 'pobo' permission"
}
]
}{
"code": 404,
"message": "Resource not found",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "NOT_FOUND",
"message": "Resource not found",
"field": null
}
]
}{
"data": null,
"code": 429,
"message": "Rate limit exceeded, please retry later",
"status": "Error",
"errors": [
{
"code": "429",
"message": "Rate limit exceeded, please retry later",
"field": "Rate limit exceeded, please retry later"
}
]
}{
"code": 500,
"message": "Unexpected error",
"status": "ERROR",
"data": null,
"errors": [
{
"code": "INTERNAL_ERROR",
"message": "Unexpected error",
"field": null
}
]
}{
"data": null,
"code": 502,
"message": "Upstream service error",
"status": "Error",
"errors": null
}POBO error codes
| Code | HTTP | When |
|---|---|---|
ERRTXN_1000 | 400 | senderId missing on pre-transaction or submit. |
ERRTXN_1001 | 400 | The route is not served by Paywho. |
ERRTXN_1002 | 400 | walletId missing on a wallet-funded transfer. |
ERRTXN_1003 | 400 | walletId not found or not active. |
ERRQUO_1000 | 404 | Quote not found. |
ERRQUO_1017 | 400 | No rate available for this route. |
ERRQUO_1019 | 400 | senderType or recipientType is not INDIVIDUAL / BUSINESS. |
ERRREC_1000 | 404 | Recipient not found. |
ERRREF_1000 / ERRREF_1001 | 400 / 404 | Malformed / unknown reference id. |
ERRCORE_1001 | 400 | Sender validation failures, including Sender not found. |
ERRCORE_1003 | 409 | A live sender already has this governmentId. |
ERRCORE_1005 | 403 | The API key lacks the pobo permission. |
errors[0].code. See Error codes for every code.Authorizations
Your partner API key. Must carry the pobo permission.
Headers
The API version this request targets. Required on every /api/v0/* call. Format YYYY-MM.<release>; 2026-09.1 is the latest. The version that served the request is echoed back on the response. Missing, malformed or unsupported values are rejected with 400.
^\d{4}-\d{2}\.\d+$Path Parameters
The sender reference id.
Response
The sender as it was before deletion. Unwrapped.
A POBO sender, unwrapped. All keys are always present; unset values are null. There is no sender status, and dateOfBirth and address are stored but not returned.
snd_… reference id. Pass as senderId on pre-transaction and submit.
INDIVIDUAL or BUSINESS.
First name; for a business, the business name.
Last name. Individuals only.
Business name. null for individuals.
Contact detail.
Contact detail.
Identity or registration number. Unique per partner.
Type of that document.
Issuing country of that document.
Individual detail.
Individual detail.
Individual detail. M or F.
Source-of-funds code.
Free text.
DD-MM-YYYY.
DD-MM-YYYY.
Business only; null for individuals.
Business only; DD-MM-YYYY.
Business only; null for individuals.
Business only; null for individuals.
e.g. CUSTOMER, SUPPLIER, EMPLOYEE.