curl --request POST \
--url https://staging.api.payluk.ng/v1/payment/escrow \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'customer-id: <customer-id>' \
--data '
{
"amount": 10503.75,
"reference": "ESC_REF_98765",
"transactionType": "escrow",
"gateway": "wallet",
"escrowDetails": {
"escrowId": "665f1b2c9a1e4d0012ab3c10"
}
}
'{
"status": 200,
"message": "Payment intent verified successfully",
"data": {
"id": "6a3cdafd734e96016b22736b",
"amount": 1030,
"reference": "rthyjyutj",
"fee": 0,
"transactionType": "escrow",
"currency": "NGN",
"transferDetails": null,
"cardId": null,
"walletDetails": null,
"blockchainDetails": null,
"withdrawalDetails": null,
"escrowDetails": {
"beneficiary": {
"name": "firsty fhgvj",
"phone": "09022331122"
},
"description": "details",
"amount": 1000,
"fee": 30,
"paymentToken": "PY_TIrNY1CD3836",
"purpose": "multi-purpose escrow item",
"channel": "API",
"callbackUrl": null
},
"metadata": null,
"status": "success",
"creditType": "debit",
"createdAt": "2026-06-25T07:38:38.003Z",
"updatedAt": "2026-06-25T07:38:39.329Z"
}
}{
"status": 400,
"message": "You can only buy to your merchant's escrow",
"data": {}
}{
"status": 401,
"message": "Your account has been disabled from buying, please contact support",
"data": {}
}{
"status": 429,
"message": "Too many request"
}Pay escrow (buy)
Fund an escrow from the buyer’s Payluk wallet or a saved card. Works for standard and milestone escrows (a milestone escrow is funded in full here). escrowDetails.escrowId may be an array to fund several escrows in one call. Requires the customer-id header (the buyer).
amount must equal what the buyer owes: the escrow amount, plus the buyer’s share of fee (all of it when whoPays is buyer, half when both, none when seller), plus the escrow’s additionalFee. Anything else is rejected with Amount mismatch, so read the escrow first rather than caching a quote. The escrow must be AWAITING_PAYMENT (Escrow is not in a valid state for checkout otherwise), and on live keys the buyer may not be the seller.
Gateways. wallet debits the buyer’s main balance (Insufficient balance if it does not cover the total). card charges a saved card and needs cardId from List customer cards; card payments are only available to Nigerian customers. Crypto (cNGN) collection is not available on this route: use the hosted Checkout SDK, which quotes the buyer a deposit address.
The call both creates and settles the payment, so a successful response means the escrow is now OPENED. Verifying the same reference again with Verify payment is idempotent.
curl --request POST \
--url https://staging.api.payluk.ng/v1/payment/escrow \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'customer-id: <customer-id>' \
--data '
{
"amount": 10503.75,
"reference": "ESC_REF_98765",
"transactionType": "escrow",
"gateway": "wallet",
"escrowDetails": {
"escrowId": "665f1b2c9a1e4d0012ab3c10"
}
}
'{
"status": 200,
"message": "Payment intent verified successfully",
"data": {
"id": "6a3cdafd734e96016b22736b",
"amount": 1030,
"reference": "rthyjyutj",
"fee": 0,
"transactionType": "escrow",
"currency": "NGN",
"transferDetails": null,
"cardId": null,
"walletDetails": null,
"blockchainDetails": null,
"withdrawalDetails": null,
"escrowDetails": {
"beneficiary": {
"name": "firsty fhgvj",
"phone": "09022331122"
},
"description": "details",
"amount": 1000,
"fee": 30,
"paymentToken": "PY_TIrNY1CD3836",
"purpose": "multi-purpose escrow item",
"channel": "API",
"callbackUrl": null
},
"metadata": null,
"status": "success",
"creditType": "debit",
"createdAt": "2026-06-25T07:38:38.003Z",
"updatedAt": "2026-06-25T07:38:39.329Z"
}
}{
"status": 400,
"message": "You can only buy to your merchant's escrow",
"data": {}
}{
"status": 401,
"message": "Your account has been disabled from buying, please contact support",
"data": {}
}{
"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.
Headers
The merchant customer this request acts on behalf of.
Body
Total amount to charge the buyer. Must equal the escrow amount plus the buyer's fee share plus the escrow's additionalFee, otherwise the request is rejected with "Amount mismatch". Read the escrow first if you are unsure: amount, fee, whoPays and additionalFee are all on it.
x >= 100010503.75
Your unique reference for this payment.
"ESC_REF_98765"
escrow "escrow"
Show child attributes
Show child attributes
Funding source. wallet debits the buyer's Payluk wallet; card charges the saved card named in cardId. Defaults to card, so send wallet explicitly for wallet payments.
wallet, card "wallet"
Saved card identifier from GET /v1/cards. Required when gateway is card.
Optional. Defaults to NGN.
Response
Escrow funded.