curl --request PUT \
--url https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form amount=150000 \
--form 'purpose=MacBook Pro 14" (updated)' \
--form whoPays=both \
--form maxDelivery=3 \
--form deliveryTimeline=days \
--form imageUrl='@example-file' \
--form 'description=<string>' \
--form totalQuantity=2 \
--form 'categoryId=<string>'import requests
url = "https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}"
files = { "imageUrl": ("example-file", open("example-file", "rb")) }
payload = {
"amount": "150000",
"purpose": "MacBook Pro 14\" (updated)",
"whoPays": "both",
"maxDelivery": "3",
"deliveryTimeline": "days",
"description": "<string>",
"totalQuantity": "2",
"categoryId": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.put(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('amount', '150000');
form.append('purpose', 'MacBook Pro 14" (updated)');
form.append('whoPays', 'both');
form.append('maxDelivery', '3');
form.append('deliveryTimeline', 'days');
form.append('imageUrl', '<string>');
form.append('description', '<string>');
form.append('totalQuantity', '2');
form.append('categoryId', '<string>');
const options = {method: 'PUT', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}', 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/edit/{paymentToken}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"amount\"\r\n\r\n150000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nMacBook Pro 14\" (updated)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"whoPays\"\r\n\r\nboth\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"maxDelivery\"\r\n\r\n3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"deliveryTimeline\"\r\n\r\ndays\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"imageUrl\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"totalQuantity\"\r\n\r\n2\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"amount\"\r\n\r\n150000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nMacBook Pro 14\" (updated)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"whoPays\"\r\n\r\nboth\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"maxDelivery\"\r\n\r\n3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"deliveryTimeline\"\r\n\r\ndays\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"imageUrl\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"totalQuantity\"\r\n\r\n2\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("PUT", url, payload)
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.put("https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"amount\"\r\n\r\n150000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nMacBook Pro 14\" (updated)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"whoPays\"\r\n\r\nboth\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"maxDelivery\"\r\n\r\n3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"deliveryTimeline\"\r\n\r\ndays\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"imageUrl\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"totalQuantity\"\r\n\r\n2\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"amount\"\r\n\r\n150000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nMacBook Pro 14\" (updated)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"whoPays\"\r\n\r\nboth\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"maxDelivery\"\r\n\r\n3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"deliveryTimeline\"\r\n\r\ndays\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"imageUrl\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"totalQuantity\"\r\n\r\n2\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Escrow updated successfully",
"data": {
"id": "665f1b2c9a1e4d0012ab3c10",
"amount": 160000,
"purpose": "MacBook Pro 14\" (updated)",
"fee": 4000,
"paymentToken": "PY_8AB12C9D3045",
"state": "AWAITING_PAYMENT",
"status": "PENDING",
"settlementType": "STANDARD",
"updatedAt": "2026-06-22T10:20:00.000Z"
}
}Edit escrow
Replaces the escrow’s details. Editable only while the escrow is AWAITING_PAYMENT, and only by the seller (send the seller’s customer-id, or omit it if your business account is the seller). The body is validated exactly like creation, so amount, purpose, whoPays, maxDelivery and deliveryTimeline are all required even if unchanged. New images are appended to the existing ones.
curl --request PUT \
--url https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form amount=150000 \
--form 'purpose=MacBook Pro 14" (updated)' \
--form whoPays=both \
--form maxDelivery=3 \
--form deliveryTimeline=days \
--form imageUrl='@example-file' \
--form 'description=<string>' \
--form totalQuantity=2 \
--form 'categoryId=<string>'import requests
url = "https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}"
files = { "imageUrl": ("example-file", open("example-file", "rb")) }
payload = {
"amount": "150000",
"purpose": "MacBook Pro 14\" (updated)",
"whoPays": "both",
"maxDelivery": "3",
"deliveryTimeline": "days",
"description": "<string>",
"totalQuantity": "2",
"categoryId": "<string>"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.put(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('amount', '150000');
form.append('purpose', 'MacBook Pro 14" (updated)');
form.append('whoPays', 'both');
form.append('maxDelivery', '3');
form.append('deliveryTimeline', 'days');
form.append('imageUrl', '<string>');
form.append('description', '<string>');
form.append('totalQuantity', '2');
form.append('categoryId', '<string>');
const options = {method: 'PUT', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}', 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/edit/{paymentToken}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"amount\"\r\n\r\n150000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nMacBook Pro 14\" (updated)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"whoPays\"\r\n\r\nboth\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"maxDelivery\"\r\n\r\n3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"deliveryTimeline\"\r\n\r\ndays\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"imageUrl\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"totalQuantity\"\r\n\r\n2\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"amount\"\r\n\r\n150000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nMacBook Pro 14\" (updated)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"whoPays\"\r\n\r\nboth\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"maxDelivery\"\r\n\r\n3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"deliveryTimeline\"\r\n\r\ndays\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"imageUrl\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"totalQuantity\"\r\n\r\n2\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("PUT", url, payload)
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.put("https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"amount\"\r\n\r\n150000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nMacBook Pro 14\" (updated)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"whoPays\"\r\n\r\nboth\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"maxDelivery\"\r\n\r\n3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"deliveryTimeline\"\r\n\r\ndays\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"imageUrl\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"totalQuantity\"\r\n\r\n2\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.api.payluk.ng/v1/escrow/edit/{paymentToken}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"amount\"\r\n\r\n150000\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nMacBook Pro 14\" (updated)\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"whoPays\"\r\n\r\nboth\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"maxDelivery\"\r\n\r\n3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"deliveryTimeline\"\r\n\r\ndays\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"imageUrl\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"totalQuantity\"\r\n\r\n2\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"categoryId\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"status": 200,
"message": "Escrow updated successfully",
"data": {
"id": "665f1b2c9a1e4d0012ab3c10",
"amount": 160000,
"purpose": "MacBook Pro 14\" (updated)",
"fee": 4000,
"paymentToken": "PY_8AB12C9D3045",
"state": "AWAITING_PAYMENT",
"status": "PENDING",
"settlementType": "STANDARD",
"updatedAt": "2026-06-22T10:20:00.000Z"
}
}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.
Headers
The merchant customer this request acts on behalf of. Omit it to act as your own business account (only a business-type account can sell on its own behalf).
Path Parameters
The escrow's payment token (e.g. PY_8AB12C9D3045).
Body
Naira with at most two decimal places. Minimum 1000.
x >= 1000150000
"MacBook Pro 14\" (updated)"
buyer, seller, both "both"
1 <= x <= 3653
minutes, hours, days "days"
Additional image(s) to append.
x >= 1