Skip to main content
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 → SettingsWebhooks:
  1. Add webhook.
  2. Enter the destination URL (HTTPS).
  3. Check the events that endpoint should receive.
  4. Save. Use the Enabled toggle to pause delivery without deleting the endpoint.

From the API

url
string
required
HTTPS destination URL. Maximum of 2048 characters.
events
string[]
required
List of subscribed events. At least one. Valid values in Events.
enabled
boolean
default:"true"
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.