Skip to main content
POST
/
api
/
v1
/
webhooks
/
trigger
Afriex SDK
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": "<string>"
}
{
"code": "<string>",
"error": "<string>",
"details": {
"errorMessage": "<string>",
"friendlyMessage": "<string>",
"data": {
"customerId": "<string>"
}
}
}
Fire a real signed webhook from sandbox using an existing entity as the payload. Use this to test your webhook handler without having to manufacture the underlying activity.
This endpoint is only available in the sandbox/staging environment and returns a 403 Forbidden response in production.
To test transaction webhooks end to end, you can also let a sandbox transaction settle on its own: it reaches a final status within ~1-2 minutes 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

  1. Create or look up an existing entity in sandbox.
  2. Call this endpoint with the matching event name and the entity’s ID.
  3. Afriex delivers a real, signed webhook to your configured callback URL using that entity as the payload.
Because the payload is a real entity, your handler verifies the signature and processes the event exactly the same way it would in production.

What to pass as entityId

Event familyentityId
CUSTOMER.*The customer ID
PAYMENT_METHOD.*The payment method ID
TRANSACTION.*The transaction ID
CHECKOUT_SESSION.*The checkout session ID

Authorizations

x-api-key
string
header
required

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

x-api-version
string

API version in ISO 8601 format (e.g. 2025-12-28). Defaults to latest stable.

Body

application/json
event
enum<string>
required

The webhook event identifier.

Available options:
CUSTOMER.CREATED,
CUSTOMER.UPDATED,
CUSTOMER.DELETED,
PAYMENT_METHOD.CREATED,
PAYMENT_METHOD.UPDATED,
PAYMENT_METHOD.DELETED,
TRANSACTION.CREATED,
TRANSACTION.UPDATED,
CHECKOUT_SESSION.CREATED
entityId
string
required

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).

Example:

"69528240ba52c13b669fb239"

Response

Webhook triggered successfully.

data
object

Details of the queued webhook delivery.