Sources
WebhookWebhooks 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.
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:
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.
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"
}'
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.
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.