AutomationFlowsWeb Scraping › Brief Form → AI Director

Brief Form → AI Director

Brief Form → AI Director. Uses httpRequest. Webhook trigger; 14 nodes.

Webhook trigger★★★★☆ complexity14 nodesHTTP Request
Web Scraping Trigger: Webhook Nodes: 14 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": "Brief Form \u2192 AI Director",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "taskade/brief-form",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "webhook-in",
      "name": "Webhook: brief-form",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        240,
        400
      ],
      "notes": "POST {WEBHOOK_URL}webhook/taskade/brief-form\nBody: {\"briefText\":\"...\", \"conceptProjectId\":\"...\", \"mode\":\"brief|angles|check|strat|translate\"}\nPaste the real Director system prompts into the five 'System:*' Set nodes below \u2014 pull them from /Users/kindofworking/AI/docs/taskade_director/_director_core.md."
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "briefText",
              "value": "={{$json.body.briefText}}"
            },
            {
              "name": "conceptProjectId",
              "value": "={{$json.body.conceptProjectId}}"
            },
            {
              "name": "mode",
              "value": "={{$json.body.mode}}"
            }
          ]
        },
        "options": {}
      },
      "id": "extract",
      "name": "Extract payload",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [
        460,
        400
      ]
    },
    {
      "parameters": {
        "dataType": "string",
        "value1": "={{$json.mode}}",
        "rules": {
          "rules": [
            {
              "value2": "brief",
              "output": 0
            },
            {
              "value2": "angles",
              "output": 1
            },
            {
              "value2": "check",
              "output": 2
            },
            {
              "value2": "strat",
              "output": 3
            },
            {
              "value2": "translate",
              "output": 4
            }
          ]
        },
        "fallbackOutput": 0
      },
      "id": "switch-mode",
      "name": "Switch on mode",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3,
      "position": [
        680,
        400
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "systemPrompt",
              "value": "You are the Ruflo AI Director running in BRIEF mode.\nTransform the user's rough brief into a clean creative brief with sections: Objective, Target, Proof, Promise, Tone, Must-haves, Avoid. Keep it under 250 words.\n\n<!-- Replace this text with the full BRIEF mode system prompt from /Users/kindofworking/AI/docs/taskade_director/_director_core.md -->"
            }
          ]
        },
        "options": {}
      },
      "id": "sys-brief",
      "name": "System: brief",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [
        900,
        180
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "systemPrompt",
              "value": "You are the Ruflo AI Director running in ANGLES mode.\nProduce 5-7 distinct creative angles for the brief, each with hook, proof, payoff.\n\n<!-- Replace this with the full ANGLES prompt -->"
            }
          ]
        },
        "options": {}
      },
      "id": "sys-angles",
      "name": "System: angles",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [
        900,
        300
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "systemPrompt",
              "value": "You are the Ruflo AI Director running in CHECK mode.\nReview the brief for gaps, contradictions, brand-fit issues. Flag the top 3 risks.\n\n<!-- Replace this with the full CHECK prompt -->"
            }
          ]
        },
        "options": {}
      },
      "id": "sys-check",
      "name": "System: check",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [
        900,
        420
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "systemPrompt",
              "value": "You are the Ruflo AI Director running in STRAT mode.\nDevelop a 1-page strategic frame: positioning, audience insight, reason to believe, cultural moment.\n\n<!-- Replace this with the full STRAT prompt -->"
            }
          ]
        },
        "options": {}
      },
      "id": "sys-strat",
      "name": "System: strat",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [
        900,
        540
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "systemPrompt",
              "value": "You are the Ruflo AI Director running in TRANSLATE mode.\nTranslate the brief across DE/EN with cultural nuance. Preserve tone.\n\n<!-- Replace this with the full TRANSLATE prompt -->"
            }
          ]
        },
        "options": {}
      },
      "id": "sys-translate",
      "name": "System: translate",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [
        900,
        660
      ]
    },
    {
      "parameters": {
        "mode": "mergeByPosition",
        "options": {}
      },
      "id": "merge",
      "name": "Merge prompt branches",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        1140,
        400
      ]
    },
    {
      "parameters": {
        "url": "https://api.anthropic.com/v1/messages",
        "method": "POST",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "x-api-key",
              "value": "={{$env.ANTHROPIC_API_KEY}}"
            },
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            },
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"model\": \"claude-sonnet-4-5-20250929\",\n  \"max_tokens\": 4096,\n  \"system\": \"{{ ($json.systemPrompt || '').replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\n') }}\",\n  \"messages\": [\n    { \"role\": \"user\", \"content\": \"{{ ($('Extract payload').first().json.briefText || '').replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, '\\\\n') }}\" }\n  ]\n}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json",
              "neverError": false
            }
          },
          "timeout": 120000
        }
      },
      "id": "anthropic-call",
      "name": "Anthropic: Messages",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1360,
        400
      ],
      "notes": "Falls back to claude-3-5-sonnet-20241022 if claude-sonnet-4-5 unavailable \u2014 edit the model field."
    },
    {
      "parameters": {
        "jsCode": "const resp = $input.first().json;\nconst text = (resp.content && resp.content[0] && resp.content[0].text) || JSON.stringify(resp);\nreturn [{ json: { directorResponse: text, mode: $('Extract payload').first().json.mode, conceptProjectId: $('Extract payload').first().json.conceptProjectId } }];"
      },
      "id": "extract-text",
      "name": "Extract Claude text",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1580,
        400
      ]
    },
    {
      "parameters": {
        "url": "=https://www.taskade.com/api/v1/projects/{{$json.conceptProjectId}}/tasks",
        "method": "POST",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{$env.TASKADE_API_KEY}}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"tasks\": [\n    {\n      \"content\": \"[Director/{{$json.mode}}] {{ ($json.directorResponse || '').slice(0, 200).replace(/\\\"/g, '\\\\\\\"').replace(/\\n/g, ' ') }}\",\n      \"placement\": \"afterbegin\"\n    }\n  ]\n}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        }
      },
      "id": "write-back",
      "name": "Taskade: write Director output",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1800,
        400
      ]
    },
    {
      "parameters": {
        "url": "http://langfuse:3000/api/public/ingestion",
        "method": "POST",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Basic {{Buffer.from($env.LANGFUSE_PUBLIC_KEY + ':' + $env.LANGFUSE_SECRET_KEY).toString('base64')}}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"batch\": [\n    {\n      \"id\": \"{{$now.toISO()}}-brief-{{$('Extract payload').first().json.mode}}\",\n      \"timestamp\": \"{{$now.toISO()}}\",\n      \"type\": \"trace-create\",\n      \"body\": {\n        \"id\": \"brief-{{$now.toMillis()}}\",\n        \"name\": \"brief-form/{{$('Extract payload').first().json.mode}}\",\n        \"input\": { \"brief\": \"{{ ($('Extract payload').first().json.briefText || '').slice(0, 500) }}\" },\n        \"output\": { \"response\": \"{{ ($('Extract Claude text').first().json.directorResponse || '').slice(0, 500) }}\" }\n      }\n    }\n  ]\n}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json",
              "neverError": true
            }
          }
        }
      },
      "id": "langfuse-trace",
      "name": "Langfuse: trace brief",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        2020,
        400
      ],
      "continueOnFail": true
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\n  \"ok\": true,\n  \"mode\": \"{{$('Extract payload').first().json.mode}}\",\n  \"output\": \"{{ ($('Extract Claude text').first().json.directorResponse || '').replace(/\\\"/g, '\\\\\\\"') }}\"\n}",
        "options": {}
      },
      "id": "respond",
      "name": "Respond",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": [
        2240,
        400
      ]
    }
  ],
  "connections": {
    "Webhook: brief-form": {
      "main": [
        [
          {
            "node": "Extract payload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract payload": {
      "main": [
        [
          {
            "node": "Switch on mode",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch on mode": {
      "main": [
        [
          {
            "node": "System: brief",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "System: angles",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "System: check",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "System: strat",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "System: translate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "System: brief": {
      "main": [
        [
          {
            "node": "Merge prompt branches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "System: angles": {
      "main": [
        [
          {
            "node": "Merge prompt branches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "System: check": {
      "main": [
        [
          {
            "node": "Merge prompt branches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "System: strat": {
      "main": [
        [
          {
            "node": "Merge prompt branches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "System: translate": {
      "main": [
        [
          {
            "node": "Merge prompt branches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge prompt branches": {
      "main": [
        [
          {
            "node": "Anthropic: Messages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Anthropic: Messages": {
      "main": [
        [
          {
            "node": "Extract Claude text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Claude text": {
      "main": [
        [
          {
            "node": "Taskade: write Director output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Taskade: write Director output": {
      "main": [
        [
          {
            "node": "Langfuse: trace brief",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Langfuse: trace brief": {
      "main": [
        [
          {
            "node": "Respond",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "saveExecutionProgress": true,
    "saveDataSuccessExecution": "all",
    "saveDataErrorExecution": "all",
    "timezone": "Europe/Berlin"
  },
  "tags": [
    {
      "name": "taskade"
    },
    {
      "name": "director"
    },
    {
      "name": "ruflo"
    }
  ]
}
Pro

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

About this workflow

Brief Form → AI Director. Uses httpRequest. Webhook trigger; 14 nodes.

Source: https://gist.github.com/KindOfADev/a6b4d04333c3c1c4f64508bdcc3c9819 — 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