Concepts

Three nouns carry the whole product: an Endpoint captures Requests, and forwarding turns each request into a Delivery with a full attempt history.

Learn these three nouns once and every screen and every API response is predictable.

Endpoint

An endpoint is a capture URL: https://in.webhookvault.dev/hook/{id}. Anything HTTP that reaches it is stored — every method, any content type, binary bodies included (stored base64, flagged bodyIsBinary). The endpoint answers the sender with the response you configure (status, headers, body), independent of what happens to the request afterwards.

  • An endpoint that is switched off answers 410 and stops capturing — visibly dark, never half-alive.
  • A deleted endpoint answers 404, immediately.
  • An ephemeral endpoint (created with ttlSeconds) answers 404 after its expiry and is then swept away with everything it captured — built for CI runs.

Sub-paths are captured too: senders can call …/hook/{id}/anything/here and the path is stored with the request.

Captured request

A captured request is the stored record: method, path, query string, headers, body, source IP, size, timing. It lives until your plan's retention window expires it, you delete it, or the per-endpoint storage cap evicts it oldest-first — the vault always stores the newest arrival and ages out old ones rather than refusing a sender.

Two honesty flags matter when reading one back:

FlagMeaning
bodyIsBinarybody holds base64 of the original bytes (invalid UTF-8 or NUL content). Decoded back to bytes on forward/replay.
bodyTruncatedThe body exceeded your plan's payload cap. Only its size was recorded; it cannot be replayed, and the API will say so rather than send a placeholder.

Delivery

When forwarding is enabled, every capture becomes a delivery: a background job that relays the request to your destination URL, retries on failure with exponential backoff, and parks in a dead-letter state when retries are exhausted. Every attempt — automatic or manual — is recorded and readable via the attempts endpoint.

The delivery state on a request is always one of:

StateIn the appMeaning
NotAttemptedForwarding was off when the request arrived.
PendingsendingQueued or in flight.
Succeededdelivered codeThe destination answered 2xx.
Failederrored codeThe destination answered, but not 2xx.
ErrorederroredThe destination was unreachable (DNS, refused, timeout).
DeadLettergave upRetries exhausted. A replay starts it fresh.

Replay re-delivers any stored request on demand — one at a time (the outcome returns inline) or in bulk (queued through the same pipeline, outcomes land in the attempt history). Replaying is always safe on the vault's side: it re-sends exactly what was captured.

Where next?

On this page