{"id":"23GPrqZjHnIVvTEa","meta":{"instanceId":"workflow-a8a62d39","versionId":"1.0.0","createdAt":"2025-09-29T07:07:58.445903","updatedAt":"2025-09-29T07:07:58.445918","owner":"n8n-user","license":"MIT","category":"automation","status":"active","priority":"high","environment":"production"},"name":"Backup n8n Workflows to Bitbucket","nodes":[{"id":"b3363b9d-ea6e-47b7-99f9-f48a21805886","name":"Calculate Wait Time","type":"n8n-nodes-base.code","position":[1400,-260],"parameters":{"jsCode":"// Get all input items and ensure we have data\nif ($input.all().length === 0 || !$input.all()[0].headers) {\n  // If no headers available, return default wait time\n  return { waitTime: 1 };\n}\n\n// Check rate limit headers from previous request\nconst headers = $input.all()[0].headers;\nlet waitTime = 1; // Default 1 second\n\n// Check if we have rate limit information (safely)\nconst remaining = parseInt(headers['x-ratelimit-remaining']) || null;\nconst reset = parseInt(headers['x-ratelimit-reset']) || null;\n\n// Only adjust wait time if we have valid rate limit info\nif (remaining !== null && reset !== null) {\n  // If we're running low on requests, calculate a longer wait time\n  if (remaining < 100) {\n    // Calculate seconds until reset\n    const now = Math.floor(Date.now() / 1000);\n    const timeUntilReset = reset - now;\n    \n    // Spread remaining requests over time until reset\n    // Add 10% buffer to be safe\n    waitTime = Math.ceil((timeUntilReset / remaining) * 1.1);\n  } else if (remaining < 500) {\n    // Start slowing down earlier\n    waitTime = 2;\n  }\n}\n\n// Cap maximum wait time at 30 seconds\nwaitTime = Math.min(waitTime, 30);\n\nreturn { waitTime };"},"typeVersion":2,"notes":"This code node performs automated tasks as part of the workflow."},{"id":"3cbc2287-b36f-4839-87b7-be4a7eadcf79","name":"Run Daily at 2 AM","type":"n8n-nodes-base.scheduleTrigger","position":[-120,-20],"parameters":{"rule":{"interval":[{"triggerAtHour":2}]}},"typeVersion":1.2,"notes":"This scheduleTrigger node performs automated tasks as part of the workflow."},{"id":"09b396aa-61e8-4631-8aae-7126fbd609e6","name":"Get All Workflows","type":"n8n-nodes-base.n8n","position":[320,-20],"parameters":{"filters":{},"requestOptions":{}},"credentials":{"n8nApi":{"id":"[n8n-api-credential-id]","name":"n8n Development Environment"}},"typeVersion":1,"notes":"This n8n node performs automated tasks as part of the workflow."},{"id":"c46b50cd-432f-4714-ac68-b6f92663b592","name":"Loop Workflows","type":"n8n-nodes-base.splitInBatches","position":[540,-20],"parameters":{"options":{}},"typeVersion":3,"notes":"This splitInBatches node performs automated tasks as part of the workflow."},{"id":"2a27e85d-51c0-4f45-a7d6-6422fc8a439b","name":"Get Existing Worfklow from Bitbucket","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","position":[780,-20],"parameters":{"url":"{{ $env.BASE_URL }}","options":{"response":{"response":{"fullResponse":true}},"allowUnauthorizedCerts":true},"authentication":"{{ $credentials.genericCredentialType }}","genericAuthType":"httpBasicAuth"},"credentials":{"httpBasicAuth":{"id":"[bitbucket-credential-id]","name":"Bitbucket"}},"retryOnFail":false,"typeVersion":4.2,"alwaysOutputData":false,"notes":"This httpRequest node performs automated tasks as part of the workflow."},{"id":"eeb52f03-dd60-46ae-ad86-1cabf7f6c20f","name":"New or Changed?","type":"n8n-nodes-base.if","position":[980,-20],"parameters":{"options":{"ignoreCase":true},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"2d5da90e-0f1d-436b-84d4-d82deaaa4b58","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $json.error.status }}","rightValue":404},{"id":"b7b9a48d-8954-4cc4-bf7a-ab30439ad930","operator":{"type":"string","operation":"notEquals"},"leftValue":"={{ $('Get Existing Worfklow from Bitbucket').item.json.data }}","rightValue":"={{ JSON.stringify($('Loop Workflows').item.json, null, 2) }}"}]}},"typeVersion":2.2,"notes":"This if node performs automated tasks as part of the workflow."},{"id":"04400827-d331-4ee2-8a67-1238ea2dc969","name":"Upload Workflow to Bitbucket","type":"n8n-nodes-base.httpRequest","position":[1200,-260],"parameters":{"url":"{{ $env.BASE_URL }}","method":"POST","options":{"redirect":{"redirect":{"maxRedirects":5}},"response":{"response":{"fullResponse":true}}},"sendBody":true,"sendHeaders":true,"authentication":"{{ $credentials.genericCredentialType }}","bodyParameters":{"parameters":[{"name":"message","value":"={{ $('Loop Workflows').item.json.name + ' [' + $now.format('yyyy-MM-dd HH:mm:ss') +']' }}"},{"name":"={{ $('Loop Workflows').item.json.name.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase() }}","value":"={{ JSON.stringify($('Loop Workflows').item.json, null, 2) }}"}]},"genericAuthType":"httpBasicAuth","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/x-www-form-urlencoded"}]}},"credentials":{"httpBasicAuth":{"id":"[bitbucket-credential-id]","name":"Bitbucket"}},"typeVersion":4.2,"notes":"This httpRequest node performs automated tasks as part of the workflow."},{"id":"5f198366-3bcf-4a96-ae60-da7cc9403a6f","name":"Wait to Avoid Rate Limiting","type":"n8n-nodes-base.wait","position":[1620,-20],"webhookId":"793d7525-d166-4487-a71f-d48da7c66662","parameters":{"amount":"={{ $json.waitTime || 1 }}"},"typeVersion":1.1,"notes":"This wait node performs automated tasks as part of the workflow."},{"id":"adc37b33-c5af-4a44-ba87-9806efe25603","name":"Set Bitbucket Workspace & Repository","type":"n8n-nodes-base.set","position":[100,-20],"parameters":{"options":{},"assignments":{"assignments":[{"id":"37f2ddba-188d-4bc1-98b3-5c5fa31d2d62","name":"WorkspaceSlug","type":"string","value":"[workspace-slug]"},{"id":"303f25f0-bba8-4977-8f4f-33961e2e7e8c","name":"RepositorySlug","type":"string","value":"[repository-slug]"}]}},"typeVersion":3.4,"notes":"This set node performs automated tasks as part of the workflow."}],"active":true,"settings":{"executionOrder":"v1","saveManualExecutions":true,"callerPolicy":"workflowsFromSameOwner","errorWorkflow":null,"timezone":"UTC","executionTimeout":3600,"maxExecutions":1000,"retryOnFail":true,"retryCount":3,"retryDelay":1000},"versionId":"f21887f2-e885-42c6-a934-4f7617e267dd","connections":{"Get Existing Worfklow from Bitbucket":{"main":[[],[],[],[],[],[],[],[],[]]},"Upload Workflow to Bitbucket":{"main":[[],[],[],[],[],[],[],[],[]]}},"description":"Automated workflow: Backup n8n Workflows to Bitbucket. This workflow processes data and performs automated tasks.","notes":"Excellent quality workflow: Backup n8n Workflows to Bitbucket. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}