{
  "id": "QRfOs6S3QrhslSFD",
  "name": "Facebook & Instagram Renovation Token",
  "tags": [],
  "nodes": [
    {
      "id": "56b6e307-f5e0-405e-9e1e-eb8e2d49b518",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -304,
        -80
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "daysInterval": 10,
              "triggerAtHour": 21
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "3a4de69d-c1d8-4e83-b3bb-25e6ff1c3cd3",
      "name": "No Operation, do nothing",
      "type": "n8n-nodes-base.noOp",
      "position": [
        400,
        160
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "ed641ba7-01ec-4baa-bf2e-5cac217a7709",
      "name": "Get token expiration date",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        -32,
        0
      ],
      "parameters": {
        "limit": 1,
        "operation": "get",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "TcHt9QIGMyCs1qIB",
          "cachedResultUrl": "/projects/XqoBcIeUrbWmIJt8/datatables/TcHt9QIGMyCs1qIB",
          "cachedResultName": "Meta credential"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ebfac905-851e-42db-b4d4-5c2a67987b46",
      "name": "Needs renewal?",
      "type": "n8n-nodes-base.if",
      "position": [
        176,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e62d1e04-38f2-454f-9301-6b6b896a9e5a",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ new Date($json.expires_at) <= new Date(Date.now() + 15*24*60*60*1000) }}",
              "rightValue": "={{ 10 }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1da184df-364e-4c52-844a-f368480ad132",
      "name": "Carry ID & Token",
      "type": "n8n-nodes-base.set",
      "position": [
        400,
        -16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1d09ed8a-2288-42db-b355-63e9b0354cbb",
              "name": "record_id",
              "type": "number",
              "value": "={{ $json.id }}"
            },
            {
              "id": "25975e2f-4375-41d4-b9cb-97ac0cec134b",
              "name": "current_token",
              "type": "string",
              "value": "={{ $json.token }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "42726ba6-dbab-4cdc-893e-92c299c0fe96",
      "name": "User Exchange",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        672,
        -16
      ],
      "parameters": {
        "url": "https://graph.facebook.com/v20.0/oauth/access_token",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "form-urlencoded",
        "bodyParameters": {
          "parameters": [
            {
              "name": "grant_type",
              "value": "fb_exchange_token"
            },
            {
              "name": "client_id"
            },
            {
              "name": "client_secret"
            },
            {
              "name": "fb_exchange_token",
              "value": "={{$json.current_token}}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "2e570311-fc11-408c-956a-f66a246aa5e1",
      "name": "Compute new expiry",
      "type": "n8n-nodes-base.set",
      "position": [
        960,
        -16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "6be317cc-adac-45eb-a36d-0440c0fbac1c",
              "name": "token",
              "type": "string",
              "value": "={{ $json.access_token }}"
            },
            {
              "id": "5d6562df-c638-4245-b967-c02e2617fab5",
              "name": "expired_at",
              "type": "string",
              "value": "={{ new Date(Date.now() + ($json.expires_in)*1000).toISOString() }}"
            },
            {
              "id": "3268497e-4040-4486-bde1-b65caf5141df",
              "name": "record_id",
              "type": "string",
              "value": "={{ $node[\"Carry ID & Token\"].json.record_id }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "97cbffa5-4305-42da-bafe-26a5f06df25a",
      "name": "Update Record",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        1168,
        -16
      ],
      "parameters": {
        "columns": {
          "value": {
            "token": "={{$json.token}}",
            "expires_at": "={{$json.expired_at}}"
          },
          "schema": [
            {
              "id": "token",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "token",
              "defaultMatch": false
            },
            {
              "id": "expires_at",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "expires_at",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "filters": {
          "conditions": [
            {
              "keyValue": "={{$json.record_id}}"
            }
          ]
        },
        "operation": "update",
        "dataTableId": {
          "__rl": true,
          "mode": "list",
          "value": "TcHt9QIGMyCs1qIB",
          "cachedResultUrl": "/projects/XqoBcIeUrbWmIJt8/datatables/TcHt9QIGMyCs1qIB",
          "cachedResultName": "Meta credencial"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "e477c855-2431-4507-a8bb-8f108ab5a973",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -416,
        -240
      ],
      "parameters": {
        "width": 288,
        "height": 480,
        "content": "* Right now the cron runs every 10 days to avoid consuming too much n8n credits. Feel free to change it. If you change it change also the logic in the \"Needs renewal?\" node.\n* For now Facebook gives token with 60 days expiration "
      },
      "typeVersion": 1
    },
    {
      "id": "9e8f62b4-187d-43eb-a40b-baa555c01eb6",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -112,
        -240
      ],
      "parameters": {
        "color": 4,
        "width": 256,
        "height": 480,
        "content": "## Data tables\n* This workflow is using the new Data tables feature\n* Create a DataTable called \"Meta credential\" with the following fields:\n** Token - your Access Token (string)\n** expires_at - expiration date of your token (datetime)"
      },
      "typeVersion": 1
    },
    {
      "id": "6afeba73-f1f4-436d-a3a4-811cc6d841de",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        -256
      ],
      "parameters": {
        "color": 5,
        "width": 272,
        "height": 496,
        "content": "## Generate new tokens\n* If tokens has less than 15 days before expiring it generates a new one \n* In this node you need to update the following fields: \n** client_id: this is your AppID you got when creating your credential \n** client_secret: this is your AppSecret"
      },
      "typeVersion": 1
    },
    {
      "id": "fef64b9c-a077-4278-9187-db0743ca7692",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        912,
        -256
      ],
      "parameters": {
        "color": 2,
        "width": 448,
        "height": 496,
        "content": "## Setting new expiration date and updating data table \n* It format the date from unix to datetime \n* It updates the row in the Data table"
      },
      "typeVersion": 1
    },
    {
      "id": "2e41d7ee-aae9-4083-bdd0-4252fc764dd9",
      "name": "When clicking \"Execute workflow\"",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -304,
        80
      ],
      "parameters": {},
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "7be243a3-0f7d-4039-990a-613e2a856002",
  "connections": {
    "User Exchange": {
      "main": [
        [
          {
            "node": "Compute new expiry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Needs renewal?": {
      "main": [
        [
          {
            "node": "Carry ID & Token",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Carry ID & Token": {
      "main": [
        [
          {
            "node": "User Exchange",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get token expiration date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compute new expiry": {
      "main": [
        [
          {
            "node": "Update Record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get token expiration date": {
      "main": [
        [
          {
            "node": "Needs renewal?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \"Execute workflow\"": {
      "main": [
        [
          {
            "node": "Get token expiration date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}