AutomationFlowsWeb Scraping › Automated Obsidian Sync via Google Drive

Automated Obsidian Sync via Google Drive

Original n8n title: Obsidian Sync

Obsidian Sync. Uses httpRequest. Scheduled trigger; 5 nodes.

Cron / scheduled trigger★★★★☆ complexity5 nodesHTTP Request
Web Scraping Trigger: Cron / scheduled Nodes: 5 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
{
  "name": "Obsidian Sync",
  "nodes": [
    {
      "parameters": {
        "trigger": "on",
        "interval": [
          5,
          "minutes"
        ]
      },
      "id": "schedule-trigger",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "method": "GET",
        "url": "https://www.googleapis.com/drive/v3/files",
        "qs": "q=trashed=false and mimeType contains 'document'",
        "authentication": "oAuth2",
        "nodeCredentialType": "googleDriveOAuth2Api"
      },
      "id": "list-drive-files",
      "name": "List Drive Files",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "method": "GET",
        "url": "={{ $env.SUPABASE_DB_URL }}/rest/v1/documents",
        "authentication": "genericCredentialType",
        "genericCredentialType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{ $env.SUPABASE_SERVICE_ROLE_KEY }}"
            }
          ]
        }
      },
      "id": "get-synced-docs",
      "name": "Get Synced Documents",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "return $node['List Drive Files'].json.files.filter(file => \n  !$node['Get Synced Documents'].json.some(doc => doc.google_drive_id === file.id)\n);"
      },
      "id": "find-new-files",
      "name": "Find New Files",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        850,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $env.OBSIDIAN_VAULT_API }}/sync",
        "authentication": "genericCredentialType",
        "genericCredentialType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{ $env.OBSIDIAN_API_KEY }}"
            }
          ]
        },
        "bodyParametersJson": "={\n  \"files\": {{ $node[\\\"Find New Files\\\"].json | json.stringify }},\n  \"vault_path\": \"{{ $env.OBSIDIAN_VAULT_PATH }}\"\n}"
      },
      "id": "sync-to-obsidian",
      "name": "Sync to Obsidian",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        1050,
        300
      ]
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "List Drive Files",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List Drive Files": {
      "main": [
        [
          {
            "node": "Get Synced Documents",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Synced Documents": {
      "main": [
        [
          {
            "node": "Find New Files",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find New Files": {
      "main": [
        [
          {
            "node": "Sync to Obsidian",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

Obsidian Sync. Uses httpRequest. Scheduled trigger; 5 nodes.

Source: https://github.com/Busraaozkan1/n8n-project/blob/568cf19ed9a57e6b5b4444c3e62d9b9a781e6930/n8n-workflows/obsidian-sync.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

Birthday Automation - Production (Fixed). Uses stopAndError, httpRequest, emailSend, bannerbear. Scheduled trigger; 86 nodes.

Stop And Error, HTTP Request, Email Send +1
Web Scraping

This template runs two scheduled workflows to govern Microsoft Entra ID (Azure AD) guest accounts by detecting stale users via Microsoft Graph, staging deletions in SharePoint with a 72-hour window, n

Microsoft SharePoint, Microsoft Teams, Microsoft Entra +1
Web Scraping

Jira-Allure-Auto-Qa. Uses httpRequest, jira. Scheduled trigger; 68 nodes.

HTTP Request, Jira
Web Scraping

Spotify-Sync-Surrealdb-V1. Uses httpRequest, n8n-nodes-surrealdb, spotify. Scheduled trigger; 62 nodes.

HTTP Request, N8N Nodes Surrealdb, Spotify
Web Scraping

As n8n instances scale, teams often lose track of sub-workflows—who uses them, where they are referenced, and whether they can be safely updated. This leads to inefficiencies like unnecessary copies o

HTTP Request, n8n, N8N Trigger +1