Package Information
Documentation
n8n-nodes-fluidx
Community n8n node for the fluidX revXR THE EYE API. Adds a single fluidX node that exposes:
| Resource | Operations |
|---|---|
| Session | Create, Get, Get All, Close, Close All |
| Inbound Call | Create, Get, Cancel, End |
| SMS | Send |
| Send | |
| Media | Get Info, Upsert Info, Get Summary, Download |
| Eye | Take Photo |
Once installed it appears in n8n's node search as fluidX.
Requirements
- Node.js 20.15 or newer.
- An n8n version that supports community nodes (self-hosted, or n8n Cloud where the node is
installable from the verified-node catalogue). - A fluidX tenant API key.
Media → Downloadadditionally requires a TENANT_ADMIN key.
Install
A) Via the community node UI (recommended)
In n8n: Settings → Community Nodes → Install and enter:
n8n-nodes-fluidx
B) Local development against your n8n instance
git clone <this-repo> n8n-nodes-fluidx
cd n8n-nodes-fluidx
npm install
npm run build
# link it into your n8n custom-nodes folder
npm link
cd ~/.n8n/custom
npm link n8n-nodes-fluidx
# restart n8n
Credentials
After install, create a new credential of type fluidX API with:
- Base URL — your fluidX root, e.g.
https://live.fluidx.digital - API Key — your tenant API key (sent as
x-api-key)
The credential test hits GET /api/healthz against the configured Base URL.
Build
npm install
npm run build # compiles TS + copies SVG icons
npm run dev # watch mode
npm run lint
Output goes to dist/. The n8n block in package.json points atdist/credentials/FluidXApi.credentials.js and dist/nodes/FluidX/FluidX.node.js.
Endpoints covered
| n8n Operation | HTTP |
|---|---|
| Session → Create | POST /api/fx/ext/session/create |
| Session → Get | GET /api/fx/ext/session?sessionId= |
| Session → Get All | GET /api/fx/ext/session/all?status=&includeAll= |
| Session → Close | POST /api/fx/ext/session/close |
| Session → Close All | POST /api/fx/ext/session/close/all |
| Inbound Call → Create | POST /api/fx/ext/inbound/calls |
| Inbound Call → Get | GET /api/fx/ext/inbound/calls/{id} (header x-call-token) |
| Inbound Call → Cancel | POST /api/fx/ext/inbound/calls/{id}/cancel |
| Inbound Call → End | POST /api/fx/ext/inbound/calls/{id}/end |
| SMS → Send | POST /api/fx/ext/sms/send |
| Email → Send | POST /api/fx/ext/email/send |
| Media → Get Info | GET /api/fx/ext/media/info?type=&id= |
| Media → Upsert Info | POST /api/fx/ext/media/info |
| Media → Get Summary | GET /api/fx/ext/media/summary?sessionId= |
| Media → Download | GET /api/fx/ext/media/download?sessionId=&mediaId=&type=&format= |
| Eye → Take Photo | POST /api/fx/ext/eye/takephoto |
Session summary (plain text)
Media → Get Summary calls an endpoint that answers with text/plain, not JSON. The node
normalises that into named fields, so the summary is a proper string on the output item:
{
"sessionId": "faf5ef0c-...",
"summary": "photo-123.png\nTitle: ...\nDescription: ...\n",
"data": "photo-123.png\nTitle: ...\nDescription: ...\n"
}
Use {{ $json.summary }}. data holds the identical string under the field name n8n's generic
HTTP Request node uses for non-JSON responses, so an existing workflow that reads data keeps
working.
Up to and including 0.4.1 the raw text was pushed as the item JSON itself, which n8n surfaces as
a character-indexed object ({"0":"T","1":"i", ...}) that no expression can read sensibly. If you
built a workflow against that shape, switch it to {{ $json.summary }}.
Downloading media (binary)
Media → Download streams the original binary of a captured photo or video and writes it
to a binary property on the output item (default field name data), so you can pipe it
straight into Write Binary File, Move Binary Data, email attachments, S3, etc.
Parameters:
- Source — how to address the media:
By ID— build the request from Session ID, Media ID and Type (+ optional Format).By URL— paste a ready download URL (e.g. aphotoRefs[].url/videoRefs[].url
link from a session response). The API key is still sent automatically, so you don't need a
separate HTTP Request node with header auth.
- Session ID / Media ID — identify the captured media (
By IDmode). - Type —
PhotoorVideo(By IDmode). - Format — video only;
WebM(default) orMP4transcode. Ignored for photos. - URL — the download link (
By URLmode). - Put Output In Field — name of the binary property to write to (default
data). - File Name — optional; otherwise derived from the media ID, type, and the response
Content-Type(e.g.photo-77.png,video-12.webm).
The endpoint requires a TENANT_ADMIN API key.
The JSON side of the output item carries { sessionId, mediaId, type, fileName }; the actual
bytes live in the binary property.
Discovering media IDs
A Session → Get (or Create) response includes photoRefs and videoRefs arrays, each entry
having an id and a ready url that already points at /api/fx/ext/media/download. You can
either:
- By ID — feed each
idinto aMedia → Downloadnode (it builds the request for you), or - By URL — pass the
urlstraight into aMedia → Downloadnode inBy URLmode
(e.g.{{ $json.url }}). This is the one-node equivalent of a generic HTTP Request node
with header auth.
Releasing
Releases are managed locally with release-it and published from CI with npm provenance.
# interactive (asks which version bump to use)
npm run release
# non-interactive bumps
npm run release:patch
npm run release:minor
npm run release:major
# preview without changing anything
npm run release:dry
release-it will: run lint + build, bump the version in package.json, update CHANGELOG.md from conventional commits, commit, tag (vX.Y.Z), push, and create the GitHub release. The pushed tag triggers .github/workflows/publish.yml, which runs npm publish with provenance — required for n8n's verified-node program.
Prerequisites:
- Run on the
mainbranch with a clean working tree. - Authenticate with GitHub so a release can be created: either export
GITHUB_TOKEN, or useGITHUB_TOKEN="$(gh auth token)" npm run release. - The
NPM_TOKENsecret must be set in the GitHub repo so the publish workflow can authenticate.
If the publish job fails with npm error code E404 on PUT https://registry.npmjs.org/n8n-nodes-fluidx,
the package is not missing — that is npm's response to an expired or revoked publish token. Rotate
the NPM_TOKEN secret and re-run the failed job; no new tag or version bump is needed. npm granular access tokens expire after at most 90 days, so expect this roughly quarterly
until the workflow is migrated to trusted publishing
(OIDC), which needs no token at all.
Use Conventional Commits (feat:, fix:, ci:, docs:, etc.) so the changelog and version bump are derived correctly.
License
MIT