{"workflow":{"id":13317,"name":"Back up Instagram videos to Google Drive with JSON metadata catalog","views":11,"recentViews":0,"totalViews":11,"createdAt":"2026-02-11T21:55:48.923Z","description":"# Instagram Video Backup to Google Drive\n\nAutomatically backup all your Instagram videos to Google Drive with a searchable metadata catalog in JSON format.\n\n## What It Does\n\nThis workflow provides a complete backup solution for your Instagram video content with intelligent caption parsing:\n\n1. **Fetches** your Instagram account ID and videos (VIDEO and REELS types)\n2. **Parses captions** into structured fields:\n   - **Title**: Everything before the first hashtag\n   - **Description**: Everything after the first hashtag (includes all tags)\n   - **Tag List**: All hashtags extracted as an array\n   - **Description Full**: Complete original caption text\n3. **Downloads** videos in maximum available quality from Instagram\n4. **Uploads** videos to a designated Google Drive folder\n5. **Creates/updates** a JSON metadata file with all video details\n6. **Prevents duplicates** using n8n Data Tables with account-level filtering\n\n## Key Features\n\n**Account-Level Tracking**: The Data Table includes `accountId` so you can use the same table across multiple Instagram accounts. Each account's videos are tracked separately.\n\n**Smart Caption Parsing**: Automatically splits Instagram captions into title (before first #) and description (all hashtags and text after), with full text preserved in `descriptionFull`.\n\n**Portable Catalog**: The JSON file is stored **in Google Drive alongside your videos**, making it accessible anywhere without needing n8n.\n\n**Maximum Quality**: Uses Instagram Graph API's `media_url` field for highest available quality.\n\n**Hashtag Extraction**: Automatically extracts all hashtags into an array for easy filtering and analysis.\n\n## Workflow Architecture\n\n### Section 1: Fetch & Filter\n```\nGet Instagram Account Info → Configuration → Fetch Media → Split Out Items → Filter Videos Only\n```\n\n- **Get Instagram Account Info**: Fetches your Instagram account ID and username\n- **Configuration**: Stores account ID, Google Drive folder ID, and settings\n- **Fetch Media**: Gets up to 100 media items from Instagram\n- **Split Out Items**: Separates each media item for individual processing\n- **Filter Videos Only**: Keeps only VIDEO and REELS types (skips images)\n\n### Section 2: Process Videos\n```\nCheck If Backed Up → IF Not Backed Up → Wait → Parse Caption → Download → Upload → Extract Metadata → Save Record → Aggregate\n```\n\n**For each video:**\n1. **Check If Already Backed Up**: Queries Data Table by `postId` to avoid duplicates\n2. **IF Not Already Backed Up**: Skips if video already exists\n3. **Wait**: 5-second delay between downloads (prevents API rate limits)\n4. **Parse Caption**: Splits caption into title, description, tagList, descriptionFull\n5. **Download Video**: Downloads video file from Instagram to memory\n6. **Upload to Google Drive**: Uploads video to configured folder\n7. **Extract Metadata**: Creates structured metadata object with all fields\n8. **Save Backup Record**: Stores `accountId`, `postId`, `googleDriveFileId`, `backedUpAt` in Data Table\n9. **Aggregate**: Collects all new video metadata for JSON update\n\n### Section 3: Update JSON Catalog\n```\nEnd Loop → Download Existing JSON → Update JSON → Upload Updated JSON\n```\n\n**After all videos processed:**\n1. **Download Existing Metadata JSON**: Gets current JSON file from Google Drive (if exists)\n2. **Update Metadata JSON**: Appends new video metadata to existing catalog\n3. **Upload Updated Metadata JSON**: Saves updated JSON back to Google Drive\n\n## Setup Steps\n\n### 1. Create Google Drive Folder\n\n1. Go to [Google Drive](https://drive.google.com)\n2. Create a new folder named `Instagram Video Backups` (or any name you prefer)\n3. Open the folder and copy the **Folder ID** from the URL:\n   ```\n   https://drive.google.com/drive/folders/1ABC123xyz...\n                                            ^^^^^^^^^^^\n                                            This is your Folder ID\n   ```\n\n### 2. Create n8n Data Table\n\nCreate a Data Table for deduplication tracking with **account-level support**:\n\n**Table Name**: `Instagram Video Backups`\n\n**Schema**:\n| Field Name | Type | Description |\n|------------|------|-------------|\n| `accountId` | string | Instagram account ID (allows multi-account use) |\n| `postId` | string (Primary Key) | Instagram post ID |\n| `googleDriveFileId` | string | Google Drive file ID for the video |\n| `backedUpAt` | string | ISO timestamp of backup |\n\n**Why accountId?** This allows you to use the same Data Table for multiple Instagram accounts. Each account's videos are tracked separately, preventing conflicts.\n\n### 3. Configure Credentials\n\nYou'll need two credential sets:\n\n#### Instagram Graph API (HTTP Bearer Auth)\n1. In n8n, create new credential: **HTTP Bearer Auth**\n2. Set header name: `Authorization`\n3. Set header value: `Bearer YOUR_INSTAGRAM_ACCESS_TOKEN`\n4. Name it: `Instagram Graph API`\n\n**Getting Instagram Access Token**:\n- Follow [Meta's Business Account setup guide](https://developers.facebook.com/docs/instagram-basic-display-api/getting-started)\n- Required permissions: `instagram_graph_user_media`\n- Tokens expire after 60 days (requires manual refresh)\n\n#### Google Drive OAuth2\n1. In n8n, create new credential: **Google Drive OAuth2 API**\n2. Follow OAuth flow to authorize your Google account\n3. Name it: `Google Drive Account`\n\n### 4. Update Configuration Node\n\nIn the workflow, open the **Configuration** node and update:\n\n```json\n{\n  \"googleDriveFolderId\": \"PASTE_YOUR_FOLDER_ID_HERE\",\n  \"maxVideosPerRun\": 100,\n  \"waitBetweenDownloads\": 5,\n  \"metadataFileName\": \"instagram-backup-metadata.json\"\n}\n```\n\n**Settings Explained**:\n- `googleDriveFolderId`: The folder ID you copied in step 1\n- `maxVideosPerRun`: Max videos to process per run (100 is safe for API limits)\n- `waitBetweenDownloads`: Seconds to wait between downloads (prevents rate limits)\n- `metadataFileName`: Name of the JSON catalog file in Google Drive\n\n**Note**: `accountId` and `accountUsername` are automatically populated from Instagram API.\n\n### 5. Test & Activate\n\n1. Click **Manual Trigger** to test the workflow\n2. Check Google Drive folder for:\n   - Video files named `instagram_{postId}.mp4`\n   - JSON file named `instagram-backup-metadata.json`\n3. Verify Data Table has records with `accountId` and `postId`\n4. Activate the **Schedule Trigger** for daily automatic backups\n\n## Metadata JSON Structure\n\nThe JSON file stored in Google Drive has this structure:\n\n```json\n{\n  \"lastUpdated\": \"2026-02-01T10:00:00Z\",\n  \"totalVideos\": 42,\n  \"videos\": [\n    {\n      \"accountId\": \"17841400123456789\",\n      \"instagramId\": \"123456789\",\n      \"permalink\": \"https://instagram.com/p/ABC123\",\n      \"title\": \"Amazing sunset at the beach!\",\n      \"description\": \"#travel #nature #sunset\",\n      \"tagList\": [\"travel\", \"nature\", \"sunset\"],\n      \"descriptionFull\": \"Amazing sunset at the beach! #travel #nature #sunset\",\n      \"timestamp\": \"2026-01-15T08:30:00Z\",\n      \"mediaType\": \"VIDEO\",\n      \"googleDriveFileId\": \"1ABC123xyz...\",\n      \"googleDriveFileName\": \"instagram_123456789.mp4\",\n      \"backedUpAt\": \"2026-02-01T10:00:00Z\"\n    }\n  ]\n}\n```\n\n### Field Descriptions\n\n- **accountId**: Instagram account ID (from Graph API `/me` endpoint)\n- **instagramId**: Instagram post ID (unique identifier)\n- **permalink**: Direct link to Instagram post\n- **title**: Caption text before the first hashtag\n- **description**: Caption text from first hashtag onward (includes all tags)\n- **tagList**: Array of hashtags without the `#` symbol\n- **descriptionFull**: Complete original caption (preserves full text)\n- **timestamp**: When the video was originally posted to Instagram\n- **mediaType**: `VIDEO` or `REELS`\n- **googleDriveFileId**: Google Drive file ID (use to access file via Drive API)\n- **googleDriveFileName**: Filename in Google Drive (`instagram_{postId}.mp4`)\n- **backedUpAt**: When the video was backed up (ISO timestamp)\n\n## Caption Parsing Logic\n\nThe **Parse Caption** Code node splits Instagram captions intelligently:\n\n**Example Caption**:\n```\n\"Amazing sunset at the beach! 🌅 #travel #nature #sunset\"\n```\n\n**Parsed Fields**:\n- **title**: `\"Amazing sunset at the beach! 🌅\"`\n- **description**: `\"#travel #nature #sunset\"`\n- **tagList**: `[\"travel\", \"nature\", \"sunset\"]`\n- **descriptionFull**: `\"Amazing sunset at the beach! 🌅 #travel #nature #sunset\"`\n\n**Edge Cases**:\n- **No hashtags**: Entire caption becomes `title`, `description` is empty\n- **Hashtag at start**: `title` is empty, entire caption becomes `description`\n- **Multiple lines**: Preserves all line breaks in `descriptionFull`\n\n## Multi-Account Usage\n\n**Using the same Data Table for multiple accounts**:\n\n1. Import this workflow multiple times (once per Instagram account)\n2. Configure each workflow with different Instagram credentials\n3. **Use the same Data Table name** in all workflows: `Instagram Video Backups`\n4. Each workflow automatically filters by its own `accountId`\n\n**Benefits**:\n- Single deduplication table for all accounts\n- Easy to query all backups across accounts\n- Prevents conflicts between accounts with same post IDs\n\n**Querying specific account backups**:\n```javascript\n// In Data Table or external script\nconst accountBackups = allBackups.filter(\n  backup =&gt; backup.accountId === \"17841400123456789\"\n);\n```\n\n## API Quotas & Limits\n\n### Instagram Graph API\n- **Rate Limits**: 200 calls/hour per user token (standard)\n- **This Workflow**: 2 calls total (1 for account info, 1 for media fetch)\n- **Impact**: Can run safely within free tier limits\n\n### Google Drive API\n- **Rate Limits**: 1,000 requests per 100 seconds per user\n- **This Workflow**: 2 calls per video (upload video + final JSON update)\n- **Impact**: 100 videos = ~200 calls, well within limits\n\n### Recommended Schedule\n- **Daily (midnight)**: Default, safe for most accounts\n- **Weekly**: Good for accounts with infrequent posting\n- **Manual**: On-demand backups when needed\n\n## Troubleshooting\n\n### No videos are being backed up\n\n**Check Instagram credentials**:\n1. Open \"Get Instagram Account Info\" node\n2. Click \"Execute Node\"\n3. Look for error messages about authentication\n\n**Verify account has videos**:\n- Instagram Graph API only returns VIDEO and REELS\n- Won't backup images or carousels (by design)\n\n### accountId is empty in Data Table\n\n**Account info fetch failed**:\n- Check Instagram credentials have correct permissions\n- Verify token hasn't expired (60-day limit)\n- Test \"Get Instagram Account Info\" node separately\n\n### JSON file has wrong title/description\n\n**Caption parsing issue**:\n1. Open \"Parse Caption\" Code node\n2. Check the output to see parsed fields\n3. Verify caption has hashtags (if no hashtags, entire caption becomes title)\n\n**Custom parsing logic**:\nEdit the \"Parse Caption\" Code node to adjust splitting logic:\n```javascript\n// Current: splits at FIRST hashtag\nconst firstHashtagIndex = caption.indexOf('#');\n\n// Alternative: split at specific word\nconst splitWord = 'DESCRIPTION:';\nconst splitIndex = caption.indexOf(splitWord);\n```\n\n### Duplicate videos in Google Drive\n\n**Data Table issues**:\n- Verify table name is exactly: `Instagram Video Backups`\n- Check table has `postId` as primary key\n- Verify `accountId` field exists\n\n**Workflow execution failed mid-run**:\n- If workflow fails after upload but before saving to Data Table, video won't be tracked\n- Safe to delete duplicate video in Google Drive and re-run\n\n### Rate limit errors\n\n**Instagram rate limits**:\n- Reduce `maxVideosPerRun` to 50 or 25\n- Increase `waitBetweenDownloads` to 10 seconds\n\n**Google Drive rate limits**:\n- Unlikely with default settings\n- If occurs, reduce `maxVideosPerRun`\n\n### Caption has special characters (emojis, line breaks)\n\n**Emojis preserved**:\n- All emojis are preserved in `descriptionFull`\n- May appear in `title` or `description` depending on position\n\n**Line breaks**:\n- Line breaks are preserved in `descriptionFull`\n- May affect title/description split if hashtags are on new lines\n\n## Advanced Customization\n\n### Change Backup Folder\n\nUpdate `googleDriveFolderId` in Configuration node to any Google Drive folder ID.\n\n### Change Schedule\n\nEdit the **Schedule Trigger** node:\n- Daily midnight: `0 0 * * *` (default)\n- Every 12 hours: `0 */12 * * *`\n- Weekly Sunday: `0 0 * * 0`\n- Custom: Use [crontab.guru](https://crontab.guru) to generate expression\n\n### Organize Videos by Date\n\nTo create monthly subfolders (e.g., `2026-02/video.mp4`):\n\n1. Before \"Upload to Google Drive\" node, add \"Google Drive - Create Folder\" node\n2. Folder name: `={{ $now.format('yyyy-MM') }}`\n3. Parent folder: `={{ $('Configuration').item.json.googleDriveFolderId }}`\n4. Update upload node to use created folder ID\n\n### Download Videos Locally Too\n\nTo keep local copies in addition to Google Drive:\n\n1. After \"Download Video\" node, add **Write Binary File** node\n2. File path: `/path/to/backup/{{ $('Extract Metadata').item.json.googleDriveFileName }}`\n3. Connect in parallel with \"Upload to Google Drive\"\n\n### Custom Caption Parsing\n\nTo use different title/description split logic:\n\n**Option 1: Split at specific keyword**\n```javascript\nconst splitKeyword = 'DESCRIPTION:';\nconst splitIndex = caption.indexOf(splitKeyword);\n\nif (splitIndex === -1) {\n  title = caption.trim();\n  description = '';\n} else {\n  title = caption.substring(0, splitIndex).trim();\n  description = caption.substring(splitIndex + splitKeyword.length).trim();\n}\n```\n\n**Option 2: Use first sentence as title**\n```javascript\nconst sentenceEnd = caption.match(/[.!?]/);\nconst endIndex = sentenceEnd ? caption.indexOf(sentenceEnd[0]) + 1 : -1;\n\nif (endIndex === -1) {\n  title = caption.trim();\n  description = '';\n} else {\n  title = caption.substring(0, endIndex).trim();\n  description = caption.substring(endIndex).trim();\n}\n```\n\n### Filter by Account in JSON\n\nTo create separate JSON files per account:\n\n1. Update \"Update Metadata JSON\" Code node to filter by `accountId`\n2. Change `metadataFileName` to include account username:\n   ```\n   instagram-backup-{{ $('Configuration').item.json.accountUsername }}.json\n   ```\n\n## Use Cases\n\n### Search Videos by Hashtag\n\nDownload the JSON file from Google Drive, then:\n\n```javascript\n// Load JSON\nconst metadata = require('./instagram-backup-metadata.json');\n\n// Find all #travel videos\nconst travelVideos = metadata.videos.filter(v =&gt;\n  v.tagList.includes('travel')\n);\n\nconsole.log(`Found ${travelVideos.length} travel videos`);\n```\n\n### Find Videos by Date Range\n\n```javascript\nconst startDate = new Date('2026-01-01');\nconst endDate = new Date('2026-01-31');\n\nconst videosInRange = metadata.videos.filter(v =&gt; {\n  const videoDate = new Date(v.timestamp);\n  return videoDate &gt;= startDate && videoDate &lt;= endDate;\n});\n```\n\n### Generate Reports\n\nImport JSON into Google Sheets or Excel to analyze:\n- Most used hashtags\n- Videos per month\n- Backup coverage percentage\n- Videos by account (if using multi-account setup)\n\n### Migrate to Another Platform\n\nThe JSON catalog includes permalinks and timestamps, making it easy to:\n- Re-upload to YouTube, TikTok, etc.\n- Generate video sitemap for website\n- Create video archive with searchable metadata\n\n## Known Limitations\n\n1. **Only videos**: Doesn't backup images or carousel posts (by design)\n2. **Token expiration**: Instagram tokens expire after 60 days, requires manual refresh\n3. **Storage limits**: Google Drive free tier is 15GB\n4. **No analytics**: Doesn't track views, likes, or comments\n5. **Single folder**: All videos in one folder (can be customized, see Advanced Customization)\n6. **Caption parsing**: Assumes first hashtag splits title/description (customizable)\n\n## Data Privacy\n\n- Videos are downloaded to n8n temporarily, then uploaded to Google Drive\n- n8n doesn't permanently store video files\n- Metadata JSON contains only public Instagram data\n- Google Drive files are private to your account\n- Instagram access token is encrypted by n8n credentials system\n- Account ID is public data from Instagram Graph API\n\n## Version History\n\n- **v1.0** (2026-02-01): Initial release\n  - Daily automatic backups\n  - Google Drive storage\n  - JSON metadata catalog with smart caption parsing\n  - Multi-account support via accountId\n  - Deduplication via Data Tables\n  - Title/description/tagList extraction\n\n## Related Workflows\n\n- **Upload from Instagram to YouTube**: Cross-post videos to YouTube with metadata\n- **Instagram to X**: Share posts to Twitter/X\n- **Instagram Account Information Tracker**: Track follower metrics and insights over time\n\n## Additional Resources\n\n- [Instagram Graph API Documentation](https://developers.facebook.com/docs/instagram-api)\n- [Google Drive API Documentation](https://developers.google.com/drive/api/guides/about-sdk)\n- [n8n Data Tables Guide](https://docs.n8n.io/data/database/)\n- [Instagram Access Token Setup](https://developers.facebook.com/docs/instagram-basic-display-api/getting-started)\n\n## Support\n\nIf you encounter issues:\n1. Check Troubleshooting section above\n2. Review n8n execution logs for error details\n3. Verify all credentials are active and have required permissions\n4. Test with Manual Trigger before relying on Schedule Trigger\n5. Check \"Parse Caption\" node output if title/description is incorrect\n","workflow":{"meta":{"instanceId":"28bbfdfc971df976a30763a80880783b0da6d49b0f9e1c35d17278160b42ad72"},"nodes":[{"id":"b002f21b-0426-4a0d-ae4b-456b353d1b9a","name":"Update JSON Catalog","type":"n8n-nodes-base.stickyNote","position":[2864,128],"parameters":{"color":3,"width":2056,"height":328,"content":"## Update JSON Catalog"},"typeVersion":1},{"id":"f4d4700e-e055-4581-8aa4-9319bceb2d2d","name":"Process Videos","type":"n8n-nodes-base.stickyNote","position":[2864,512],"parameters":{"color":7,"width":2056,"height":296,"content":"## Process Videos"},"typeVersion":1},{"id":"ff58825b-0663-4acc-a28e-48358b03d0ce","name":"Fetch & Filter","type":"n8n-nodes-base.stickyNote","position":[1248,528],"parameters":{"color":6,"width":1076,"height":296,"content":"## Fetch & Filter"},"typeVersion":1},{"id":"19f3bae2-2df1-47d2-b1b8-39604eb3ceec","name":"Setup Instructions","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"width":860,"height":900,"content":"## Instagram Video Backup to Google Drive\n\nAutomatically backs up Instagram videos (VIDEO and REELS) to Google Drive with searchable JSON metadata catalog.\n\n## Setup Instructions\n\n### 1. Create Google Drive Folder\n   - Create a dedicated folder in Google Drive\n   - Copy the folder ID from the URL\n   - Example: `https://drive.google.com/drive/folders/1tsSr_Ky0...` → ID is `1tsSr_Ky0...`\n\n###  2. Create Data Table: \"Instagram Video Backups\"\n   Required fields:\n   - `postId` (string, primary key)\n   - `accountId` (string)\n   - `title` (string)\n   - `description` (string)\n   - `descriptionFull` (string)\n   - `tagList` (string)\n\n### 3. Add Credentials\n   - Instagram: HTTP Bearer Auth with access token\n   - Google Drive: OAuth2 account\n\n### 4. Configure Workflow\n   - Update Configuration node with your Google Drive folder ID\n   - Adjust `maxVideosPerRun` if needed (default: 100)\n\n### 5. Test\n   - Run with Manual Trigger first\n   - Check Google Drive for uploaded videos\n   - Verify metadata JSON file is created\n\n### Schedule:\n   -Daily at midnight (customizable)"},"typeVersion":1},{"id":"89183b88-0910-40cd-b666-5b4ae3307130","name":"Upload New Metadata File","type":"n8n-nodes-base.googleDrive","position":[3376,240],"parameters":{"name":"={{ $('Build Metadata from Data Table').item.json.fileName }}","driveId":{"__rl":true,"mode":"list","value":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"id","value":"={{ $('Configuration').first().json.googleDriveFolderId }}"}},"credentials":{"googleDriveOAuth2Api":{"id":"gVg184aZJ4sXz9Uo","name":"Google Drive account"}},"typeVersion":3,"inputsOverride":{"main":[{"sourcePath":"$('Build Metadata from Data Table')"}]}},{"id":"e3f0c373-5228-4531-9e72-d0eedefdf55f","name":"List All Metadata Files","type":"n8n-nodes-base.httpRequest","position":[3600,240],"parameters":{"url":"=https://www.googleapis.com/drive/v3/files","options":{},"sendQuery":true,"authentication":"predefinedCredentialType","queryParameters":{"parameters":[{"name":"q","value":"=name='{{ $('Configuration').first().json.metadataFileName }}' and '{{ $('Configuration').first().json.googleDriveFolderId }}' in parents and trashed=false"},{"name":"fields","value":"files(id,name,createdTime)"},{"name":"orderBy","value":"createdTime"}]},"nodeCredentialType":"googleDriveOAuth2Api"},"credentials":{"googleDriveOAuth2Api":{"id":"gVg184aZJ4sXz9Uo","name":"Google Drive account"}},"typeVersion":4.2,"alwaysOutputData":true},{"id":"cff11e7f-8989-432e-9a2f-4fa1ba0a3139","name":"Find Old Metadata Files","type":"n8n-nodes-base.code","position":[3824,240],"parameters":{"jsCode":"// Get all metadata files from Google Drive API response\nconst response = $input.item.json;\nconst allFiles = response.files || [];\n\nconsole.log('Total metadata files found:', allFiles.length);\n\n// If only 1 or no files, don't delete anything\nif (allFiles.length <= 1) {\n  console.log('Only one or no metadata files - nothing to delete');\n  return [];\n}\n\n// Sort by creation time to ensure newest is last\nallFiles.sort((a, b) => {\n  const dateA = new Date(a.createdTime);\n  const dateB = new Date(b.createdTime);\n  return dateA - dateB;\n});\n\n// Keep only the newest file (last in array), delete all others\nconst newestFile = allFiles[allFiles.length - 1];\nconst filesToDelete = allFiles.slice(0, -1); // All files except the last one\n\nconsole.log('Newest file (keeping):', newestFile.name, 'created:', newestFile.createdTime);\nconsole.log('Files to delete:', filesToDelete.length);\n\n// Return array of files to delete\nreturn filesToDelete.map(file => ({\n  fileId: file.id,\n  fileName: file.name,\n  createdTime: file.createdTime\n}));"},"typeVersion":2},{"id":"de67c9e1-5c0e-441e-866d-7a5214432074","name":"Loop Over Old Files","type":"n8n-nodes-base.splitInBatches","position":[4048,240],"parameters":{"options":{}},"typeVersion":3},{"id":"07435d9d-e2e5-4855-a9a0-e459da841cda","name":"Delete Old Metadata File","type":"n8n-nodes-base.googleDrive","position":[4272,304],"parameters":{"fileId":{"__rl":true,"mode":"id","value":"={{ $json.fileId }}"},"options":{},"operation":"deleteFile"},"credentials":{"googleDriveOAuth2Api":{"id":"gVg184aZJ4sXz9Uo","name":"Google Drive account"}},"typeVersion":3},{"id":"18827ae0-05c3-444b-8220-eecc28317637","name":"End Cleanup Loop","type":"n8n-nodes-base.noOp","position":[4272,176],"parameters":{},"typeVersion":1},{"id":"826f7257-5442-479e-a023-050a67fe7539","name":"Build Metadata from Data Table","type":"n8n-nodes-base.code","position":[3152,240],"parameters":{"jsCode":"// Export n8n Data Table to JSON\n\n// Get all records from Data Table\nconst tableRecords = $('Get All Data Table Records').all();\nconst videos = tableRecords.map(item => item.json);\n\n// Build metadata structure from Data Table\nconst newMetadata = {\n  lastUpdated: new Date().toISOString(),\n  totalVideos: videos.length,\n  videos: videos\n};\n\nconsole.log('Built metadata from Data Table with', videos.length, 'videos');\n\n// Get file ID from search results\nlet existingFileId = null;\ntry {\n  const searchResult = $('Search for Metadata File').item;\n  if (searchResult && searchResult.json && searchResult.json.id) {\n    existingFileId = searchResult.json.id;\n    console.log('Found existing metadata file with ID:', existingFileId);\n  } else {\n    console.log('No existing metadata file found');\n  }\n} catch (error) {\n  console.log('No existing metadata file found');\n}\n\n// Convert to binary data for Google Drive upload\nconst jsonContent = JSON.stringify(newMetadata, null, 2);\nconst binaryData = Buffer.from(jsonContent, 'utf-8');\n\nreturn {\n  json: {\n    fileName: $('Configuration').item.json.metadataFileName,\n    existingFileId: existingFileId\n  },\n  binary: {\n    data: {\n      data: binaryData,\n      mimeType: 'application/json',\n      fileName: $('Configuration').item.json.metadataFileName\n    }\n  }\n};"},"typeVersion":2},{"id":"6b72580f-48f3-4bc5-ac86-0319799f8173","name":"Get All Data Table Records","type":"n8n-nodes-base.dataTable","position":[2928,240],"parameters":{"operation":"get","returnAll":true,"dataTableId":{"__rl":true,"mode":"list","value":"aNByykkM3ZxYjt5K","cachedResultUrl":"/projects/vZdjtqHcrLoO32Ib/datatables/aNByykkM3ZxYjt5K","cachedResultName":"Instagram Video Backups"}},"typeVersion":1,"alwaysOutputData":true},{"id":"038b0927-d467-4bad-8c9f-ceb4466bcb39","name":"End Loop","type":"n8n-nodes-base.noOp","position":[4752,704],"parameters":{},"typeVersion":1},{"id":"a875008d-2339-478b-a517-a728f1fda30e","name":"Save Backup Record","type":"n8n-nodes-base.dataTable","position":[4496,560],"parameters":{"columns":{"value":{"title":"={{ $json.title }}","postId":"={{ $json.postId }}","tagList":"={{ $json.description }}","accountId":"={{ $json.accountId }}","description":"={{ $json.description }}","descriptionFull":"={{ $json.descriptionFull }}"},"schema":[{"id":"postId","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"postId","defaultMatch":false},{"id":"accountId","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"accountId","defaultMatch":false},{"id":"tagList","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"tagList","defaultMatch":false},{"id":"description","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"description","defaultMatch":false},{"id":"title","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"title","defaultMatch":false},{"id":"descriptionFull","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"descriptionFull","defaultMatch":false}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"dataTableId":{"__rl":true,"mode":"list","value":"aNByykkM3ZxYjt5K","cachedResultUrl":"/projects/vZdjtqHcrLoO32Ib/datatables/aNByykkM3ZxYjt5K","cachedResultName":"Instagram Video Backups"}},"typeVersion":1},{"id":"6787f380-7e93-48f8-b813-126e1c1689aa","name":"Extract Metadata","type":"n8n-nodes-base.set","position":[4272,560],"parameters":{"options":{},"assignments":{"assignments":[{"id":"account-id","name":"accountId","type":"string","value":"={{ $('Configuration').item.json.accountId }}"},{"id":"post-id","name":"postId","type":"string","value":"={{ $('Filter Videos Only').item.json.id }}"},{"id":"drive-file-id","name":"googleDriveFileId","type":"string","value":"={{ $json.id }}"},{"id":"drive-file-name","name":"googleDriveFileName","type":"string","value":"={{ $json.name }}"},{"id":"permalink","name":"permalink","type":"string","value":"={{ $('Filter Videos Only').item.json.permalink }}"},{"id":"title","name":"title","type":"string","value":"={{ $('Parse Caption').item.json.title }}"},{"id":"description","name":"description","type":"string","value":"={{ $('Parse Caption').item.json.description }}"},{"id":"tag-list","name":"tagList","type":"array","value":"={{ $('Parse Caption').item.json.tagList }}"},{"id":"description-full","name":"descriptionFull","type":"string","value":"={{ $('Parse Caption').item.json.descriptionFull }}"},{"id":"timestamp","name":"instagramTimestamp","type":"string","value":"={{ $('Filter Videos Only').item.json.timestamp }}"},{"id":"media-type","name":"mediaType","type":"string","value":"={{ $('Filter Videos Only').item.json.media_type }}"},{"id":"backed-up-at","name":"backedUpAt","type":"string","value":"={{ $now.toISO() }}"}]}},"typeVersion":3.4},{"id":"3d50a9d3-0cf2-486e-8fcd-f325d0698762","name":"Upload to Google Drive","type":"n8n-nodes-base.googleDrive","position":[4048,560],"parameters":{"name":"={{ $json.title }}-{{ $('Loop Over Videos').item.json.id }}.mp4","driveId":{"__rl":true,"mode":"list","value":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"id","value":"={{ $('Configuration').item.json.googleDriveFolderId }}"}},"credentials":{"googleDriveOAuth2Api":{"id":"gVg184aZJ4sXz9Uo","name":"Google Drive account"}},"typeVersion":3},{"id":"1a1d1d80-9a54-4135-bf71-3118caa7527d","name":"Download Video","type":"n8n-nodes-base.httpRequest","position":[3824,560],"parameters":{"url":"={{ $('Filter Videos Only').item.json.media_url }}","options":{"response":{"response":{"responseFormat":"file"}}}},"typeVersion":4.2},{"id":"efab7150-5f13-4bd4-aa8a-14a7dc32bd2a","name":"Parse Caption","type":"n8n-nodes-base.code","position":[3600,560],"parameters":{"jsCode":"// Parse Instagram caption into structured fields\nconst caption = $('Filter Videos Only').item.json.caption || '';\n\n// Find first hashtag position\nconst hashtagMatch = caption.match(/#/);\nconst firstHashtagIndex = hashtagMatch ? caption.indexOf('#') : -1;\n\nlet title = '';\nlet description = '';\nconst tagList = [];\n\nif (firstHashtagIndex === -1) {\n  // No hashtags - entire caption is title\n  title = caption.trim();\n  description = '';\n} else {\n  // Split at first hashtag\n  title = caption.substring(0, firstHashtagIndex).trim();\n  description = caption.substring(firstHashtagIndex).trim();\n}\n\n// Extract all hashtags\nconst hashtagMatches = caption.match(/#\\w+/g);\nif (hashtagMatches) {\n  tagList.push(...hashtagMatches.map(tag => tag.substring(1)));\n}\n\nreturn {\n  title: title,\n  description: description,\n  tagList: tagList,\n  descriptionFull: caption\n};"},"typeVersion":2},{"id":"b7ea7693-b851-460c-aac4-2365e3887880","name":"Wait","type":"n8n-nodes-base.wait","position":[3376,560],"webhookId":"wait-webhook","parameters":{"amount":"={{ $('Configuration').item.json.waitBetweenDownloads }}"},"typeVersion":1.1},{"id":"fe280ca2-a8c9-44cf-ac03-cbf3eef364f3","name":"IF Not Already Backed Up","type":"n8n-nodes-base.if","position":[3152,624],"parameters":{"options":{},"conditions":{"options":{"version":1,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"not-exists","operator":{"type":"object","operation":"empty","singleValue":true},"leftValue":"={{ $('Check If Already Backed Up').first().json }}","rightValue":"postId"}]}},"typeVersion":2},{"id":"18bb4f99-2744-43ca-9d8e-25e88db383bd","name":"Check If Already Backed Up","type":"n8n-nodes-base.dataTable","onError":"continueRegularOutput","position":[2928,624],"parameters":{"filters":{"conditions":[{"keyName":"postId","keyValue":"={{ $json.id }}"}]},"operation":"get","dataTableId":{"__rl":true,"mode":"list","value":"aNByykkM3ZxYjt5K","cachedResultUrl":"/projects/vZdjtqHcrLoO32Ib/datatables/aNByykkM3ZxYjt5K","cachedResultName":"Instagram Video Backups"}},"typeVersion":1,"alwaysOutputData":true},{"id":"7efb911b-b3e3-4672-b980-2d0d38744e8b","name":"Loop Over Videos","type":"n8n-nodes-base.splitInBatches","position":[2624,624],"parameters":{"options":{}},"typeVersion":3},{"id":"93c781b7-066d-4147-af35-6c541cd9df33","name":"Filter Videos Only","type":"n8n-nodes-base.if","position":[2416,640],"parameters":{"options":{},"conditions":{"options":{"version":1,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"filter-video","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.media_type }}","rightValue":"VIDEO"},{"id":"filter-reels","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.media_type }}","rightValue":"REELS"}]}},"typeVersion":2},{"id":"94dbe269-01c1-4e80-b1d3-075c6b39dd75","name":"Sort Earliest to Latest","type":"n8n-nodes-base.code","position":[1968,640],"parameters":{"jsCode":"// Sort media items from earliest to latest by timestamp\nconst response = $input.item.json;\nconst mediaItems = response.data || [];\n\nconsole.log('Total media items fetched:', mediaItems.length);\n\n// Sort by timestamp - earliest first (ascending order)\nmediaItems.sort((a, b) => {\n  const dateA = new Date(a.timestamp);\n  const dateB = new Date(b.timestamp);\n  return dateA - dateB;\n});\n\nif (mediaItems.length > 0) {\n  console.log('Earliest:', mediaItems[0].timestamp);\n  console.log('Latest:', mediaItems[mediaItems.length - 1].timestamp);\n}\n\nreturn {\n  json: {\n    data: mediaItems,\n    paging: response.paging\n  }\n};"},"typeVersion":2},{"id":"bebb7d7f-0259-40e5-af93-1d23623b547f","name":"Split Out Media Items","type":"n8n-nodes-base.splitOut","position":[2192,640],"parameters":{"options":{},"fieldToSplitOut":"data"},"typeVersion":1},{"id":"082f5c57-cdb5-4aff-9621-6811514779d2","name":"Fetch Instagram Media","type":"n8n-nodes-base.httpRequest","position":[1744,640],"parameters":{"url":"=https://graph.instagram.com/me/media?fields=id,media_type,media_url,permalink,caption,timestamp,thumbnail_url&limit={{ $('Configuration').item.json.maxVideosPerRun }}","options":{},"authentication":"predefinedCredentialType","nodeCredentialType":"httpBearerAuth"},"credentials":{"httpBearerAuth":{"id":"ngxNKAAR2WN7cqrp","name":"Bearer Auth Instagram Account Statuenable"}},"typeVersion":4.2},{"id":"ca45ba9e-41d7-4d4d-990d-1dded3212ce3","name":"Configuration","type":"n8n-nodes-base.set","position":[1520,640],"parameters":{"options":{},"assignments":{"assignments":[{"id":"account-id","name":"accountId","type":"string","value":"={{ $json.id }}"},{"id":"account-username","name":"accountUsername","type":"string","value":"={{ $json.username }}"},{"id":"google-drive-folder","name":"googleDriveFolderId","type":"string","value":"YOUR_GOOGLE_DRIVE_ID"},{"id":"max-videos","name":"maxVideosPerRun","type":"number","value":100},{"id":"wait-seconds","name":"waitBetweenDownloads","type":"number","value":5},{"id":"metadata-filename","name":"metadataFileName","type":"string","value":"instagram-backup-metadata.json"}]}},"typeVersion":3.4},{"id":"4c2cd070-686f-474d-ab4e-6f2feb31c9b6","name":"Get Instagram Account Info","type":"n8n-nodes-base.httpRequest","position":[1296,640],"parameters":{"url":"=https://graph.instagram.com/me?fields=id,username","options":{},"authentication":"predefinedCredentialType","nodeCredentialType":"httpBearerAuth"},"credentials":{"httpBearerAuth":{"id":"ngxNKAAR2WN7cqrp","name":"Bearer Auth Instagram Account Statuenable"}},"typeVersion":4.2},{"id":"5ad4a85b-dceb-425d-ba06-c1e4dec516e5","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[1072,544],"parameters":{},"typeVersion":1},{"id":"a162785e-9490-4394-861e-59ac8b1ca3a1","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[1072,736],"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 0 * * *"}]}},"typeVersion":1.2}],"pinData":{},"connections":{"Wait":{"main":[[{"node":"Parse Caption","type":"main","index":0}]]},"End Loop":{"main":[[{"node":"Loop Over Videos","type":"main","index":0}]]},"Configuration":{"main":[[{"node":"Fetch Instagram Media","type":"main","index":0}]]},"Parse Caption":{"main":[[{"node":"Download Video","type":"main","index":0}]]},"Download Video":{"main":[[{"node":"Upload to Google Drive","type":"main","index":0}]]},"Manual Trigger":{"main":[[{"node":"Get Instagram Account Info","type":"main","index":0}]]},"Extract Metadata":{"main":[[{"node":"Save Backup Record","type":"main","index":0}]]},"Loop Over Videos":{"main":[[{"node":"Get All Data Table Records","type":"main","index":0}],[{"node":"Check If Already Backed Up","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Get Instagram Account Info","type":"main","index":0}]]},"Filter Videos Only":{"main":[[{"node":"Loop Over Videos","type":"main","index":0}]]},"Save Backup Record":{"main":[[{"node":"End Loop","type":"main","index":0}]]},"Loop Over Old Files":{"main":[[{"node":"End Cleanup Loop","type":"main","index":0}],[{"node":"Delete Old Metadata File","type":"main","index":0}]]},"Fetch Instagram Media":{"main":[[{"node":"Sort Earliest to Latest","type":"main","index":0}]]},"Split Out Media Items":{"main":[[{"node":"Filter Videos Only","type":"main","index":0}]]},"Upload to Google Drive":{"main":[[{"node":"Extract Metadata","type":"main","index":0}]]},"Find Old Metadata Files":{"main":[[{"node":"Loop Over Old Files","type":"main","index":0}]]},"List All Metadata Files":{"main":[[{"node":"Find Old Metadata Files","type":"main","index":0}]]},"Sort Earliest to Latest":{"main":[[{"node":"Split Out Media Items","type":"main","index":0}]]},"Delete Old Metadata File":{"main":[[{"node":"Loop Over Old Files","type":"main","index":0}]]},"IF Not Already Backed Up":{"main":[[{"node":"Wait","type":"main","index":0}],[{"node":"End Loop","type":"main","index":0}]]},"Upload New Metadata File":{"main":[[{"node":"List All Metadata Files","type":"main","index":0}]]},"Check If Already Backed Up":{"main":[[{"node":"IF Not Already Backed Up","type":"main","index":0}]]},"Get All Data Table Records":{"main":[[{"node":"Build Metadata from Data Table","type":"main","index":0}]]},"Get Instagram Account Info":{"main":[[{"node":"Configuration","type":"main","index":0}]]},"Build Metadata from Data Table":{"main":[[{"node":"Upload New Metadata File","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":30,"nodeTypes":{"n8n-nodes-base.if":{"count":2},"n8n-nodes-base.set":{"count":2},"n8n-nodes-base.code":{"count":4},"n8n-nodes-base.noOp":{"count":2},"n8n-nodes-base.wait":{"count":1},"n8n-nodes-base.splitOut":{"count":1},"n8n-nodes-base.dataTable":{"count":3},"n8n-nodes-base.stickyNote":{"count":4},"n8n-nodes-base.googleDrive":{"count":3},"n8n-nodes-base.httpRequest":{"count":4},"n8n-nodes-base.manualTrigger":{"count":1},"n8n-nodes-base.splitInBatches":{"count":2},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Lucio","username":"misterfunable","bio":"SuperCloudDevSecGalaxyOpsx10Sunshine worker.","verified":true,"links":["https://x.com/MisterFunable"],"avatar":"https://gravatar.com/avatar/c4f7c8ec4ca53ace683b1c638a51eba75a424a9b56632a08a2fc3f2685dc9583?r=pg&d=retro&size=200"},"nodes":[{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":26,"icon":"fa:arrow-right","name":"n8n-nodes-base.noOp","codex":{"data":{"alias":["nothing"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.noop/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"organization\"]","defaults":{"name":"No Operation, do nothing","color":"#b0b0b0"},"iconData":{"icon":"arrow-right","type":"icon"},"displayName":"No Operation, do nothing","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":39,"icon":"fa:sync","name":"n8n-nodes-base.splitInBatches","codex":{"data":{"alias":["Loop","Concatenate","Batch","Split","Split In Batches"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Loop Over Items","color":"#007755"},"iconData":{"icon":"sync","type":"icon"},"displayName":"Loop Over Items (Split in Batches)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":58,"icon":"file:googleDrive.svg","name":"n8n-nodes-base.googleDrive","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledrive/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Drive"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Drive","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":514,"icon":"fa:pause-circle","name":"n8n-nodes-base.wait","codex":{"data":{"alias":["pause","sleep","delay","timeout"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Wait","color":"#804050"},"iconData":{"icon":"pause-circle","type":"icon"},"displayName":"Wait","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":838,"icon":"fa:mouse-pointer","name":"n8n-nodes-base.manualTrigger","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"When clicking ‘Execute workflow’","color":"#909298"},"iconData":{"icon":"mouse-pointer","type":"icon"},"displayName":"Manual Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1239,"icon":"file:splitOut.svg","name":"n8n-nodes-base.splitOut","codex":{"data":{"alias":["Split","Nested","Transform","Array","List","Item"],"details":"","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitout/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Split Out"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJub25lIj48ZyBmaWxsPSIjOUI2REQ1IiBjbGlwLXBhdGg9InVybCgjYSkiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTQ4MCAxNDhjMC02LjYyNy01LjM3My0xMi0xMi0xMkgzMjJjLTYuNjI3IDAtMTIgNS4zNzMtMTIgMTJ2MjRjMCA2LjYyNyA1LjM3MyAxMiAxMiAxMmgxNDZjNi42MjcgMCAxMi01LjM3MyAxMi0xMnptMCA5NmMwLTYuNjI3LTUuMzczLTEyLTEyLTEySDMyMmMtNi42MjcgMC0xMiA1LjM3My0xMiAxMnYyNGMwIDYuNjI3IDUuMzczIDEyIDEyIDEyaDE0NmM2LjYyNyAwIDEyLTUuMzczIDEyLTEyem0wIDk2YzAtNi42MjctNS4zNzMtMTItMTItMTJIMzIyYy02LjYyNyAwLTEyIDUuMzczLTEyIDEydjI0YzAgNi42MjcgNS4zNzMgMTIgMTIgMTJoMTQ2YzYuNjI3IDAgMTItNS4zNzMgMTItMTJ6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJNNDM4IDc2YzAgNi42MjctNS4zNzMgMTItMTIgMTJIMzA5Ljc4M2MtMTcuNjczIDAtMzIgMTQuMzI3LTMyIDMydjU2YzAgMjYuOTc4LTEwLjI3MiA1MS41NTctMjcuMTE5IDcwLjAzOS01LjA1NSA1LjU0NS01LjA1NSAxNC4zNzcgMCAxOS45MjIgMTYuODQ3IDE4LjQ4MiAyNy4xMTkgNDMuMDYxIDI3LjExOSA3MC4wMzl2NTZjMCAxNy42NzMgMTQuMzI3IDMyIDMyIDMySDQyNmM2LjYyNyAwIDEyIDUuMzczIDEyIDEydjI0YzAgNi42MjctNS4zNzMgMTItMTIgMTJIMzA5Ljc4M2MtNDQuMTgzIDAtODAtMzUuODE3LTgwLTgwdi01NmMwLTMwLjkyOC0yNS4wNzItNTYtNTYtNTZhNS43ODMgNS43ODMgMCAwIDEtNS43ODMtNS43ODN2LTM2LjQzNGE1Ljc4MyA1Ljc4MyAwIDAgMSA1Ljc4My01Ljc4M2MzMC45MjggMCA1Ni0yNS4wNzIgNTYtNTZ2LTU2YzAtNDQuMTgzIDM1LjgxNy04MCA4MC04MEg0MjZjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnoiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMzYgMjQ0YzAtNi42MjctNS4zNzMtMTItMTItMTJIMTJjLTYuNjI3IDAtMTIgNS4zNzMtMTIgMTJ2MjRjMCA2LjYyNyA1LjM3MyAxMiAxMiAxMmgxMTJjNi42MjcgMCAxMi01LjM3MyAxMi0xMnoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik01MTIgMEgwdjUxMmg1MTJ6Ii8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+"},"displayName":"Split Out","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1315,"icon":"fa:table","name":"n8n-nodes-base.dataTable","codex":{"data":{"alias":["data","table","knowledge","data table","table","sheet","database","data base","mysql","postgres","postgresql","airtable","supabase","noco","notion"],"details":"Data table","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.datatable/"}]},"categories":["Core Nodes","Development"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\",\"transform\"]","defaults":{"name":"Data table"},"iconData":{"icon":"table","type":"icon"},"displayName":"Data table","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":36,"name":"File Management"}],"image":[]}}