Webhooks API
Register webhook endpoints to receive real-time HTTP callbacks when events occur in your account.
For the full list of webhook events and payload examples, see the Webhooks Guide.
List Webhooks
/api/webhooks/manageList all registered webhook endpoints for the authenticated user.
curl --location --request GET 'http://outreach.weezly.com/api/webhooks/manage' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"webhooks": [
{
"id": "wh_001",
"url": "https://your-app.com/webhooks/outreach",
"secret": "whsec_a1b2c3d4e5f6...",
"events": ["lead.replied", "connection.accepted", "campaign.completed"],
"active": true,
"failureCount": 0,
"lastSentAt": "2026-06-07T08:30:00.000Z",
"lastFailedAt": null,
"createdAt": "2026-05-20T10:00:00.000Z"
}
]
}Create Webhook
/api/webhooks/manageRegister a new webhook endpoint. URL must use HTTPS. A signing secret is generated automatically.
Request Body
| Parameter | Type | Description |
|---|---|---|
urlrequired | string | HTTPS endpoint URL to receive events |
eventsrequired | string[] | Array of event types to subscribe to |
Available Event Types
| lead.replied | A lead replied to a message |
| connection.accepted | A connection request was accepted |
| campaign.completed | All leads in a campaign have finished |
| campaign.launched | A campaign was launched |
| campaign.step.completed | A campaign step was executed successfully |
| campaign.step.failed | A campaign step failed |
| account.status_changed | A LinkedIn account status changed |
| lead.created | A new lead was added to a list |
curl --location --request POST 'http://outreach.weezly.com/api/webhooks/manage' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"url": "https://your-app.com/webhooks/outreach",
"events": [
"lead.replied",
"connection.accepted"
]
}'{
"webhook": {
"id": "wh_new002",
"url": "https://your-app.com/webhooks/outreach",
"secret": "whsec_9f8e7d6c5b4a...",
"events": ["lead.replied", "connection.accepted"],
"active": true,
"failureCount": 0,
"createdAt": "2026-06-07T10:00:00.000Z"
}
}Response Codes
| 201 | Webhook created |
| 400 | URL must use HTTPS / events array required |
| 409 | Webhook with this URL already exists |
Update Webhook
/api/webhooks/manage/:idUpdate a webhook's events or active state.
Request Body
| Parameter | Type | Description |
|---|---|---|
events | string[] | New event subscriptions |
active | boolean | Enable/disable the webhook |
curl --location --request PATCH 'http://outreach.weezly.com/api/webhooks/manage/:id' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"events": [
"lead.replied",
"connection.accepted",
"campaign.completed"
],
"active": true
}'{
"webhook": {
"id": "wh_001",
"events": ["lead.replied", "connection.accepted", "campaign.completed"],
"active": true
}
}Delete Webhook
/api/webhooks/manage/:idRemove a webhook endpoint. Pending deliveries are cancelled.
curl --location --request DELETE 'http://outreach.weezly.com/api/webhooks/manage/:id' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{ "ok": true }Response Codes
| 200 | Webhook deleted |
| 404 | Webhook not found |
Test Webhook
/api/webhooks/manage/:id/testSend a test event to the webhook endpoint. Uses a test.ping event with sample data.
curl --location --request POST 'http://outreach.weezly.com/api/webhooks/manage/:id/test' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"success": true,
"statusCode": 200,
"duration": 342,
"response": "OK"
}{
"success": false,
"statusCode": 502,
"duration": 5012,
"error": "Connection timed out"
}Response Codes
| 200 | Test sent (check success field for delivery result) |
| 404 | Webhook not found |
Delivery History
/api/webhooks/manage/:id/deliveriesGet the last 50 delivery attempts for a webhook endpoint.
curl --location --request GET 'http://outreach.weezly.com/api/webhooks/manage/:id/deliveries' \
--header 'X-API-KEY: sk_live_YOUR_API_KEY'{
"deliveries": [
{
"id": "wd_001",
"event": "lead.replied",
"payload": {
"event": "lead.replied",
"data": {
"leadId": "cm3lead_001",
"leadName": "Sarah Chen",
"campaignId": "cm3camp456",
"campaignName": "Q1 SaaS Outreach",
"chatId": "chat_abc123def456",
"replyPreview": "Thanks for reaching out! I'd love to..."
},
"timestamp": "2026-06-07T08:30:00.000Z"
},
"statusCode": 200,
"response": "OK",
"success": true,
"duration": 145,
"createdAt": "2026-06-07T08:30:00.500Z"
},
{
"id": "wd_002",
"event": "connection.accepted",
"payload": { "..." : "..." },
"statusCode": 500,
"response": "Internal Server Error",
"success": false,
"duration": 2034,
"createdAt": "2026-06-07T07:15:00.200Z"
}
]
}Delivery Format
Each webhook delivery is an HTTP POST to your endpoint with a JSON body and a signature header for verification.
POST /webhooks/outreach HTTP/1.1
Content-Type: application/json
X-Webhook-Signature: t=1717747800,v1=5af3c09e2b8a7d...{
"event": "lead.replied",
"data": {
"leadId": "cm3lead_001",
"leadName": "Sarah Chen",
"campaignId": "cm3camp456",
"campaignName": "Q1 SaaS Outreach",
"chatId": "chat_abc123def456",
"replyPreview": "Thanks for reaching out!"
},
"timestamp": "2026-06-07T08:30:00.000Z"
}Signature verification: Compute HMAC-SHA256 of timestamp.payload using your webhook secret. Compare with the v1 value in the signature header. See the Getting Started guide for full verification code in Node.js and Python.