API Reference

Last updated: April 2026

The WebhookWhisper REST API lets you manage endpoints, retrieve events, configure forwarding rules, and send test webhooks programmatically. All responses are JSON. Base URL: https://webhookwhisper.com

Base URL
webhookwhisper.com
Format
JSON (application/json)
Auth
Bearer token or API key

Related guides

Beyond the API reference below, these companion guides cover signature verification and embedding the live inspector in your own pages.

Authentication

Most endpoints require authentication. Pass your token in the Authorization header:

Authorization: Bearer sess_abc123...

# Or with an API key (Pro plan only):
Authorization: Bearer wf_live_abc123...

Get a session token from POST /api/auth/login. Get API keys (Pro only) from your dashboard settings.

Authentication

POST
/api/auth/register

Create a new user account. Returns a session token.

no auth
Request Body (JSON)
namestring — display name (2–100 chars)
emailstring — valid email address
passwordstring — min 8 characters
Response
{
  "data": {
    "user": { "id": "uuid", "name": "Jane", "email": "[email protected]", "plan": "free" },
    "token": "sess_abc123...",
    "expiresAt": "2026-05-09T00:00:00.000Z"
  }
}
POST
/api/auth/login

Sign in and receive a session token.

no auth
Request Body (JSON)
emailstring
passwordstring
Response
{
  "data": {
    "user": { "id": "uuid", "name": "Jane", "email": "[email protected]", "plan": "free" },
    "token": "sess_abc123...",
    "expiresAt": "2026-05-09T00:00:00.000Z"
  }
}
POST
/api/auth/logout

Invalidate the current session token.

Bearer token
Response
{ "data": { "message": "Logged out successfully" } }
GET
/api/auth/me

Get the currently authenticated user.

Bearer token
Response
{
  "data": {
    "user": { "id": "uuid", "name": "Jane", "email": "[email protected]", "plan": "free", "role": "user" }
  }
}

Receiving Webhooks

ALL
/hook/:slug

Your webhook endpoint URL. Accepts any HTTP method (GET, POST, PUT, PATCH, DELETE). Every incoming request is captured, stored, and forwarded per your rules. Returns immediately with a 200 response.

no auth
Response
{ "received": true }

Endpoints

GET
/api/endpoints

List all your webhook endpoints with event counts and last activity.

Bearer token
Response
{
  "data": [
    {
      "id": "uuid",
      "name": "My Stripe Endpoint",
      "slug": "abc123xyz",
      "description": "Stripe payments",
      "isActive": true,
      "webhookUrl": "https://webhookwhisper.com/hook/abc123xyz",
      "eventCount": 42,
      "ruleCount": 2,
      "lastEventAt": "2026-04-09T10:00:00.000Z",
      "createdAt": "2026-04-01T00:00:00.000Z"
    }
  ]
}
POST
/api/endpoints

Create a new webhook endpoint. Returns the endpoint with its unique webhook URL.

Bearer token
Request Body (JSON)
namestring — required (1–100 chars)
descriptionstring — optional (max 500 chars)
secretKeystring — optional, for signature verification
Response
{
  "data": {
    "id": "uuid",
    "name": "My Stripe Endpoint",
    "slug": "abc123xyz",
    "webhookUrl": "https://webhookwhisper.com/hook/abc123xyz",
    "isActive": true,
    "createdAt": "2026-04-09T00:00:00.000Z"
  }
}
GET
/api/endpoints/:id

Get a single endpoint with its forwarding rules and last 20 events.

Bearer token
Response
{
  "data": {
    "endpoint": { "id": "uuid", "name": "...", "webhookUrl": "...", "isActive": true },
    "rules": [ { "id": "uuid", "targetUrl": "https://myapp.com/hooks", "isActive": true } ],
    "recentEvents": [ { "id": "uuid", "method": "POST", "receivedAt": "..." } ]
  }
}
PUT
/api/endpoints/:id

Update endpoint name, description, active status, or custom response settings.

Bearer token
Request Body (JSON)
namestring — optional
descriptionstring — optional
isActiveboolean — optional
customResponseStatusnumber — optional, 200–599 (Pro only)
customResponseBodystring — optional JSON string (Pro only)
customResponseHeadersstring — optional JSON string (Pro only)
Response
{ "data": { "id": "uuid", "name": "Updated Name", "isActive": false } }
DELETE
/api/endpoints/:id

Delete an endpoint and all its events and forwarding rules.

Bearer token
Response
{ "data": { "message": "Endpoint deleted successfully" } }

Events

GET
/api/endpoints/:endpointId/events

List events for an endpoint, paginated. Supports filtering by HTTP method and body search.

Bearer token
Query Parameters
pagenumber — default 1
limitnumber — default 50, max 100
methodstring — filter by HTTP method (GET, POST, etc.)
searchstring — search within request body
Response
{
  "data": [
    {
      "id": "uuid",
      "method": "POST",
      "headers": { "content-type": "application/json", "x-stripe-signature": "t=..." },
      "query": {},
      "body": "{"type":"payment_intent.succeeded","amount":2999}",
      "bodyJson": { "type": "payment_intent.succeeded", "amount": 2999 },
      "sourceIp": "54.187.0.1",
      "size": 1024,
      "receivedAt": "2026-04-09T10:00:00.000Z",
      "deliveryCount": 2,
      "successCount": 2
    }
  ],
  "meta": { "page": 1, "limit": 50, "total": 142, "totalPages": 3 }
}
GET
/api/endpoints/:endpointId/events/:eventId

Get a single event with full headers, body, and all delivery attempt details.

Bearer token
Response
{
  "data": {
    "event": {
      "id": "uuid",
      "method": "POST",
      "headers": { "content-type": "application/json" },
      "body": "{"type":"checkout.session.completed"}",
      "bodyJson": { "type": "checkout.session.completed" },
      "receivedAt": "2026-04-09T10:00:00.000Z"
    },
    "deliveries": [
      {
        "id": "uuid",
        "targetUrl": "https://myapp.com/webhooks",
        "status": "success",
        "statusCode": 200,
        "durationMs": 145,
        "attempt": 1,
        "deliveredAt": "2026-04-09T10:00:01.000Z"
      }
    ]
  }
}
POST
/api/endpoints/:endpointId/events/:eventId/replay

Replay an event to all active forwarding rules. Re-enqueues delivery with retry logic.

PROBearer token
Response
{
  "data": {
    "message": "Event replayed to 2 rule(s)",
    "rulesCount": 2,
    "jobIds": ["job_abc", "job_xyz"]
  }
}

Forwarding Rules

GET
/api/endpoints/:endpointId/rules

List all forwarding rules for an endpoint.

Bearer token
Response
{
  "data": [
    {
      "id": "uuid",
      "endpointId": "uuid",
      "targetUrl": "https://myapp.com/webhooks",
      "httpMethod": "SAME",
      "retryCount": 3,
      "timeoutMs": 10000,
      "isActive": true,
      "customHeaders": "{}",
      "createdAt": "2026-04-01T00:00:00.000Z"
    }
  ]
}
POST
/api/endpoints/:endpointId/rules

Create a forwarding rule. Webhooks received at the endpoint will be forwarded to targetUrl.

Bearer token
Request Body (JSON)
targetUrlstring — required, valid URL (e.g. https://myapp.com/hooks or http://localhost:3000/hooks)
httpMethodstring — SAME | GET | POST | PUT | DELETE | PATCH. Default: SAME (mirrors incoming method)
retryCountnumber — 0–10. Default: 3
timeoutMsnumber — 1000–30000ms. Default: 10000
customHeadersstring — JSON object of extra headers to add. Default: {}
isActiveboolean — Default: true
Response
{
  "data": {
    "id": "uuid",
    "targetUrl": "https://myapp.com/webhooks",
    "httpMethod": "SAME",
    "retryCount": 3,
    "timeoutMs": 10000,
    "isActive": true,
    "createdAt": "2026-04-09T00:00:00.000Z"
  }
}
PUT
/api/endpoints/:endpointId/rules/:ruleId

Update a forwarding rule.

Bearer token
Request Body (JSON)
targetUrlstring — optional
httpMethodstring — optional
retryCountnumber — optional
timeoutMsnumber — optional
customHeadersstring — optional JSON
isActiveboolean — optional
Response
{ "data": { "id": "uuid", "targetUrl": "https://newurl.com/hooks", "isActive": false } }
DELETE
/api/endpoints/:endpointId/rules/:ruleId

Delete a forwarding rule.

Bearer token
Response
{ "data": { "message": "Rule deleted successfully" } }

Test Sender

GET
/api/test/samples

Get all 35+ available sample payloads (Stripe, GitHub, Shopify, Razorpay, etc.).

no auth
Response
{
  "data": {
    "samples": [
      {
        "id": "uuid",
        "provider": "stripe",
        "eventName": "payment_intent.succeeded",
        "category": "stripe",
        "description": "Payment Intent Succeeded",
        "method": "POST",
        "headers": { "content-type": "application/json", "stripe-signature": "..." },
        "payload": { "type": "payment_intent.succeeded", "data": { "object": { "amount": 2000 } } }
      }
    ]
  }
}
POST
/api/test/send

Send a custom HTTP request to any URL. Returns the response status, headers, body, and latency.

Bearer token
Request Body (JSON)
targetUrlstring — required, URL to send to
methodstring — GET | POST | PUT | DELETE | PATCH. Default: POST
headersobject — optional key/value headers
bodystring — optional request body
Response
{
  "data": {
    "success": true,
    "statusCode": 200,
    "responseHeaders": { "content-type": "application/json" },
    "responseBody": "{"ok":true}",
    "durationMs": 145
  }
}
POST
/api/test/send-sample

Send a pre-built sample payload from a specific provider to a target URL.

Bearer token
Request Body (JSON)
sampleIdstring — ID from GET /api/test/samples
targetUrlstring — URL to send the sample to
Response
{
  "data": {
    "success": true,
    "statusCode": 200,
    "durationMs": 120,
    "sampleUsed": { "provider": "stripe", "eventType": "payment_intent.succeeded", "name": "Payment Intent Succeeded" }
  }
}

API Keys

GET
/api/keys

List your API keys (key prefix and metadata only — full keys are never shown again).

PROBearer token
Response
{
  "data": [
    {
      "id": "uuid",
      "name": "Production Key",
      "keyPrefix": "wf_live_abc",
      "lastUsedAt": "2026-04-09T10:00:00.000Z",
      "createdAt": "2026-04-01T00:00:00.000Z"
    }
  ]
}
POST
/api/keys

Create an API key. The full key is shown only once — save it immediately.

PROBearer token
Request Body (JSON)
namestring — label for this key (1–100 chars)
Response
{
  "data": {
    "id": "uuid",
    "name": "Production Key",
    "keyPrefix": "wf_live_abc",
    "key": "wf_live_abc123xyz...",
    "warning": "Save this key now. You will not be able to see it again.",
    "createdAt": "2026-04-09T00:00:00.000Z"
  }
}
DELETE
/api/keys/:id

Revoke an API key. This immediately invalidates the key.

PROBearer token
Response
{ "data": { "message": "API key revoked successfully" } }

Stats

GET
/api/stats

Get your account stats: endpoint count, event totals, delivery success rate, avg latency. Pro accounts also get hourly chart data.

Bearer token
Response
{
  "data": {
    "endpoints": { "total": 3, "active": 3 },
    "events": { "total": 1420, "today": 87, "lastHour": 12 },
    "deliveries": { "success": 85, "failed": 2, "pending": 0 },
    "rules": { "total": 5, "active": 5 },
    "successRate": 97.7,
    "avgLatencyMs": 143
  }
}

Error Responses

All errors return JSON with an error field:

{ "error": "Endpoint not found" }

// Validation errors include details:
{
  "error": "Validation failed",
  "details": [{ "path": ["name"], "message": "String must contain at least 1 character(s)" }]
}

// Plan limit errors include upgrade info:
{
  "error": "API keys are a Pro feature",
  "upgradeRequired": true
}
StatusMeaning
200OK — request succeeded
201Created — resource created successfully
400Bad Request — validation failed or malformed JSON
401Unauthorized — missing or invalid token
403Forbidden — feature requires a higher plan, or you don't own this resource
404Not Found — endpoint, event, or rule doesn't exist
410Gone — guest endpoint has expired
429Too Many Requests — rate limit exceeded
500Internal Server Error — something went wrong on our end

Code Examples

Create an endpoint and get its URL

# 1. Login to get a token
curl -X POST https://webhookwhisper.com/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"yourpassword"}'

# Response: { "data": { "token": "sess_abc...", "user": {...} } }

# 2. Create an endpoint
curl -X POST https://webhookwhisper.com/api/endpoints \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sess_abc..." \
  -d '{"name":"My Stripe Endpoint","description":"Production payments"}'

# Response includes webhookUrl: "https://webhookwhisper.com/hook/abc123xyz"

# 3. Add a forwarding rule to your local server
curl -X POST https://webhookwhisper.com/api/endpoints/{endpointId}/rules \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sess_abc..." \
  -d '{"targetUrl":"http://localhost:3000/webhooks","retryCount":3}'

List recent events

curl https://webhookwhisper.com/api/endpoints/{endpointId}/events?limit=10 \
  -H "Authorization: Bearer sess_abc..."

Send a Stripe test payload

# 1. Get sample IDs
curl https://webhookwhisper.com/api/test/samples

# 2. Send the sample to your endpoint
curl -X POST https://webhookwhisper.com/api/test/send-sample \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sess_abc..." \
  -d '{
    "sampleId": "uuid-of-stripe-sample",
    "targetUrl": "https://webhookwhisper.com/hook/abc123xyz"
  }'

Rate Limits

EndpointLimit
POST /api/test/sendDaily limit per user (plan-dependent)
POST /api/test/send-sampleDaily limit per user (plan-dependent)
POST /hook/:slug (receiving)No limit on receiving webhooks
All other API endpointsStandard rate limits apply