n8n community node for the Framer Server API (framer-api). Provides CMS read/write, publish, and deploy operations for Framer projects directly inside n8n workflows — no plugin or open browser required.
Independent rewrite/fork of
n8n-nodes-framerv0.2.1 (originally by FleetPay, MIT licensed). Reconstructed from the published package to fix a brokenmainentry point, add types throughout, and continue development independently. See LICENSE for attribution.
- Full CMS access (collections, items, fields)
publish()anddeploy()native (covers the gap of webhook-plugin integrations)- A compound Site Manager resource that accepts a v4-webhook-style JSON payload and runs multi-step read/audit/write flows (see below) — present in the upstream package but undocumented there
- Credential managed in n8n UI, encrypted in n8n's database — no env vars
- WebSocket-based, designed for batch operations
- Works offline of the Framer editor (no need to keep the project open)
- Open your self-hosted n8n
- Go to Settings → Community Nodes
- Click Install
- Enter package name:
n8n-nodes-framer-cms - Accept the unverified package disclaimer
- Click Install
cd ~/.n8n/custom # or wherever your n8n custom nodes folder is
npm install n8n-nodes-framer-cmsRestart n8n after manual install.
- Open your Framer project in the browser
- Go to Site Settings → API Keys
- Click Create API Key and copy the value (it is only shown once)
- Go to Credentials → New
- Search for Framer API
- Fill in:
- Project URL: the URL from your browser address bar, e.g.
https://framer.com/projects/Sites--aabbccddeeff - API Key: the key you just created
- Project URL: the URL from your browser address bar, e.g.
- Save
- In any workflow, search for Framer in the node panel
- Pick the resource and operation
- Bind the credential you created
Accepts a single Input JSON payload (defaults to $json, i.e. the incoming webhook body) and runs one of:
| Operation | What it does |
|---|---|
| Read Structure | Every collection with its fields and item count |
| Read Page(s) | Items matching one or more slug paths (path or paths) |
| Read CMS Collection | All items of a collection matched by name substring (collection) |
| Read CMS Item | One item by collection name + slug |
| Audit SEO | Scans every item for missing/oversized meta title & description |
| Read Changes | Paths changed since the last publish |
| Update SEO / Pages | Bulk-updates page fields by path (looks for a collection named like "page(s)"/"landing") |
| Create Page | Adds one item to the pages collection |
| Create Blog Posts | Adds one or more items to the blog/post collection |
| Publish | Creates a preview deployment |
| Deploy | Promotes a deployment_id to production |
| Publish and Deploy | Publish then immediately deploy in one call |
This resource exists to be a drop-in target for existing v4-webhook-based automations — point the webhook at this node instead and keep the same JSON body shape.
- Get Info — display name and hashed project ID
- Get Many — list all collections (managed and unmanaged)
- Get — fetch a collection by ID
- Get Fields — list field definitions of a collection
- Set Fields — replace field schema (managed collections only)
- Get Many — list items in a collection
- Add or Update — bulk insert/update items by ID match
- Remove — delete items by ID
- Set Order — arrange items in a specific order
- Get Changes — paths added/removed/modified since last publish
- Get Contributors — authors who contributed to a version range
- Create Preview — publish a preview link, returns deployment ID
- Deploy to Production — promote a preview to production
Manual Trigger
→ Framer (Item: Add or Update) // populate CMS from external source
→ Framer (Publish: Get Changes) // verify what changed
→ Framer (Publish: Create Preview) // get deployment ID
→ Framer (Publish: Deploy to Production)
- The node opens one WebSocket connection per execution and reuses it across all input items, then disconnects. This is the recommended pattern for the Framer Server API and avoids reconnect overhead in batch workflows.
framer-apiships ESM-only ("type": "module") while this node compiles to CommonJS. It's loaded through a dynamicimport()at runtime (see the top ofFramer.node.ts) sotscdoesn't downlevel it to arequire()call, which would crash withERR_REQUIRE_ESM.- Compatible with n8n self-hosted (Community Edition or higher). Not available on n8n Cloud (unverified community nodes are restricted to self-hosted).
- n8n version: ≥ 1.82.0
- Node.js: ≥ 22 (matches the
framer-apiengine requirement) - Framer Server API: open beta
npm install
npm run build # tsc + copy icons into dist/
npm run lintLink into a local n8n instance for testing:
npm run build
npm link
cd ~/.n8n/custom
npm link n8n-nodes-framer-cmsIssues and PRs welcome on this repo.
MIT — see LICENSE. Originally based on n8n-nodes-framer v0.2.1 (MIT, © FleetPay).