This workflow follows the HTTP Request → Readwritefile recipe pattern — see all workflows that pair these two integrations.
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 →
{
"name": "pipelineA",
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-560,
-160
],
"id": "cd890c04-bf37-482d-b027-fd6fc5186e85",
"name": "When clicking \u2018Execute workflow\u2019"
},
{
"parameters": {
"method": "POST",
"url": "https://api.groq.com/openai/v1/chat/completions",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpBearerAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\n \"model\": \"llama-3.3-70b-versatile\",\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"Return structured JSON only.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Extract company name and services from this: AC repair company offering HVAC repair and installation open 9-5.\"\n }\n ]\n}",
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
-352,
-160
],
"id": "8b43289a-e130-45ea-abc7-a30944eb063d",
"name": "HTTP Request",
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"fileSelector": "/data/data/demo/*.txt",
"options": {}
},
"type": "n8n-nodes-base.readWriteFile",
"typeVersion": 1.1,
"position": [
-160,
-176
],
"id": "67011d15-53cc-4015-8a3f-838962bfdb5a",
"name": "Read/Write Files from Disk"
},
{
"parameters": {
"options": {}
},
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
16,
-144
],
"id": "4ba28223-fa2f-4854-ad3d-5d6dd3b0ba60",
"name": "Loop Over Items"
},
{
"parameters": {
"operation": "text",
"destinationKey": "=transcript",
"options": {
"keepSource": "json"
}
},
"type": "n8n-nodes-base.extractFromFile",
"typeVersion": 1.1,
"position": [
480,
-176
],
"id": "680522a4-c73e-4327-92d9-073423809700",
"name": "Extract from File"
},
{
"parameters": {
"method": "POST",
"url": "https://api.groq.com/openai/v1/chat/completions",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpBearerAuth",
"sendBody": true,
"contentType": "raw",
"rawContentType": "JSON",
"body": "={\n \"model\": \"llama-3.3-70b-versatile\",\n \"temperature\": 0,\n \"response_format\": { \"type\": \"json_object\" },\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"You are an expert information extraction engine specialized in analyzing contractor demo call transcripts. Your job is to convert messy conversational transcripts into structured operational data used to configure AI phone agents.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"Account ID: {{$json.account_id}}\\n\\nAnalyze the following transcript and extract ALL operational business information relevant for configuring a phone answering AI agent.\\n\\nYour output must be structured JSON following the exact schema below.\\n\\nIMPORTANT RULES:\\n- Only extract information explicitly mentioned.\\n- Do NOT invent facts.\\n- If information is missing, add a clear question in questions_or_unknowns.\\n- Questions should represent information that would be required to properly configure a phone answering AI agent.\\n- Capture operational details such as routing, services, hours, staffing, escalation, and emergency definitions.\\n- Keep notes concise but informative.\\n- Output VALID JSON only. No markdown. No explanation.\\n\\nReturn JSON using this schema:\\n\\n{\\n \\\"account_id\\\": \\\"string\\\",\\n\\n \\\"business_profile\\\": {\\n \\\"owner_name\\\": \\\"string|null\\\",\\n \\\"industry\\\": \\\"string|null\\\",\\n \\\"years_in_business\\\": \\\"number|null\\\",\\n \\\"current_challenges\\\": [],\\n \\\"current_team\\\": {\\n \\\"employees\\\": \\\"number|null\\\",\\n \\\"vans\\\": \\\"number|null\\\"\\n },\\n \\\"future_plans\\\": {\\n \\\"hiring_operations_manager\\\": \\\"boolean|null\\\",\\n \\\"business_growth\\\": \\\"boolean|null\\\"\\n },\\n \\\"previous_solutions\\\": {\\n \\\"virtual_assistant\\\": \\\"string|null\\\"\\n }\\n },\\n\\n \\\"company_name\\\": \\\"string|null\\\",\\n\\n \\\"business_hours\\\": {\\n \\\"days\\\": \\\"string|null\\\",\\n \\\"start\\\": \\\"string|null\\\",\\n \\\"end\\\": \\\"string|null\\\",\\n \\\"timezone\\\": \\\"string|null\\\"\\n },\\n\\n \\\"office_address\\\": \\\"string|null\\\",\\n\\n \\\"services_supported\\\": [],\\n\\n \\\"emergency_definition\\\": [],\\n\\n \\\"emergency_routing_rules\\\": {\\n \\\"primary_contact\\\": \\\"string|null\\\",\\n \\\"secondary_contact\\\": \\\"string|null\\\",\\n \\\"fallback\\\": \\\"string|null\\\"\\n },\\n\\n \\\"non_emergency_routing_rules\\\": \\\"string|null\\\",\\n\\n \\\"call_transfer_rules\\\": {\\n \\\"timeout_seconds\\\": \\\"number|null\\\",\\n \\\"retry_attempts\\\": \\\"number|null\\\",\\n \\\"failure_message\\\": \\\"string|null\\\"\\n },\\n\\n \\\"integration_constraints\\\": [],\\n\\n \\\"after_hours_flow_summary\\\": \\\"string|null\\\",\\n\\n \\\"office_hours_flow_summary\\\": \\\"string|null\\\",\\n\\n \\\"questions_or_unknowns\\\": [],\\n\\n \\\"notes\\\": \\\"string\\\"\\n}\\n\\nGuidelines for extraction:\\n\\nBUSINESS PROFILE\\nExtract information about the owner, company maturity, staffing, growth plans, and operational challenges.\\n\\nSERVICES\\nIdentify the types of services the company provides (e.g. electrical repair, HVAC maintenance, plumbing, etc.).\\n\\nEMERGENCY DEFINITIONS\\nIdentify what situations the business considers an emergency.\\n\\nROUTING LOGIC\\nIf mentioned, identify who should receive emergency calls or urgent requests.\\n\\nBUSINESS HOURS\\nExtract operating days, hours, and timezone.\\n\\nCALL HANDLING FLOWS\\nSummarize how calls should be handled during:\\n- office hours\\n- after hours\\n\\nQUESTIONS OR UNKNOWNS\\nGenerate useful operational questions required to fully configure a phone answering AI. Examples:\\n- What are the official business hours?\\n- Who should receive emergency calls after hours?\\n- What services should the AI schedule automatically?\\n- Which integrations should the agent avoid?\\n\\nNOTES\\nWrite a short operational summary of the company and its current workflow.\\n\\nTranscript:\\n{{$json.transcript_clean}}\"\n }\n ]\n}",
"options": {
"response": {
"response": {}
}
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1024,
-176
],
"id": "58dd602a-812a-4936-833a-b6239940835d",
"name": "HTTP Request1",
"credentials": {
"httpBearerAuth": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsCode": "let transcript = $json.transcript || \"\";\n\ntranscript = transcript\n .replace(/\\r/g, \" \")\n .replace(/\\n/g, \" \")\n .replace(/\"/g, '\\\\\"');\n\nif (transcript.length > 4000) {\n transcript = transcript.substring(0, 4000);\n}\n\nreturn [\n {\n json: {\n account_id: $json.account_id,\n transcript_clean: transcript\n }\n }\n];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
720,
-176
],
"id": "c1d9fa7c-7b43-47a3-aa9b-bb4c5c1a5bf8",
"name": "Code in JavaScript1"
},
{
"parameters": {
"method": "POST",
"url": "http://host.docker.internal:5000/process-demo",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "account_id",
"value": "={{$json.account_id}}"
},
{
"name": "llm_output",
"value": "={{ JSON.stringify($json) }}"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1600,
-160
],
"id": "1159ce67-de1f-40c3-90c9-1e1071fffcca",
"name": "HTTP Request2"
},
{
"parameters": {
"jsCode": "const raw = $json.choices[0].message.content;\n\n// remove markdown code blocks\nconst cleaned = raw\n .replace(/```json/g, \"\")\n .replace(/```/g, \"\")\n .trim();\n\n// parse JSON\nconst parsed = JSON.parse(cleaned);\n\nreturn [\n {\n json: parsed\n }\n];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1344,
-176
],
"id": "17e93c9a-b234-4509-8675-71cd7ad0f3a5",
"name": "Code in JavaScript3"
},
{
"parameters": {},
"type": "n8n-nodes-base.noOp",
"name": "Replace Me1",
"typeVersion": 1,
"position": [
720,
384
],
"id": "e2c5eaa0-6931-4f06-ab33-7945b04a6a4c"
},
{
"parameters": {
"jsCode": "return $input.all().map(item => {\n\n const filename = item.binary.data.fileName;\n\n const account_id = filename.replace(\".txt\",\"\");\n\n return {\n json: {\n account_id: account_id\n },\n binary: item.binary\n };\n\n});"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
256,
-144
],
"id": "115e9e7d-cc01-4da1-a761-f4445b394950",
"name": "Code in JavaScript2"
}
],
"connections": {
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "Read/Write Files from Disk",
"type": "main",
"index": 0
}
]
]
},
"Read/Write Files from Disk": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
],
[
{
"node": "Code in JavaScript2",
"type": "main",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "Code in JavaScript1",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript1": {
"main": [
[
{
"node": "HTTP Request1",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request1": {
"main": [
[
{
"node": "Code in JavaScript3",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript3": {
"main": [
[
{
"node": "HTTP Request2",
"type": "main",
"index": 0
}
]
]
},
"Replace Me1": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request2": {
"main": [
[
{
"node": "Replace Me1",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript2": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"binaryMode": "separate",
"availableInMCP": false,
"timeSavedMode": "fixed",
"callerPolicy": "workflowsFromSameOwner"
},
"versionId": "a952c483-061e-4600-b108-f902ac286769",
"id": "jLOg9z4n6FFzmIzt",
"tags": []
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
httpBearerAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
pipelineA. Uses httpRequest, readWriteFile. Event-driven trigger; 11 nodes.
Source: https://github.com/4ryn/Talk2Agent/blob/main/workflows/pipelineA.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
🤖🧑💻 AI Agent for Top n8n Creators Leaderboard Reporting. Uses httpRequest, executeWorkflowTrigger, readWriteFile, googleDrive. Event-driven trigger; 49 nodes.
pipelineB. Uses readWriteFile, httpRequest. Event-driven trigger; 10 nodes.
RAG CHATBOT Main. Uses telegram, telegramTrigger, lmChatOpenAi, n8n-nodes-mcp. Event-driven trigger; 87 nodes.
This workflow helps to automatically discover undocumented API endpoints by analysing JavaScript files from the website's HTML code.
🤖🧑💻 AI Agent for Top n8n Creators Leaderboard Reporting. Uses httpRequest, lmChatOpenAi, executeWorkflowTrigger, toolWorkflow. Event-driven trigger; 49 nodes.