curl --request POST \
--url https://prod-api.pcxpay.com/v1/public/webhooks \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"endpoint_url": "https://yourapp.com/webhooks/pcx",
"events": [
"payment.settled",
"payment.failed"
]
}
'import requests
url = "https://prod-api.pcxpay.com/v1/public/webhooks"
payload = {
"endpoint_url": "https://yourapp.com/webhooks/pcx",
"events": ["payment.settled", "payment.failed"]
}
headers = {
"Authorization": "<authorization>",
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: '<authorization>',
'X-Api-Key': '<x-api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
endpoint_url: 'https://yourapp.com/webhooks/pcx',
events: ['payment.settled', 'payment.failed']
})
};
fetch('https://prod-api.pcxpay.com/v1/public/webhooks', 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://prod-api.pcxpay.com/v1/public/webhooks",
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([
'endpoint_url' => 'https://yourapp.com/webhooks/pcx',
'events' => [
'payment.settled',
'payment.failed'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json",
"X-Api-Key: <x-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://prod-api.pcxpay.com/v1/public/webhooks"
payload := strings.NewReader("{\n \"endpoint_url\": \"https://yourapp.com/webhooks/pcx\",\n \"events\": [\n \"payment.settled\",\n \"payment.failed\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("X-Api-Key", "<x-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://prod-api.pcxpay.com/v1/public/webhooks")
.header("Authorization", "<authorization>")
.header("X-Api-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"endpoint_url\": \"https://yourapp.com/webhooks/pcx\",\n \"events\": [\n \"payment.settled\",\n \"payment.failed\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod-api.pcxpay.com/v1/public/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["X-Api-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"endpoint_url\": \"https://yourapp.com/webhooks/pcx\",\n \"events\": [\n \"payment.settled\",\n \"payment.failed\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "<string>",
"data": {
"webhook_id": "<string>",
"org_id": "<string>",
"endpoint_url": "<string>",
"secret_key": "<string>",
"events": [
"<string>"
],
"status": "active",
"created_at": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"status": "error"
}{
"message": "<string>",
"status": "error"
}Register webhook
Registers an HTTPS endpoint to receive event notifications. PCX will POST events to this URL as they occur. The organisation identity is derived from your API key. The response includes the secret_key used to sign every delivery — it is returned only once, so store it securely.
curl --request POST \
--url https://prod-api.pcxpay.com/v1/public/webhooks \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"endpoint_url": "https://yourapp.com/webhooks/pcx",
"events": [
"payment.settled",
"payment.failed"
]
}
'import requests
url = "https://prod-api.pcxpay.com/v1/public/webhooks"
payload = {
"endpoint_url": "https://yourapp.com/webhooks/pcx",
"events": ["payment.settled", "payment.failed"]
}
headers = {
"Authorization": "<authorization>",
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: '<authorization>',
'X-Api-Key': '<x-api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
endpoint_url: 'https://yourapp.com/webhooks/pcx',
events: ['payment.settled', 'payment.failed']
})
};
fetch('https://prod-api.pcxpay.com/v1/public/webhooks', 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://prod-api.pcxpay.com/v1/public/webhooks",
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([
'endpoint_url' => 'https://yourapp.com/webhooks/pcx',
'events' => [
'payment.settled',
'payment.failed'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"Content-Type: application/json",
"X-Api-Key: <x-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://prod-api.pcxpay.com/v1/public/webhooks"
payload := strings.NewReader("{\n \"endpoint_url\": \"https://yourapp.com/webhooks/pcx\",\n \"events\": [\n \"payment.settled\",\n \"payment.failed\"\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
req.Header.Add("X-Api-Key", "<x-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://prod-api.pcxpay.com/v1/public/webhooks")
.header("Authorization", "<authorization>")
.header("X-Api-Key", "<x-api-key>")
.header("Content-Type", "application/json")
.body("{\n \"endpoint_url\": \"https://yourapp.com/webhooks/pcx\",\n \"events\": [\n \"payment.settled\",\n \"payment.failed\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://prod-api.pcxpay.com/v1/public/webhooks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["X-Api-Key"] = '<x-api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"endpoint_url\": \"https://yourapp.com/webhooks/pcx\",\n \"events\": [\n \"payment.settled\",\n \"payment.failed\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"status": "success",
"message": "<string>",
"data": {
"webhook_id": "<string>",
"org_id": "<string>",
"endpoint_url": "<string>",
"secret_key": "<string>",
"events": [
"<string>"
],
"status": "active",
"created_at": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"status": "error"
}{
"message": "<string>",
"status": "error"
}Headers
Bearer JWT for user-facing flows (Bearer eyJraWQ...), or the literal string NONE when authenticating via API key.
"Bearer eyJraWQ..."
API key for server-to-server flows, or the literal string NONE when authenticating via JWT.
"pcx_abc123_xxxx"
Body
HTTPS URL that PCX will POST events to. Must be publicly reachable and return a 2xx response to acknowledge receipt.
"https://yourapp.com/webhooks/pcx"
Event types to subscribe to. Omit or send an empty array to receive all event types. See GET /public/webhooks/events/catalogue for the full list.
["payment.settled", "payment.failed"]