curl --request GET \
--url https://api-sandbox.endl.io/api/v0/pobo/senders \
--header 'API-KEY: <api-key>' \
--header 'Api-Version: <api-version>'import requests
url = "https://api-sandbox.endl.io/api/v0/pobo/senders"
headers = {
"Api-Version": "<api-version>",
"API-KEY": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'Api-Version': '<api-version>', 'API-KEY': '<api-key>'}
};
fetch('https://api-sandbox.endl.io/api/v0/pobo/senders', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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"
req, _ := http.NewRequest("GET", 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.get("https://api-sandbox.endl.io/api/v0/pobo/senders")
.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")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Api-Version"] = '<api-version>'
request["API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"id": "snd_3kP9qLm2Xr7Tz5Wb8NcV",
"type": "INDIVIDUAL",
"firstName": "Jane",
"lastName": "Doe",
"businessName": null,
"email": null,
"phone": null,
"governmentId": null,
"governmentIdType": null,
"governmentIdIssueCountry": null,
"nationality": null,
"occupation": null,
"gender": null,
"sourceOfFunds": null,
"remark": null,
"governmentIdIssueDate": null,
"governmentIdExpiryDate": null,
"businessRegistrationNumber": null,
"incorporationDate": null,
"businessRegistrationCountry": null,
"businessStructure": null,
"relationshipToCustomer": null
},
{
"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"
}
]
}{
"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
}List senders
Every sender registered under your partner account, as a bare JSON array of sender objects — no paging and no totalCount. An empty list is [].
curl --request GET \
--url https://api-sandbox.endl.io/api/v0/pobo/senders \
--header 'API-KEY: <api-key>' \
--header 'Api-Version: <api-version>'import requests
url = "https://api-sandbox.endl.io/api/v0/pobo/senders"
headers = {
"Api-Version": "<api-version>",
"API-KEY": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'Api-Version': '<api-version>', 'API-KEY': '<api-key>'}
};
fetch('https://api-sandbox.endl.io/api/v0/pobo/senders', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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"
req, _ := http.NewRequest("GET", 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.get("https://api-sandbox.endl.io/api/v0/pobo/senders")
.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")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Api-Version"] = '<api-version>'
request["API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"id": "snd_3kP9qLm2Xr7Tz5Wb8NcV",
"type": "INDIVIDUAL",
"firstName": "Jane",
"lastName": "Doe",
"businessName": null,
"email": null,
"phone": null,
"governmentId": null,
"governmentIdType": null,
"governmentIdIssueCountry": null,
"nationality": null,
"occupation": null,
"gender": null,
"sourceOfFunds": null,
"remark": null,
"governmentIdIssueDate": null,
"governmentIdExpiryDate": null,
"businessRegistrationNumber": null,
"incorporationDate": null,
"businessRegistrationCountry": null,
"businessStructure": null,
"relationshipToCustomer": null
},
{
"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"
}
]
}{
"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+$Response
A bare array of senders. Unwrapped.
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.