Sources

Webhook

Background

Webhooks are event-driven mechanisms that allow one system to send real-time data to another when specific events occur. In a streaming ETL (Extract, Transform, Load) workflow, webhooks act as a reliable source or destination for delivering or receiving data instantaneously. Their simplicity and flexibility make them a powerful tool for integrating systems and triggering real-time data transformations.

Setup

From the dashboard, create a new source and select Webhook. You will receive a unique endpoint you can post to directly using JSON, NDJSON, or CSV. Here is an example of an endpoint you might receive:

https://go.proxyhook.com/A817GH

To start tracking data against your new endpoint, send a POST call to it. The endpoint accepts three content types — JSON (single event), NDJSON (newline-delimited JSON, up to 1000 events per request), and CSV (up to 1000 events per request) — so you can pick whichever is most convenient for the system sending the data. Regardless of format, each row is delivered to your destinations as the same per-event shape.

Show JSON example

Send one event per request. Native types (strings, numbers, booleans, nested objects, arrays) are preserved.

curl -X POST https://go.proxyhook.com/WEBHOOK_ID \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "name": "Ada Lovelace",
    "plan": "pro",
    "signup_date": "2026-05-12"
  }'
Show NDJSON example

Send many events in a single request — one JSON object per line, separated by \n. Empty lines are skipped. Up to 1000 events per request; additional rows are dropped silently. Native types are preserved per line.

curl -X POST https://go.proxyhook.com/WEBHOOK_ID \
  -H "Content-Type: application/x-ndjson" \
  --data-binary @events.ndjson

Where events.ndjson contains:

{"email":"[email protected]","name":"Ada","plan":"pro"}
{"email":"[email protected]","name":"Ben","plan":"free"}
{"email":"[email protected]","name":"Cleo","plan":"enterprise"}

Each line must be a complete, valid JSON object — no line breaks inside an object.

Show CSV example

Send many events as CSV. The first row is the header — each column name becomes a field name on every event. Each subsequent row becomes one event. Up to 1000 rows per request; additional rows are dropped silently.

curl -X POST https://go.proxyhook.com/WEBHOOK_ID \
  -H "Content-Type: text/csv" \
  --data-binary @events.csv

Where events.csv contains:

email,name,plan
[email protected],Ada,pro
[email protected],"Ben, Jr.",free
[email protected],Cleo,enterprise

Wrap values containing commas, newlines, or double quotes in double quotes; escape inner double quotes by doubling them. All values arrive as strings — CSV has no native type system, so "5" will not be coerced to 5. If your destination cares about types, prefer NDJSON.

All requests to the endpoint will respond with a status code 200, regardless of any existing subscriptions tied to it. This helps de-couple the reliability of collecting events from your destinations to overcome overages, outages, rate limits, etc on your destinations and allow advanced retry logic.