AutomationFlowsGeneral › Automate Wallabag Posts with n8n Workflow

Automate Wallabag Posts with n8n Workflow

Original n8n title: Post to Wallabag

post to wallabag. Uses manualTrigger, httpRequest, noOp. Event-driven trigger; 10 nodes.

Event trigger★★★★☆ complexity10 nodesHTTP Request
General Trigger: Event Nodes: 10 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "4",
  "name": "post to wallabag",
  "nodes": [
    {
      "name": "On clicking 'execute'",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        120,
        250
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1280,
        380
      ],
      "parameters": {
        "url": "=http://{HERE-YOUR-WALLABAG-HOST}/api/entries.json",
        "options": {},
        "requestMethod": "POST",
        "bodyParametersUi": {
          "parameter": [
            {
              "name": "url",
              "value": "={{$json[\"url\"]}}"
            }
          ]
        },
        "queryParametersUi": {
          "parameter": []
        },
        "headerParametersUi": {
          "parameter": [
            {
              "name": "Authorization",
              "value": "=Bearer {{$json[\"access_token\"]}}"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Cron",
      "type": "n8n-nodes-base.cron",
      "position": [
        120,
        400
      ],
      "parameters": {
        "triggerTimes": {
          "item": [
            {
              "mode": "everyX",
              "unit": "minutes",
              "value": 10
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Function",
      "type": "n8n-nodes-base.function",
      "position": [
        900,
        470
      ],
      "parameters": {
        "functionCode": "// Get the global workflow static data\nconst staticData = getWorkflowStaticData('global')\n\n// Access its data\nconst lastStarRssId = staticData.lastStarRssId\n\nlet list = []\n\nfor (const item of items[0].json.content){\n  let currentId = item.id\n  if(currentId == lastStarRssId) break;\n  list.push({'json':{\n    'id': currentId,\n    'lastId': lastStarRssId,\n    'url': item.link,\n    'tags': item.tags,\n    'access_token': items[1].json.access_token\n  }})\n}\n\n\n// Get the last ID from Rss Feed\nlet currentStarRssId = items[0].json.content[0].id\n\n// TODO: make a loop to get all the items beyond the last saved id\nif(!lastStarRssId || currentStarRssId != lastStarRssId)\n{  \n  // Update its data\n  staticData.lastStarRssId = currentStarRssId;\n  \n}\nelse { list = [{'json':{ 'id': 'Nan', 'lastId': staticData.lastStarRssId }}] }\nreturn list;\n\n/*return [{'json':{'url': items[0].json.content.pop(), 'wallabag':items[1].json}}]*/"
      },
      "typeVersion": 1
    },
    {
      "name": "IF",
      "type": "n8n-nodes-base.if",
      "position": [
        1100,
        470
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$node[\"Function\"].json[\"id\"]}}",
              "value2": "NaN",
              "operation": "notEqual"
            }
          ],
          "boolean": []
        }
      },
      "typeVersion": 1
    },
    {
      "name": "NoOp",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1290,
        570
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "name": "Auth Wallabag",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        490,
        590
      ],
      "parameters": {
        "url": "http://{HERE-YOUR-WALLABAG-HOST}/oauth/v2/token",
        "options": {},
        "requestMethod": "POST",
        "bodyParametersUi": {
          "parameter": [
            {
              "name": "grant_type",
              "value": "password"
            },
            {
              "name": "client_id",
              "value": "{HERE-YOUR-CLIENT_ID}"
            },
            {
              "name": "client_secret",
              "value": "{HERE-YOUR-CLIENT_SECRET}"
            },
            {
              "name": "username",
              "value": "{HERE-YOUR-USERNAME}"
            },
            {
              "name": "password",
              "value": "{HERE-YOUR-PASSWORD}"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        710,
        470
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "name": "Get stared articles",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        490,
        400
      ],
      "parameters": {
        "url": "http://{HERE-YOUR-TTRSS-HOST}/tt-rss/api/",
        "options": {},
        "requestMethod": "POST",
        "bodyParametersUi": {
          "parameter": [
            {
              "name": "sid",
              "value": "={{$json[\"content\"][\"session_id\"]}}"
            },
            {
              "name": "op",
              "value": "getHeadLines"
            },
            {
              "name": "feed_id",
              "value": "-1"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Auth TTRss",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        320,
        400
      ],
      "parameters": {
        "url": "http://{HERE-YOUR-TTRSS-HOST}/tt-rss/api/",
        "options": {},
        "requestMethod": "POST",
        "bodyParametersUi": {
          "parameter": [
            {
              "name": "op",
              "value": "login"
            },
            {
              "name": "user",
              "value": "{HERE-YOUR-API-USER}"
            },
            {
              "name": "password",
              "value": "{HERE-YOUR-API-SECRET}"
            }
          ]
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {},
  "connections": {
    "IF": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "NoOp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cron": {
      "main": [
        [
          {
            "node": "Auth TTRss",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Function",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Function": {
      "main": [
        [
          {
            "node": "IF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Auth TTRss": {
      "main": [
        [
          {
            "node": "Get stared articles",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Auth Wallabag": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Get stared articles": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On clicking 'execute'": {
      "main": [
        [
          {
            "node": "Auth TTRss",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow enables you to effortlessly save articles from any source directly to your Wallabag library, freeing you from manual bookmarking and ensuring your reading list remains organised and accessible across devices. It suits avid readers, researchers, or professionals who frequently encounter valuable online content but lack time to curate it immediately. The key step involves an HTTP Request node that authenticates and posts the article details to Wallabag, seamlessly integrating with the service to handle metadata like titles and URLs without additional tools.

Use this workflow when you need an automated, event-driven system to capture and store web content on demand, such as after browsing sessions or via scheduled cron jobs for batch processing. Avoid it for high-volume scraping tasks, as it relies on manual triggers and basic HTTP calls that may not scale efficiently; opt for dedicated RSS integrations instead. Common variations include adding conditional IF nodes to filter articles by keywords or merging inputs from multiple sources before posting.

About this workflow

post to wallabag. Uses manualTrigger, httpRequest, noOp. Event-driven trigger; 10 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest, stickyNote, manualTrigger. Event-driven trigger; 51 nodes.

HTTP Request
General

Generate Leads with Google Maps - AlexK1919. Uses manualTrigger, scheduleTrigger, executeWorkflowTrigger, stopAndError. Event-driven trigger; 42 nodes.

Execute Workflow Trigger, Stop And Error, HTTP Request +1
General

Limit Code. Uses microsoftOutlookTrigger, httpRequest, limit, noOp. Event-driven trigger; 41 nodes.

Microsoft Outlook Trigger, HTTP Request
General

AutoQoutesV2_template. Uses manualTrigger, httpRequest, stickyNote, googleSheets. Event-driven trigger; 28 nodes.

HTTP Request, Google Sheets, Google Drive +2
General

Turn YouTube Videos into Summaries, Transcripts, and Visual Insights. Uses manualTrigger, stickyNote, httpRequest. Event-driven trigger; 26 nodes.

HTTP Request