API Reference
Complete reference for the HostWebhook REST API — ingress, webhook management, additional targets, and event operations.
Base URL
https://api.hostwebhook.comhostwh login — the dashboard and CLI handle authentication automatically.Ingress (webhook receiver)
/api/in/:tokenpublicAccept an incoming webhook. Responds immediately with 202 Accepted. The payload is stored and queued for delivery.
Path / query params
tokenstringrequiredIngress token from the webhookHTTP 202 Accepted
{ "eventId": "64f1a2b3c4d5e6f7a8b9c0d1" }Webhooks
List webhooks
/webhooksList all webhooks for the authenticated user/organization.
[{ "id": "...", "name": "Stripe prod", "targetUrl": "https://...", "isActive": true, ... }]Create webhook
/webhooksCreate a new webhook. Returns the webhook with its ingress URL and signing secret.
Request body
namestringrequiredFriendly labeltargetUrlstringYour server's webhook handler URL (optional — leave empty for notification-only webhooks)descriptionstringOptional descriptionisActivebooleanWhether to accept deliveries (default: true)maxRetriesnumber0–20 (default: 3)retryDelaySecondsnumberBase delay for exponential backoff (default: 60, min: 10)rateLimitPerMinutenumberMax deliveries per minute — 0 = unlimited (default: 0)incomingSignatureTypestringVerify inbound signatures: none | stripe | github | custom (default: none)incomingSignatureSecretstringSecret used to verify inbound signatures (required if type ≠ none)payloadFiltersPayloadFilter[]Rules to discard events before deliverydegradedAfternumberConsecutive failures before health → degraded (default: 2)downAfternumberConsecutive failures before health → down (default: 4){
"id": "...",
"name": "Stripe prod",
"targetUrl": "https://yourapp.com/webhooks",
"ingressToken": "tok_...",
"signingSecret": "whsec_...",
"isActive": true,
"maxRetries": 3,
"retryDelaySeconds": 60,
"rateLimitPerMinute": 0,
"incomingSignatureType": "stripe",
"payloadFilters": [],
"healthStatus": "healthy",
"createdAt": "2024-05-01T12:00:00.000Z"
}Get webhook
/webhooks/:idGet a single webhook by ID.
Path / query params
idstringrequiredWebhook IDUpdate webhook
/webhooks/:idUpdate any webhook field. All fields are optional — only provided fields are updated.
Path / query params
idstringrequiredWebhook IDRequest body
namestringtargetUrlstringdescriptionstringmaxRetriesnumberretryDelaySecondsnumberrateLimitPerMinutenumberisActivebooleanincomingSignatureTypestringincomingSignatureSecretstringpayloadFiltersPayloadFilter[]Replaces the full filter listDelete webhook
/webhooks/:idPermanently delete a webhook and all its events.
Path / query params
idstringrequiredWebhook ID204 No Content
Toggle active
/webhooks/:id/toggle-activeToggle the webhook's isActive status (pause/activate).
Path / query params
idstringrequiredWebhook ID{ "isActive": false }Rotate ingress token
/webhooks/:id/rotate-tokenGenerate a new ingress token. The old ingress URL stops working immediately.
Path / query params
idstringrequiredWebhook ID{ "ingressToken": "tok_newtoken..." }Rotate signing secret
/webhooks/:id/rotate-signing-secretGenerate a new signing secret. The old secret stops working immediately.
Path / query params
idstringrequiredWebhook ID{ "signingSecret": "whsec_newsecret..." }Payload Filters
Payload filters discard events before delivery. Only events matching all rules are delivered — non-matching events are marked filtered.
PayloadFilter object
| Field | Type | Description |
|---|---|---|
| field | string | Dot-notation path (e.g. data.object.status) |
| operator | string | eq | neq | contains | gt | lt | exists | not_exists | in | not_in |
| value | string? | Comparison value — not required for exists / not_exists |
Example
{
"payloadFilters": [
{ "field": "type", "operator": "eq", "value": "invoice.paid" },
{ "field": "data.object.amount_paid", "operator": "gt", "value": "1000" }
]
}Additional targets
Additional targets are separate resources linked to one or more webhooks. When an event arrives, all active additional targets attached to it are delivered in parallel — each with its own retry budget, filters, and optional payload transform.
Additional target object
| Field | Type | Description |
|---|---|---|
| id | string | Unique ID |
| name | string | Friendly label |
| url | string | Destination URL |
| isActive | boolean | Enable/disable without removing (default: true) |
| maxRetries | number? | Override retry count (plan-limited: Free max 3, Pro max 10) |
| inputNodes | { nodeType, nodeId }[] | Upstream nodes that feed this one. nodeType is the node kind (webhook, scheduledWorkflow, filter, …) |
| filters | PayloadFilter[] | Per-target payload filters |
| payloadTransform | string? | JSON template with {{path}} interpolation — reshapes payload before delivery |
| notifyPrimaryOnFailure | boolean | When true: POST a target.failed notification to the webhook's primary targetUrl if this additional target exhausts all retries (default: false) |
List additional targets
/additional-targetsList all additional targets for the authenticated user/organization.
[{ "id": "...", "name": "Stripe → Discord", "url": "https://discord.com/...", "inputNodes": [{ "nodeType": "webhook", "nodeId": "..." }], ... }]Create additional target
/additional-targetsCreate a new additional target linked to one or more webhooks.
Request body
namestringrequiredFriendly labelurlstringrequiredDestination URLisActivebooleanDefault: truemaxRetriesnumberAdditional attempts after a failure (plan-limited: Free max 3, Pro max 10)filtersPayloadFilter[]Per-target payload filterspayloadTransformstringJSON template string with {{path}} expressionsnotifyPrimaryOnFailurebooleanPOST a target.failed notification to the webhook's primary targetUrl when this additional target permanently fails (default: false){
"id": "...",
"name": "Stripe → Discord",
"url": "https://discord.com/api/webhooks/...",
"isActive": true,
"inputNodes": [{ "nodeType": "webhook", "nodeId": "ep_abc123" }],
"filters": [],
"payloadTransform": "{ \"embeds\": [...] }",
"createdAt": "..."
}Get additional target
/additional-targets/:idGet a single additional target by ID.
Path / query params
idstringrequiredAdditional target IDUpdate additional target
/additional-targets/:idUpdate an additional target. All fields are optional.
Path / query params
idstringrequiredAdditional target IDRequest body
namestringurlstringisActivebooleanmaxRetriesnumberfiltersPayloadFilter[]Replaces the full filter listpayloadTransformstring | nullSet to null to remove the transformnotifyPrimaryOnFailurebooleanDelete additional target
/additional-targets/:idPermanently delete an additional target.
Path / query params
idstringrequiredAdditional target ID204 No Content
Events
List events
/eventsList events with optional filters. Returns paginated results.
Path / query params
webhookIdstringFilter by webhookstatusstringpending | delivered | retrying | failed | filteredeventTypestringMatch the top-level type or event field in the payloaddateFromstringISO 8601 date (inclusive)dateTostringISO 8601 date (inclusive)pagenumberPage number (default: 1)limitnumberResults per page (default: 15, max: 100){
"data": [{ "id": "...", "status": "delivered", "createdAt": "...", ... }],
"total": 142,
"page": 1,
"limit": 15
}Get distinct event types
/events/typesGet all distinct event types (top-level type field) seen on a webhook. Used to populate filter dropdowns.
Path / query params
webhookIdstringFilter to one webhook["payment_intent.succeeded", "payment_intent.created", "customer.subscription.updated"]
Get event
/events/:idGet a single event with its full payload.
Path / query params
idstringrequiredEvent IDDelivery attempts
/events/:eventId/deliveriesList all delivery attempts for an event, including response body, latency, and target info.
Path / query params
eventIdstringrequired[{
"id": "...",
"targetUrl": "https://yourapp.com/webhooks",
"isAdditionalTarget": false,
"attempt": 1,
"statusCode": 200,
"responseBody": "ok",
"latencyMs": 143,
"success": true,
"attemptedAt": "2024-05-01T12:00:00.000Z"
}]Replay event
/events/:eventId/replayManually replay an event. Creates a new delivery attempt with the original payload.
Path / query params
eventIdstringrequired{ "ok": true }Replay all failed
/events/replay-allReplay all failed events for a webhook.
Path / query params
webhookIdstringrequiredQuery param{ "queued": 12 }Cancel event
/events/:eventId/cancelCancel a pending or retrying event. Cannot be undone, but can be replayed.
Path / query params
eventIdstringrequired204 No Content
Delivery stats
/events/statsAggregate delivery stats for the current user.
Path / query params
webhookIdstringFilter to one webhook{ "total": 1200, "delivered": 1180, "failed": 20, "successRate": 98.3 }Latency stats
/events/latencyLatency percentiles (ms) for successful deliveries.
Path / query params
webhookIdstringFilter to one webhook{ "avg": 210, "p95": 580, "p99": 1240 }Routers
/routersList all routers.
/routersCreate a router with conditional routing rules.
Request body
namestringrequiredRouter nameroutesRoute[]Array of {field, operator, value, outputWebhookId}/routers/:idUpdate a router.
Path / query params
idstringrequired/routers/:idDelete a router.
Path / query params
idstringrequired204 No Content
Filter Nodes
/filter-nodesList all filter nodes.
/filter-nodesCreate a filter node.
Request body
namestringrequiredFilter namefilterModestring'and' | 'or' (default: 'and')filtersFilter[]Array of {field, operator, value}/filter-nodes/:idUpdate a filter node.
Path / query params
idstringrequired/filter-nodes/:idDelete a filter node.
Path / query params
idstringrequired204 No Content
Transform Nodes
/transform-nodesList all transform nodes.
/transform-nodesCreate a transform node.
Request body
namestringrequiredTransform nametransformModestring'handlebars' | 'jq' | 'javascript'templatestringTransform template string/transform-nodes/:idUpdate a transform node.
Path / query params
idstringrequired/transform-nodes/:idDelete a transform node.
Path / query params
idstringrequired204 No Content
Schema Validators
/schema-validatorsList all schema validators.
/schema-validatorsCreate a schema validator.
Request body
namestringrequiredValidator namestrictModebooleanReject payloads with extra fields (default: false)fieldsField[]Array of {path, type, required, constraints}/schema-validators/:idUpdate a schema validator.
Path / query params
idstringrequired/schema-validators/:idDelete a schema validator.
Path / query params
idstringrequired204 No Content
Delay Nodes
/delay-nodesList all delay nodes.
/delay-nodesCreate a delay node.
Request body
namestringrequiredDelay namedelaySecondsnumberrequiredSeconds to delay before forwarding/delay-nodes/:idUpdate a delay node.
Path / query params
idstringrequired/delay-nodes/:idDelete a delay node.
Path / query params
idstringrequired204 No Content
Merge Nodes
/merge-nodesList all merge nodes.
/merge-nodesCreate a merge node.
Request body
namestringrequiredMerge namemodestring'wait_all' | 'first' (default: 'wait_all')expectedBranchCountnumberNumber of branches to wait for/merge-nodes/:idUpdate a merge node.
Path / query params
idstringrequired/merge-nodes/:idDelete a merge node.
Path / query params
idstringrequired204 No Content
Approval Nodes
/approval-nodesList all approval nodes.
/approval-nodesCreate an approval node.
Request body
namestringrequiredApproval gate nametimeoutMinutesnumberAuto-action after timeout (default: 60)autoActionOnTimeoutstring'approve' | 'reject' (default: 'reject')notifyEmailsstring[]Emails to notify for approval/approval-nodes/:id/approveApprove a pending event at this gate.
Path / query params
idstringrequired/approval-nodes/:id/rejectReject a pending event at this gate.
Path / query params
idstringrequired/approval-nodes/:idUpdate an approval node.
Path / query params
idstringrequired/approval-nodes/:idDelete an approval node.
Path / query params
idstringrequired204 No Content
Email Actions
/email-actionsList all email actions.
/email-actionsCreate an email action.
Request body
namestringrequiredEmail action nametostringrequiredRecipient emailsubjectstringEmail subject (supports templates)bodystringEmail body (supports templates)triggerOnstring'success' | 'failure' | 'always'/email-actions/:idUpdate an email action.
Path / query params
idstringrequired/email-actions/:idDelete an email action.
Path / query params
idstringrequired204 No Content
Gmail
/gmail-actionsList all Gmail nodes.
/gmail-actionsCreate a Gmail node.
Request body
namestringrequiredGmail node namecredentialIdstringConnected Google accountoperationstringOne of the 17 operations (default: 'send')operationConfigobjectParameters for the chosen operation (supports templates)aiEnabledbooleanExpose the 16-tool toolkit to an AI NodetriggerOnstring'success' | 'always'/gmail-actions/:idUpdate a Gmail node.
Path / query params
idstringrequiredGmail node ID/gmail-actions/:idDelete a Gmail node.
Path / query params
idstringrequiredGmail node ID/gmail-actions/labels/:credentialIdList the account's Gmail labels.
Path / query params
credentialIdstringrequiredConnected Google accountHTTP Actions
/http-actionsList all HTTP actions.
/http-actionsCreate an HTTP action.
Request body
namestringrequiredHTTP action nameurlstringrequiredTarget URLmethodstringGET | POST | PUT | PATCH | DELETE (default: POST)headersobjectCustom headersbodystringRequest body templatetriggerOnstring'success' | 'failure' | 'always'/http-actions/:idUpdate an HTTP action.
Path / query params
idstringrequired/http-actions/:idDelete an HTTP action.
Path / query params
idstringrequired204 No Content
MongoDB Actions
/mongo-actionsList all MongoDB actions.
/mongo-actionsCreate a MongoDB action.
Request body
namestringrequiredAction nameconnectionUristringrequiredMongoDB connection string (encrypted)databasestringrequiredDatabase namecollectionstringrequiredCollection nameoperationstring'insertOne' | 'updateOne' | 'replaceOne'documentstringDocument template/mongo-actions/:idUpdate a MongoDB action.
Path / query params
idstringrequired/mongo-actions/:idDelete a MongoDB action.
Path / query params
idstringrequired204 No Content
Notification Actions
/notification-actionsList all notification actions (Slack/Discord).
/notification-actionsCreate a notification action.
Request body
namestringrequiredAction nameplatformstringrequired'slack' | 'discord'webhookUrlstringrequiredPlatform webhook URLtemplatePresetstring'default' | 'detailed' | 'minimal' | 'custom'triggerOnstring'success' | 'failure' | 'always'/notification-actions/:idUpdate a notification action.
Path / query params
idstringrequired/notification-actions/:idDelete a notification action.
Path / query params
idstringrequired204 No Content
Google Sheets Actions
/sheets-actionsList all Google Sheets actions.
/sheets-actionsCreate a Sheets action.
Request body
namestringrequiredAction namespreadsheetIdstringrequiredGoogle Sheets spreadsheet IDsheetNamestringSheet tab name (default: Sheet1)operationstring'append_row' | 'update_cell'columnsstring[]Template array mapping payload fields to columns/sheets-actions/:idUpdate a Sheets action.
Path / query params
idstringrequired/sheets-actions/:idDelete a Sheets action.
Path / query params
idstringrequired204 No Content
Scheduled Workflows
/scheduled-workflowsList all scheduled webhooks.
/scheduled-workflowsCreate a scheduled webhook (cron-based HTTP calls).
Request body
namestringrequiredNamecronExpressionstringrequiredCron expression (e.g. '0 */5 * * *')urlstringTarget URL (or connect to a webhook)methodstringHTTP method (default: POST)headersobjectCustom headersbodystringRequest bodyisActivebooleanEnable/disable (default: true)/scheduled-workflows/:idUpdate a scheduled webhook.
Path / query params
idstringrequired/scheduled-workflows/:idDelete a scheduled webhook.
Path / query params
idstringrequired204 No Content
Canvas Snapshots
/canvas-snapshotsList all canvas snapshots.
/canvas-snapshotsSave a canvas snapshot (nodes + edges layout).
Request body
namestringrequiredSnapshot namenodesobject[]requiredReactFlow nodes arrayedgesobject[]requiredReactFlow edges array/canvas-snapshots/:idGet a single snapshot.
Path / query params
idstringrequired/canvas-snapshots/:idDelete a snapshot.
Path / query params
idstringrequired204 No Content
Time Travel
/events/:id/time-travelDry-run replay an event through a historical canvas snapshot.
Request body
snapshotIdstringrequiredCanvas snapshot ID to simulate against{
"steps": [{ "node": "schema-validator", "name": "...", "result": "pass" }, ...],
"finalStatus": "delivered",
"matchedNodes": 4
}Contract Testing
/events/:webhookId/contract-healthValidate recent events against connected schema validators.
Path / query params
webhookIdstringrequiredWebhook IDlimitnumberNumber of recent events to check (default: 100){
"score": 94,
"totalChecked": 100,
"passed": 94,
"failed": 6,
"validators": [{ "id": "...", "name": "...", "passRate": 94 }]
}Errors
All error responses follow a consistent shape:
{
"statusCode": 400,
"message": "targetUrl must be a URL address",
"error": "Bad Request"
}| Status | Meaning |
|---|---|
| 400 | Bad Request — invalid or missing parameters |
| 401 | Unauthorized — missing or expired session |
| 403 | Forbidden — resource belongs to another user, or plan limit exceeded |
| 404 | Not Found — resource doesn't exist |
| 429 | Too Many Requests — rate limit exceeded |
| 500 | Internal Server Error — something went wrong on our end |