{"workflow":{"id":13925,"name":"Download KSeF (Poland’s e-invoicing system) invoices to an Excel spreadsheet","views":211,"recentViews":2,"totalViews":211,"createdAt":"2026-03-06T17:59:33.593Z","description":"### TL;DR;\n\nDownload invoices from Poland's KSeF (Krajowy System e-Faktur) and export them as an XLSX spreadsheet. Handles the full v2 authentication flow automatically.\n\n---\n\n## Download KSeF invoices through n8n\n\n### What it does\n\nThis workflow connects to Poland's **KSeF** (Krajowy System e-Faktur) API v2, downloads invoice metadata for a configurable date range, and exports everything as a clean **Excel spreadsheet** (.xlsx).\n\nThe spreadsheet includes: KSeF number, invoice number, issue date, seller/buyer NIP and name, net/VAT/gross amounts, currency, invoice type, and more.\n\n### Who is it for\n\nPolish companies and accountants who need to bulk-download invoice data from KSeF for bookkeeping, reconciliation, or tax reporting.\n\n### How to set up\n\n1. **Get your KSeF authorization token** — log in at [ksef.mf.gov.pl](https://ksef.mf.gov.pl), go to token management, and generate a token. It looks like: `YYYYMMDD-XX-XXXXXXXXXX-XXXXXXXXXX-XX|nip-XXXXXXXXXX|hash`\n2. **Open the ⚙️ Config node** and fill in:\n   - `nip` — your 10-digit NIP\n   - `authToken` — the KSeF token from step 1\n   - `startDate` / `endDate` — the date range in ISO 8601 format (e.g. `2026-01-01T00:00:00Z`)\n   - `subjectType` — use `Subject2` for invoices you **received** (as buyer), `Subject1` for invoices you **issued** (as seller)\n3. **Click \"Test workflow\"** — the spreadsheet will appear as binary output in the Write XLSX node\n\n### How it works (under the hood)\n\nKSeF API v2 requires a 6-step authentication flow:\n\n1. Fetch the RSA public key certificate from KSeF\n2. Request a challenge (nonce + timestamp)\n3. RSA-OAEP encrypt your token with the challenge timestamp\n4. Initialize authentication — returns a temporary JWT\n5. Poll the auth status until it's ready\n6. Redeem the temporary JWT for a real access token\n\nOnly after step 6 can you query invoices. This workflow handles all of that automatically — you just provide your token and NIP.\n\n### Extending the workflow\n\nSome ideas for what you can add after the Write XLSX node:\n\n- **Write Binary File** — save the spreadsheet to disk\n- **Send Email** (Gmail / SMTP) — email the spreadsheet as an attachment\n- **Google Drive** — upload the spreadsheet to Drive\n- **Postgres / MySQL** — write invoice data to a database for querying\n- **Download Invoice XML** — add an HTTP Request node to `GET /invoices/{ksefNumber}` with the access token to download the full invoice XML\n\n### Requirements\n\n- A KSeF authorization token (generated at ksef.mf.gov.pl)\n- No external credentials or API keys needed in n8n — everything goes through the Config node\n- Works with n8n self-hosted and cloud\n\n### API reference\n\n- KSeF API v2: `https://api.ksef.mf.gov.pl/v2`\n- KSeF test environment: `https://api-test.ksef.mf.gov.pl/v2`\n- Official docs: https://www.gov.pl/web/kas/krajowy-system-e-faktur\n\n\nMade with ❤️ by [Greg Brzezinka](greg@prosit.no) Need help? [Reach out to me](https://www.linkedin.com/in/brzezinka)!\n---\n\n## Tags\n\n`ksef`, `poland`, `invoices`, `tax`, `e-invoicing`, `spreadsheet`, `xlsx`, `accounting`\n\n## Categories\n\nFinance & Accounting, Data Transformation","workflow":{"id":"nS78CfnstbrfE7Ag","meta":{"instanceId":"bde9d5e601b182118fd4523698ff41b1c864fa1a38806ed83c91c77b7d5b5f20"},"name":"KSeF - Download Invoices to Spreadsheet","tags":[],"nodes":[{"id":"s1","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-48,-768],"parameters":{"color":4,"width":1048,"height":442,"content":"## 🇵🇱 KSeF — Download Invoices to Spreadsheet\n\nDownloads invoice metadata from Poland's **KSeF** (Krajowy System e-Faktur) and exports it as an **XLSX spreadsheet**.\n\n### Quick Start\n1. Open the **⚙️ Config** node and fill in your **NIP** and **KSeF token**\n2. Set the **date range** (startDate / endDate)\n3. Click **Test workflow**\n4. Your spreadsheet will appear in the **Write XLSX** node output\n\n### How to get a KSeF token\nGenerate an authorization token at [ksef.mf.gov.pl](https://ksef.mf.gov.pl) → Log in → Manage tokens.\nTokens look like: `YYYYMMDD-XX-XXXXXXXXXX-XXXXXXXXXX-XX|nip-XXXXXXXXXX|hash`\n\n### Need help?\nKSeF docs: https://www.gov.pl/web/kas/krajowy-system-e-faktur\n\nMade with ❤️ by [Greg Brzezinka](greg@prosit.no) Need help? [Reach out to me](https://www.linkedin.com/in/brzezinka)!"},"typeVersion":1},{"id":"s2","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-48,-272],"parameters":{"width":464,"height":520,"content":"## 🔧 Configuration\nEdit the JSON below to set your:\n- **nip** — your 10-digit NIP number\n- **authToken** — KSeF authorization token\n- **startDate / endDate** — ISO 8601 format\n- **subjectType** —\n  `Subject2` = invoices you **received** (buyer)\n  `Subject1` = invoices you **issued** (seller)\n\nDates use `PermanentStorage` type (when KSeF stored the invoice)."},"typeVersion":1},{"id":"s3","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[432,-272],"parameters":{"color":3,"width":1884,"height":520,"content":"## 🔐 Authentication Flow (v2 API)\nKSeF uses a multi-step auth:\n1. **Get Public Key** — fetch RSA certificate\n2. **Get Challenge** — get a challenge + timestamp\n3. **Encrypt Token** — RSA-OAEP encrypt `token|timestamp`\n4. **Init Auth** — submit encrypted token, get temp JWT\n5. **Wait + Check Status** — poll until auth is ready\n6. **Redeem Token** — exchange temp JWT for access token\n\n⚠️ The `authenticationToken` from step 4 is **temporary**!\nOnly the `accessToken` from step 6 works for API calls."},"typeVersion":1},{"id":"s4","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[2352,-272],"parameters":{"color":2,"width":484,"height":522,"content":"## 📊 Output\nInvoice metadata is flattened into columns:\nKSeF Number, Invoice Number, Issue Date, Seller/Buyer NIP & Name, Net/VAT/Gross amounts, Currency, Type.\n\nThe XLSX file is available as binary output in the **Write XLSX** node.\n\nTo save to disk, connect a **Write Binary File** node after Write XLSX.\nTo email it, connect a **Send Email** node and attach the binary.\n\nSwap it to Google Spreadsheet or database of your choice."},"typeVersion":1},{"id":"n1","name":"When clicking 'Test workflow'","type":"n8n-nodes-base.manualTrigger","position":[0,0],"parameters":{},"typeVersion":1},{"id":"n2","name":"⚙️ Config","type":"n8n-nodes-base.set","position":[224,0],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n  \"baseUrl\": \"https://api.ksef.mf.gov.pl/v2\",\n  \"nip\": \"YOUR_NIP_HERE\",\n  \"authToken\": \"YOUR_KSEF_TOKEN_HERE\",\n  \"startDate\": \"2026-02-01T00:00:00Z\",\n  \"endDate\": \"2026-03-06T23:59:59Z\",\n  \"subjectType\": \"Subject2\"\n}"},"typeVersion":3.4},{"id":"n3","name":"Get Public Key","type":"n8n-nodes-base.httpRequest","position":[448,0],"parameters":{"url":"={{ $json.baseUrl }}/security/public-key-certificates","options":{}},"typeVersion":4.4},{"id":"n3b","name":"Get Challenge","type":"n8n-nodes-base.httpRequest","position":[672,0],"parameters":{"url":"={{ $('⚙️ Config').first().json.baseUrl }}/auth/challenge","method":"POST","options":{}},"typeVersion":4.4},{"id":"n4","name":"Encrypt Token","type":"n8n-nodes-base.code","position":[880,0],"parameters":{"jsCode":"// RSA-OAEP SHA-256 encryption of KSeF token\n// Format: authToken|timestampMs encrypted with KSeF public certificate\nconst crypto = require('crypto');\nconst config = $('⚙️ Config').first().json;\n\nconst challengeData = $input.first().json;\nconst challenge = challengeData.challenge;\nconst timestampMs = challengeData.timestampMs;\n\n// Get public key(s) from Get Public Key node\nconst keyItems = $('Get Public Key').all();\nlet publicKeys;\nif (Array.isArray(keyItems[0].json)) {\n  publicKeys = keyItems[0].json;\n} else if (keyItems.length > 1) {\n  publicKeys = keyItems.map(i => i.json);\n} else {\n  publicKeys = [keyItems[0].json];\n}\n\n// Find the key for token encryption\nconst encKey = publicKeys.find(k => \n  (k.usage && k.usage.includes('KsefTokenEncryption')) ||\n  (k.usageTypes && k.usageTypes.includes('KsefTokenEncryption'))\n) || publicKeys[0];\n\n// Prepare plaintext: authToken|timestampMs\nconst plaintext = `${config.authToken}|${timestampMs}`;\n\n// Convert certificate to PEM format with proper 64-char line breaks\nconst certBase64 = typeof encKey === 'string' ? encKey : (encKey.certificate || encKey.publicKey);\nlet certPem;\nif (certBase64.includes('-----BEGIN')) {\n  certPem = certBase64;\n} else {\n  const formatted = certBase64.match(/.{1,64}/g).join('\\n');\n  certPem = `-----BEGIN CERTIFICATE-----\\n${formatted}\\n-----END CERTIFICATE-----`;\n}\n\n// Encrypt with RSA-OAEP SHA-256 + MGF1\nconst encryptedBuffer = crypto.publicEncrypt(\n  {\n    key: certPem,\n    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,\n    oaepHash: 'sha256'\n  },\n  Buffer.from(plaintext)\n);\nconst encryptedToken = encryptedBuffer.toString('base64');\n\nreturn [{\n  json: {\n    challenge: challenge,\n    contextIdentifier: {\n      type: 'Nip',\n      value: config.nip\n    },\n    encryptedToken: encryptedToken\n  }\n}];"},"typeVersion":2},{"id":"n5","name":"Init Auth","type":"n8n-nodes-base.httpRequest","position":[1104,0],"parameters":{"url":"={{ $('⚙️ Config').first().json.baseUrl }}/auth/ksef-token","method":"POST","options":{},"jsonBody":"={{ JSON.stringify($json) }}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.4},{"id":"n5a","name":"Wait 2s","type":"n8n-nodes-base.code","position":[1328,0],"parameters":{"jsCode":"// KSeF needs a moment to process authentication\n// 2 seconds is usually enough\nawait new Promise(r => setTimeout(r, 2000));\nreturn $input.all();"},"typeVersion":2},{"id":"n5b","name":"Check Auth Status","type":"n8n-nodes-base.httpRequest","position":[1552,0],"parameters":{"url":"={{ $('⚙️ Config').first().json.baseUrl }}/auth/{{ $('Init Auth').first().json.referenceNumber }}","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer {{ $('Init Auth').first().json.authenticationToken.token }}"},{"name":"Accept","value":"application/json"}]}},"typeVersion":4.4},{"id":"n5c","name":"Redeem Token","type":"n8n-nodes-base.httpRequest","position":[1760,0],"parameters":{"url":"={{ $('⚙️ Config').first().json.baseUrl }}/auth/token/redeem","method":"POST","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer {{ $('Init Auth').first().json.authenticationToken.token }}"},{"name":"Accept","value":"application/json"}]}},"typeVersion":4.4},{"id":"n6","name":"Query Invoices","type":"n8n-nodes-base.httpRequest","position":[1984,0],"parameters":{"url":"={{ $('⚙️ Config').first().json.baseUrl }}/invoices/query/metadata","method":"POST","options":{"pagination":{"pagination":{"parameters":{"parameters":[{"name":"pageOffset","value":"={{ $pageCount }}"}]},"completeExpression":"={{ $response.body.hasMore === false }}","paginationCompleteWhen":"other"}}},"jsonBody":"={{ JSON.stringify({ subjectType: $('⚙️ Config').first().json.subjectType, dateRange: { dateType: 'PermanentStorage', from: $('⚙️ Config').first().json.startDate, to: $('⚙️ Config').first().json.endDate } }) }}","sendBody":true,"sendQuery":true,"sendHeaders":true,"specifyBody":"json","queryParameters":{"parameters":[{"name":"pageSize","value":"250"},{"name":"sortOrder","value":"Desc"}]},"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"},{"name":"Authorization","value":"=Bearer {{ $('Redeem Token').first().json.accessToken.token }}"}]}},"typeVersion":4.4},{"id":"n7","name":"Extract Invoices","type":"n8n-nodes-base.code","position":[2208,0],"parameters":{"jsCode":"// Collect all invoices from paginated results\nconst pages = $input.all();\nconst allInvoices = [];\n\nfor (const page of pages) {\n  if (page.json.invoices && Array.isArray(page.json.invoices)) {\n    allInvoices.push(...page.json.invoices);\n  }\n}\n\nif (allInvoices.length === 0) {\n  return [{ json: { _noInvoices: true, message: 'No invoices found in the specified date range', count: 0 } }];\n}\n\nconsole.log(`Found ${allInvoices.length} invoices`);\nreturn allInvoices.map(inv => ({ json: inv }));"},"typeVersion":2},{"id":"n10","name":"Format for Spreadsheet","type":"n8n-nodes-base.code","position":[2432,0],"parameters":{"jsCode":"// Flatten nested KSeF metadata into clean spreadsheet columns\nconst items = $input.all();\n\nif (items.length === 1 && items[0].json._noInvoices) {\n  return [{ json: { message: 'No invoices to export' } }];\n}\n\nconst rows = items.map(item => {\n  const inv = item.json;\n  return {\n    json: {\n      'KSeF Number': inv.ksefNumber || '',\n      'Invoice Number': inv.invoiceNumber || '',\n      'Issue Date': inv.issueDate || '',\n      'Invoicing Date': inv.invoicingDate ? inv.invoicingDate.split('T')[0] : '',\n      'Acquisition Date': inv.acquisitionDate ? inv.acquisitionDate.split('T')[0] : '',\n      'Seller NIP': inv.seller?.nip || '',\n      'Seller Name': inv.seller?.name || '',\n      'Buyer NIP': inv.buyer?.identifier?.value || '',\n      'Buyer Name': inv.buyer?.name || '',\n      'Net Amount': inv.netAmount || 0,\n      'VAT Amount': inv.vatAmount || 0,\n      'Gross Amount': inv.grossAmount || 0,\n      'Currency': inv.currency || 'PLN',\n      'Invoice Type': inv.invoiceType || '',\n      'Has Attachment': inv.hasAttachment ? 'Yes' : 'No',\n      'Self Invoicing': inv.isSelfInvoicing ? 'Yes' : 'No'\n    }\n  };\n});\n\nconsole.log(`Formatted ${rows.length} rows for spreadsheet`);\nreturn rows;"},"typeVersion":2},{"id":"n11","name":"Write XLSX","type":"n8n-nodes-base.spreadsheetFile","position":[2640,0],"parameters":{"options":{"fileName":"ksef_invoices.xlsx","headerRow":true,"sheetName":"Invoices"},"operation":"toFile","fileFormat":"xlsx"},"typeVersion":2},{"id":"n9","name":"Close Session","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[2864,0],"parameters":{"url":"={{ $('⚙️ Config').first().json.baseUrl }}/auth/sessions/current","method":"DELETE","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer {{ $('Redeem Token').first().json.accessToken.token }}"}]}},"typeVersion":4.4}],"active":false,"pinData":{},"settings":{"timezone":"Europe/Warsaw","callerPolicy":"workflowsFromSameOwner","availableInMCP":false,"executionOrder":"v1"},"versionId":"fc53a640-2d3b-49af-a9a9-c41be97af326","connections":{"Wait 2s":{"main":[[{"node":"Check Auth Status","type":"main","index":0}]]},"Init Auth":{"main":[[{"node":"Wait 2s","type":"main","index":0}]]},"Write XLSX":{"main":[[{"node":"Close Session","type":"main","index":0}]]},"Redeem Token":{"main":[[{"node":"Query Invoices","type":"main","index":0}]]},"Encrypt Token":{"main":[[{"node":"Init Auth","type":"main","index":0}]]},"Get Challenge":{"main":[[{"node":"Encrypt Token","type":"main","index":0}]]},"⚙️ Config":{"main":[[{"node":"Get Public Key","type":"main","index":0}]]},"Get Public Key":{"main":[[{"node":"Get Challenge","type":"main","index":0}]]},"Query Invoices":{"main":[[{"node":"Extract Invoices","type":"main","index":0}]]},"Extract Invoices":{"main":[[{"node":"Format for Spreadsheet","type":"main","index":0}]]},"Check Auth Status":{"main":[[{"node":"Redeem Token","type":"main","index":0}]]},"Format for Spreadsheet":{"main":[[{"node":"Write XLSX","type":"main","index":0}]]},"When clicking 'Test workflow'":{"main":[[{"node":"⚙️ Config","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":18,"nodeTypes":{"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":4},"n8n-nodes-base.stickyNote":{"count":4},"n8n-nodes-base.httpRequest":{"count":7},"n8n-nodes-base.manualTrigger":{"count":1},"n8n-nodes-base.spreadsheetFile":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Greg Brzezinka","username":"ai-greg","bio":"","verified":false,"links":["https://www.linkedin.com/in/brzezinka/"],"avatar":"https://gravatar.com/avatar/6ca1f2596255ff5660b439434c5d499250a63f6c4b40b38ca792895b5fefaa67?r=pg&d=retro&size=200"},"nodes":[{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":41,"icon":"fa:table","name":"n8n-nodes-base.spreadsheetFile","codex":{"data":{"alias":["_Excel","Excel","CSV","Sheet","Spreadsheet","xls","xlsx","ods"],"resources":{"generic":[{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.converttofile/"}]},"categories":["Data & Storage","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Files"]}}},"group":"[\"transform\"]","defaults":{"name":"Spreadsheet File","color":"#2244FF"},"iconData":{"icon":"table","type":"icon"},"displayName":"Spreadsheet File","typeVersion":2,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":838,"icon":"fa:mouse-pointer","name":"n8n-nodes-base.manualTrigger","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"When clicking ‘Execute workflow’","color":"#909298"},"iconData":{"icon":"mouse-pointer","type":"icon"},"displayName":"Manual Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":34,"name":"Invoice Processing"}],"image":[]}}