Documentation

Everything you need to inspect and monitor webhooks in real time.

Quick start

  1. 1

    Create an account

    Sign up at heylistenup.app/sign-up. No credit card required.

  2. 2

    Create an endpoint

    From the dashboard, click New endpoint. You instantly get a unique URL — no configuration needed.

  3. 3

    Point any service at it

    Copy the endpoint URL and paste it into Stripe, GitHub, Twilio, or anything that sends webhooks.

    https://hook.heylistenup.app/hook/{your-token}
  4. 4

    Watch events arrive

    Open the endpoint in your dashboard. Events appear instantly via WebSocket — no refresh needed. Click any event to inspect the full payload.

Endpoints list

The endpoints list is your home base. Everything starts here.

Creating an endpoint

Click New endpoint in the top-right corner. Give it a descriptive name (e.g. "Stripe payments", "GitHub push events"). The endpoint URL is generated immediately and is ready to receive requests.

Copying the endpoint URL

Each row shows the full webhook URL. Click the copy icon next to it to copy it to your clipboard, then paste it into whichever service you're integrating with.

Pausing and resuming

Toggle the active switch on any endpoint to pause it. Paused endpoints still accept requests but return your configured mock status immediately without storing events. Useful for temporarily silencing noisy integrations.

Bulk actions

Select multiple endpoints using the checkboxes, then use the bulk action bar that appears in the header to pause, resume, or delete them all at once.

Renaming an endpoint

Click the three-dot menu on any endpoint row and select Rename. Names are for your reference only — they don't affect the webhook URL.

Deleting an endpoint

Click the three-dot menu and select Delete. This permanently deletes the endpoint and all its stored events. The URL stops accepting requests immediately.

Endpoint detail

Click any endpoint to open its detail view — a split-pane interface with live events on the left and the full payload on the right.

Live event feed

Events appear in real time via WebSocket. Each entry shows the HTTP method, timestamp, content type, and response status. New events are prepended at the top. Click any event to load its full payload in the inspector on the right.

Payload inspector

The right pane shows everything about a selected event: request headers, query parameters, source IP, body size, and the full body. JSON bodies are syntax-highlighted and collapsible — click any object or array node to expand or collapse it.

Sharing a specific event

The selected event ID is persisted in the URL as a query parameter (?event=...). Copy the URL from your browser to share a specific event with a teammate — they'll land directly on it.

Downloading event body

In the payload inspector, click the Download icon to save the raw event body as a file. Useful for capturing large payloads or feeding them into other tools.

CSV / JSON export Pro

Export all events for an endpoint as CSV or JSON from the toolbar. CSV includes method, timestamp, content type, status, and body size per row. JSON includes the full event objects.

Event replay Pro

Re-send any stored event to any URL. In the payload inspector, click Replay, enter a target URL (e.g. http://localhost:3000/webhook), and click send. The original headers and body are forwarded exactly as received.

Response mocking Pro

Configure what status code the endpoint returns to the sender. Options are 200, 400, or 500. Useful for testing how your service reacts to webhook failures without actually breaking anything.

Local forwarding Pro

Forward live webhook events to a local server — no ngrok or tunnel required. Set a forward URL (e.g. http://localhost:3000/webhook) in the endpoint settings. While your browser tab is open, every incoming event is relayed directly from the browser to your local server via a POST request.

Slack notifications Pro

Get notified in Slack when events arrive. Add a Slack incoming webhook URL in the endpoint settings. A notification is sent for every event received, regardless of whether your dashboard is open.

Sending a test request

Use curl to send a test webhook to your endpoint:

curl -X POST https://hook.heylistenup.app/hook/{token} \
  -H "Content-Type: application/json" \
  -d '{"event": "test", "data": {"amount": 2500}}'

The endpoint accepts any HTTP method and any body format (JSON, form-encoded, XML, plain text). The response is always:

{ "received": true, "id": "event-id" }

Limits & responses

StatusMeaning
200Event received and stored
429Rate limit exceeded (60 req/min free · 600 req/min Pro). Retry after 60 seconds.
413Payload too large (256 KB free · 1 MB Pro)
404Token not found or endpoint deleted

REST API Bearer auth required

All API routes require a Clerk JWT in the Authorization: Bearer <token> header.

POST /api/users/provision

Create shadow user record (call on first sign-in)

GET /api/users/me

Get current user plan and billing status

GET /api/endpoints

List all endpoints for the authenticated user

POST /api/endpoints

Create a new endpoint

GET /api/endpoints/:id

Get a single endpoint by ID

PATCH /api/endpoints/:id

Update endpoint name, active status, mock status, forward URL, or Slack webhook URL

DELETE /api/endpoints/:id

Delete endpoint and all its events

GET /api/endpoints/:id/events

List events for an endpoint (paginated, retention-filtered)

DELETE /api/endpoints/:id/events

Clear all events for an endpoint

GET /api/events/:eventId

Get a single event by ID

POST /api/events/:eventId/replay

Replay an event to a target URL (body: { targetUrl })

POST /api/billing/checkout

Create Stripe Checkout session for plan upgrade (body: { plan, billingPeriod, successUrl, cancelUrl })

POST /api/billing/portal

Create Stripe Customer Portal session (body: { returnUrl })

WebSocket (realtime)

Connect to receive events in real time. Authentication is via a Clerk JWT passed as a query parameter (browser WebSocket upgrades don't support headers).

wss://api.heylistenup.app/api/ws/{endpointId}?token={clerkJwt}

Messages you'll receive

{ "type": "connected", "endpointId": "..." }   // on connect
{ "type": "event", "data": { WebhookEvent } }   // on each webhook

Keepalive

Send "ping" every 25 seconds. The server responds with "pong". Cloudflare closes idle connections after 30 seconds.