AutomationFlowsData & Sheets › R2 URL Refresh Inactive

R2 URL Refresh Inactive

r2-URL-Refresh-Inactive. Uses supabase, httpRequest. Scheduled trigger; 9 nodes.

Cron / scheduled trigger★★★★☆ complexity9 nodesSupabaseHTTP Request
Data & Sheets Trigger: Cron / scheduled Nodes: 9 Complexity: ★★★★☆ Added:

This workflow follows the HTTP Request → Supabase recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "r2-URL-Refresh-Inactive",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtHour": 5,
              "triggerAtMinute": null
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        0,
        0
      ],
      "id": "a120245d-0ab3-4008-864d-ef450685cb8b",
      "name": "Schedule: Sunday 01:00"
    },
    {
      "parameters": {
        "operation": "getAll",
        "tableId": "intake",
        "limit": 1,
        "filters": {
          "conditions": [
            {
              "keyName": "status",
              "condition": "eq",
              "keyValue": "=inactive"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        240,
        0
      ],
      "id": "a2d842ee-2528-4a2c-8201-b5bdc17d38c6",
      "name": "Supabase: Get Intake Stage",
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "getAll",
        "tableId": "media_forensics",
        "returnAll": true,
        "filters": {
          "conditions": [
            {
              "keyName": "retool_url_expires_at",
              "condition": "lte",
              "keyValue": "={{ DateTime.now().plus({days: 8}).toISO() }}"
            },
            {
              "keyName": "retool_url_expires_at",
              "condition": "is",
              "keyValue": "null"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        656,
        0
      ],
      "id": "6af4c4b1-b78e-4dea-a9b0-79aedd590525",
      "name": "Supabase: Get Expiring URLs",
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const items = $input.all();\n\nreturn items.map(item => ({\n  json: {\n    intake_id: item.json.intake_id,\n  }\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        448,
        0
      ],
      "id": "9e7aefd5-1636-4f79-9cee-1400efea5164",
      "name": "Code: Extract Intake IDs"
    },
    {
      "parameters": {
        "jsCode": "const mediaItems = $input.all();\nconst intakeItems = $('Code: Extract Intake IDs').all();\n\nconst activeIntakeIds = new Set(intakeItems.map(i => i.json.intake_id));\n\nreturn mediaItems\n  .filter(item => activeIntakeIds.has(item.json.intake_id))\n  .map(item => ({\n    json: {\n      id: item.json.id,\n      intake_id: item.json.intake_id,\n      r2_object_key: item.json.r2_object_key\n    }\n  }));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        864,
        0
      ],
      "id": "09bc57f5-f29e-43d5-8f45-ebd582803a44",
      "name": "Code: Filter by Active Intake IDs"
    },
    {
      "parameters": {
        "jsCode": "const items = $input.all();\n\nreturn items.map(item => ({\n  json: {\n    ...item.json,\n    expiry_seconds: 1209600\n  }\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1072,
        0
      ],
      "id": "b2c99a58-30b0-43f9-81a3-026306e156a8",
      "name": "Code: Determine Expiry"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://spx-r2-signer.spexai.workers.dev/sign",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"r2_object_key\": \"{{ $json.r2_object_key }}\",\n  \"expiry_seconds\": {{ $json.expiry_seconds }}\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        1280,
        0
      ],
      "id": "de72b715-a7f8-4a78-bbf9-ff9b2be4b3d9",
      "name": "HTTP Request",
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "update",
        "tableId": "media_forensics",
        "filters": {
          "conditions": [
            {
              "keyName": "id",
              "condition": "eq",
              "keyValue": "={{ $('Code: Filter by Active Intake IDs').item.json.id }}"
            }
          ]
        },
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "retool_signed_url",
              "fieldValue": "={{ $json.retool_signed_url }}"
            },
            {
              "fieldId": "retool_url_expires_at",
              "fieldValue": "={{ $json.retool_url_expires_at }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.supabase",
      "typeVersion": 1,
      "position": [
        1488,
        0
      ],
      "id": "5093facc-12be-4e40-b315-66da3552f497",
      "name": "Supabase: Update Signed URL",
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        160
      ],
      "id": "f5ee8245-b268-45b8-865c-f1726dbb8b63",
      "name": "When clicking \u2018Execute workflow\u2019"
    }
  ],
  "connections": {
    "Schedule: Sunday 01:00": {
      "main": [
        [
          {
            "node": "Supabase: Get Intake Stage",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase: Get Intake Stage": {
      "main": [
        [
          {
            "node": "Code: Extract Intake IDs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code: Extract Intake IDs": {
      "main": [
        [
          {
            "node": "Supabase: Get Expiring URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase: Get Expiring URLs": {
      "main": [
        [
          {
            "node": "Code: Filter by Active Intake IDs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code: Filter by Active Intake IDs": {
      "main": [
        [
          {
            "node": "Code: Determine Expiry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code: Determine Expiry": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Supabase: Update Signed URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Supabase: Get Intake Stage",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": false
  },
  "versionId": "fdaca958-1a39-4712-a341-6fd2d4080171",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "QDzl0ojgnphyJE98",
  "tags": [
    {
      "updatedAt": "2026-04-11T17:19:07.684Z",
      "createdAt": "2026-04-11T17:19:07.684Z",
      "id": "0kHDvaC4AFK5HWaF",
      "name": "systems_update"
    },
    {
      "updatedAt": "2026-04-07T05:54:12.040Z",
      "createdAt": "2026-04-07T05:54:12.040Z",
      "id": "3ctqgxjHRVbu8uPR",
      "name": "noir-test"
    },
    {
      "updatedAt": "2026-04-07T05:54:41.309Z",
      "createdAt": "2026-04-07T05:54:41.309Z",
      "id": "617SY1s5iJZzmnko",
      "name": "noir-collective-france"
    },
    {
      "updatedAt": "2026-04-11T08:01:19.854Z",
      "createdAt": "2026-04-11T08:01:19.854Z",
      "id": "6QshQRR9Gq480E2s",
      "name": "template"
    },
    {
      "updatedAt": "2026-04-07T05:54:15.456Z",
      "createdAt": "2026-04-07T05:54:15.456Z",
      "id": "U5Z5J0HkLxUQA5hK",
      "name": "prototype"
    },
    {
      "updatedAt": "2026-04-11T17:19:17.815Z",
      "createdAt": "2026-04-11T17:19:17.815Z",
      "id": "n69dqzL4kSMo9qoo",
      "name": "maintainence"
    },
    {
      "updatedAt": "2026-04-11T08:02:56.129Z",
      "createdAt": "2026-04-11T08:02:56.129Z",
      "id": "vP2cQVtcEk5GKWoz",
      "name": "_template"
    },
    {
      "updatedAt": "2026-04-07T06:57:56.832Z",
      "createdAt": "2026-04-07T06:57:56.832Z",
      "id": "wAJsiiKAX1HZZKGW",
      "name": "reference"
    },
    {
      "updatedAt": "2026-04-07T06:58:06.901Z",
      "createdAt": "2026-04-07T06:58:06.901Z",
      "id": "xzkRjFgbGBkSMd3E",
      "name": "demo"
    }
  ]
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

r2-URL-Refresh-Inactive. Uses supabase, httpRequest. Scheduled trigger; 9 nodes.

Source: https://github.com/dev-spai/spexecute-talent-prism-osr/blob/main/workflows/r2-URL-Refresh-Inactive.json — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

This workflow ingests job postings from Greenhouse/Lever/Ashby job boards, Adzuna, and RemoteOK into a Supabase jobs pool, then daily uses Anthropic Claude to score a short list against a single candi

HTTP Request, Supabase, Resend +1
Data & Sheets

This workflow solves a common problem with RSS feeds: they often only provide a short summary or snippet of the full article. This template automatically monitors a list of your favorite blog RSS feed

HTTP Request, RSS Feed Read, Supabase
Data & Sheets

This workflow is a multi-system document synchronization pipeline built in n8n, designed to automatically sync and back up files between Microsoft SharePoint, Supabase/Postgres, and Google Drive.

HTTP Request, Supabase, Postgres +1
Data & Sheets

03 - Recordatorio 4h (CON VERIFICACIÓN) ✅. Uses supabase, httpRequest, twilio. Scheduled trigger; 17 nodes.

Supabase, HTTP Request, Twilio
Data & Sheets

02 - Recordatorio 24h antes (CON VERIFICACIÓN) ✅. Uses supabase, httpRequest, twilio. Scheduled trigger; 17 nodes.

Supabase, HTTP Request, Twilio