HookInspector

Developer ToolsIntermediateJan 6, 2026

HookInspector

Capture, inspect, and replay incoming webhooks with ease for faster debugging.

The Problem

Solo developers and small teams building SaaS products or integrations frequently encounter a major headache when dealing with third-party webhooks (e.g., Stripe, GitHub, Shopify, Twilio). Debugging these incoming requests is notoriously difficult. Developers often resort to exposing their local environment using tunneling tools like ngrok, which can be slow, unreliable, and prone to losing critical payload data upon server restarts. Without a persistent history, recreating specific scenarios or inspecting subtle changes between webhook invocations becomes a time-consuming manual process, involving copying raw JSON into external formatters. This leads to hours wasted per week (an estimated 5-10 hours for complex integrations) in setup, re-triggering events, and back-and-forth communication with teammates about specific payloads, significantly delaying feature development and increasing frustration.

The Solution

HookInspector provides a dedicated, persistent service for capturing, inspecting, and managing all your incoming webhook requests. Users generate unique, permanent webhook URLs for their projects. When a third-party service sends a webhook, HookInspector captures the full request (headers, body, query parameters) and stores it securely. The intuitive web UI offers real-time display of incoming requests, syntax-highlighted JSON inspection with collapsible sections, powerful search and filtering capabilities, and a detailed history. Our unique 'Replay' feature allows developers to re-send any captured webhook payload to a different target URL (e.g., their local development server or a staging environment), drastically simplifying testing of edge cases and specific scenarios. HookInspector eliminates the need for ephemeral tunnels and manual parsing, offering a collaborative workspace to share specific webhook payloads with a simple link, accelerating integration debugging from hours to minutes.

Tech Stack

Frontend
Next.js 14ReactTailwind CSS
Backend
Next.js API RoutesNode.js
Database
PostgreSQL (Supabase)
APIs
Stripe (for subscriptions)Resend (for transactional emails)Supabase (for Auth)

System Architecture

Database Schema

CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), -- Supabase manages this mostly
    email TEXT UNIQUE NOT NULL,
    created_at TIMESTAMPTZ DEFAULT now(),
    -- Stripe customer ID, for subscription management
    stripe_customer_id TEXT
);

CREATE TABLE projects (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    user_id UUID REFERENCES users(id) ON DELETE CASCADE,
    name TEXT NOT NULL,
    description TEXT,
    created_at TIMESTAMPTZ DEFAULT now(),
    updated_at TIMESTAMPTZ DEFAULT now()
);

CREATE TABLE webhook_endpoints (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
    name TEXT NOT NULL,
    -- The unique slug forms part of the URL, e.g., hookinspector.com/webhook/slug
    slug TEXT UNIQUE NOT NULL,
    -- Optional secret for webhook validation
    secret TEXT,
    created_at TIMESTAMPTZ DEFAULT now(),
    updated_at TIMESTAMPTZ DEFAULT now()
);

CREATE INDEX idx_webhook_endpoints_project_id ON webhook_endpoints(project_id);
CREATE INDEX idx_webhook_endpoints_slug ON webhook_endpoints(slug);

CREATE TABLE webhook_requests (
    id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
    endpoint_id UUID REFERENCES webhook_endpoints(id) ON DELETE CASCADE,
    method TEXT NOT NULL, -- e.g., 'POST', 'GET'
    headers JSONB NOT NULL DEFAULT '{}',
    body JSONB NOT NULL DEFAULT '{}', -- Store as JSONB for efficient querying
    query_params JSONB NOT NULL DEFAULT '{}',
    received_at TIMESTAMPTZ DEFAULT now(),
    -- To allow sharing specific requests without exposing user/project info
    share_token TEXT UNIQUE
);

CREATE INDEX idx_webhook_requests_endpoint_id ON webhook_requests(endpoint_id);
CREATE INDEX idx_webhook_requests_received_at ON webhook_requests(received_at DESC);

API Endpoints

POST/api/webhook/:slugCaptures and stores an incoming webhook request for a given endpoint slug.
GET/api/projectsRetrieves a list of all projects for the authenticated user.
POST/api/projectsCreates a new project for the authenticated user.
GET/api/projects/:projectId/endpointsRetrieves all webhook endpoints associated with a specific project.
POST/api/projects/:projectId/endpointsCreates a new webhook endpoint within a project, generating a unique slug.
GET/api/endpoints/:endpointIdRetrieves details of a specific webhook endpoint.
DELETE/api/endpoints/:endpointIdDeletes a webhook endpoint and all associated requests.
GET/api/endpoints/:endpointId/requestsRetrieves a paginated list of all captured requests for a specific webhook endpoint.
GET/api/requests/:requestIdRetrieves the full details (headers, body, query params) of a specific captured webhook request.
POST/api/requests/:requestId/replayReplays a captured webhook request to a user-specified target URL.
POST/api/requests/:requestId/shareGenerates a unique, shareable link for a specific captured webhook request.
GET/share/:shareTokenPublic endpoint to view a shared webhook request without authentication.
šŸ¤–

Start Building with AI

Copy this prompt for Cursor, v0, Bolt, or any AI coding assistant

šŸ‘·

...

builders copied today

Found this useful? Share it with your builder friends!

BD

BuilderDaily Team

Verified

Indie hackers and full-stack engineers creating validated Micro-SaaS blueprints with production-ready tech stacks.

Developer Tools
Code TestedSchema ValidatedProduction Ready
Coming Soon in Beta

Gap Alert

Today's gap expires in ~14 hours

Get tomorrow's blueprint delivered to your inbox so you never miss a profitable idea.

(Email delivery launching soon — sign up to be first!)

No spam, ever•Unsubscribe anytime