Description
n8n-nodes-unsiloed
An n8n community node for Unsiloed AI. It reads documents (PDFs, scans, photos, images) and returns clean Markdown or structured JSON inside your workflows.
n8n has no built-in OCR. Its Extract from File node reads a PDF’s embedded text layer, not the page, so a scan, a phone photo, or any PDF with a broken text layer comes back as confident nonsense and nothing warns you. This node OCRs the rendered page instead, so it reads what a person sees.
Why n8n’s Built-In Extraction Falls Short
The built-in extractor trusts the text layer. That layer is fine for clean born-digital PDFs, but scans and many exports either have no text layer or a broken one, and the extractor returns garbage without failing. Same invoice, same workflow, two extractors:
n8n Extract from PDF → "OFCGOET Ofcgoet Fg. IC-9762 ... Zgzqsrxt $33,002.99"
Unsiloed → "INVOICE Invoice No. HV-2087 ... Total due $11,557.22"
Parse forces OCR on the rendered pixels, and Extract reads the rendered document by design, so a bad text layer can’t poison either result.
What the Node Does
The node has two operations:
- Parse: OCR the document and return layout-aware Markdown (headings, tables, paragraphs). No schema required.
- Extract: pull named fields into JSON using a schema you define (invoice number, totals, dates, line items). Each value comes back with a confidence score and a citation (page and bounding box).
Installing
The node is published on npm as n8n-nodes-unsiloed, so you can install it from n8n’s own UI, with no terminal and no restart:
1. Open Settings → Community Nodes → Install.
2. Enter n8n-nodes-unsiloed and confirm.
3. Search for Unsiloed in the node panel.
Once installed, the node type is n8n-nodes-unsiloed.unsiloed.
This is for self-hosted n8n. n8n Cloud only allows community nodes that n8n has itself verified, and this node isn’t verified yet, so Cloud users need a self-hosted instance for now.
If you’d rather install from the command line, add it to your n8n user folder and restart n8n:
mkdir -p ~/.n8n/nodes && cd ~/.n8n/nodes
npm install n8n-nodes-unsiloed
Installing From Source Instead
You only need this if you’re modifying the node. n8n loads anything in ~/.n8n/custom on startup, and the compiled dist/ is committed, so no build step is required. Note that a node loaded this way registers as CUSTOM.unsiloed, not n8n-nodes-unsiloed.unsiloed — so workflows exported from one install won’t import into the other without editing the node’s type.
For Docker:
git clone https://github.com/Unsiloed-AI/n8n-nodes-unsiloed
docker cp n8n-nodes-unsiloed/dist/. :/home/node/.n8n/custom/
docker restart
Or run the bundled installer from the node’s folder:
cd n8n-nodes-unsiloed && ./install.sh
For a local n8n install:
git clone https://github.com/Unsiloed-AI/n8n-nodes-unsiloed
mkdir -p ~/.n8n/custom
cp -r n8n-nodes-unsiloed/dist/* ~/.n8n/custom/
then restart n8n
Setting Up the Credential
Create an Unsiloed API credential on the node:
https://prod.visionapi.unsiloed.ai (the default)Use the credential’s Test button to confirm the key works before you run a workflow.
Using the Node
Give the node a document, then choose an operation depending on what you need back. Document Source controls where the document comes from:
data.Using the Node as an AI Agent Tool
The node can be attached to an AI Agent on its Tool socket, letting an agent parse or extract from a document on its own.
Set Document Source to URL when you do. n8n does not pass binary data to tools, so a tool-mode node never receives the agent’s upstream file and Binary Property mode cannot work there. Click the sparkle beside Document URL so the agent supplies the address itself, and it will fill it from the conversation.
Self-hosted instances also need N8NCOMMUNITYPACKAGESALLOWTOOL_USAGE=true, otherwise n8n hides community nodes from the tool list.
Parse: Clean Markdown From Any Document
Parse needs no configuration beyond the document source. Point it at any document and it returns the document as Markdown in the markdown field, with tables and headings preserved. This is the fastest way to try the node: install it, drop in a scan or a photo, and run.
Use Parse when you want the full document text, for example to feed a language model, index a knowledge base, or store a readable copy.
Extract: Structured Fields You Define
Extract returns structured JSON, so you tell it which fields to pull with a JSON Schema. Set the Schema (JSON) field on the node. This example pulls an invoice’s header fields and its line-item table:
{
"type": "object",
"properties": {
"vendor": { "type": "string", "description": "Company that issued the invoice" },
"invoice_number": { "type": "string" },
"total_due": { "type": "string" },
"line_items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"description": { "type": "string" },
"quantity": { "type": "string" },
"unit_price": { "type": "string" },
"amount": { "type": "string" }
}
}
}
}
}
Each property becomes a key in the output, holding a value, a nested score (with groundingscore and extractionscore), and a citation you can act on:
{
"total_due": {
"value": "$11,557.22",
"score": { "groundingscore": 0.998, "extractionscore": 0.998 },
"citation": { "page": 1, "bbox": [470, 577, 533, 592], "pagewidth": 595.28, "pageheight": 841.89 }
}
}
So in later steps the value is {{ $json.totaldue.value }} and its confidence is {{ $json.totaldue.score.grounding_score }} — the scores are nested under score, not on the field itself. To run Extract on a different document, change the property names and descriptions to the fields you want. The schema above is generic enough to work on most invoices as-is; a receipt, a contract, or an ID needs its own field list.
Extraction runs on Unsiloed’s gamma model (the recommended, most thorough tier), with citations enabled so every field comes back grounded.
Once you have the output, wire it into a spreadsheet, a database, a notification, or a language-model step. The examples/ folder in the repo has a ready-to-import Parse workflow with a sample document.
Building From Source
The committed dist/ is prebuilt, so most people don’t need this. To rebuild after changing the source:
npm install
npm run build