Table of contents

Webhooks

Webhooks enable real-time notifications when transaction statuses change.

Overview

The Revio API allows you to:

  • Configure webhook URLs for different event types
  • Receive real-time callbacks when collections or payments change status
  • Test webhook integrations in the sandbox environment

There is no limit to the number of webhooks you can configure.

Callback Types

|Type|Description| |---|---| |`EFT_COLLECTION`|EFT debit order collection status changes| |`DEBICHECK_COLLECTION`|DebiCheck collection status changes| |`DEBICHECK_MANDATE`|DebiCheck mandate status changes| |`EFT_PAYMENT`|EFT payment status changes|

Step 1: Create Callback URL

Register a URL to receive webhook notifications.

Endpoint

POST /v2/clientcallbackurl/

Request

BASH

curl -X POST https://dev.api.revio.co.za/v2/clientcallbackurl/ \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "clientId": 109,
   "url": "https://your-server.com/webhooks/revio",
   "callbackType": "EFT_COLLECTION",
   "callbackVersion": "V2"
 }'

Request Fields

|Field|Type|Required|Description| |---|---|---|---| |`clientId`|integer|Yes|Your client ID (from merchant profile `createdByClient`)| |`url`|string|Yes|HTTPS URL to receive callbacks| |`callbackType`|string|Yes|Event type to subscribe to| |`callbackVersion`|string|Yes|Callback version (`V2` recommended)|

Response

JSON

{
 "id": "callback-url-123",
 "clientId": 109,
 "url": "https://your-server.com/webhooks/revio",
 "callbackType": "EFT_COLLECTION",
 "callbackVersion": "V2"
}

Register Multiple Callback Types

Create separate callback URLs for each event type:

BASH

# EFT Collections
curl -X POST https://dev.api.revio.co.za/v2/clientcallbackurl/ \
 -d '{"clientId": 109, "url": "https://...", "callbackType": "EFT_COLLECTION", "callbackVersion": "V2"}'

# DebiCheck Collections
curl -X POST https://dev.api.revio.co.za/v2/clientcallbackurl/ \
 -d '{"clientId": 109, "url": "https://...", "callbackType": "DEBICHECK_COLLECTION", "callbackVersion": "V2"}'

# DebiCheck Mandates
curl -X POST https://dev.api.revio.co.za/v2/clientcallbackurl/ \
 -d '{"clientId": 109, "url": "https://...", "callbackType": "DEBICHECK_MANDATE", "callbackVersion": "V2"}'

# EFT Payments
curl -X POST https://dev.api.revio.co.za/v2/clientcallbackurl/ \
 -d '{"clientId": 109, "url": "https://...", "callbackType": "EFT_PAYMENT", "callbackVersion": "V2"}'

Step 2: Trigger Callback Event

Trigger a callback for a specific collection (useful for re-sending notifications).

Endpoint

POST /v2/callback/collection/eft/{collectionId}/

Request

BASH

curl -X POST https://dev.api.revio.co.za/v2/callback/collection/eft/63d94be3-1faf-428b-89f3-bc5271be8015/ \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "collectionStatus": "UNPAID",
   "callbackVersion": "V2"
 }'

This sends the current collection status to your configured callback URL.

Step 3: Test Callback (Sandbox)

Simulate callback events to test your webhook handler without affecting actual transactions.

Endpoint

POST /v2/callback/test/collection/eft/{collectionId}/

Request

BASH

curl -X POST https://dev.api.revio.co.za/v2/callback/test/collection/eft/63d94be3-1faf-428b-89f3-bc5271be8015/ \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "collectionStatus": "UNPAID",
   "callbackVersion": "V2"
 }'

Request Fields

|Field|Type|Required|Description| |---|---|---|---| |`collectionStatus`|string|Yes|Status to simulate| |`callbackVersion`|string|Yes|Callback version| |`overrideUrl`|string|No|Send to different URL for testing|

Override URL Example

Send test callback to a different URL:

JSON

{
 "overrideUrl": "https://webhook.site/your-test-id",
 "collectionStatus": "COMPLETED",
 "callbackVersion": "V2"
}

Callback Payload

When a status change occurs, Revio sends a POST request to your webhook URL.

EFT Collection Callback

JSON

{
 "id": "63d94be3-1faf-428b-89f3-bc5271be8015",
 "type": "EFT_COLLECTION",
 "status": "COMPLETED",
 "mandateId": "8f4a6b0f-fa9b-4f45-8e19-b75c1a70432a",
 "contractReference": "CONTRACT001",
 "amountCents": 10000,
 "collectionDate": "2024-02-15T00:00:00.000Z",
 "statementId": "stmt_12345",
 "timestamp": "2024-02-15T14:30:00.000Z"
}

DebiCheck Mandate Callback

JSON

{
 "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
 "type": "DEBICHECK_MANDATE",
 "status": "COMPLETED",
 "contractReference": "DC001",
 "authenticationType": "REALTIME",
 "timestamp": "2024-02-15T14:30:00.000Z"
}

DebiCheck Collection Callback

JSON

{
 "id": "coll-123-456-789",
 "type": "DEBICHECK_COLLECTION",
 "status": "COMPLETED",
 "mandateId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
 "amountCents": 10000,
 "timestamp": "2024-02-15T14:30:00.000Z"
}

Handling Webhooks

Webhook Handler Example (Node.js)

JSX

const express = require('express');
const app = express();

app.use(express.json());

app.post('/webhooks/revio', (req, res) => {
 const event = req.body;

 console.log('Received webhook:', event.type, event.status);

 switch (event.type) {
   case 'EFT_COLLECTION':
     handleEftCollection(event);
     break;
   case 'DEBICHECK_COLLECTION':
     handleDebicheckCollection(event);
     break;
   case 'DEBICHECK_MANDATE':
     handleDebicheckMandate(event);
     break;
   case 'EFT_PAYMENT':
     handleEftPayment(event);
     break;
 }

 // Always respond with 200 OK
 res.status(200).send('OK');
});

function handleEftCollection(event) {
 if (event.status === 'COMPLETED') {
   // Mark payment as successful in your system
 } else if (event.status === 'UNPAID') {
   // Handle failed collection
 }
}

Best Practices

  1. Respond quickly: Return 200 OK within 5 seconds
  2. Process asynchronously: Queue events for background processing
  3. Handle duplicates: Implement idempotency using the event ID
  4. Verify source: Validate requests originate from Revio
  5. Log everything: Keep detailed logs for debugging
  6. Retry handling: Handle the same event being sent multiple times

Webhook Security

URL Requirements

  • Must use HTTPS
  • Must be publicly accessible
  • Should respond within 5 seconds

Recommendations

  1. Use a unique path: Include a secret in your webhook URL
  2. Validate payloads: Check expected fields are present
  3. Monitor failures: Alert on repeated delivery failures

Testing Tools

Use these services to test webhooks during development:

Example with Webhook.site

  1. Go to webhook.site and copy your unique URL
  2. Register it as your callback URL:

BASH

curl -X POST https://dev.api.revio.co.za/v2/clientcallbackurl/ \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
 -H "Content-Type: application/json" \
 -d '{
   "clientId": 109,
   "url": "https://webhook.site/your-unique-id",
   "callbackType": "EFT_COLLECTION",
   "callbackVersion": "V2"
 }'

  1. Trigger a test callback to see the payload

Troubleshooting

Common Issues

|Issue|Cause|Solution| |---|---|---| |No callbacks received|URL not registered|Verify callback URL configuration| |404 errors|Wrong endpoint|Check your webhook handler path| |Timeout errors|Slow processing|Return 200 immediately, process async| |Missing events|Wrong callback type|Register for correct event types|

Verify Callback Registration

Get your client ID from merchant profile:

BASH

curl -X GET https://dev.api.revio.co.za/v2/merchantprofile/ \
 -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

The createdByClient field is your client ID for webhook registration.