---
title: "Create project webhook"
method: POST
path: "/whatsapp/webhooks"
tags: ["Webhooks"]
---

# Create project webhook

`POST /whatsapp/webhooks`

Create a webhook for this project.

Two scoping options:
- **Project-scoped**: Omit `phone_number_id` to receive project events only
- **Number-scoped**: Include `phone_number_id` to receive message and conversation events for that number

Project webhooks do not receive message or conversation events. Use a number-scoped webhook (or
`POST /whatsapp/phone_numbers/{phone_number_id}/webhooks`) for those.

Subscribing to `project.event` requires project events to be available on your plan.

Two webhook types:
- **kapso**: Event-based webhooks with filtered events, buffering support, and Kapso payload format
- **meta**: Raw Meta webhook forwarding - receives the exact payload Meta sends (requires `phone_number_id`)

## Request body

- WhatsappProjectWebhookRequest
  - `whatsapp_webhook` object, required
    - `url` string, uri, required — Webhook delivery endpoint
    - `phone_number_id` string — Optional Meta phone number ID. Omit for project-scoped webhooks (project events only). Required for message/conversation events and all meta webhooks.
    - `kind` 'kapso' | 'meta' — Webhook type: - **kapso**: Event-based webhooks with filtered events, buffering support, and Kapso payload format (default) - **meta**: Raw Meta webhook forwarding - receives the exact payload Meta sends. Requires phone_number_id.
    - `secret_key` string, nullable — Secret for request verification
    - `active` boolean — Enable deliveries
    - `buffer_enabled` boolean — Batch messages before delivery (not supported for 'meta' webhooks)
    - `buffer_window_seconds` integer, nullable — Seconds to wait (1-60, default 5)
    - `max_buffer_size` integer, nullable — Max messages per batch (1-100)
    - `inactivity_minutes` integer, nullable — Minutes before inactivity event
    - `events` string[] — Event subscriptions (project events for project-scoped webhooks, message/conversation events for number-scoped webhooks)
    - `buffer_events` string[] — Events to buffer (not supported for 'meta' webhooks)
    - `headers` object, nullable — Custom request headers
    - `payload_version` string, nullable — Webhook payload format version (defaults to 'v2')

## Response `201`

Created

- WhatsappWebhookResponse
  - `data` WhatsappWebhook, required
    - `id` string, uuid, required
    - `url` string, uri, required — Webhook delivery endpoint
    - `kind` 'kapso' | 'meta', required — Webhook type - 'kapso' for event-based webhooks, 'meta' for raw Meta payload forwarding
    - `events` string[], required — Event subscriptions (required for 'kapso' webhooks, empty for 'meta')
    - `active` boolean, required — Pause deliveries without deleting
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
    - `project_id` string, uuid, required
    - `phone_number_id` string, nullable — Meta phone number ID
    - `secret_key` string, nullable — Secret for signing requests
    - `headers` object, nullable — Custom request headers
    - `buffer_enabled` boolean, nullable — Batch messages before delivery
    - `buffer_window_seconds` integer, nullable — Seconds to wait before sending batch
    - `max_buffer_size` integer, nullable — Max messages per batch
    - `buffer_events` string[] — Events to buffer
    - `inactivity_minutes` integer, nullable — Trigger inactivity event after N minutes
    - `payload_version` string, nullable — Webhook payload format version (defaults to 'v2')

## Other responses

- `401` — Missing or invalid API key
- `402` — Feature requires a paid plan
- `404` — Resource not found
- `422` — Request validation failed

---

[API](https://skmtc.net/kapso/apis/kapso-platform-api.md) · [All operations](https://skmtc.net/kapso/apis/kapso-platform-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/kapso/kapso-platform-api/revisions/18ff5548a33f/schema)
