Concepts

Updated May 02, 2026

The data model

Understanding five concepts is enough to use Splithook fluently.

Workspace
  └── Endpoint  (public URL — one per integration)
        ├── WebhookRequest  (immutable capture of each incoming HTTP request)
        └── Destination  (target to forward to, with filter + signing)
              └── ReplayLog  (attempt history — status, latency, response)

Workspace

A workspace is a team container. All members share:

Members have one of three roles: Owner, Admin, or Member. Roles control who can invite others, delete endpoints, and manage billing. See Workspaces & teams for details.

Endpoint

An endpoint is a public HTTPS URL that accepts webhook HTTP requests from any provider:

https://splithook.com/e/{slug}

The {slug} is an 8-character base32 string generated on creation. You can rotate it at any time — the old slug stops working immediately.

What an endpoint does:

  1. Accepts any POST request (no auth, no IP filtering — designed for external providers).
  2. Stores the raw body in Redis with a 24-hour TTL (Free plan) or longer (Pro/Team).
  3. Persists metadata to the database: method, headers, body hash, IP, timestamp, inferred provider/event type.
  4. Dispatches async jobs: schema inference, Mercure broadcast, fan-out to destinations.

The capture path is optimized for speed (p99 < 50ms). Your provider gets a 200 OK back before any forwarding happens.

WebhookRequest

A WebhookRequest is the immutable record of a single HTTP call to your endpoint. It contains:

Field Description
method HTTP method (always POST in practice)
headers All headers, stored as JSON
body_hash SHA-256 of the raw body — used to detect changes
provider Auto-detected provider (Stripe, GitHub, Shopify…)
event_type Auto-detected event type (charge.failed, push…)
received_at Timestamp at capture

The body itself lives in Redis, not in the database — keeping the database row small and the hot path fast.

Destination

A destination is a target that receives forwarded webhooks. Each endpoint can have multiple destinations (fan-out). A destination owns:

There are two destination types:

Type Description
http Plain HTTPS endpoint — your staging server, webhook.site, a queue
tunnel Splithook CLI tunnel — forwards directly to localhost without opening ports

ReplayLog

Every delivery attempt creates a ReplayLog entry:

The replay log is visible per-workspace in the Replay Log tab.

Schema

Every time a webhook arrives, Splithook walks the JSON body recursively and updates an inferred schema for that (endpoint, event_type) pair. The schema records:

From this, Splithook generates a TypeScript interface you can copy directly into your codebase. See Schemas & types.