Skip to main content
Mobile app only. Webhooks are configured through the Allo mobile app.

What are webhooks?

Webhooks let you receive real-time notifications from Allo to your own systems or applications. When an event happens in Allo (like a call ending or receiving an SMS), we send an HTTPS POST request to your specified URL. Common use cases:
  • Log calls to your custom database
  • Trigger automations in your own systems
  • Send notifications to internal tools
  • Build custom integrations

How to set up webhooks

Step 1: Enable webhook

  1. Open the Allo mobile app
  2. Go to Settings
  3. Tap Integrations
  4. Select Webhooks
  5. Toggle Enable webhook on

Step 2: Configure your URL

Enter your webhook URL in the URL field. Requirements:
  • Must use HTTPS (not HTTP)
  • Must be capable of receiving POST requests
  • Must return a 2xx status code
Example URL:
https://your-domain.com/allo-webhook
Important: Your endpoint must be publicly accessible and use HTTPS. Test your endpoint before enabling the webhook.

Step 3: Select event types

Choose which events you want to receive: Call Received
  • Triggered every time a call finishes
  • Includes call details, recording, transcript, and summary
SMS Received
  • Triggered every time you receive an SMS
  • Includes message content and sender information
You can enable one or both event types depending on your needs.

Step 4: Test the connection

Before going live, test your webhook:
  1. Scroll to Test the connection
  2. Tap Send
  3. Allo will send a test POST request to your URL
  4. Verify your endpoint receives the test data
If the test fails, check:
  • Your URL is correct
  • Your endpoint is publicly accessible
  • Your server accepts POST requests
  • Your endpoint returns a 2xx status code

Webhook payload

Call Received event

When a call finishes, we send a POST request with the following data:
{
  "event": "call.received",
  "timestamp": "2025-01-20T12:30:00Z",
  "call": {
    "id": "call_123456",
    "direction": "inbound",
    "from": "+33612345678",
    "to": "+33987654321",
    "duration": 180,
    "status": "completed",
    "recording_url": "https://...",
    "transcript": "Full call transcript...",
    "summary": "AI-generated summary...",
    "started_at": "2025-01-20T12:30:00Z",
    "ended_at": "2025-01-20T12:33:00Z"
  }
}

SMS Received event

When you receive an SMS, we send a POST request with:
{
  "event": "sms.received",
  "timestamp": "2025-01-20T12:30:00Z",
  "sms": {
    "id": "sms_123456",
    "from": "+33612345678",
    "to": "+33987654321",
    "message": "Message content...",
    "received_at": "2025-01-20T12:30:00Z"
  }
}

Security best practices

Verify webhook authenticity

Always verify that webhook requests come from Allo to prevent unauthorized access.
Recommended security measures:
  1. Use HTTPS only
  2. Validate the request signature (if provided)
  3. Check the request origin
  4. Implement rate limiting
  5. Log all webhook requests

Handle webhook failures

Your endpoint should:
  • Respond within 5 seconds
  • Return a 2xx status code for success
  • Handle errors gracefully
  • Implement retry logic if needed
If your endpoint fails:
  • Allo will retry up to 3 times
  • Retries happen with exponential backoff
  • After 3 failures, the webhook is disabled
  • You’ll need to re-enable it manually

Troubleshooting

Check these common issues:
  • ✅ URL is correct and publicly accessible
  • ✅ Using HTTPS (not HTTP)
  • ✅ Endpoint accepts POST requests
  • ✅ Firewall allows incoming requests
  • ✅ Server returns 2xx status code
  • ✅ Response time is under 5 seconds
Possible causes:
  1. Webhook disabled: Check if toggle is still on
  2. Event types not selected: Verify you enabled the right events
  3. Endpoint down: Test your server is running
  4. Failed deliveries: Check if webhook was auto-disabled after failures
Solution: Re-enable webhook and test connection again.
Why this happens:
  • Network issues can cause retries
  • Allo retries failed deliveries
Solution:Implement idempotency in your endpoint using the event ID to prevent duplicate processing.
Reason:After 3 consecutive delivery failures, Allo automatically disables the webhook to prevent resource waste.Solution:
  1. Fix the issue with your endpoint
  2. Test that it’s working
  3. Re-enable the webhook in the app
  4. Run a test to verify

Example implementation

Node.js / Express

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

app.use(express.json());

app.post('/allo-webhook', (req, res) => {
  const event = req.body;
  
  // Log the event
  console.log('Received webhook:', event);
  
  // Process based on event type
  if (event.event === 'call.received') {
    // Handle call event
    console.log('Call from:', event.call.from);
    console.log('Summary:', event.call.summary);
  } else if (event.event === 'sms.received') {
    // Handle SMS event
    console.log('SMS from:', event.sms.from);
    console.log('Message:', event.sms.message);
  }
  
  // Always return 200 for successful processing
  res.status(200).send('OK');
});

app.listen(3000, () => {
  console.log('Webhook server running on port 3000');
});

Python / Flask

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/allo-webhook', methods=['POST'])
def allo_webhook():
    event = request.get_json()
    
    # Log the event
    print('Received webhook:', event)
    
    # Process based on event type
    if event['event'] == 'call.received':
        # Handle call event
        print('Call from:', event['call']['from'])
        print('Summary:', event['call']['summary'])
    elif event['event'] == 'sms.received':
        # Handle SMS event
        print('SMS from:', event['sms']['from'])
        print('Message:', event['sms']['message'])
    
    # Always return 200 for successful processing
    return jsonify({'status': 'success'}), 200

if __name__ == '__main__':
    app.run(port=3000)

Need help?