Webhooks Guide

Receive asynchronous workflow results — real‑time delivery of completed business work units

⚡ deterministic outcomes

Why webhooks?

AccelEx processes invoices, contracts, support cases, and compliance records as asynchronous work units. Instead of polling for status, your system receives a secure HTTP POST when a workflow unit is completed: an invoice resolved, a contract risk‑scored, or a case routed. Webhooks transform raw operational noise into system‑ready decisions without blocking your infrastructure.

🔌 Setup your endpoint

1. Register webhook URL

In the AccelEx Dashboard → Webhooks → Add endpoint. Provide https://your-domain.com/api/accelex/webhook. Choose events:

  • invoice.resolved – verified invoice ready for payment
  • contract.processed – clause intelligence + risk score
  • case.closed – categorized support case with routing
  • compliance.record_generated – auditable record
  • workflow.failed – confidence below threshold

2. Verify signature (security)

Every webhook includes X-AccelEx-Signature (SHA-256 HMAC). Validate before processing:

const crypto = require('crypto'); const secret = process.env.ACCEEX_WEBHOOK_SECRET; const signature = req.headers['x-accelex-signature']; const digest = crypto.createHmac('sha256', secret) .update(JSON.stringify(req.body)) .digest('hex'); if (signature !== digest) throw new Error('Invalid signature');

📦 Webhook payload structure

Every completed work unit shares the same envelope: provenance, validation traces, and deterministic outcome ready for enterprise systems.

{ "event_id": "evt_01JQ2R7X4P9K3F2A", "event_type": "invoice.resolved", "created_at": "2025-05-18T10:32:17Z", "workflow_id": "wf_finance_invoice_v2", "tenant_id": "org_acme_inc", "data": { "status": "approved", "confidence_score": 0.997, "business_object": { "invoice_number": "INV-4021", "amount": 12450.00, "currency": "USD", "vendor": "Supply Chain Co", "due_date": "2025-06-01", "line_items": [...], "anomaly_flags": [], "approval_signal": "auto_approve" }, "audit_trail": { "extraction_hash": "sha256:...", "validation_rules_passed": 12, "processed_by_pipeline": "finance-pipeline-us-east" } }, "retry_attempt": 0 }

All payloads include decision-ready records that plug directly into ERPs, CRMs, or case management.

🔄 Handling delivery & retries

Idempotency

Each webhook includes a unique event_id. Your endpoint should store processed IDs to prevent duplicate execution. AccelEx guarantees at-least-once delivery.

if (await redis.sismember('processed_events', eventId)) { return res.status(200).send('OK'); } await processWorkUnit(payload); await redis.sadd('processed_events', eventId);

Retry policy

If your endpoint returns non-2xx or times out (>5s), AccelEx retries with exponential backoff: 5s, 30s, 2min, 10min, 1h (up to 24h). Failed events appear in Dashboard → Webhook Logs.

⏱️ Best practice: respond with 200 OK as soon as you've validated the signature, then process asynchronously.

📋 Supported event types (workflow outcomes)

Event typeTrigger conditionOutput ready for
invoice.resolvedFinance pipeline completes verification & anomaly detectionERP / payment approval system
contract.processedLegal pipeline extracts clauses, risk classificationCLM, legal review queue
case.closedSupport pipeline produces summary + routing decisionZendesk, Salesforce, ticketing
compliance.record_generatedAudit-ready structured object createdData lake, GRC platform
workflow.failedConfidence below threshold or validation errorFallback human review queue

🛡️ Security & best practices

🔐 HTTPS required

All webhook endpoints must use HTTPS with a valid certificate. AccelEx rejects plain HTTP endpoints. Use mutual TLS (mTLS) for additional security — contact support to enable.

CURL example verification: curl -X POST https://your-app/api/webhook \ -H "X-AccelEx-Signature: ..." \ -d '@payload.json'

📡 IP allowlisting

AccelEx webhooks originate from static IP ranges: 52.44.120.0/24, 3.216.98.0/24. Whitelist these in your firewall. For on‑premise deployments, contact our team for direct connectivity options.

🧪 Testing webhooks locally

Use the AccelEx Dashboard Test Webhook feature or simulate an event via API. For local development, we recommend ngrok or Cloudflare Tunnel:

ngrok http 3000 # Forward your local endpoint to public URL # Set webhook URL to https://xxxx.ngrok.io/api/accelex/webhook

Dashboard also provides a dry-run payload generator with real signatures to verify your endpoint logic.

📌 Example: invoice resolved webhook handler (Node.js)

const express = require('express'); const crypto = require('crypto'); const app = express(); app.use(express.json()); const WEBHOOK_SECRET = process.env.ACCEEX_WEBHOOK_SECRET; app.post('/api/accelex/webhook', (req, res) => { const signature = req.headers['x-accelex-signature']; const payload = req.body; const digest = crypto.createHmac('sha256', WEBHOOK_SECRET) .update(JSON.stringify(payload)) .digest('hex'); if (signature !== digest) { console.error('Invalid signature'); return res.status(401).send('Unauthorized'); } const { event_type, data } = payload; if (event_type === 'invoice.resolved' && data.status === 'approved') { // Insert into ERP await db.invoices.insert(data.business_object); await triggerPaymentWorkflow(data.business_object.invoice_number); } res.status(200).json({ received: true }); }); app.listen(3000);

⚡ Need dedicated webhook infrastructure? AccelEx offers guaranteed delivery SLA, dead‑letter queues, and replay capabilities for enterprise plans.

View pricing →