curl --request POST \
--url https://api.sbx.moduluslabs.io/ecom/v1/payment-links \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"merchant_branch_reference_number": "SH-ANG-001",
"type": "MULTI_USE",
"currency": "PHP",
"amount": 150000,
"line_items": [
{
"sku": "PROD-001",
"name": "Wireless Earbuds",
"unit_price": 75000,
"quantity": 2,
"metadata": {
"color": "black"
}
}
],
"description": "Order for wireless earbuds",
"order_reference": "ORD-2026-0618-001",
"redirect_urls": {
"success": "https://merchant.com/payment/success",
"declined": "https://merchant.com/payment/declined",
"expired": "https://merchant.com/payment/expired"
},
"expires_at": "2026-07-18T00:00:00Z",
"max_uses": 10,
"metadata": {
"campaign_id": "summer-2026",
"internal_ref": "CRM-4821"
}
}
'import requests
url = "https://api.sbx.moduluslabs.io/ecom/v1/payment-links"
payload = {
"merchant_branch_reference_number": "SH-ANG-001",
"type": "MULTI_USE",
"currency": "PHP",
"amount": 150000,
"line_items": [
{
"sku": "PROD-001",
"name": "Wireless Earbuds",
"unit_price": 75000,
"quantity": 2,
"metadata": { "color": "black" }
}
],
"description": "Order for wireless earbuds",
"order_reference": "ORD-2026-0618-001",
"redirect_urls": {
"success": "https://merchant.com/payment/success",
"declined": "https://merchant.com/payment/declined",
"expired": "https://merchant.com/payment/expired"
},
"expires_at": "2026-07-18T00:00:00Z",
"max_uses": 10,
"metadata": {
"campaign_id": "summer-2026",
"internal_ref": "CRM-4821"
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"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: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
merchant_branch_reference_number: 'SH-ANG-001',
type: 'MULTI_USE',
currency: 'PHP',
amount: 150000,
line_items: [
{
sku: 'PROD-001',
name: 'Wireless Earbuds',
unit_price: 75000,
quantity: 2,
metadata: {color: 'black'}
}
],
description: 'Order for wireless earbuds',
order_reference: 'ORD-2026-0618-001',
redirect_urls: {
success: 'https://merchant.com/payment/success',
declined: 'https://merchant.com/payment/declined',
expired: 'https://merchant.com/payment/expired'
},
expires_at: '2026-07-18T00:00:00Z',
max_uses: 10,
metadata: {campaign_id: 'summer-2026', internal_ref: 'CRM-4821'}
})
};
fetch('https://api.sbx.moduluslabs.io/ecom/v1/payment-links', 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",
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([
'merchant_branch_reference_number' => 'SH-ANG-001',
'type' => 'MULTI_USE',
'currency' => 'PHP',
'amount' => 150000,
'line_items' => [
[
'sku' => 'PROD-001',
'name' => 'Wireless Earbuds',
'unit_price' => 75000,
'quantity' => 2,
'metadata' => [
'color' => 'black'
]
]
],
'description' => 'Order for wireless earbuds',
'order_reference' => 'ORD-2026-0618-001',
'redirect_urls' => [
'success' => 'https://merchant.com/payment/success',
'declined' => 'https://merchant.com/payment/declined',
'expired' => 'https://merchant.com/payment/expired'
],
'expires_at' => '2026-07-18T00:00:00Z',
'max_uses' => 10,
'metadata' => [
'campaign_id' => 'summer-2026',
'internal_ref' => 'CRM-4821'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"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"
payload := strings.NewReader("{\n \"merchant_branch_reference_number\": \"SH-ANG-001\",\n \"type\": \"MULTI_USE\",\n \"currency\": \"PHP\",\n \"amount\": 150000,\n \"line_items\": [\n {\n \"sku\": \"PROD-001\",\n \"name\": \"Wireless Earbuds\",\n \"unit_price\": 75000,\n \"quantity\": 2,\n \"metadata\": {\n \"color\": \"black\"\n }\n }\n ],\n \"description\": \"Order for wireless earbuds\",\n \"order_reference\": \"ORD-2026-0618-001\",\n \"redirect_urls\": {\n \"success\": \"https://merchant.com/payment/success\",\n \"declined\": \"https://merchant.com/payment/declined\",\n \"expired\": \"https://merchant.com/payment/expired\"\n },\n \"expires_at\": \"2026-07-18T00:00:00Z\",\n \"max_uses\": 10,\n \"metadata\": {\n \"campaign_id\": \"summer-2026\",\n \"internal_ref\": \"CRM-4821\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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")
.header("Idempotency-Key", "<idempotency-key>")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"merchant_branch_reference_number\": \"SH-ANG-001\",\n \"type\": \"MULTI_USE\",\n \"currency\": \"PHP\",\n \"amount\": 150000,\n \"line_items\": [\n {\n \"sku\": \"PROD-001\",\n \"name\": \"Wireless Earbuds\",\n \"unit_price\": 75000,\n \"quantity\": 2,\n \"metadata\": {\n \"color\": \"black\"\n }\n }\n ],\n \"description\": \"Order for wireless earbuds\",\n \"order_reference\": \"ORD-2026-0618-001\",\n \"redirect_urls\": {\n \"success\": \"https://merchant.com/payment/success\",\n \"declined\": \"https://merchant.com/payment/declined\",\n \"expired\": \"https://merchant.com/payment/expired\"\n },\n \"expires_at\": \"2026-07-18T00:00:00Z\",\n \"max_uses\": 10,\n \"metadata\": {\n \"campaign_id\": \"summer-2026\",\n \"internal_ref\": \"CRM-4821\"\n }\n}")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.sbx.moduluslabs.io/ecom/v1/payment-links");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Idempotency-Key", "<idempotency-key>");
request.AddHeader("X-API-Key", "<api-key>");
request.AddJsonBody("{\n \"merchant_branch_reference_number\": \"SH-ANG-001\",\n \"type\": \"MULTI_USE\",\n \"currency\": \"PHP\",\n \"amount\": 150000,\n \"line_items\": [\n {\n \"sku\": \"PROD-001\",\n \"name\": \"Wireless Earbuds\",\n \"unit_price\": 75000,\n \"quantity\": 2,\n \"metadata\": {\n \"color\": \"black\"\n }\n }\n ],\n \"description\": \"Order for wireless earbuds\",\n \"order_reference\": \"ORD-2026-0618-001\",\n \"redirect_urls\": {\n \"success\": \"https://merchant.com/payment/success\",\n \"declined\": \"https://merchant.com/payment/declined\",\n \"expired\": \"https://merchant.com/payment/expired\"\n },\n \"expires_at\": \"2026-07-18T00:00:00Z\",\n \"max_uses\": 10,\n \"metadata\": {\n \"campaign_id\": \"summer-2026\",\n \"internal_ref\": \"CRM-4821\"\n }\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "ONE_TIME",
"merchant_branch_reference_number": "SH-ANG-001",
"currency": "PHP",
"amount": 150000,
"line_items": [
{
"sku": "PROD-001",
"name": "Wireless Earbuds",
"unit_price": 75000,
"quantity": 2,
"metadata": {}
}
],
"description": "Order for wireless earbuds",
"status": "ACTIVE",
"expires_at": "2026-07-18T00:00:00Z",
"url": "https://pay.sbx.moduluslabs.io/550e8400-e29b-41d4-a716-446655440000",
"max_uses": 10,
"successful_payment_count": 3,
"metadata": {},
"created_at": "2026-06-18T10:30:00Z",
"updated_at": "2026-06-18T14:22:00Z",
"cancelled_at": "2023-11-07T05:31:56Z",
"cancellation_reason": "<string>",
"order_reference": "ORD-2026-0618-001",
"redirect_urls": {
"success": "https://merchant.com/payment/success",
"declined": "https://merchant.com/payment/declined",
"expired": "https://merchant.com/payment/expired"
}
}Create Payment Link
Create a hosted payment link and return the URL to share with customers
curl --request POST \
--url https://api.sbx.moduluslabs.io/ecom/v1/payment-links \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--header 'X-API-Key: <api-key>' \
--data '
{
"merchant_branch_reference_number": "SH-ANG-001",
"type": "MULTI_USE",
"currency": "PHP",
"amount": 150000,
"line_items": [
{
"sku": "PROD-001",
"name": "Wireless Earbuds",
"unit_price": 75000,
"quantity": 2,
"metadata": {
"color": "black"
}
}
],
"description": "Order for wireless earbuds",
"order_reference": "ORD-2026-0618-001",
"redirect_urls": {
"success": "https://merchant.com/payment/success",
"declined": "https://merchant.com/payment/declined",
"expired": "https://merchant.com/payment/expired"
},
"expires_at": "2026-07-18T00:00:00Z",
"max_uses": 10,
"metadata": {
"campaign_id": "summer-2026",
"internal_ref": "CRM-4821"
}
}
'import requests
url = "https://api.sbx.moduluslabs.io/ecom/v1/payment-links"
payload = {
"merchant_branch_reference_number": "SH-ANG-001",
"type": "MULTI_USE",
"currency": "PHP",
"amount": 150000,
"line_items": [
{
"sku": "PROD-001",
"name": "Wireless Earbuds",
"unit_price": 75000,
"quantity": 2,
"metadata": { "color": "black" }
}
],
"description": "Order for wireless earbuds",
"order_reference": "ORD-2026-0618-001",
"redirect_urls": {
"success": "https://merchant.com/payment/success",
"declined": "https://merchant.com/payment/declined",
"expired": "https://merchant.com/payment/expired"
},
"expires_at": "2026-07-18T00:00:00Z",
"max_uses": 10,
"metadata": {
"campaign_id": "summer-2026",
"internal_ref": "CRM-4821"
}
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"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: {
'Idempotency-Key': '<idempotency-key>',
'X-API-Key': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
merchant_branch_reference_number: 'SH-ANG-001',
type: 'MULTI_USE',
currency: 'PHP',
amount: 150000,
line_items: [
{
sku: 'PROD-001',
name: 'Wireless Earbuds',
unit_price: 75000,
quantity: 2,
metadata: {color: 'black'}
}
],
description: 'Order for wireless earbuds',
order_reference: 'ORD-2026-0618-001',
redirect_urls: {
success: 'https://merchant.com/payment/success',
declined: 'https://merchant.com/payment/declined',
expired: 'https://merchant.com/payment/expired'
},
expires_at: '2026-07-18T00:00:00Z',
max_uses: 10,
metadata: {campaign_id: 'summer-2026', internal_ref: 'CRM-4821'}
})
};
fetch('https://api.sbx.moduluslabs.io/ecom/v1/payment-links', 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",
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([
'merchant_branch_reference_number' => 'SH-ANG-001',
'type' => 'MULTI_USE',
'currency' => 'PHP',
'amount' => 150000,
'line_items' => [
[
'sku' => 'PROD-001',
'name' => 'Wireless Earbuds',
'unit_price' => 75000,
'quantity' => 2,
'metadata' => [
'color' => 'black'
]
]
],
'description' => 'Order for wireless earbuds',
'order_reference' => 'ORD-2026-0618-001',
'redirect_urls' => [
'success' => 'https://merchant.com/payment/success',
'declined' => 'https://merchant.com/payment/declined',
'expired' => 'https://merchant.com/payment/expired'
],
'expires_at' => '2026-07-18T00:00:00Z',
'max_uses' => 10,
'metadata' => [
'campaign_id' => 'summer-2026',
'internal_ref' => 'CRM-4821'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>",
"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"
payload := strings.NewReader("{\n \"merchant_branch_reference_number\": \"SH-ANG-001\",\n \"type\": \"MULTI_USE\",\n \"currency\": \"PHP\",\n \"amount\": 150000,\n \"line_items\": [\n {\n \"sku\": \"PROD-001\",\n \"name\": \"Wireless Earbuds\",\n \"unit_price\": 75000,\n \"quantity\": 2,\n \"metadata\": {\n \"color\": \"black\"\n }\n }\n ],\n \"description\": \"Order for wireless earbuds\",\n \"order_reference\": \"ORD-2026-0618-001\",\n \"redirect_urls\": {\n \"success\": \"https://merchant.com/payment/success\",\n \"declined\": \"https://merchant.com/payment/declined\",\n \"expired\": \"https://merchant.com/payment/expired\"\n },\n \"expires_at\": \"2026-07-18T00:00:00Z\",\n \"max_uses\": 10,\n \"metadata\": {\n \"campaign_id\": \"summer-2026\",\n \"internal_ref\": \"CRM-4821\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
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")
.header("Idempotency-Key", "<idempotency-key>")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"merchant_branch_reference_number\": \"SH-ANG-001\",\n \"type\": \"MULTI_USE\",\n \"currency\": \"PHP\",\n \"amount\": 150000,\n \"line_items\": [\n {\n \"sku\": \"PROD-001\",\n \"name\": \"Wireless Earbuds\",\n \"unit_price\": 75000,\n \"quantity\": 2,\n \"metadata\": {\n \"color\": \"black\"\n }\n }\n ],\n \"description\": \"Order for wireless earbuds\",\n \"order_reference\": \"ORD-2026-0618-001\",\n \"redirect_urls\": {\n \"success\": \"https://merchant.com/payment/success\",\n \"declined\": \"https://merchant.com/payment/declined\",\n \"expired\": \"https://merchant.com/payment/expired\"\n },\n \"expires_at\": \"2026-07-18T00:00:00Z\",\n \"max_uses\": 10,\n \"metadata\": {\n \"campaign_id\": \"summer-2026\",\n \"internal_ref\": \"CRM-4821\"\n }\n}")
.asString();using RestSharp;
var options = new RestClientOptions("https://api.sbx.moduluslabs.io/ecom/v1/payment-links");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Idempotency-Key", "<idempotency-key>");
request.AddHeader("X-API-Key", "<api-key>");
request.AddJsonBody("{\n \"merchant_branch_reference_number\": \"SH-ANG-001\",\n \"type\": \"MULTI_USE\",\n \"currency\": \"PHP\",\n \"amount\": 150000,\n \"line_items\": [\n {\n \"sku\": \"PROD-001\",\n \"name\": \"Wireless Earbuds\",\n \"unit_price\": 75000,\n \"quantity\": 2,\n \"metadata\": {\n \"color\": \"black\"\n }\n }\n ],\n \"description\": \"Order for wireless earbuds\",\n \"order_reference\": \"ORD-2026-0618-001\",\n \"redirect_urls\": {\n \"success\": \"https://merchant.com/payment/success\",\n \"declined\": \"https://merchant.com/payment/declined\",\n \"expired\": \"https://merchant.com/payment/expired\"\n },\n \"expires_at\": \"2026-07-18T00:00:00Z\",\n \"max_uses\": 10,\n \"metadata\": {\n \"campaign_id\": \"summer-2026\",\n \"internal_ref\": \"CRM-4821\"\n }\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "ONE_TIME",
"merchant_branch_reference_number": "SH-ANG-001",
"currency": "PHP",
"amount": 150000,
"line_items": [
{
"sku": "PROD-001",
"name": "Wireless Earbuds",
"unit_price": 75000,
"quantity": 2,
"metadata": {}
}
],
"description": "Order for wireless earbuds",
"status": "ACTIVE",
"expires_at": "2026-07-18T00:00:00Z",
"url": "https://pay.sbx.moduluslabs.io/550e8400-e29b-41d4-a716-446655440000",
"max_uses": 10,
"successful_payment_count": 3,
"metadata": {},
"created_at": "2026-06-18T10:30:00Z",
"updated_at": "2026-06-18T14:22:00Z",
"cancelled_at": "2023-11-07T05:31:56Z",
"cancellation_reason": "<string>",
"order_reference": "ORD-2026-0618-001",
"redirect_urls": {
"success": "https://merchant.com/payment/success",
"declined": "https://merchant.com/payment/declined",
"expired": "https://merchant.com/payment/expired"
}
}201 Created with the payment link object. Share the returned url with your customer to collect payment.merchant_branch_reference_number is required when your API key is scoped to a partner or merchant. Branch-scoped keys can omit it - the link is created against that branch automatically.Authorizations
API key enabled for the requested payment-link operation and associated with an eligible partner, merchant, or branch account.
Headers
Unique client-generated identifier to prevent duplicate operations. Allowed characters: letters, digits, dot (.), hyphen (-), and underscore (_); 8–64 characters. Reusing the same key with an identical body returns the original response; reusing it with a different body returns 409 IDEMPOTENCY_MISMATCH. Keys expire after 24 hours.
8 - 64^[A-Za-z0-9._-]{8,64}$Body
Usage model for the new link. ONE_TIME accepts one successful payment; MULTI_USE can accept multiple successful payments.
ONE_TIME, MULTI_USE ISO 4217 currency code (for example, PHP). Must be a currency enabled for your account.
3^[A-Z]{3}$Payment amount in the currency's smallest unit (for PHP, centavos). 150000 = PHP 1,500.00. Integer, range 1 to 99,999,999.
1 <= x <= 99999999150000
RFC 3339 timestamp when the link expires. Required and must be in the future.
"2026-07-18T00:00:00Z"
Branch this link belongs to. Required for partner- and merchant-scoped keys; branch-scoped keys can omit it.
1000 to 100 line items. When supplied, amount must equal the sum of unit_price × quantity; an empty array creates an amount-only link.
100Show child attributes
Show child attributes
Maximum successful payments allowed. null means unlimited. ONE_TIME links are always 1. Integer >= 1.
x >= 110
Optional human-readable label. Omit it or send null when no label is needed. When supplied, it must contain at least one non-whitespace character and be at most 500 characters.
1 - 500Your own reference for reconciliation. Max 100 characters.
100URLs to redirect the customer after payment. Each URL must use HTTPS.
Show child attributes
Show child attributes
Free-form string key/value pairs. Max 50 keys; each key <=40 characters, each value <=500 characters; <=10,000 serialized bytes.
Show child attributes
Show child attributes
Response
Payment link created
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?