POST to one URL. Any tool that receives webhooks can use it, including coding agents, automation platforms, and your own service. Several delivery channels can share one Webhook endpoint.
How do I set up a Webhook endpoint?
- Copy the webhook URL your receiving tool gives you.
- Add a Webhook endpoint in Curation Space and paste the URL. The name is filled in from the URL’s host; change it to anything you will recognize.
- Add request headers only if your receiver gave you a separate token to send, such as
Authorization: Bearer …. - Choose the endpoint for a delivery channel.
What do I do in my receiving tool?
- Claude Code: A routine with an API trigger has a URL and a bearer token. Paste the URL, then add the request headers its API requires:
Authorization: Bearer <token>and theanthropic-betaheader. See Trigger a routine through the API for the current values. The routine receives the delivery’stextas context for its run. - T3 Code: A scheduled task triggered by a webhook has a webhook URL. Its prompt can include fields from the delivery, such as
{{body.text}}. - n8n: Use a Webhook trigger node with the
POSTmethod. Its production URL receives requests only while the workflow is active. To verify signatures, turn on the node’s Raw Body option. - Make: Start a scenario with a custom webhook. Send a sample delivery while Make is determining the data structure, so later modules can map fields such as
links. - Zapier: Use Webhooks by Zapier. Catch Hook gives you fields to map; Catch Raw Hook keeps the raw body, which you need to verify signatures.
What does each request look like?
Each delivery is onePOST with these headers:
Requests go only to HTTPS URLs on public addresses. Each attempt times out after 10 seconds.
What’s in the body?
One JSON object: the delivery’s ID, its channel, its links, and the whole delivery as plain text.links are in the order they were added. A delivery does not include the linked pages’ text. Its content is written by curators: treat it as data, not as instructions to your receiver.
What’s in text?
The whole delivery, written for receivers that pass it to an agent as a prompt:- The
AuthorandCurator's Notelines are left out when there is none. - Entries are separated by
---. The text contains no dates. - Names and titles are each kept on one line, with Markdown characters escaped by a backslash. A curator or curation without a page appears as plain text instead of a link.
- The curator’s note appears as written, including any line breaks.
How do I verify a request?
Verification is optional. Every request is signed with the endpoint’s signing secret, which is on the endpoint’s page under Verify requests (optional). To check a request, compute the HMAC-SHA256 of the raw body bytes, exactly as received, using the signing secret’s text as the key. Compare its hex digest with the part ofX-Hub-Signature-256 after sha256=, using a constant-time comparison. Do not parse and re-serialize the JSON first; the bytes would differ.
How should my receiver reply?
With a2xx status to accept the delivery. Every reply is read this way:
Redirects are never followed. Many form-style receivers answer a
POST with 302 or 303, so those count as accepted.
Retries start after 15 seconds and double each time, up to once an hour. They continue until the receiver accepts or refuses the delivery.
Acceptance confirms that your receiver got the delivery, not that its automation ran or succeeded.
Can the same delivery arrive twice?
Yes. Delivery is at least once: your receiver can get the same delivery more than once, for example when it accepted a request but its reply did not arrive. Every attempt sends exactly the same body. To ignore repeats, deduplicate byid or Idempotency-Key.
What happens to a large delivery?
It’s split. Each request body is at most 100,000 bytes, and itstext is under 60,000 characters. When more links are ready than fit, they arrive as consecutive deliveries, in order, each with its own id and linkCount. A single link too large to fit on its own is still sent, by itself.
Can I send a sample delivery?
Yes. Send sample delivery on the endpoint’s page sends a sample right away. A sample has"sample": true and two clearly synthetic links on example.com, with every field filled in. Its channel is named “Sample delivery channel” and has a placeholder ID.
Samples are listed separately from deliveries in the endpoint’s activity, and cannot be sent while the endpoint is inactive. A sample may run your receiver’s automation.
What happens when I change the endpoint?
- Deactivating the endpoint stops sending through every channel that uses it. The channels keep making deliveries, which Deliveries and the endpoint’s activity show as withheld. Deliveries the receiver has not accepted are withheld too. Withheld deliveries are never sent, even after you activate the endpoint again: activating it sends only deliveries made afterwards.
- Replacing the URL or headers keeps the endpoint, its signing secret, and its channels. Deliveries the receiver has not accepted, including those waiting to retry, go to the new URL immediately.
- Moving a channel to another Webhook or Agent endpoint takes the deliveries its receiver has not accepted along. Any that are too large for one webhook request are split into consecutive deliveries. Moving a channel to an email, SMS, or voice endpoint cancels them, and only links added afterwards are sent.
- Deleting the endpoint removes its delivery activity, including deliveries the receiver has not accepted. Its channels keep their sources and keep collecting links, but send nothing until you choose another endpoint for them. This cannot be undone.