List all customers' disputes
curl --request GET \
--url https://staging.api.payluk.ng/v1/escrow/all-dispute \
--header 'Authorization: Bearer <token>'import requests
url = "https://staging.api.payluk.ng/v1/escrow/all-dispute"
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/escrow/all-dispute', 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/escrow/all-dispute",
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/escrow/all-dispute"
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/escrow/all-dispute")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.api.payluk.ng/v1/escrow/all-dispute")
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": "Dispute fetched successfully",
"data": {
"data": [
{
"id": "6948fb43cb570eeef76285e3",
"amount": 1000,
"purpose": "iPhone 13 Pro Max",
"description": "Black Titanium, White Titanium, Natural Titanium, Desert Titanium\n\nTitanium design\nLatest-generation Ceramic Shield front\nTextured matt glass back",
"whoPays": "buyer",
"imageUrl": [
"https://mediacloud.me/media/bWVkaWEvaW1hZ2VzL29wdGltaXplL3Z0VjhwN0psSzlIMzhEVWxicWpmV1JZdUpuSUZNWlhEdU03UkVmeHEuanBn.jpg"
],
"fee": 15,
"paymentToken": "PY_KrWLqPd90314",
"paidAt": "1766391073",
"status": "DISPUTED",
"state": "OPENED",
"logs": [
"DISPUTED"
],
"channel": "API",
"isSeller": false,
"dispute": [
{
"name": "Ezumah",
"profile": null,
"message": "Item not as described; the seal was broken on arrival",
"proofUrl": "https://mediacloud.me/media/dispute-evidence.jpg",
"type": "buyer",
"createdAt": "2025-12-22 08:20:00"
}
],
"paymentDetails": {
"id": "6948fd20cb570eeef76286a4",
"amount": 1015,
"status": "success",
"reference": "9500364766547485",
"fee": 15,
"transactionType": "escrow",
"currency": "NGN",
"createdAt": "2025-12-22T08:11:12.605Z"
},
"category": null,
"completedAt": null,
"approvedClaimBy": null,
"refundedBy": null,
"maxDelivery": 20,
"deliveryTimeline": "minutes",
"totalQuantity": 1,
"settlementType": "STANDARD",
"milestones": [],
"createdAt": "2025-12-22T08:03:15.124Z",
"updatedAt": "2025-12-22T08:14:49.601Z"
}
],
"pagination": {
"count": 1,
"pages": 1,
"isLastPage": true,
"nextPage": null,
"previousPage": null
}
}
}{
"status": 429,
"message": "Too many request"
}7. Release & resolve: Disputes
List all customers' disputes
Merchant-wide dispute feed. Must not send a customer-id header.
GET
/
v1
/
escrow
/
all-dispute
List all customers' disputes
curl --request GET \
--url https://staging.api.payluk.ng/v1/escrow/all-dispute \
--header 'Authorization: Bearer <token>'import requests
url = "https://staging.api.payluk.ng/v1/escrow/all-dispute"
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/escrow/all-dispute', 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/escrow/all-dispute",
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/escrow/all-dispute"
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/escrow/all-dispute")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.api.payluk.ng/v1/escrow/all-dispute")
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": "Dispute fetched successfully",
"data": {
"data": [
{
"id": "6948fb43cb570eeef76285e3",
"amount": 1000,
"purpose": "iPhone 13 Pro Max",
"description": "Black Titanium, White Titanium, Natural Titanium, Desert Titanium\n\nTitanium design\nLatest-generation Ceramic Shield front\nTextured matt glass back",
"whoPays": "buyer",
"imageUrl": [
"https://mediacloud.me/media/bWVkaWEvaW1hZ2VzL29wdGltaXplL3Z0VjhwN0psSzlIMzhEVWxicWpmV1JZdUpuSUZNWlhEdU03UkVmeHEuanBn.jpg"
],
"fee": 15,
"paymentToken": "PY_KrWLqPd90314",
"paidAt": "1766391073",
"status": "DISPUTED",
"state": "OPENED",
"logs": [
"DISPUTED"
],
"channel": "API",
"isSeller": false,
"dispute": [
{
"name": "Ezumah",
"profile": null,
"message": "Item not as described; the seal was broken on arrival",
"proofUrl": "https://mediacloud.me/media/dispute-evidence.jpg",
"type": "buyer",
"createdAt": "2025-12-22 08:20:00"
}
],
"paymentDetails": {
"id": "6948fd20cb570eeef76286a4",
"amount": 1015,
"status": "success",
"reference": "9500364766547485",
"fee": 15,
"transactionType": "escrow",
"currency": "NGN",
"createdAt": "2025-12-22T08:11:12.605Z"
},
"category": null,
"completedAt": null,
"approvedClaimBy": null,
"refundedBy": null,
"maxDelivery": 20,
"deliveryTimeline": "minutes",
"totalQuantity": 1,
"settlementType": "STANDARD",
"milestones": [],
"createdAt": "2025-12-22T08:03:15.124Z",
"updatedAt": "2025-12-22T08:14:49.601Z"
}
],
"pagination": {
"count": 1,
"pages": 1,
"isLastPage": true,
"nextPage": null,
"previousPage": null
}
}
}{
"status": 429,
"message": "Too many request"
}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.
Filter to the escrow with this payment token.
Only disputes on escrows created on or after this date.
Only disputes on escrows created on or before this date.
Response
Paginated merchant-wide disputes.