Overview
The Zendesk Webhook source receives events from your Zendesk account at a dedicated HTTPS endpoint and routes each event to a Kafka topic based on its event type (tickets, users, organizations, articles, messaging, etc.). You point Zendesk at the Streamkap-generated webhook URL, configure which event subscriptions to send, and Streamkap takes care of parsing, key extraction, schema inference, and routing.This connector is in Beta. Behaviors and defaults may change before general availability.
Prerequisites
- A Zendesk account with Admin permissions (required to create webhooks and event subscriptions).
- A Streamkap workspace with permission to create source connectors.
- A clear list of the Zendesk objects you want to capture (tickets, users, organizations, etc.).
How It Works
- Endpoint provisioning — When you create the source, Streamkap generates a unique HTTPS webhook URL and an API key.
- Zendesk subscription — In Zendesk, you create a webhook target pointing at that URL and subscribe it to the event types you care about.
- Event routing — Each incoming event carries a
typefield (for examplezen:event-type:ticket.created). The Zendesk payload router maps the event domain to a topic —ticket.*events go toticket_events,user.*events go touser_events, and so on. - Key extraction — The router pulls a stable identifier from the payload (typically
detail.id) and uses it as the Kafka message key, enabling upsert-style consumption downstream. - Optional flattening / fan-out — Nested
detailfields can be promoted to top level, and array fields (such as ticket tags or custom fields) can be fanned out into their own topics.
Streamkap Setup
1. Create the Source
- Navigate to Sources and choose Zendesk Webhook.
- Give the source a memorable Name (for example,
zendesk-prod).
2. Connection Settings (Auth tab)
These fields are populated automatically once you save the source — you do not enter them manually.3. Schema (Zendesk Models)
In the Schema tab, the topics are pre-populated with the nine built-in Zendesk event models. Leave them all enabled, or remove any you do not want to ingest.
Any fan-out topics you configure (see below) are added to this list automatically.
4. Settings
5. Save and Copy the Endpoint
Save the source. Copy the Webhook URL and API Key — you will need them in the next section to configure Zendesk.Zendesk Setup
You configure Zendesk to send events to the Streamkap endpoint in two pieces: a webhook target and one or more event subscriptions.1. Create the Webhook in Zendesk
- In Zendesk, go to Admin Center → Apps and integrations → Webhooks → Webhooks.
- Click Create webhook.
- Choose Trigger or automation (or Zendesk events — see step 2 below).
- Configure the webhook:
- Name —
Streamkap(or anything memorable). - Endpoint URL — paste the Webhook URL from Streamkap.
- Request method —
POST. - Request format —
JSON. - Authentication — choose API key:
- Header name —
X-API-Key - Value — paste the API Key from Streamkap.
- Header name —
- Name —
- Click Test webhook to confirm Zendesk can reach the endpoint, then Create webhook.
2. Subscribe to Event Types
To stream object-level events (ticket created, user updated, organization deleted, …), connect the webhook to Zendesk’s Events subscription system:- In Admin Center, go to Apps and integrations → Webhooks → Connections.
- Click Create connection, pick the webhook you just created, and select the event types you want to forward.
- Use event types from the families that match the topics you enabled in Streamkap:
zen:event-type:ticket.*zen:event-type:user.*zen:event-type:organization.*zen:event-type:article.*zen:event-type:community_post.*zen:event-type:messaging_ticket.*zen:event-type:agent.*zen:event-type:omnichannel_config.*zen:event-type:messaging_live_metrics.*
- Save the connection. Zendesk now begins POSTing events to Streamkap.
For triggers and automations (instead of native event subscriptions), set the request body to forward the relevant fields — including a
type value such as zen:event-type:ticket.updated — so the payload router can identify the event family.Event Routing Reference
The payload router inspects thetype field on each incoming event and maps it to a topic.
Event types ending in
.deleted or .removed (but not .soft_deleted or .undeleted) automatically set __deleted: true on the output record so downstream sinks can issue tombstones.
Fan-out
When Flatten Detail Fields is on, scalar fields are promoted to the top level — but arrays and lists of objects (tags, custom fields, comments, …) cannot be flattened cleanly. Fan-out solves this by emitting one record per array element to a dedicated topic. Set Fan-out Fields to a comma-separated list ofdomain.field pairs:
The fan-out topics are added to the Schema list automatically, so you do not need to register them manually.
Each fan-out record contains the array element’s own fields plus:
detail_id— parent entity ID (matches the key field name)._ctx_event_id— the originating webhook event UUID, useful for correlating fan-out records back to the parent event.
Example Payload
A typical event sent by Zendesk:ticket_events looks like:
tags, custom_fields) are emitted to ticket_tags and ticket_custom_fields if those entries are listed in Fan-out Fields.
Common Patterns
State table (upsert) ingestion
Use this when you want one row per Zendesk entity in your warehouse, mirroring the live state.- Flatten Detail Fields —
true - Include Event Field —
false - Fan-out Fields — list any nested arrays you want as separate tables (typically
ticket.tags,ticket.custom_fields)
detail_id key. .deleted events flip __deleted: true, which most sinks treat as a tombstone.
Audit log ingestion
Use this when you want every event preserved as a separate row.- Flatten Detail Fields —
false - Include Event Field —
true - Fan-out Fields — empty
Troubleshooting
Zendesk’s webhook test returns 401 — Check that theX-API-Key header name is exactly X-API-Key and the value matches the API Key shown in the Streamkap UI. Regenerate the source if the key was lost.
Events arrive in the unknown topic instead of the expected one — The event type did not match any known prefix. Verify the event family is one of those listed in Event Routing Reference. If you are using a Zendesk trigger (rather than an event subscription), make sure the request body includes a valid type value.
No data is flowing — Confirm in Zendesk that the webhook is Active and connected to at least one event subscription. Use the Activity view on the Zendesk webhook to see recent delivery attempts and response codes.
Records are nested when I expected flat fields — Toggle Flatten Detail Fields on and re-deploy the source. Existing records already in Kafka will not be retroactively flattened.
My destination cannot handle the array fields — Add the relevant entries to Fan-out Fields so each array element becomes its own record in a dedicated topic.
Limitations
- The Zendesk Webhook source is currently Beta.
- The connector accepts only
POSTrequests; do not configure Zendesk to use a different HTTP method. - Maximum payload size is 50 MB and maximum header size is 64 KB. Zendesk events fit comfortably within these limits.
- Each request is treated as a single Kafka record. Zendesk does not batch events into one request.
- The connector runs as a single task; horizontal scaling requires multiple source instances.
See Also
- Webhook Source — generic webhook source for any HTTP-capable producer.