Webhooks
Transacty sends webhook notifications to your server for pay-in and payout state changes.
Configure your webhook URL
/v1/me/webhookRequest fields
| Field | Type | Required | Description |
|---|---|---|---|
webhookUrl | string | null | Yes | Merchant callback URL, or null to remove. Production URLs must be HTTPS. |
Set URL
{ "webhookUrl": "https://merchant.example.com/webhooks/transacty" }The response includes a webhookSecret once. Store it securely — it is used to
verify webhook signatures and is not shown again.
Events sent by Transacty
payin.completedpayin.failedpayout.completedpayout.failed
The same webhook URL serves all rails (Bangladesh, Brazil, India, Europe, Nigeria, PYUSD).
For PYUSD completed: currency is PYUSD-USDC, not USDC. paidAmount is the
net credited to that pocket.
For Nigeria completed: currency is NGN.
Webhook headers
Each webhook request includes:
X-Transacty-Webhook-Signature— HMAC-SHA256 of the raw body withwebhookSecretX-Transacty-Event— the event type
Webhook payload example
{
"event": "payin.completed",
"transactionId": "uuid",
"status": "success",
"amount": "25.00",
"paidAmount": "24.50",
"currency": "PYUSD-USDC",
"platformOrderId": "…",
"timestamp": "2026-08-31T10:00:00.000Z"
}For failed events, paidAmount may be absent.
Nigeria VA credits use the same event names with "currency": "NGN":
{
"event": "payin.completed",
"transactionId": "uuid",
"status": "success",
"amount": "5000.00",
"paidAmount": "5000.00",
"currency": "NGN",
"platformOrderId": "…",
"timestamp": "2026-08-31T10:00:00.000Z"
}Signature verification
Use webhookSecret to verify the payload before processing:
Read the raw body
Read the raw request body exactly as received.
Compute the signature
Compute HMAC-SHA256(rawBody, webhookSecret).
Compare
Compare it with X-Transacty-Webhook-Signature.
Reject mismatches
Reject the request if the signature does not match.
Best practices
- Process webhooks idempotently using
transactionId. - Treat the webhook as the source of asynchronous state updates.
- If a webhook is delayed, poll the rail’s status endpoint (
GET /v1/payins/:id,GET /v1/payouts/:id,GET /v1/ngn/payouts/:transactionId, or the region-specific status path).