Quick Start

Get your first webhook up and running in under 5 minutes. No SDKs required — and no server either, if your flow doesn't need one.

How it works

HostWebhook sits between whoever is sending you webhooks and wherever those events need to end up. Each webhook you create gets a unique ingress URL — point your provider (Stripe, GitHub, etc.) at that URL and the event lands in a pipeline you control.

The simplest pipeline is a straight line: receive, forward to your server, retry until it sticks. Even that buys you something a direct webhook cannot — the event is stored before anyone tries to deliver it. A deploy, a timeout or a 500 on your side costs you nothing, because the provider already got its 202 and the retries are now on your terms, not theirs.

Stripe / GitHub / RSS / any source

api.hostwebhook.com/api/in/:token

filtertransformrouteAI node
your-server.com/webhookDiscordGoogle SheetsPostgres

One of these, several at once, or none of them.

That middle box is the part worth reading twice. Between the two arrows you can drop events you don't care about, reshape the payload, route on what it contains, hand it to an AI node, or fan it out to several destinations at once — none of which requires code on your side. Your server is optional: plenty of flows never touch a backend at all and end in Discord, a spreadsheet or a database.

Step-by-step

1

Create a webhook on the canvas

Go to Dashboard → Flows, add a Webhook node to the canvas, and open it to fill in:

  • Name — a friendly label (e.g. "Stripe production")
  • Target URLoptional. Your server's webhook handler (e.g. https://yourapp.com/webhooks/stripe). Leave it empty when the flow ends somewhere else, like a Discord or Sheets node.
  • Max retries — how many times to retry a failed delivery (default: 3)
2

Copy your ingress URL

After creating the webhook, open its detail page. You'll see your personal ingress URL:

https://api.hostwebhook.com/api/in/<your-token>

Point your webhook provider to this URL. It will accept any HTTP POST with any payload (JSON, form-encoded, raw bytes).

3

Send your first event

Test it from the terminal with curl:

curl -X POST https://api.hostwebhook.com/api/in/<your-token> \
  -H "Content-Type: application/json" \
  -d '{"event": "test.ping", "data": {"hello": "world"}}'

You'll get a 202 Accepted response immediately. The event is now queued for delivery to your server.

4

Handle the webhook in your server

Your server receives a POST request with the original payload and a few extra headers:

POST /webhooks/stripe HTTP/1.1
Host: yourapp.com
Content-Type: application/json
X-HostWebhook-Event-Id: 64f1a2b3c4d5e6f7a8b9c0d1
X-HostWebhook-Attempt: 1
X-HostWebhook-Signature: t=1714000000000,v1=a3f8c2d1...

{"event": "test.ping", "data": {"hello": "world"}}

Return any 2xx status code to mark the delivery as successful. Any other status (or a timeout) will trigger a retry.

5

Verify the signature (recommended)

Use the signing secret from the webhook detail page to verify that the request came from HostWebhook and wasn't tampered with.

typescriptwebhook-handler.ts
import crypto from "crypto";

function verifySignature(
  rawBody: string,      // raw request body as string
  signature: string,    // X-HostWebhook-Signature header
  secret: string,       // signing secret from dashboard
): boolean {
  // Parse "t=<timestamp>,v1=<hmac>"
  const parts = Object.fromEntries(
    signature.split(",").map((p) => p.split("=") as [string, string]),
  );
  const ts = parts["t"];
  const v1 = parts["v1"];
  if (!ts || !v1) return false;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(`${ts}.${rawBody}`)
    .digest("hex");

  if (expected.length !== v1.length) return false;
  return crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}
Full verification guide with more languages →

Monitor events

Open your webhook in the dashboard to see every event in real-time: status, HTTP response code, response body, and latency. Failed events show their retry schedule. You can manually replay any event at any time.

The dashboard streams events via WebSocket — you see new deliveries within seconds, no refresh needed.

Next steps