AutomationFlowsWeb Scraping › Webhook-ai-router — Signed Webhook Example

Webhook-ai-router — Signed Webhook Example

webhook-ai-router — signed webhook example. Uses httpRequest. Event-driven trigger; 3 nodes.

Event trigger★★★★☆ complexity3 nodesHTTP Request
Web Scraping Trigger: Event Nodes: 3 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "webhook-ai-router \u2014 signed webhook example",
  "nodes": [
    {
      "id": "f76b6c2c-0001-4d1e-9b3b-000000000001",
      "name": "When clicking 'Test workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        240,
        320
      ],
      "parameters": {}
    },
    {
      "id": "f76b6c2c-0002-4d1e-9b3b-000000000002",
      "name": "Build signed request",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        480,
        320
      ],
      "parameters": {
        "language": "javaScript",
        "jsCode": "// Build a signed POST body for webhook-ai-router.\n//\n// Signature shape mirrors core/security.py:verify_hmac \u2014\n// HMAC-SHA256 of \"{timestamp}.{raw_body}\" using the shared secret.\n// The same raw body bytes that get signed are the ones POSTed.\n//\n// Configure with the n8n credentials store or, for a quick demo, edit\n// the SECRET / TARGET_URL constants below.\n\nconst crypto = require('crypto');\n\nconst SECRET = process.env.HUBSPOT_WEBHOOK_SECRET || 'ci-test-secret';\nconst TARGET_URL = process.env.WEBHOOK_ROUTER_URL || 'http://localhost:8000/webhooks/hubspot';\n\nconst body = JSON.stringify([\n  {\n    eventId: Math.floor(Math.random() * 1_000_000),\n    subscriptionType: 'contact.creation',\n    portalId: 12345,\n    objectId: 999,\n    occurredAt: Date.now(),\n  },\n]);\n\nconst timestamp = Math.floor(Date.now() / 1000).toString();\nconst signature = crypto\n  .createHmac('sha256', SECRET)\n  .update(`${timestamp}.${body}`)\n  .digest('hex');\nconst idempotencyKey = crypto.randomUUID();\n\nreturn [\n  {\n    json: {\n      target_url: TARGET_URL,\n      body,\n      timestamp,\n      signature,\n      idempotency_key: idempotencyKey,\n    },\n  },\n];\n"
      }
    },
    {
      "id": "f76b6c2c-0003-4d1e-9b3b-000000000003",
      "name": "POST /webhooks/hubspot",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        760,
        320
      ],
      "parameters": {
        "method": "POST",
        "url": "={{ $json.target_url }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "X-Signature",
              "value": "={{ $json.signature }}"
            },
            {
              "name": "X-Timestamp",
              "value": "={{ $json.timestamp }}"
            },
            {
              "name": "Idempotency-Key",
              "value": "={{ $json.idempotency_key }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "raw",
        "rawContentType": "application/json",
        "body": "={{ $json.body }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "responseFormat": "json"
            }
          }
        }
      }
    }
  ],
  "connections": {
    "When clicking 'Test workflow'": {
      "main": [
        [
          {
            "node": "Build signed request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build signed request": {
      "main": [
        [
          {
            "node": "POST /webhooks/hubspot",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "00000000-0000-0000-0000-000000000001",
  "id": "webhook-ai-router-example"
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

webhook-ai-router — signed webhook example. Uses httpRequest. Event-driven trigger; 3 nodes.

Source: https://github.com/JohnARI/webhook-ai-router/blob/9a4a8535671aa1a3ab44438709dcb4ce931ed5ef/examples/n8n-workflow.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

This workflow listens for an “Approved” label on a Trello card, reads the AI draft bookkeeping JSON from card comments, and posts the corresponding transaction to Xero. It then adds a Xero deep link b

Trello Trigger, HTTP Request
Web Scraping

02_LLM_Pipeline v1.0. Uses executeWorkflowTrigger, httpRequest, seaTable. Event-driven trigger; 65 nodes.

Execute Workflow Trigger, HTTP Request, Sea Table
Web Scraping

This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t

Execute Command, Read Write File, HTTP Request +3
Web Scraping

[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.

HTTP Request, GitHub, Stop And Error +1
Web Scraping

[](https://youtu.be/c7yCZhmMjtI)

HTTP Request, GitHub, Stop And Error +1