AutomationFlowsWeb Scraping › Expertise Inflation Index (eii) - Full Pipeline

Expertise Inflation Index (eii) - Full Pipeline

Expertise Inflation Index (EII) - Full Pipeline. Uses httpRequest. Webhook trigger; 11 nodes.

Webhook trigger★★★★☆ complexity11 nodesHTTP Request
Web Scraping Trigger: Webhook Nodes: 11 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": "Expertise Inflation Index (EII) - Full Pipeline",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "eii-analyze",
        "options": {}
      },
      "id": "webhook-trigger",
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "url": "https://api.firecrawl.dev/v0/scrape",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "firecrawlApi",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{$env.FIRECRAWL_API_KEY}}"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "url",
              "value": "={{$json.url}}"
            },
            {
              "name": "formats",
              "value": "[\"markdown\"]"
            },
            {
              "name": "onlyMainContent",
              "value": true
            }
          ]
        },
        "options": {}
      },
      "id": "firecrawl-scrape",
      "name": "Firecrawl Scrape",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        460,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "success-check",
              "leftValue": "={{$json.success}}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "equal"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "check-scrape-success",
      "name": "Check Scrape Success",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "url": "https://api.openai.com/v1/chat/completions",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "openAiApi",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{$env.OPENAI_API_KEY}}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "gpt-4"
            },
            {
              "name": "messages",
              "value": "=[{\"role\": \"user\", \"content\": \"{{$('Load EII Prompt').first().$json.prompt.replace('[INSERT ARTICLE TEXT HERE]', $json.data.markdown)}}\"}]"
            },
            {
              "name": "temperature",
              "value": 0.3
            },
            {
              "name": "max_tokens",
              "value": 1000
            }
          ]
        },
        "options": {}
      },
      "id": "openai-analysis",
      "name": "OpenAI Analysis",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        1120,
        200
      ]
    },
    {
      "parameters": {
        "url": "https://api.anthropic.com/v1/messages",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "anthropicApi",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{$env.ANTHROPIC_API_KEY}}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "claude-3-haiku-20240307"
            },
            {
              "name": "max_tokens",
              "value": 1000
            },
            {
              "name": "temperature",
              "value": 0.3
            },
            {
              "name": "messages",
              "value": "=[{\"role\": \"user\", \"content\": \"{{$('Load EII Prompt').first().$json.prompt.replace('[INSERT ARTICLE TEXT HERE]', $('Firecrawl Scrape').first().$json.data.markdown)}}\"}]"
            }
          ]
        },
        "options": {}
      },
      "id": "anthropic-analysis",
      "name": "Anthropic Analysis",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        1120,
        400
      ]
    },
    {
      "parameters": {
        "jsCode": "// Load the EII scoring prompt\nconst fs = require('fs');\nconst path = require('path');\n\n// Read the prompt file\nconst promptPath = path.join(__dirname, '../prompts/score_prompt.txt');\nlet prompt;\n\ntry {\n  prompt = fs.readFileSync(promptPath, 'utf8');\n} catch (error) {\n  // Fallback prompt if file not found\n  prompt = `You are an expert analyst tasked with evaluating articles for \"expertise inflation\" - the tendency for AI-related content to exhibit overconfidence, excessive jargon, and inflated claims of expertise.\n\nAnalyze the following article and score it on these five dimensions (1-10 scale):\n\n**CONFIDENCE INFLATION (1-10):**\n- 1-3: Humble, acknowledges limitations, uses hedging language\n- 4-6: Moderate confidence, some definitive statements but balanced\n- 7-8: High confidence, frequent definitive claims, minimal uncertainty\n- 9-10: Extreme overconfidence, absolute statements, dismisses alternatives\n\n**JARGON DENSITY (1-10):**\n- 1-3: Plain language, minimal technical terms, concepts well-explained\n- 4-6: Some technical language but accessible, good explanations\n- 7-8: Heavy jargon, buzzwords, assumes expert knowledge\n- 9-10: Incomprehensible jargon wall, buzzword bingo, obfuscating\n\n**SELF-REFERENCE/AUTHORITY (1-10):**\n- 1-3: Minimal self-promotion, cites others, collaborative tone\n- 4-6: Some personal expertise mentioned, balanced citations\n- 7-8: Frequent self-citation, emphasizes own authority/experience\n- 9-10: Extreme self-promotion, dismisses others, \"guru\" positioning\n\n**ORIGINALITY CLAIMS (1-10):**\n- 1-3: Builds on existing work, gives credit, incremental insights\n- 4-6: Some novel ideas mixed with established concepts\n- 7-8: Claims significant breakthroughs, overstates novelty\n- 9-10: Claims to have \"cracked the code\", revolutionary breakthrough\n\n**HUMOR/SELF-AWARENESS (1-10):**\n- 1-3: No humor, takes itself very seriously, lacks perspective\n- 4-6: Occasional light moments, some self-awareness\n- 7-8: Good humor, acknowledges absurdities, self-deprecating\n- 9-10: Satirical, highly self-aware, embraces the absurd\n\nReturn your analysis as a JSON object with this exact structure:\n\n{\n  \"scores\": {\n    \"confidence\": <1-10 integer>,\n    \"jargon_density\": <1-10 integer>, \n    \"self_reference\": <1-10 integer>,\n    \"originality\": <1-10 integer>,\n    \"humor_rating\": <1-10 integer>\n  },\n  \"analysis\": {\n    \"overall_eii_score\": <calculated average of first 4 scores>,\n    \"key_phrases\": [\"<notable overconfident phrase>\", \"<jargon example>\", \"<self-reference example>\"],\n    \"tone_summary\": \"<2-3 sentence summary of the article's tone and approach>\",\n    \"inflation_type\": \"<primary type: 'Technical Guru', 'Thought Leader', 'Breakthrough Claimer', 'Jargon Bomber', or 'Balanced'>\"\n  }\n}\n\n---\n\nARTICLE TO ANALYZE:\n\n[INSERT ARTICLE TEXT HERE]`;\n}\n\nreturn [{ json: { prompt } }];"
      },
      "id": "load-eii-prompt",
      "name": "Load EII Prompt",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        900,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "// Parse LLM responses and prepare data for Supabase\nconst openaiResult = $('OpenAI Analysis').first();\nconst anthropicResult = $('Anthropic Analysis').first();\nconst originalUrl = $('Webhook Trigger').first().$json.url;\nconst scrapedData = $('Firecrawl Scrape').first().$json.data;\n\n// Extract JSON from OpenAI response\nlet openaiScores = null;\ntry {\n  const openaiContent = openaiResult.$json.choices[0].message.content;\n  const jsonStart = openaiContent.indexOf('{');\n  const jsonEnd = openaiContent.lastIndexOf('}') + 1;\n  if (jsonStart !== -1 && jsonEnd > jsonStart) {\n    openaiScores = JSON.parse(openaiContent.substring(jsonStart, jsonEnd));\n  }\n} catch (error) {\n  console.log('Failed to parse OpenAI response:', error);\n}\n\n// Extract JSON from Anthropic response\nlet anthropicScores = null;\ntry {\n  const anthropicContent = anthropicResult.$json.content[0].text;\n  const jsonStart = anthropicContent.indexOf('{');\n  const jsonEnd = anthropicContent.lastIndexOf('}') + 1;\n  if (jsonStart !== -1 && jsonEnd > jsonStart) {\n    anthropicScores = JSON.parse(anthropicContent.substring(jsonStart, jsonEnd));\n  }\n} catch (error) {\n  console.log('Failed to parse Anthropic response:', error);\n}\n\n// Use OpenAI as primary, Anthropic as fallback\nconst finalScores = openaiScores || anthropicScores;\n\nif (!finalScores) {\n  throw new Error('Failed to parse any LLM response');\n}\n\n// Prepare article data for insertion\nconst articleData = {\n  title: scrapedData.title || 'Untitled',\n  source: new URL(originalUrl).hostname,\n  url: originalUrl,\n  author: scrapedData.author || null,\n  content: scrapedData.markdown,\n  published_at: scrapedData.publishedTime || new Date().toISOString(),\n  scored_at: new Date().toISOString()\n};\n\n// Prepare scores data\nconst scoresData = {\n  confidence: finalScores.scores.confidence,\n  jargon_density: finalScores.scores.jargon_density,\n  self_reference: finalScores.scores.self_reference,\n  originality: finalScores.scores.originality,\n  humor_rating: finalScores.scores.humor_rating,\n  summary: JSON.stringify(finalScores.analysis)\n};\n\nreturn [{\n  json: {\n    article: articleData,\n    scores: scoresData,\n    analysis: finalScores.analysis,\n    model_used: openaiScores ? 'gpt-4' : 'claude-3-haiku'\n  }\n}];"
      },
      "id": "prepare-supabase-data",
      "name": "Prepare Supabase Data",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1360,
        300
      ]
    },
    {
      "parameters": {
        "url": "={{$env.SUPABASE_URL}}/rest/v1/articles",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{$env.SUPABASE_SERVICE_ROLE_KEY}}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "apikey",
              "value": "{{$env.SUPABASE_ANON_KEY}}"
            },
            {
              "name": "Prefer",
              "value": "return=representation"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "title",
              "value": "={{$json.article.title}}"
            },
            {
              "name": "source",
              "value": "={{$json.article.source}}"
            },
            {
              "name": "url",
              "value": "={{$json.article.url}}"
            },
            {
              "name": "author",
              "value": "={{$json.article.author}}"
            },
            {
              "name": "content",
              "value": "={{$json.article.content}}"
            },
            {
              "name": "published_at",
              "value": "={{$json.article.published_at}}"
            },
            {
              "name": "scored_at",
              "value": "={{$json.article.scored_at}}"
            }
          ]
        },
        "options": {}
      },
      "id": "insert-article",
      "name": "Insert Article",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        1580,
        200
      ]
    },
    {
      "parameters": {
        "url": "={{$env.SUPABASE_URL}}/rest/v1/scores",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{$env.SUPABASE_SERVICE_ROLE_KEY}}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "apikey",
              "value": "={{$env.SUPABASE_ANON_KEY}}"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "article_id",
              "value": "={{$('Insert Article').first().$json[0].id}}"
            },
            {
              "name": "confidence",
              "value": "={{$json.scores.confidence}}"
            },
            {
              "name": "jargon_density",
              "value": "={{$json.scores.jargon_density}}"
            },
            {
              "name": "self_reference",
              "value": "={{$json.scores.self_reference}}"
            },
            {
              "name": "originality",
              "value": "={{$json.scores.originality}}"
            },
            {
              "name": "humor_rating",
              "value": "={{$json.scores.humor_rating}}"
            },
            {
              "name": "summary",
              "value": "={{$json.scores.summary}}"
            }
          ]
        },
        "options": {}
      },
      "id": "insert-scores",
      "name": "Insert Scores",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [
        1580,
        400
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\n  \"success\": true,\n  \"message\": \"Article analyzed successfully\",\n  \"data\": {\n    \"url\": \"{{$json.article.url}}\",\n    \"title\": \"{{$json.article.title}}\",\n    \"eii_score\": {{$json.analysis.overall_eii_score}},\n    \"scores\": {\n      \"confidence\": {{$json.scores.confidence}},\n      \"jargon_density\": {{$json.scores.jargon_density}},\n      \"self_reference\": {{$json.scores.self_reference}},\n      \"originality\": {{$json.scores.originality}},\n      \"humor_rating\": {{$json.scores.humor_rating}}\n    },\n    \"analysis\": {\n      \"tone_summary\": \"{{$json.analysis.tone_summary}}\",\n      \"inflation_type\": \"{{$json.analysis.inflation_type}}\",\n      \"key_phrases\": {{JSON.stringify($json.analysis.key_phrases)}}\n    },\n    \"model_used\": \"{{$json.model_used}}\"\n  }\n}",
        "options": {}
      },
      "id": "webhook-response",
      "name": "Webhook Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": [
        1800,
        300
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\n  \"success\": false,\n  \"error\": \"Failed to scrape article\",\n  \"message\": \"Unable to extract content from the provided URL\",\n  \"url\": \"{{$('Webhook Trigger').first().$json.url}}\"\n}",
        "responseCode": 400,
        "options": {}
      },
      "id": "error-response",
      "name": "Error Response",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": [
        680,
        480
      ]
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Firecrawl Scrape",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Firecrawl Scrape": {
      "main": [
        [
          {
            "node": "Check Scrape Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Scrape Success": {
      "main": [
        [
          {
            "node": "Load EII Prompt",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Error Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Load EII Prompt": {
      "main": [
        [
          {
            "node": "OpenAI Analysis",
            "type": "main",
            "index": 0
          },
          {
            "node": "Anthropic Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Analysis": {
      "main": [
        [
          {
            "node": "Prepare Supabase Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Anthropic Analysis": {
      "main": [
        [
          {
            "node": "Prepare Supabase Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Supabase Data": {
      "main": [
        [
          {
            "node": "Insert Article",
            "type": "main",
            "index": 0
          },
          {
            "node": "Insert Scores",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert Article": {
      "main": [
        [
          {
            "node": "Webhook Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert Scores": {
      "main": [
        [
          {
            "node": "Webhook Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "createdAt": "2025-07-18T14:00:00.000Z",
  "updatedAt": "2025-07-18T14:00:00.000Z",
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [
    {
      "createdAt": "2025-07-18T14:00:00.000Z",
      "updatedAt": "2025-07-18T14:00:00.000Z",
      "id": "eii-analysis",
      "name": "EII Analysis"
    }
  ],
  "triggerCount": 0,
  "versionId": "1"
}
Pro

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

About this workflow

Expertise Inflation Index (EII) - Full Pipeline. Uses httpRequest. Webhook trigger; 11 nodes.

Source: https://github.com/dp-pcs/expertise-inflation-index/blob/c6c482e9183c1529db4920a563ee2c9aceac2289/n8n/eii_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 n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di

n8n, Execute Workflow Trigger, HTTP Request +1
Web Scraping

This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .

HTTP Request, Ssh
Web Scraping

This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c

HTTP Request
Web Scraping

Sign PDF documents with legally-compliant digital signatures using X.509 certificates. Supports multiple PAdES signature levels (B, T, LT, LTA) with optional visible stamps.

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

📡 This workflow serves as the central Alpha Vantage API fetcher for Tesla trading indicators, delivering cleaned 20-point JSON outputs for three timeframes: , , and . It is required by the following a

HTTP Request