const result = await afriex.webhooks.triggerTestWebhook({
event: "TRANSACTION.UPDATED",
resourceId: "transaction-id",
});
console.log(result); // { success: true, message: "..." }curl --request POST \
--url https://sandbox.api.afriex.com/api/v1/webhooks/trigger \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"event": "TRANSACTION.UPDATED",
"entityId": "6952826eba52c13b669fb263"
}
'import requests
url = "https://sandbox.api.afriex.com/api/v1/webhooks/trigger"
payload = {
"event": "TRANSACTION.UPDATED",
"entityId": "6952826eba52c13b669fb263"
}
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({event: 'TRANSACTION.UPDATED', entityId: '6952826eba52c13b669fb263'})
};
fetch('https://sandbox.api.afriex.com/api/v1/webhooks/trigger', 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://sandbox.api.afriex.com/api/v1/webhooks/trigger",
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([
'event' => 'TRANSACTION.UPDATED',
'entityId' => '6952826eba52c13b669fb263'
]),
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://sandbox.api.afriex.com/api/v1/webhooks/trigger"
payload := strings.NewReader("{\n \"event\": \"TRANSACTION.UPDATED\",\n \"entityId\": \"6952826eba52c13b669fb263\"\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://sandbox.api.afriex.com/api/v1/webhooks/trigger")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"event\": \"TRANSACTION.UPDATED\",\n \"entityId\": \"6952826eba52c13b669fb263\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.afriex.com/api/v1/webhooks/trigger")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"event\": \"TRANSACTION.UPDATED\",\n \"entityId\": \"6952826eba52c13b669fb263\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"queued": true,
"event": "TRANSACTION.UPDATED",
"entityId": "6952826eba52c13b669fb263",
"deliveryUrl": "https://merchant.example.com/webhooks"
}
}{
"code": "<string>",
"error": "<string>",
"details": {
"errorMessage": "<string>",
"friendlyMessage": "<string>",
"data": {
"customerId": "<string>"
}
}
}{
"code": "<string>",
"error": "<string>",
"details": {
"errorMessage": "<string>",
"friendlyMessage": "<string>",
"data": {
"customerId": "<string>"
}
}
}{
"message": "Not allowed"
}{
"code": "<string>",
"error": "<string>",
"details": {
"errorMessage": "<string>",
"friendlyMessage": "<string>",
"data": {
"customerId": "<string>"
}
}
}Trigger Test Webhook
Fires a real signed webhook to the business’s configured callback URL using a real entity (customer, payment method, transaction, or checkout session) as the payload. Useful for testing webhook handlers in sandbox without manufacturing the underlying activity. This endpoint is only available in the sandbox/staging environment and will return a 403 Forbidden response in production.
const result = await afriex.webhooks.triggerTestWebhook({
event: "TRANSACTION.UPDATED",
resourceId: "transaction-id",
});
console.log(result); // { success: true, message: "..." }curl --request POST \
--url https://sandbox.api.afriex.com/api/v1/webhooks/trigger \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"event": "TRANSACTION.UPDATED",
"entityId": "6952826eba52c13b669fb263"
}
'import requests
url = "https://sandbox.api.afriex.com/api/v1/webhooks/trigger"
payload = {
"event": "TRANSACTION.UPDATED",
"entityId": "6952826eba52c13b669fb263"
}
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({event: 'TRANSACTION.UPDATED', entityId: '6952826eba52c13b669fb263'})
};
fetch('https://sandbox.api.afriex.com/api/v1/webhooks/trigger', 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://sandbox.api.afriex.com/api/v1/webhooks/trigger",
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([
'event' => 'TRANSACTION.UPDATED',
'entityId' => '6952826eba52c13b669fb263'
]),
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://sandbox.api.afriex.com/api/v1/webhooks/trigger"
payload := strings.NewReader("{\n \"event\": \"TRANSACTION.UPDATED\",\n \"entityId\": \"6952826eba52c13b669fb263\"\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://sandbox.api.afriex.com/api/v1/webhooks/trigger")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"event\": \"TRANSACTION.UPDATED\",\n \"entityId\": \"6952826eba52c13b669fb263\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.afriex.com/api/v1/webhooks/trigger")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"event\": \"TRANSACTION.UPDATED\",\n \"entityId\": \"6952826eba52c13b669fb263\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"queued": true,
"event": "TRANSACTION.UPDATED",
"entityId": "6952826eba52c13b669fb263",
"deliveryUrl": "https://merchant.example.com/webhooks"
}
}{
"code": "<string>",
"error": "<string>",
"details": {
"errorMessage": "<string>",
"friendlyMessage": "<string>",
"data": {
"customerId": "<string>"
}
}
}{
"code": "<string>",
"error": "<string>",
"details": {
"errorMessage": "<string>",
"friendlyMessage": "<string>",
"data": {
"customerId": "<string>"
}
}
}{
"message": "Not allowed"
}{
"code": "<string>",
"error": "<string>",
"details": {
"errorMessage": "<string>",
"friendlyMessage": "<string>",
"data": {
"customerId": "<string>"
}
}
}403 Forbidden response in production.meta.reference contains SIMULATE_INSTANT) and sends TRANSACTION.UPDATED. Set meta.reference to a value containing fail to test a FAILED outcome, or any other value for SUCCESS. See Testing transaction outcomes in sandbox.How it works
- Create or look up an existing entity in sandbox.
- Call this endpoint with the matching
eventname and the entity’s ID. - Afriex delivers a real, signed webhook to your configured callback URL using that entity as the payload.
What to pass as entityId
| Event family | entityId |
|---|---|
CUSTOMER.* | The customer ID |
PAYMENT_METHOD.* | The payment method ID |
TRANSACTION.* | The transaction ID |
CHECKOUT_SESSION.* | The checkout session ID |
Authorizations
Static business API key issued from the dashboard. A business can provision multiple API keys, each scoped to a configurable set of permissions (e.g. read transactions, create deposits, etc). Permissions are chosen per key at creation time in the dashboard and may be revoked by deleting the key. Requests made with a key that does not include the permission required by the target endpoint will be rejected with a 403 Forbidden response; an unrecognised, malformed or revoked key returns 401 Unauthorized. Manage your keys and their permissions under Developer → API keys in the dashboard.
Headers
API version in ISO 8601 format (e.g. 2025-12-28). Defaults to latest stable.
Body
The webhook event identifier.
CUSTOMER.CREATED, CUSTOMER.UPDATED, CUSTOMER.DELETED, PAYMENT_METHOD.CREATED, PAYMENT_METHOD.UPDATED, PAYMENT_METHOD.DELETED, TRANSACTION.CREATED, TRANSACTION.UPDATED, CHECKOUT_SESSION.CREATED The identifier of the entity to send in the webhook payload. Must be a UUID v4 when event is CHECKOUT_SESSION.CREATED; otherwise must be the 24-character hexadecimal id of the relevant customer, payment method, or transaction (the id returned when it was created).
"69528240ba52c13b669fb239"
Response
Webhook triggered successfully.
Details of the queued webhook delivery.
Show child attributes
Show child attributes
