{"_id":"@bamostech/n8n-nodes-sevdesk","_rev":"2-c79332dd29a063b925c18090f1cc74d7","name":"@bamostech/n8n-nodes-sevdesk","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@bamostech/n8n-nodes-sevdesk","version":"0.1.0","keywords":["n8n-community-node-package"],"author":{"url":"BuildWithTino","name":"Tino Coda"},"license":"MIT","_id":"@bamostech/n8n-nodes-sevdesk@0.1.0","maintainers":[{"name":"tinocoda","email":"moanda@live.fr"}],"homepage":"https://github.com/TinoCoda/n8n-nodes-sevdesk","bugs":{"url":"https://github.com/TinoCoda/n8n-nodes-sevdesk/issues"},"n8n":{"nodes":["dist/nodes/SevDesk/SevDesk.node.js"],"strict":true,"credentials":["dist/credentials/SevDeskApi.credentials.js"],"n8nNodesApiVersion":1},"dist":{"shasum":"c2d2ccf0cce663fdceef7a1ea2b5a38ac65b065f","tarball":"https://registry.npmjs.org/@bamostech/n8n-nodes-sevdesk/-/n8n-nodes-sevdesk-0.1.0.tgz","fileCount":19,"integrity":"sha512-5vlSzCqBweuNU3XvivrLKIWz6v0YCwMjw9W9U5IDUhNqCKTQqIsb4prNfIDA0IpeKqbO5Kd1iiHGzcL61e76gg==","signatures":[{"sig":"MEYCIQCTB5bKNiQE6jMtWUTmapKCl7HbCwHrATTnNfIs+SoT/AIhAMcw+IKsXMC23FH0OQHkGaFLldd0beab4uqvnfKh7551","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107940},"gitHead":"d226d7e9c992ecf975db15ae310502ac25c65345","scripts":{"lint":"eslint .","test":"vitest run","build":"tsc && npm run copy-assets","lint:fix":"eslint . --fix","build:watch":"tsc --watch","copy-assets":"node -e \"const fs=require('fs'),path=require('path');function copy(dir,out){for(const f of fs.readdirSync(dir,{withFileTypes:true})){const src=path.join(dir,f.name);if(f.isDirectory()){copy(src,path.join(out,f.name));}else if(f.name.endsWith('.svg')||f.name.endsWith('.png')){fs.mkdirSync(out,{recursive:true});fs.copyFileSync(src,path.join(out,f.name));}}}copy('nodes','dist/nodes');copy('credentials','dist/credentials');\""},"_npmUser":{"name":"tinocoda","email":"moanda@live.fr"},"repository":{"url":"git+https://github.com/TinoCoda/n8n-nodes-sevdesk.git","type":"git"},"_npmVersion":"11.6.2","description":"n8n community node for sevDesk — find/create contacts, create draft invoices, and finalize them.","directories":{},"_nodeVersion":"25.0.0","_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^2.1.0","typescript":"^5.7.2","@types/node":"^22.10.2","n8n-workflow":"^1.0.0","typescript-eslint":"^8.0.0","@n8n/eslint-plugin-community-nodes":"^0.8.0"},"peerDependencies":{"n8n-workflow":"*"},"_npmOperationalInternal":{"tmp":"tmp/n8n-nodes-sevdesk_0.1.0_1787131021938_0.9862005268401792","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bamostech/n8n-nodes-sevdesk","version":"0.1.1","description":"n8n community node for sevDesk — find/create contacts, create draft invoices, and finalize them.","license":"MIT","homepage":"https://github.com/TinoCoda/n8n-nodes-sevdesk","keywords":["n8n-community-node-package"],"author":{"name":"Tino Coda","url":"BuildWithTino"},"repository":{"type":"git","url":"git+https://github.com/TinoCoda/n8n-nodes-sevdesk.git"},"scripts":{"build":"tsc && npm run copy-assets","build:watch":"tsc --watch","test":"vitest run","copy-assets":"node -e \"const fs=require('fs'),path=require('path');function copy(dir,out){for(const f of fs.readdirSync(dir,{withFileTypes:true})){const src=path.join(dir,f.name);if(f.isDirectory()){copy(src,path.join(out,f.name));}else if(f.name.endsWith('.svg')||f.name.endsWith('.png')){fs.mkdirSync(out,{recursive:true});fs.copyFileSync(src,path.join(out,f.name));}}}copy('nodes','dist/nodes');copy('credentials','dist/credentials');\"","lint":"eslint .","lint:fix":"eslint . --fix"},"n8n":{"n8nNodesApiVersion":1,"strict":true,"credentials":["dist/credentials/SevDeskApi.credentials.js"],"nodes":["dist/nodes/SevDesk/SevDesk.node.js"]},"devDependencies":{"@n8n/eslint-plugin-community-nodes":"^0.8.0","@types/node":"^22.10.2","eslint":"^9.0.0","n8n-workflow":"^1.0.0","typescript":"^5.7.2","typescript-eslint":"^8.0.0","vitest":"^2.1.0"},"peerDependencies":{"n8n-workflow":"*"},"gitHead":"52a1720ceb7584f366635437d6856c7dbf12bbe5","_id":"@bamostech/n8n-nodes-sevdesk@0.1.1","bugs":{"url":"https://github.com/TinoCoda/n8n-nodes-sevdesk/issues"},"_nodeVersion":"25.0.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-mb5vY3XBS0/KfZd6AeWXo5FrSBisimDzyQamrJxf7tIMXDWHux4AiYFes6XcwHg6IoD30N+frS2WJYt+XtcKlg==","shasum":"8a788d30a63650a0c69339575a64fb8c13e97f26","tarball":"https://registry.npmjs.org/@bamostech/n8n-nodes-sevdesk/-/n8n-nodes-sevdesk-0.1.1.tgz","fileCount":19,"unpackedSize":107874,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCNUrpPs/fKL1mw7YKjwH24xJGtvDPzPVVQ9eIDg+/t7QIgQBinV+BG1kj+lQsiRsJvbqLa4cjLNAHkY2LuL0Vy4wE="}]},"_npmUser":{"name":"tinocoda","email":"bamostech@gmail.com"},"directories":{},"maintainers":[{"name":"tinocoda","email":"bamostech@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/n8n-nodes-sevdesk_0.1.1_1787160865313_0.5830758635489666"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-19T09:17:01.571Z","modified":"2026-08-19T17:34:25.675Z","0.1.0":"2026-08-19T09:17:02.069Z","0.1.1":"2026-08-19T17:34:25.476Z"},"bugs":{"url":"https://github.com/TinoCoda/n8n-nodes-sevdesk/issues"},"author":{"name":"Tino Coda","url":"BuildWithTino"},"license":"MIT","homepage":"https://github.com/TinoCoda/n8n-nodes-sevdesk","keywords":["n8n-community-node-package"],"repository":{"type":"git","url":"git+https://github.com/TinoCoda/n8n-nodes-sevdesk.git"},"description":"n8n community node for sevDesk — find/create contacts, create draft invoices, and finalize them.","maintainers":[{"name":"tinocoda","email":"bamostech@gmail.com"}],"readme":"# n8n-nodes-sevdesk\n\nAn [n8n](https://n8n.io) community node for [sevDesk](https://sevdesk.de), the German cloud bookkeeping platform. Find or create contacts, create draft invoices, and finalize them into real, permanently-numbered invoices — directly from an n8n workflow, no Code node required.\n\nBuilt as part of a rate-limited Postgres → sevDesk invoice sync — this package extracts that same proven API logic into a reusable, installable node.\n\n## Installation\n\nFollow n8n's [community nodes installation guide](https://docs.n8n.io/integrations/community-nodes/installation-and-management/). In short, on a self-hosted instance:\n\n**Settings → Community Nodes → Install**, then enter `@bamostech/n8n-nodes-sevdesk`.\n\n## Credentials\n\nRequires a **sevDesk API** credential — just your sevDesk API key (Settings → User → API in sevDesk's own UI). Sent as a raw token in the `Authorization` header; sevDesk does not use a `Bearer` prefix.\n\n## Operations\n\n| Resource | Operation | What it does |\n|---|---|---|\n| Contact | Find or Create | Looks up a contact by exact name match first (avoids duplicates across runs); creates one if none exists |\n| Invoice | Create Draft | Creates a draft invoice (sevDesk status 100) with one or more line items |\n| Invoice | Finalize | Assigns the invoice a real, permanent number — **irreversible** |\n\n### A note on Finalize\n\nOnce an invoice is finalized, sevDesk locks it permanently under German bookkeeping law (GoBD immutability) — there is no working \"undo.\" `resetToDraft` fails with `\"Already enshrined by object\"` on any invoice that's actually been sent. Only finalize an invoice you're certain about.\n\nThere's also a known sevDesk API quirk this node works around automatically: `PUT /Invoice/{id}/sendBy` returns a 500 error whenever the invoice's `header` field is null (true for every invoice this node creates) — even though the finalize succeeds server-side. This node detects that specific case and confirms the real result via a follow-up read, rather than reporting a false failure.\n\n## Local development\n\nThis package is scaffolded and built by hand, **not** with `@n8n/node-cli`\n(the official scaffolding tool) — that package bundles `isolated-vm` as a real\ndependency, which fails to native-compile on Windows without the Clang/LLVM\ntoolset for MSVC installed (`error MSB8020: ClangCL build tools cannot be\nfound`). Rather than requiring that toolchain, this project uses plain `tsc`\n+ `eslint` directly, matching what `@n8n/node-cli`'s own `build`/`lint`\ncommands would do under the hood anyway.\n\n**Install dependencies** — always with `--ignore-scripts`, even though this\nproject has no native deps of its own: `n8n-workflow` (installed only as a\ndevDependency, for local type-checking) pulls in `isolated-vm` transitively,\nso a plain `npm install` will hit the same wall:\n\n```\nnpm install --ignore-scripts\n```\n\n**Build:**\n\n```\nnpm run build\n```\n\n**Test against a real n8n instance** (there is no bundled local dev sandbox\nhere, unlike `@n8n/node-cli`'s `dev` command): bind-mount this project's\nfolder into a real n8n Docker container and set `N8N_CUSTOM_EXTENSIONS` to\npoint at it, e.g. in that instance's `docker-compose.yml`:\n\n```yaml\n    environment:\n      - N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom\n    volumes:\n      - ./n8n_data:/home/node/.n8n\n      - /path/to/n8n-nodes-sevdesk:/home/node/.n8n/custom/n8n-nodes-sevdesk\n```\n\nRestart the container after any rebuild (`npm run build` then\n`docker restart <container>`) to pick up changes — there's no hot reload.\n\n## Compatibility\n\nBuilt and tested against n8n 2.33.4 (self-hosted, Docker). Uses `n8nNodesApiVersion: 1`.\n\n## Resources\n\n- [n8n community nodes documentation](https://docs.n8n.io/integrations/community-nodes/)\n- [sevDesk API](https://api.sevdesk.de/)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}