Description
n8n-nodes-swipeflow
Add human approval to your n8n workflows with SwipeFlow. A reviewer swipes to approve, reject or request changes on their phone, and your workflow carries on with the decision.
n8n is a fair-code licensed workflow automation platform. Learn more about SwipeFlow at swipeflow.io.
Installation · Credentials · Wait for approval · SwipeFlow node · SwipeFlow Trigger · Upgrading · Compatibility · Development
Installation
Follow the community nodes installation guide and install @swipeflow/n8n-nodes-swipeflow.
Credentials
1. In SwipeFlow, open Settings → API Keys and create a key.
2. In n8n, add a SwipeFlow API credential and paste the key.
Base URL defaults to https://api.swipeflow.io. Change it only for a staging or self-hosted deployment.
> Treat the API key like a password: it grants access to your SwipeFlow projects.
Scopes
An API key can be limited to the scopes it needs, and to specific projects. The nodes need:
| To | Scopes |
| — | —— |
| Create, update or version items, request changes, mark processed, upload media | reviews:request |
| Read items, statuses, versions or media | reviews:read |
| Approve or reject an item from n8n | reviews:decide |
| Wait for a decision (SwipeFlow Approval, Create and Wait, Wait for Decision) | reviews:request, reviews:read, and projects:read and projects:write, because each wait registers a short-lived webhook on the project |
| SwipeFlow Trigger | projects:read and projects:write, to register its webhook |
| List or manage projects, webhooks and manual triggers | projects:read, projects:write |
A call the key’s scopes do not allow is refused by SwipeFlow with a 403.
Wait for approval in one node
SwipeFlow → Item → Create and Wait for Decision creates an item for review and pauses the workflow. When a reviewer decides, the workflow resumes with the outcome:
{
"decision": "approved",
"approved": true,
"comment": "Looks good",
"decidedBy": "Riley Reviewer",
"decidedAt": "2026-09-21T12:00:00.000Z",
"itemId": "0192f1a4-7c3e-7507-9f1f-6cd799439012",
"projectId": "0192f1a4-7c3e-7507-9f1f-6cd799439011",
"item": { "...": "the full item" }
}
decision is approved, rejected, change_requested, or deleted if the item was removed while waiting. Branch on it with an IF or Switch node.
Requesting changes. A change request ends the wait like any other decision. To loop, revise the content, run Item → Create Version, then Item → Wait for Decision on the same item ID.
Time limit. Turn on Limit Wait Time to continue after a while without a decision. The workflow then carries on with the node’s input unchanged, as with n8n’s own send-and-wait nodes, so there is no decision field. Test for that (for example an IF on {{ $json.decision }} being empty) to handle a timeout. The item stays pending in SwipeFlow.
Delivery mode. Webhook (the default) has SwipeFlow call n8n when the decision is made, and the execution does not hold a worker. Polling has n8n check SwipeFlow every Polling Interval (at least 1 minute) until a decision or the Limit Wait Time is reached, so polling needs a time limit. Use polling when SwipeFlow cannot reach n8n; it holds a worker for the whole wait.
Things to know
- Only the first input item is used; an execution can be paused once per node. Put the node in a loop (for example Loop Over Items) to review many.
- An automatic retry of the node (Retry On Fail) does not create a second item: the item is created with an idempotency key derived from the execution and node. Re-running the workflow does create a new one.
- SwipeFlow has no per-item callbacks, so each wait registers a short-lived webhook on the project (named
n8n wait exec=) and removes it when the decision arrives.item= - Other events in the project also reach n8n while a wait is open; the node ignores everything except a decision on its own item.
- Fixed: Expiration Date is now sent when creating an item (version 1 accepted it and dropped it).
- Fixed: Metadata is sent as a JSON object (version 1 sent the text as entered).
- Fixed: the Trigger no longer fails on Item Deleted, and supports Item Processed.
- Fixed: Custom API Call works with the documented
projects/…form and no longer requires choosing a project. - Added: wait for approval, media, webhook and project trigger operations, idempotency keys, item status and versions, Return All, searchable project list, signature verification.
- Changed: project operations are named Get and Get Many instead of Fetch and List; Update Project changes only the fields you set.
– A wait with a time limit sets the webhook to expire when the limit passes, and SwipeFlow deletes it then, even if the execution was cancelled.
– A cancelled wait with no time limit leaves its webhook until you delete it under the project’s webhooks in SwipeFlow. It points at a URL n8n no longer serves, so it does no harm beyond failed delivery entries in the webhook log.
SwipeFlow Approval node
SwipeFlow Approval is the same approval step with one output per outcome: Timed out, Approved, Rejected, Change requested and Always. It appears under Human review in n8n’s node picker, so no IF node is needed to branch on the decision. Always runs for every decision, which suits audit logging.
Timed out runs when Limit Wait Time passes with no decision, in either delivery mode. Expiry on the SwipeFlow side is tracked in swipeflow/swipeflow#424 and will get its own output. See docs/USAGE.md for details and examples.
SwipeFlow node
| Resource | Operations |
| — | — |
| Item | Create · Create and Wait for Decision · Wait for Decision · Get · Get Many · Get Next Pending · Get Status · Approve · Reject · Request Changes · Mark as Processed · Create Version · List Versions · Get Version · Delete |
| Media | Upload (from binary data) · Import From URL · Get · Get Many · Download · Get Usage · Delete |
| Project | Create · Get · Get Many · Get or Create (by name) · Update · Delete |
| Project Trigger | Get Many · Create · Run · Delete |
| Webhook | Get Many · Create · Send Test · Delete |
| Other | Custom API Call |
Pick projects from a searchable list or by ID. Get Many operations offer Return All and Limit.
Simplify. Item operations that return an item (Create, Get, Get Many, Get Next Pending, Approve, Reject, Request Changes, Mark as Processed) return ten fields by default: id, title, status, decision, comment, contentType, content, description, version and projectId, where decision and comment come from the latest decision. With Include All Versions on, versions is added. Turn Simplify off for the full item, including media, metadata and all decisions.
Images, video and audio. Use Media → Upload on a binary file, then put the returned ref (media://) in an item’s Content (with Content Type Image, Video or Audio), or list the media ID under Additional Fields → Media IDs.
Carousels. Choose Content Type Carousel and set Content to JSON with 1 to 20 slides, for example {"items": [{"type": "image", "url": "media://. Each slide’s url is an https URL or a media reference, and caption and alt are optional. A bare list of slides works too.
Custom API Call takes a path such as projects/{projectId}/items (the /v1 prefix is added if missing). Full URLs are refused so the credential’s API key can only go to SwipeFlow.
The node can also be used as a tool by AI agents.
SwipeFlow Trigger
Starts a workflow when something happens in a project. It registers a webhook with SwipeFlow when the workflow is activated and removes it when it is deactivated.
Events: Item Created, Updated, Deleted, Approved, Rejected, Change Requested, Processed, and Project Triggered (a manual trigger run from SwipeFlow).
Every event has event, timestamp and, where they apply, projectId, itemId, item, decision, processed, version and userId. Project Triggered events carry triggerName, triggerEvent, triggeredBy and any extra data under payload.
Signature verification. Each delivery is signed by SwipeFlow, and the trigger checks the signature and rejects unsigned, altered or replayed requests with a 401. The webhook’s secret is generated by the trigger and kept in the workflow’s static data. Turn it off under Options → Verify Signature if a proxy alters requests before they reach n8n.
Upgrading from earlier versions
Existing workflows keep working: nodes you already have stay on node version 1 and behave as before. New nodes use version 2. To move a workflow over, add a new SwipeFlow node and copy its settings.
What version 2 changes:
Compatibility
Tested end to end against n8n 2.35.7 (loading the package, the Trigger lifecycle and signature checks, waiting and resuming, timeouts, and a version 1 node in a saved workflow) and unit tested against n8n-workflow 2.39.
Older n8n versions have not been tested. The wait relies on n8n’s signed resume URLs; on a version that does not provide them the node falls back to the unsigned resume URL, which has not been tested.
Development
npm install
npm run build # compile
npm run lint # n8n community node rules (must pass with no errors)
npm test # unit tests
npm run dev # run n8n locally with the node loaded and hot reload
The node ships with no runtime dependencies, so it cannot import @swipeflow/sdk (which needs axios). The SDK’s generated types and media helpers are copied into nodes/SwipeFlow/sdk by
npm run sync-sdk # reads ../../sdk/swipeflow-sdk-ts, or pass a path
Do not edit the copied files; refresh them after the API changes. nodes/SwipeFlow/sdk/client.ts is a small hand-written client over n8n’s HTTP helpers with the SDK’s method names.
Resources
Questions or problems: open an issue or contact [email protected].


