curl --request POST \
--url https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"reason": "Customer requested cancellation"
}
'import requests
url = "https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel"
payload = { "reason": "Customer requested cancellation" }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: 'Customer requested cancellation'})
};
fetch('https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel', 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.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => 'Customer requested cancellation'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel"
payload := strings.NewReader("{\n \"reason\": \"Customer requested cancellation\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"Customer requested cancellation\"\n}")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("X-API-Key", "<api-key>");
request.AddJsonBody("{\n \"reason\": \"Customer requested cancellation\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
Cancel Payment Link
Permanently cancel an active payment link by ID
curl --request POST \
--url https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"reason": "Customer requested cancellation"
}
'import requests
url = "https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel"
payload = { "reason": "Customer requested cancellation" }
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({reason: 'Customer requested cancellation'})
};
fetch('https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel', 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.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'reason' => 'Customer requested cancellation'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel"
payload := strings.NewReader("{\n \"reason\": \"Customer requested cancellation\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"Customer requested cancellation\"\n}")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.sbx.moduluslabs.io/ecom/v1/payment-links/{id}/cancel");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("X-API-Key", "<api-key>");
request.AddJsonBody("{\n \"reason\": \"Customer requested cancellation\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
ACTIVE links can be cancelled.status: "CANCELLED", cancelled_at populated, and cancellation_reason if a reason was provided.Authorizations
API key enabled for the requested payment-link operation and associated with an eligible partner, merchant, or branch account.
Headers
Optional and validated when supplied. Cancel does not currently persist or replay a prior response. Same charset as Create: letters, digits, dot (.), hyphen (-), underscore (_); 8–64 characters.
8 - 64^[A-Za-z0-9._-]{8,64}$Path Parameters
The payment link ID (UUID v7).
Body
Optional reason for cancellation. String, max 500 characters. Returned as cancellation_reason.
500"Customer requested cancellation"
Response
The cancelled payment link
The payment link object returned by all endpoints.
Unique identifier (UUID v7). Use this in API paths and for tracking.
"550e8400-e29b-41d4-a716-446655440000"
Payment-link usage model. ONE_TIME accepts one successful payment; MULTI_USE can accept multiple successful payments.
ONE_TIME, MULTI_USE Reference number of the branch this link belongs to.
"SH-ANG-001"
ISO 4217 currency code.
"PHP"
Payment amount in the currency's smallest unit (for PHP, centavos). 150000 = PHP 1,500.00.
150000
Items the customer is paying for.
Show child attributes
Show child attributes
Merchant-defined description displayed to the customer.
"Order for wireless earbuds"
Current payment-link lifecycle status.
ACTIVE, CONSUMED, EXPIRED, CANCELLED RFC 3339 timestamp. When the link stops accepting payments.
"2026-07-18T00:00:00Z"
The URL to share with customers. Read-only.
"https://pay.sbx.moduluslabs.io/550e8400-e29b-41d4-a716-446655440000"
Maximum number of successful payments allowed. null means unlimited. ONE_TIME links always have a value of 1.
10
Number of successful payments completed so far.
3
Merchant key-value pairs. Max 50 keys, key max 40 Unicode characters, value max 500 Unicode characters, and max 10,000 serialized bytes.
Show child attributes
Show child attributes
RFC 3339 timestamp. When the link was created.
"2026-06-18T10:30:00Z"
RFC 3339 timestamp. When the link was last modified.
"2026-06-18T14:22:00Z"
RFC 3339 timestamp. When the link was cancelled. null if not cancelled.
Reason for cancellation. null if not cancelled.
500Merchant's internal order reference for reconciliation.
100"ORD-2026-0618-001"
Customer redirect destinations for successful, declined, or expired outcomes. null when no redirects are configured.
Show child attributes
Show child attributes
Was this page helpful?