Zapfy uses a subscription model: instead of a single global URL that receives
everything, you register endpoints and each one subscribes to the set of
events it wants.
- Want everything in one place → 1 endpoint with all events.
- Want them split (e.g. message status to one service, connection to another) →
separate endpoints, each with its own filter.
Limit of 5 endpoints per instance. Each endpoint is a delivery target per
event; the cap prevents accidental amplification.
From the dashboard
Open the instance → Settings → Webhooks:
- Add webhook.
- Enter the destination URL (HTTPS).
- Check the events that endpoint should receive.
- Save. Use the Enabled toggle to pause delivery without deleting the endpoint.
From the API
HTTPS destination URL. Maximum of 2048 characters.
List of subscribed events. At least one. Valid values in Events.
Whether the endpoint receives deliveries.
Create
curl -X POST https://api.zapfy.io/instances/{instanceId}/webhooks \
-H "Authorization: Bearer zpfy_acct_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks",
"events": ["MESSAGE_RECEIVED", "MESSAGE_STATUS"]
}'
List, update and delete
# list
curl https://api.zapfy.io/instances/{instanceId}/webhooks \
-H "Authorization: Bearer zpfy_acct_xxxxxxxxxxxx"
# update (partial)
curl -X PATCH https://api.zapfy.io/instances/{instanceId}/webhooks/{webhookId} \
-H "Authorization: Bearer zpfy_acct_xxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "enabled": false }'
# delete
curl -X DELETE https://api.zapfy.io/instances/{instanceId}/webhooks/{webhookId} \
-H "Authorization: Bearer zpfy_acct_xxxxxxxxxxxx"
Delivery
- Zapfy sends a
POST to each subscribing endpoint when the event happens.
- Reply
2xx to acknowledge. Without 2xx, the event is retried.
- Delivery is at-least-once — deduplicate using the event’s
id field.