{ "updatedAt": "2026-05-22T21:55:07.379Z", "createdAt": "2026-05-13T21:26:54.606Z", "id": "7MlM3DjAMf4eSl0s", "name": "Paperless School Intake Metadata Enrichment v1.1", "description": null, "active": true, "isArchived": false, "nodes": [ { "parameters": { "httpMethod": "POST", "path": "school/intake/paperless-enrich", "responseMode": "lastNode", "responseData": "allEntries", "options": {} }, "id": "paperless-school-webhook", "name": "Paperless School Webhook", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [ -1168, 0 ], "webhookId": "22ec3671-3ad9-4c48-8720-2ba31b944671" }, { "parameters": { "jsCode": "\nconst input = $input.first().json || {};\nconst body = input.body || {};\nconst query = input.query || {};\nconst params = input.params || {};\nconst headers = input.headers || {};\nconst candidates = [\n body.document_id,\n body.id,\n body.doc_id,\n body.pk,\n body.document_id?.id,\n body.document?.id,\n body.document,\n query.document_id,\n query.id,\n query.doc_id,\n params.document_id,\n params.id,\n headers['x-paperless-document-id'],\n input.document_id,\n input.id\n].filter(v => v !== undefined && v !== null && v !== '');\nlet raw = candidates[0];\nif (typeof raw === 'object' && raw !== null) raw = raw.id ?? raw.document_id ?? raw.pk ?? null;\nif (typeof raw === 'string' && /\\{.+\\}/.test(raw)) {\n throw new Error('Received unresolved template string instead of document id.');\n}\nconst documentId = Number(raw);\nif (!Number.isFinite(documentId) || documentId <= 0) {\n throw new Error('Could not resolve Paperless document id from webhook payload.');\n}\nreturn [{ json: { document_id: documentId } }];" }, "id": "normalize-paperless-webhook", "name": "Normalize Paperless Webhook", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -896, 0 ] }, { "parameters": { "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/'}}", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}" }, { "name": "Accept", "value": "application/json" } ] }, "options": { "timeout": 120000 } }, "id": "fetch-paperless-document", "name": "Fetch Paperless Document", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ -640, 0 ] }, { "parameters": { "jsCode": "\nconst doc = $input.first().json || {};\nconst originalFilename = doc.original_file_name || doc.original_filename || '';\nconst baseName = String(originalFilename).replace(/\\.[^.]+$/, '');\nconst currentTitle = String(doc.title || '').trim();\nconst parts = currentTitle.split(' — ').map((p) => p.trim()).filter(Boolean);\nconst class_name = parts.length >= 3 ? parts[0] : null;\nconst submission_kind = parts.length >= 3 ? parts[parts.length - 1] : null;\nconst assignment_name = parts.length >= 3 ? parts.slice(1, -1).join(' — ') : null;\nreturn [{ json: {\n intake_id: baseName && baseName.startsWith('school-') ? baseName : null,\n document_id: doc.id,\n current_title: currentTitle,\n current_tags: Array.isArray(doc.tags) ? doc.tags : [],\n original_filename: originalFilename,\n class_name,\n assignment_name,\n submission_kind\n} }];" }, "id": "extract-intake-id", "name": "Extract Intake Metadata", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -384, 0 ] }, { "parameters": { "jsCode": "\nconst intake = $input.first().json || {};\nconst doc = $('Fetch Paperless Document').first().json || {};\nconst classTagMap = JSON.parse($env.PAPERLESS_TAG_CLASS_MAP_JSON || '{}');\nconst kindTagMap = JSON.parse($env.PAPERLESS_TAG_SUBMISSION_KIND_MAP_JSON || '{}');\nconst classCorrespondentMap = JSON.parse($env.PAPERLESS_CORRESPONDENT_CLASS_MAP_JSON || '{}');\nconst currentTags = Array.isArray(doc.tags) ? doc.tags.map(Number).filter(Number.isFinite) : [];\nconst merged = new Set(currentTags);\nfor (const id of [$env.PAPERLESS_TAG_SCHOOL, $env.PAPERLESS_TAG_ASSIGNMENTS, $env.PAPERLESS_TAG_TELEGRAM]) {\n const n = Number(id);\n if (Number.isFinite(n) && n > 0) merged.add(n);\n}\nconst classTag = Number(classTagMap[intake.class_name]);\nif (Number.isFinite(classTag) && classTag > 0) merged.add(classTag);\nconst kindKey = String(intake.submission_kind || '').trim().toLowerCase();\nconst kindTag = Number(kindTagMap[kindKey]);\nif (Number.isFinite(kindTag) && kindTag > 0) merged.add(kindTag);\nconst title = intake.current_title || [intake.class_name, intake.assignment_name, intake.submission_kind].filter(Boolean).join(' — ');\nconst payload = { title, tags: Array.from(merged) };\nconst correspondent = Number(classCorrespondentMap[intake.class_name]);\nif (Number.isFinite(correspondent) && correspondent > 0) payload.correspondent = correspondent;\nreturn [{ json: {\n intake_id: intake.intake_id,\n document_id: doc.id,\n payload,\n title,\n final_tag_ids: payload.tags,\n class_name: intake.class_name,\n assignment_name: intake.assignment_name,\n submission_kind: intake.submission_kind,\n original_filename: intake.original_filename,\n content: String(doc.content || '').slice(0, 12000),\n created: doc.created || null,\n status: 'enriched'\n} }];" }, "id": "build-paperless-update", "name": "Build Paperless Update", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 144, 0 ] }, { "parameters": { "method": "PATCH", "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/'}}", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}" }, { "name": "Content-Type", "value": "application/json" }, { "name": "Accept", "value": "application/json" } ] }, "sendBody": true, "bodyParameters": { "parameters": [ {} ] }, "options": { "timeout": 120000 } }, "id": "update-paperless-document", "name": "Update Paperless Document", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 400, 0 ] }, { "parameters": { "jsCode": "\nconst update = $('Parse School Summary').first().json;\nreturn [{ json: {\n ok: true,\n intake_id: update.intake_id,\n document_id: update.document_id,\n title: update.title,\n final_tag_ids: update.final_tag_ids,\n ai_suggested_tags: update.ai_suggested_tags || [],\n status: update.status || 'enriched'\n} }];" }, "id": "return-enrichment-success", "name": "Return Enrichment Success", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 1216, 0 ] }, { "parameters": { "method": "POST", "url": "http://10.5.30.6:4000/v1/chat/completions", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Content-Type", "value": "application/json" }, { "name": "Authorization", "value": "={{'Bearer ' + $env.LITELLM_API_KEY}}" } ] }, "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"model\": \"medium\",\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"You write concise, useful summaries for school assignments stored in Paperless. Return ONLY valid JSON with this exact shape: {\\\"summary\\\": string, \\\"course_context\\\": [string], \\\"suggested_tags\\\": [string]}. Summary should be 2-4 sentences, name the argument or subject clearly, and avoid fluff. course_context should contain short bullets like assignment type, score if known, or class framing when inferable from the provided metadata. suggested_tags should be 3-6 lowercase tags focused on subject matter, not generic words. No markdown, no code fences.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"={{ JSON.stringify('Title: ' + ($json.title || '') + '\\nClass: ' + ($json.class_name || '') + '\\nAssignment: ' + ($json.assignment_name || '') + '\\nSubmission kind: ' + ($json.submission_kind || '') + '\\nOriginal filename: ' + ($json.original_filename || '') + '\\n\\nDocument content:\\n' + ($json.content || '')).slice(1, -1) }}\"\n }\n ],\n \"max_tokens\": 500,\n \"temperature\": 0.2,\n \"response_format\": { \"type\": \"json_object\" }\n}", "options": {} }, "id": "school-ai-summary", "name": "Generate School Summary", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 672, 0 ] }, { "parameters": { "jsCode": "\nconst raw = $input.first().json?.choices?.[0]?.message?.content || '{}';\nconst meta = $('Build Paperless Update').first().json;\nlet parsed;\ntry {\n parsed = JSON.parse(raw);\n} catch (error) {\n parsed = {\n summary: 'School document ingested and tagged. Automated summary parsing failed, so this note was kept minimal.',\n course_context: [],\n suggested_tags: []\n };\n}\nconst contextLines = [\n `- Course: ${meta.class_name || 'Unknown'}`,\n meta.assignment_name ? `- D2L assignment: ${meta.assignment_name}` : null,\n meta.submission_kind ? `- Submission kind: ${meta.submission_kind}` : null,\n ...(Array.isArray(parsed.course_context) ? parsed.course_context.filter(Boolean).map(v => `- ${String(v).replace(/^[-•]\\s*/, '').trim()}`) : [])\n].filter(Boolean);\nconst note = [\n '**School Intake Summary**',\n ...contextLines,\n '',\n '**Summary**',\n String(parsed.summary || '').trim() || 'No summary returned.'\n].join('\\n');\nconst aiTags = Array.isArray(parsed.suggested_tags)\n ? [...new Set(parsed.suggested_tags.map(t => String(t || '').trim().toLowerCase()).filter(Boolean))].slice(0, 6)\n : [];\nreturn [{ json: { ...meta, note, ai_suggested_tags: aiTags } }];" }, "id": "school-parse-summary", "name": "Parse School Summary", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 864, 0 ] }, { "parameters": { "method": "POST", "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/notes/'}}", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}" }, { "name": "Content-Type", "value": "application/json" }, { "name": "Accept", "value": "application/json" } ] }, "sendBody": true, "bodyParameters": { "parameters": [ {} ] }, "options": { "timeout": 120000 } }, "id": "add-school-note", "name": "Add School Note", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 1040, 0 ] } ], "connections": { "Paperless School Webhook": { "main": [ [ { "node": "Normalize Paperless Webhook", "type": "main", "index": 0 } ] ] }, "Normalize Paperless Webhook": { "main": [ [ { "node": "Fetch Paperless Document", "type": "main", "index": 0 } ] ] }, "Fetch Paperless Document": { "main": [ [ { "node": "Extract Intake Metadata", "type": "main", "index": 0 } ] ] }, "Extract Intake Metadata": { "main": [ [ { "node": "Build Paperless Update", "type": "main", "index": 0 } ] ] }, "Build Paperless Update": { "main": [ [ { "node": "Update Paperless Document", "type": "main", "index": 0 } ] ] }, "Update Paperless Document": { "main": [ [ { "node": "Generate School Summary", "type": "main", "index": 0 } ] ] }, "Generate School Summary": { "main": [ [ { "node": "Parse School Summary", "type": "main", "index": 0 } ] ] }, "Parse School Summary": { "main": [ [ { "node": "Add School Note", "type": "main", "index": 0 } ] ] }, "Add School Note": { "main": [ [ { "node": "Return Enrichment Success", "type": "main", "index": 0 } ] ] } }, "settings": { "executionOrder": "v1", "binaryMode": "separate" }, "staticData": null, "meta": null, "pinData": {}, "versionId": "c7771791-a51a-4750-b99c-ea263463ac51", "activeVersionId": "c7771791-a51a-4750-b99c-ea263463ac51", "versionCounter": 51, "triggerCount": 1, "shared": [ { "updatedAt": "2026-05-13T21:26:54.606Z", "createdAt": "2026-05-13T21:26:54.606Z", "role": "workflow:owner", "workflowId": "7MlM3DjAMf4eSl0s", "projectId": "dxCRnBdX5uJizCGa", "project": { "updatedAt": "2026-05-06T01:10:37.484Z", "createdAt": "2026-05-06T01:08:07.721Z", "id": "dxCRnBdX5uJizCGa", "name": "Wilfred Fizzlepoof ", "type": "personal", "icon": null, "description": null, "creatorId": "47b2227f-2fc2-4a08-bd35-ea157b92df0d" } } ], "tags": [], "activeVersion": { "updatedAt": "2026-05-22T21:55:07.381Z", "createdAt": "2026-05-22T21:55:07.381Z", "versionId": "c7771791-a51a-4750-b99c-ea263463ac51", "workflowId": "7MlM3DjAMf4eSl0s", "nodes": [ { "parameters": { "httpMethod": "POST", "path": "school/intake/paperless-enrich", "responseMode": "lastNode", "responseData": "allEntries", "options": {} }, "id": "paperless-school-webhook", "name": "Paperless School Webhook", "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [ -1168, 0 ], "webhookId": "22ec3671-3ad9-4c48-8720-2ba31b944671" }, { "parameters": { "jsCode": "\nconst input = $input.first().json || {};\nconst body = input.body || {};\nconst query = input.query || {};\nconst params = input.params || {};\nconst headers = input.headers || {};\nconst candidates = [\n body.document_id,\n body.id,\n body.doc_id,\n body.pk,\n body.document_id?.id,\n body.document?.id,\n body.document,\n query.document_id,\n query.id,\n query.doc_id,\n params.document_id,\n params.id,\n headers['x-paperless-document-id'],\n input.document_id,\n input.id\n].filter(v => v !== undefined && v !== null && v !== '');\nlet raw = candidates[0];\nif (typeof raw === 'object' && raw !== null) raw = raw.id ?? raw.document_id ?? raw.pk ?? null;\nif (typeof raw === 'string' && /\\{.+\\}/.test(raw)) {\n throw new Error('Received unresolved template string instead of document id.');\n}\nconst documentId = Number(raw);\nif (!Number.isFinite(documentId) || documentId <= 0) {\n throw new Error('Could not resolve Paperless document id from webhook payload.');\n}\nreturn [{ json: { document_id: documentId } }];" }, "id": "normalize-paperless-webhook", "name": "Normalize Paperless Webhook", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -896, 0 ] }, { "parameters": { "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/'}}", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}" }, { "name": "Accept", "value": "application/json" } ] }, "options": { "timeout": 120000 } }, "id": "fetch-paperless-document", "name": "Fetch Paperless Document", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ -640, 0 ] }, { "parameters": { "jsCode": "\nconst doc = $input.first().json || {};\nconst originalFilename = doc.original_file_name || doc.original_filename || '';\nconst baseName = String(originalFilename).replace(/\\.[^.]+$/, '');\nconst currentTitle = String(doc.title || '').trim();\nconst parts = currentTitle.split(' — ').map((p) => p.trim()).filter(Boolean);\nconst class_name = parts.length >= 3 ? parts[0] : null;\nconst submission_kind = parts.length >= 3 ? parts[parts.length - 1] : null;\nconst assignment_name = parts.length >= 3 ? parts.slice(1, -1).join(' — ') : null;\nreturn [{ json: {\n intake_id: baseName && baseName.startsWith('school-') ? baseName : null,\n document_id: doc.id,\n current_title: currentTitle,\n current_tags: Array.isArray(doc.tags) ? doc.tags : [],\n original_filename: originalFilename,\n class_name,\n assignment_name,\n submission_kind\n} }];" }, "id": "extract-intake-id", "name": "Extract Intake Metadata", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -384, 0 ] }, { "parameters": { "jsCode": "\nconst intake = $input.first().json || {};\nconst doc = $('Fetch Paperless Document').first().json || {};\nconst classTagMap = JSON.parse($env.PAPERLESS_TAG_CLASS_MAP_JSON || '{}');\nconst kindTagMap = JSON.parse($env.PAPERLESS_TAG_SUBMISSION_KIND_MAP_JSON || '{}');\nconst classCorrespondentMap = JSON.parse($env.PAPERLESS_CORRESPONDENT_CLASS_MAP_JSON || '{}');\nconst currentTags = Array.isArray(doc.tags) ? doc.tags.map(Number).filter(Number.isFinite) : [];\nconst merged = new Set(currentTags);\nfor (const id of [$env.PAPERLESS_TAG_SCHOOL, $env.PAPERLESS_TAG_ASSIGNMENTS, $env.PAPERLESS_TAG_TELEGRAM]) {\n const n = Number(id);\n if (Number.isFinite(n) && n > 0) merged.add(n);\n}\nconst classTag = Number(classTagMap[intake.class_name]);\nif (Number.isFinite(classTag) && classTag > 0) merged.add(classTag);\nconst kindKey = String(intake.submission_kind || '').trim().toLowerCase();\nconst kindTag = Number(kindTagMap[kindKey]);\nif (Number.isFinite(kindTag) && kindTag > 0) merged.add(kindTag);\nconst title = intake.current_title || [intake.class_name, intake.assignment_name, intake.submission_kind].filter(Boolean).join(' — ');\nconst payload = { title, tags: Array.from(merged) };\nconst correspondent = Number(classCorrespondentMap[intake.class_name]);\nif (Number.isFinite(correspondent) && correspondent > 0) payload.correspondent = correspondent;\nreturn [{ json: {\n intake_id: intake.intake_id,\n document_id: doc.id,\n payload,\n title,\n final_tag_ids: payload.tags,\n class_name: intake.class_name,\n assignment_name: intake.assignment_name,\n submission_kind: intake.submission_kind,\n original_filename: intake.original_filename,\n content: String(doc.content || '').slice(0, 12000),\n created: doc.created || null,\n status: 'enriched'\n} }];" }, "id": "build-paperless-update", "name": "Build Paperless Update", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 144, 0 ] }, { "parameters": { "method": "PATCH", "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/'}}", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}" }, { "name": "Content-Type", "value": "application/json" }, { "name": "Accept", "value": "application/json" } ] }, "sendBody": true, "bodyParameters": { "parameters": [ {} ] }, "options": { "timeout": 120000 } }, "id": "update-paperless-document", "name": "Update Paperless Document", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 400, 0 ] }, { "parameters": { "jsCode": "\nconst update = $('Parse School Summary').first().json;\nreturn [{ json: {\n ok: true,\n intake_id: update.intake_id,\n document_id: update.document_id,\n title: update.title,\n final_tag_ids: update.final_tag_ids,\n ai_suggested_tags: update.ai_suggested_tags || [],\n status: update.status || 'enriched'\n} }];" }, "id": "return-enrichment-success", "name": "Return Enrichment Success", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 1216, 0 ] }, { "parameters": { "method": "POST", "url": "http://10.5.30.6:4000/v1/chat/completions", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Content-Type", "value": "application/json" }, { "name": "Authorization", "value": "={{'Bearer ' + $env.LITELLM_API_KEY}}" } ] }, "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"model\": \"medium\",\n \"messages\": [\n {\n \"role\": \"system\",\n \"content\": \"You write concise, useful summaries for school assignments stored in Paperless. Return ONLY valid JSON with this exact shape: {\\\"summary\\\": string, \\\"course_context\\\": [string], \\\"suggested_tags\\\": [string]}. Summary should be 2-4 sentences, name the argument or subject clearly, and avoid fluff. course_context should contain short bullets like assignment type, score if known, or class framing when inferable from the provided metadata. suggested_tags should be 3-6 lowercase tags focused on subject matter, not generic words. No markdown, no code fences.\"\n },\n {\n \"role\": \"user\",\n \"content\": \"={{ JSON.stringify('Title: ' + ($json.title || '') + '\\nClass: ' + ($json.class_name || '') + '\\nAssignment: ' + ($json.assignment_name || '') + '\\nSubmission kind: ' + ($json.submission_kind || '') + '\\nOriginal filename: ' + ($json.original_filename || '') + '\\n\\nDocument content:\\n' + ($json.content || '')).slice(1, -1) }}\"\n }\n ],\n \"max_tokens\": 500,\n \"temperature\": 0.2,\n \"response_format\": { \"type\": \"json_object\" }\n}", "options": {} }, "id": "school-ai-summary", "name": "Generate School Summary", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 672, 0 ] }, { "parameters": { "jsCode": "\nconst raw = $input.first().json?.choices?.[0]?.message?.content || '{}';\nconst meta = $('Build Paperless Update').first().json;\nlet parsed;\ntry {\n parsed = JSON.parse(raw);\n} catch (error) {\n parsed = {\n summary: 'School document ingested and tagged. Automated summary parsing failed, so this note was kept minimal.',\n course_context: [],\n suggested_tags: []\n };\n}\nconst contextLines = [\n `- Course: ${meta.class_name || 'Unknown'}`,\n meta.assignment_name ? `- D2L assignment: ${meta.assignment_name}` : null,\n meta.submission_kind ? `- Submission kind: ${meta.submission_kind}` : null,\n ...(Array.isArray(parsed.course_context) ? parsed.course_context.filter(Boolean).map(v => `- ${String(v).replace(/^[-•]\\s*/, '').trim()}`) : [])\n].filter(Boolean);\nconst note = [\n '**School Intake Summary**',\n ...contextLines,\n '',\n '**Summary**',\n String(parsed.summary || '').trim() || 'No summary returned.'\n].join('\\n');\nconst aiTags = Array.isArray(parsed.suggested_tags)\n ? [...new Set(parsed.suggested_tags.map(t => String(t || '').trim().toLowerCase()).filter(Boolean))].slice(0, 6)\n : [];\nreturn [{ json: { ...meta, note, ai_suggested_tags: aiTags } }];" }, "id": "school-parse-summary", "name": "Parse School Summary", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 864, 0 ] }, { "parameters": { "method": "POST", "url": "={{($env.PAPERLESS_BASE_URL || 'https://paperless.paccoco.com').replace(/\\/$/, '') + '/api/documents/' + $json.document_id + '/notes/'}}", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "Authorization", "value": "={{'Token ' + $env.PAPERLESS_API_TOKEN}}" }, { "name": "Content-Type", "value": "application/json" }, { "name": "Accept", "value": "application/json" } ] }, "sendBody": true, "bodyParameters": { "parameters": [ {} ] }, "options": { "timeout": 120000 } }, "id": "add-school-note", "name": "Add School Note", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 1040, 0 ] } ], "connections": { "Paperless School Webhook": { "main": [ [ { "node": "Normalize Paperless Webhook", "type": "main", "index": 0 } ] ] }, "Normalize Paperless Webhook": { "main": [ [ { "node": "Fetch Paperless Document", "type": "main", "index": 0 } ] ] }, "Fetch Paperless Document": { "main": [ [ { "node": "Extract Intake Metadata", "type": "main", "index": 0 } ] ] }, "Extract Intake Metadata": { "main": [ [ { "node": "Build Paperless Update", "type": "main", "index": 0 } ] ] }, "Build Paperless Update": { "main": [ [ { "node": "Update Paperless Document", "type": "main", "index": 0 } ] ] }, "Update Paperless Document": { "main": [ [ { "node": "Generate School Summary", "type": "main", "index": 0 } ] ] }, "Generate School Summary": { "main": [ [ { "node": "Parse School Summary", "type": "main", "index": 0 } ] ] }, "Parse School Summary": { "main": [ [ { "node": "Add School Note", "type": "main", "index": 0 } ] ] }, "Add School Note": { "main": [ [ { "node": "Return Enrichment Success", "type": "main", "index": 0 } ] ] } }, "authors": "Wilfred Fizzlepoof", "name": null, "description": null, "autosaved": false, "workflowPublishHistory": [ { "createdAt": "2026-05-22T21:55:07.444Z", "id": 321, "workflowId": "7MlM3DjAMf4eSl0s", "versionId": "c7771791-a51a-4750-b99c-ea263463ac51", "event": "deactivated", "userId": "47b2227f-2fc2-4a08-bd35-ea157b92df0d" }, { "createdAt": "2026-05-22T21:55:07.467Z", "id": 322, "workflowId": "7MlM3DjAMf4eSl0s", "versionId": "c7771791-a51a-4750-b99c-ea263463ac51", "event": "activated", "userId": "47b2227f-2fc2-4a08-bd35-ea157b92df0d" } ] } }