{
  "id": "23GPrqZjHnIVvTEa",
  "meta": {
    "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",
  "tags": [
    "automation",
    "n8n",
    "production-ready",
    "excellent",
    "optimized"
  ],
  "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": {}
      },
      "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"
      },
      "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"
            }
          ]
        }
      },
      "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,
  "pinData": {},
  "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": {
    "2a27e85d-51c0-4f45-a7d6-6422fc8a439b": {
      "main": [
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b-68e20d4f",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b-8964a104",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b-1932455b",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b-70f555b6",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b-059cd44f",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b-41c81a6d",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b-f1ba85ea",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-2a27e85d-51c0-4f45-a7d6-6422fc8a439b-b51f5ddd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "04400827-d331-4ee2-8a67-1238ea2dc969": {
      "main": [
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969-92591993",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969-7e606baa",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969-aa77979c",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969-fe496515",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969-eb171c4f",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969-e8400adf",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969-6ea0c278",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-04400827-d331-4ee2-8a67-1238ea2dc969-ef7e31d6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "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."
}