n8n template
Mask PII before calling OpenAI or Claude
One step in your n8n workflow. The Vrymdor™ AI Node hides the private details, calls the model, checks the reply and puts your customer's own details back in the answer.
What the workflow does
- Sample ticket holds a customer's email address and the text to send. Replace it with your own trigger.
- Vrymdor: call Claude is the Vrymdor AI Node step with Call a Model. The model reads [REDACTED:EMAIL_1], never the real address.
- Rehydrate is on, so the answer comes back with the real values, put back inside your AI Node in the same step.
- Only For is set to the customer's email, so only their details can come back. If anyone else's are in the answer, nothing is put back.
Secrets such as API keys are never put back. The real values stay in your AI Node's memory only, and they're deleted after 15 minutes by default (1 hour at most). If anything fails or times out, the request is blocked, never sent unchecked.
A second step, Vrymdor: call OpenAI, is the same call to OpenAI. It is off until you turn it on.
Set it up
- In n8n, open Settings, Community Nodes, Install, and install
n8n-nodes-vrymdor. - Import the file: Workflows, Import from File.
- Open Vrymdor: call Claude, Credential, Create new, and paste the Node Host URL, Agent ID and Agent Secret from the Connect your AI Node card in your Vrymdor dashboard.
- Upstream is the name of a model upstream on your AI Node:
anthropicfor Claude,openaifor OpenAI. The setup guide shows how to add one. - Press Execute workflow.
On n8n Cloud, community nodes need n8n's approval first. Until then, the setup guide has a version built from n8n's own steps.
Before you start
Free scanner: paste your n8n workflow and see what it leaks today. It runs in your browser. Or try masking and putting values back in the Live Playground.
The workflow file
{
"name": "Vrymdor AI Node: mask PII before calling OpenAI or Claude",
"nodes": [
{
"parameters": {
"content": "## Mask PII before calling OpenAI or Claude\n1. **Settings**, **Community Nodes**, **Install**: `n8n-nodes-vrymdor`.\n2. Open **Vrymdor: call Claude**, **Credential**, **Create new**: paste the Node Host URL, Agent ID (`agt_...`) and Agent Secret (`vrym_agent_...`) from the **Connect your AI Node** card in your Vrymdor dashboard.\n3. **Upstream** is the name of a model upstream on your AI Node: `anthropic` here, `openai` on the OpenAI step.\n4. Put your own trigger in place of **Sample ticket**, keeping a `customer_email` field and a `text` field.\n5. **Execute workflow**.\n\nThe model reads `[REDACTED:EMAIL_1]`, never the real address. **Rehydrate** puts the real values back in the answer, inside your AI Node, in the same step. **Only For** is set to the customer, so only their details can come back: if anyone else's are in the answer, nothing is put back. Secrets such as API keys are never put back.",
"height": 480,
"width": 440
},
"id": "6a1f3c10-0000-4000-8000-000000000001",
"name": "How to use this workflow",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-480,
-260
]
},
{
"parameters": {},
"id": "6a1f3c10-0000-4000-8000-000000000002",
"name": "Start",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
0
]
},
{
"parameters": {
"mode": "manual",
"assignments": {
"assignments": [
{
"id": "6a1f3c10-0000-4000-8000-0000000000a1",
"name": "customer_email",
"value": "[email protected]",
"type": "string"
},
{
"id": "6a1f3c10-0000-4000-8000-0000000000a2",
"name": "text",
"value": "Write a short, friendly reply to [email protected], who asked whether the refund for her order was sent. It was sent today.",
"type": "string"
}
]
},
"options": {}
},
"id": "6a1f3c10-0000-4000-8000-000000000003",
"name": "Sample ticket",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
220,
0
]
},
{
"parameters": {
"operation": "llm",
"upstream": "anthropic",
"path": "v1/messages",
"input": "={{ { \"model\": \"claude-sonnet-5-5\", \"max_tokens\": 512, \"messages\": [{ \"role\": \"user\", \"content\": $json.text }] } }}",
"options": {
"rehydrate": true,
"onlyFor": "={{ $json.customer_email }}"
}
},
"id": "6a1f3c10-0000-4000-8000-000000000004",
"name": "Vrymdor: call Claude",
"type": "n8n-nodes-vrymdor.vrymdor",
"typeVersion": 1,
"position": [
460,
-100
]
},
{
"parameters": {
"operation": "llm",
"upstream": "openai",
"path": "v1/chat/completions",
"input": "={{ { \"model\": \"gpt-4o-mini\", \"messages\": [{ \"role\": \"user\", \"content\": $json.text }] } }}",
"options": {
"rehydrate": true,
"onlyFor": "={{ $json.customer_email }}"
}
},
"id": "6a1f3c10-0000-4000-8000-000000000005",
"name": "Vrymdor: call OpenAI",
"type": "n8n-nodes-vrymdor.vrymdor",
"typeVersion": 1,
"position": [
460,
120
],
"disabled": true
},
{
"parameters": {
"content": "## Using OpenAI instead\nSelect **Vrymdor: call OpenAI** and press **D** to turn it on, then turn the Claude step off the same way. It needs an upstream named `openai` on your AI Node that points at https://api.openai.com. Use any model your OpenAI account has.",
"height": 240,
"width": 360
},
"id": "6a1f3c10-0000-4000-8000-000000000006",
"name": "Using OpenAI instead",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
700,
60
]
}
],
"connections": {
"Start": {
"main": [
[
{
"node": "Sample ticket",
"type": "main",
"index": 0
}
]
]
},
"Sample ticket": {
"main": [
[
{
"node": "Vrymdor: call Claude",
"type": "main",
"index": 0
},
{
"node": "Vrymdor: call OpenAI",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
}
}