curl --request GET \
--url https://staging.api.payluk.ng/v1/customers \
--header 'Authorization: Bearer <token>'import requests
url = "https://staging.api.payluk.ng/v1/customers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://staging.api.payluk.ng/v1/customers', 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://staging.api.payluk.ng/v1/customers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://staging.api.payluk.ng/v1/customers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://staging.api.payluk.ng/v1/customers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.api.payluk.ng/v1/customers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Customers fetched successfully",
"data": {
"pagination": {
"count": 26,
"pages": 3,
"isLastPage": false,
"nextPage": 2,
"previousPage": null
},
"data": [
{
"customerId": "6a19b57ffa797d3af379ca2a",
"firstname": "firsty",
"lastname": "fhgvj",
"email": "[email protected]",
"phone": "09022331122",
"bvn": null,
"status": "active",
"blockedReason": null,
"blockedAt": null,
"createdAt": "2026-05-29T15:49:19.848Z",
"dob": null,
"permissions": {
"canWithdraw": true,
"canBuy": true,
"canSell": true
},
"countryId": "69b8d4c7f80e1f661b48c9ca"
}
]
}
}List merchant customers
Lists your customers, newest first.
Pass email or phone to look a single customer up instead of paging through the list. Both are unique among your customers, so either one identifies exactly one record: the response keeps the same shape, with that customer as the only row and a one-page pagination. Sending both narrows to the customer matching both, not to two results. page and limit are ignored on a lookup.
If no customer matches, the request fails with 400 rather than returning an empty list.
curl --request GET \
--url https://staging.api.payluk.ng/v1/customers \
--header 'Authorization: Bearer <token>'import requests
url = "https://staging.api.payluk.ng/v1/customers"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://staging.api.payluk.ng/v1/customers', 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://staging.api.payluk.ng/v1/customers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://staging.api.payluk.ng/v1/customers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://staging.api.payluk.ng/v1/customers")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.api.payluk.ng/v1/customers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Customers fetched successfully",
"data": {
"pagination": {
"count": 26,
"pages": 3,
"isLastPage": false,
"nextPage": 2,
"previousPage": null
},
"data": [
{
"customerId": "6a19b57ffa797d3af379ca2a",
"firstname": "firsty",
"lastname": "fhgvj",
"email": "[email protected]",
"phone": "09022331122",
"bvn": null,
"status": "active",
"blockedReason": null,
"blockedAt": null,
"createdAt": "2026-05-29T15:49:19.848Z",
"dob": null,
"permissions": {
"canWithdraw": true,
"canBuy": true,
"canSell": true
},
"countryId": "69b8d4c7f80e1f661b48c9ca"
}
]
}
}Authorizations
Your secret key as a Bearer token. The key prefix selects the environment: sk_test_... (staging) or sk_live_... (production); a key on the wrong host is refused with 403 Unauthorized Access. Each key is limited to 10 requests per minute (429 beyond that) and, on production, to the IP addresses on your dashboard allowlist when one is configured.
Query Parameters
Page number (1-based).
Items per page.
Look up the single customer with this email address. Case-insensitive.
Look up the single customer with this phone number. Any spelling of the same number matches, so 08012345678 and 2348012345678 both find the same customer and you do not need to send it in the format you created it with. Only the country prefix is interchangeable: a different subscriber number is a different customer.
Response
Paginated customers. When email or phone is sent, a single-row page.