PricingFAQAboutContactLog inStart for free →
FREN
Developers/Webhooks

Webhooks

Receive real-time HTTP notifications as soon as an event occurs in e-Signal. No more polling — react instantly.

20+ eventsHMAC-SHA256Automatic retriesReal-time logs

Setup

1
Set the receiving URL
In Dashboard → Settings → Webhooks, add the HTTPS URL of your endpoint.
2
Select events
Choose which event types to receive. You can filter by channel or by threshold.
3
Get your secret
A unique HMAC secret is generated. Store it in an environment variable.
4
Verify signatures
Every request includes an X-ESignal-Signature-256 header. Verify it to confirm the request origin.

Payload structure

Each webhook is an HTTP POST with the Content-Type: application/json header. Example for message.received:

JSON payload
{
  "id": "evt_01JAB5XQKPZN3MWV...",
  "type": "message.received",
  "created_at": "2025-11-20T14:10:23Z",
  "data": {
    "id": "msg_01JAB4...",
    "conversation_id": "conv_01J7P3...",
    "contact": {
      "id": "cnt_01J8X4...",
      "name": "Kofi Asante",
      "phone": "+233241234567"
    },
    "channel": "whatsapp",
    "direction": "inbound",
    "type": "text",
    "content": "Hello, is this available?",
    "ai": {
      "sentiment": "positive",
      "intent": "inquiry",
      "score": 0.76
    }
  }
}
HTTP headers
Content-Typeapplication/json
X-ESignal-Eventmessage.received
X-ESignal-Deliveryevt_01JAB5...
X-ESignal-Signature-256sha256=abc123...
X-ESignal-Timestamp1732104623
User-AgentESignal-Webhook/1.0
Respond with 200 quickly
e-Signal expects a 2xx response within 10 seconds. Process the webhook in a background job to avoid timeouts.

Signature verification

Every webhook request is signed with HMAC-SHA256. Always verify the signature before processing the event.

import hmac
import hashlib

def verify_signature(payload: bytes, signature: str, secret: str) -> bool:
    """Verifies the HMAC-SHA256 signature of an e-Signal webhook."""
    expected = hmac.new(
        secret.encode(),
        payload,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(f"sha256={expected}", signature)

# In your Flask/Django/FastAPI handler:
# sig = request.headers.get("X-ESignal-Signature-256")
# if not verify_signature(request.data, sig, WEBHOOK_SECRET):
#     return 401

Retry policy

⚡
1st
Immediate
🔄
2nd
+30s
⏱️
3rd
+5 min
⏰
4th
+30 min
🕐
5th
+2h

After 5 failed attempts, the webhook is marked as failed and you receive an email. Webhooks can be replayed manually from the dashboard.

Event catalog

Messages

message.receivedAn inbound message is received on any connected channel.
message.sentAn outbound message was sent successfully.
message.failedA message failed to send (timeout, carrier rejection).
message.readA message was read by the recipient (WhatsApp, Instagram).

Conversations

conversation.createdA new conversation is opened with a contact.
conversation.assignedA conversation is assigned to an agent or a team.
conversation.resolvedA conversation is marked as resolved.
conversation.reopenedA resolved conversation is reopened after a new message.

Contacts & CRM

contact.createdA new contact is created in the CRM.
contact.updatedA contact's data is updated (fields, tags, score).
lead.scoredA lead's AI score crosses a configured threshold.
lead.convertedA lead is marked as a converted customer.
deal.stage_changedA deal moves to a different stage in the sales pipeline.

Campaigns

campaign.startedA scheduled campaign starts sending.
campaign.completedAll messages in a campaign have been sent.
campaign.message.openedA recipient opened a campaign message.
campaign.message.clickedA link in a campaign message was clicked.

AI alerts

alert.triggeredA configured KPI threshold was exceeded.
anomaly.detectedThe AI detected an anomaly in performance data.
sentiment.negative_spikeA spike in negative sentiment was detected on one or more channels.