AutomationFlowsData & Sheets › N8n Whitepaper

N8n Whitepaper

N8N whitepaper. Uses n8n-nodes-twelve-labs, airtable, formTrigger, form. Event-driven trigger; 28 nodes.

Event trigger★★★★☆ complexity28 nodesN8N Nodes Twelve LabsAirtableForm TriggerFormAWS LambdaAWS S3
Data & Sheets Trigger: Event Nodes: 28 Complexity: ★★★★☆ Added:
N8n Whitepaper — n8n workflow card showing N8N Nodes Twelve Labs, Airtable, Form Trigger integration

This workflow follows the Airtable → Form Trigger 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": "N8N whitepaper",
  "nodes": [
    {
      "parameters": {
        "operation": "uploadUrl",
        "indexId": "<YOUR_TWELVELABS_INDEX_ID>",
        "videoUrl": "={{ $json.presignedUrl }}"
      },
      "type": "n8n-nodes-twelve-labs.twelveLabs",
      "typeVersion": 1,
      "position": [
        -672,
        208
      ],
      "id": "b2d8feb7-6ab0-4959-98c3-95a1e3493803",
      "name": "Index to TwelveLabs",
      "credentials": {
        "twelveLabsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "# \ud83d\udcf9 Index to TwelveLabs\n\n**Upload videos to TwelveLabs for multimodal AI analysis**\n\n**[\ud83d\udcd6 Documentation](https://docs.twelvelabs.io/v1.3/sdk-reference/node-js/upload-content/video-indexing-tasks)**",
        "height": 400,
        "width": 864,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1376,
        16
      ],
      "typeVersion": 1,
      "id": "c4e6a94d-8041-458e-8e5b-88aecf741e30",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "jsCode": "// Parse the Lambda response and extract unique files\nconst seenKeys = new Set();\nconst results = [];\n\nfor (const item of $input.all()) {\n  const response = JSON.parse(item.json.result.body);\n  for (const file of response.files) {\n    if (!seenKeys.has(file.Key)) {\n      seenKeys.add(file.Key);\n      results.push({\n        json: {\n          Key: file.Key,\n          presignedUrl: file.presignedUrl,\n          Size: file.Size,\n          LastModified: file.LastModified,\n          expiresIn: file.expiresIn\n        }\n      });\n    }\n  }\n}\n\nreturn results;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -896,
        208
      ],
      "id": "f07674c1-6363-4b6f-87ff-91a8dd33ec03",
      "name": "Get pre-signed URLs"
    },
    {
      "parameters": {
        "content": "# \ud83c\udfaf Analyze Video with TwelveLabs\n\n**Generate insights from indexed videos using Pegasus**\n\n**[\ud83d\udcd6 Documentation](https://docs.twelvelabs.io/v1.3/sdk-reference/node-js/generate/video-analysis)**",
        "height": 784,
        "width": 864,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        16
      ],
      "typeVersion": 1,
      "id": "65d32fd6-17fe-4619-9cc9-c656c6dfd2dd",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "resource": "analysis",
        "indexId": "={{ $json.indexId }}",
        "videoId": "={{ $json.videoId }}",
        "prompt": "Analyze this video for content compliance using YouTube's ABCD framework:\n\n**A - Adult Content:**\n- Nudity or sexual content\n- Sexually suggestive content\n- Adult themes\n\n**B - Brand Safety:**\n- Inflammatory or demeaning content\n- Hateful content targeting protected groups\n- Harmful or dangerous acts\n- Shocking or graphic content\n- Profanity and crude language\n\n**C - Copyright:**\n- Copyrighted music, video, or images\n- Unlicensed third-party content\n\n**D - Dangerous/Harmful:**\n- Violence or graphic content\n- Drugs, dangerous products, or substances\n- Firearms and weapons\n- Misinformation (health, elections, etc.)\n\nFor each flagged issue, provide:\n1. **Timestamp**: When it appears\n2. **Category**: A, B, C, or D\n3. **Issue**: Brief description\n4. **Action**: Allow, Restrict (age-gate), Monetization off, or Remove\n\n**Output:**\n- Overall Status: Suitable / Needs Review / Not Suitable\n- Flagged Issues (if any)\n- Recommended Actions",
        "additionalOptions": {
          "temperature": 0.2
        }
      },
      "type": "n8n-nodes-twelve-labs.twelveLabs",
      "typeVersion": 1,
      "position": [
        -224,
        176
      ],
      "id": "77440a41-d7fe-4837-aa7e-e6996c07b7c3",
      "name": "Analyze for compliance",
      "credentials": {
        "twelveLabsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "analysis",
        "indexId": "={{ $json.indexId }}",
        "videoId": "={{ $json.videoId }}",
        "prompt": "Summarize this video in 3-4 paragraphs covering:\n- What happens in the video\n- Main topics or themes\n- Key moments or important details",
        "additionalOptions": {
          "temperature": 0.2
        }
      },
      "type": "n8n-nodes-twelve-labs.twelveLabs",
      "typeVersion": 1,
      "position": [
        -224,
        336
      ],
      "id": "4ea3a8e0-1a51-4910-9dac-bf0d6a6fa9ad",
      "name": "Generate summary",
      "credentials": {
        "twelveLabsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "analysis",
        "indexId": "={{ $json.indexId }}",
        "videoId": "={{ $json.videoId }}",
        "prompt": "Break this video into chapters with timestamps. For each chapter provide:\n- Timestamp (start time)\n- Chapter title\n- Brief description of what happens",
        "additionalOptions": {
          "temperature": 0.2
        }
      },
      "type": "n8n-nodes-twelve-labs.twelveLabs",
      "typeVersion": 1,
      "position": [
        -224,
        480
      ],
      "id": "e32b1209-1e01-4ba3-ae9f-edc6c9275d73",
      "name": "Generate chapters",
      "credentials": {
        "twelveLabsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "analysis",
        "indexId": "={{ $json.indexId }}",
        "videoId": "={{ $json.videoId }}",
        "prompt": "Identify the most important or interesting moments in this video. For each highlight provide:\n- Timestamp\n- Title of the moment\n- Why it's noteworthy",
        "additionalOptions": {
          "temperature": 0.2
        }
      },
      "type": "n8n-nodes-twelve-labs.twelveLabs",
      "typeVersion": 1,
      "position": [
        -224,
        640
      ],
      "id": "dace148a-0491-4133-9321-49b43dac7184",
      "name": "Generate highlights",
      "credentials": {
        "twelveLabsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "numberInputs": 4
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        -16,
        368
      ],
      "id": "1a69f2ec-a620-4c90-9abb-cf860bda417d",
      "name": "Merge TwelveLabs analysis"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -1552,
        208
      ],
      "id": "cdeef633-90f9-4699-8584-7aee06216ae0",
      "name": "When clicking 'Execute workflow'"
    },
    {
      "parameters": {
        "operation": "upsert",
        "base": {
          "__rl": true,
          "value": "<YOUR_AIRTABLE_BASE_ID>",
          "mode": "list",
          "cachedResultName": "N8N",
          "cachedResultUrl": "https://airtable.com/<YOUR_AIRTABLE_BASE_ID>"
        },
        "table": {
          "__rl": true,
          "value": "<YOUR_AIRTABLE_TABLE_ID>",
          "mode": "list",
          "cachedResultName": "Table 1",
          "cachedResultUrl": "https://airtable.com/<YOUR_AIRTABLE_BASE_ID>/<YOUR_AIRTABLE_TABLE_ID>"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "id": "<YOUR_AIRTABLE_TABLE_ID>",
            "Compliance report": "={{ $json[\"Compliance report\"] }}",
            "Summary": "={{ $json.Summary }}",
            "Chapters": "={{ $json.Chapters }}",
            "Highlights": "={{ $json.Highlights }}",
            "videoID": "={{ $json.videoID }}",
            "Compliance": "={{ $json[\"Compliance Status\"] }}"
          },
          "matchingColumns": [
            "id"
          ],
          "schema": [
            {
              "id": "id",
              "displayName": "id",
              "required": false,
              "defaultMatch": true,
              "display": true,
              "type": "string",
              "readOnly": true,
              "removed": false
            },
            {
              "id": "videoID",
              "displayName": "videoID",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Compliance",
              "displayName": "Compliance",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "options",
              "options": [
                {
                  "name": "PASS",
                  "value": "PASS"
                },
                {
                  "name": "FAILED",
                  "value": "FAILED"
                },
                {
                  "name": "NEEDS REVIEW",
                  "value": "NEEDS REVIEW"
                }
              ],
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Compliance report",
              "displayName": "Compliance report",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Summary",
              "displayName": "Summary",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Chapters",
              "displayName": "Chapters",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "Highlights",
              "displayName": "Highlights",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        176,
        544
      ],
      "id": "fa517b24-b77e-4203-9f9c-038e86dc4d4e",
      "name": "Create or update a record",
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Organize TwelveLabs analysis results based on input order\nconst allItems = $input.all();\n\nconst videoId = allItems[0]?.json?.videoId || '';\n\n// Input 0 = Compliance, 1 = Summary, 2 = Chapters, 3 = Highlights\nconst complianceResponse = allItems[0]?.json?.response || '';\n\nlet complianceStatus = 'NEEDS REVIEW';\n\nif (complianceResponse.includes('Overall Status: Suitable')) {\n  complianceStatus = 'PASS';\n} else if (complianceResponse.includes('Overall Status: Not Suitable')) {\n  complianceStatus = 'FAILED';\n} else if (complianceResponse.includes('Overall Status: Needs Review')) {\n  complianceStatus = 'NEEDS REVIEW';\n}\n\nconst result = {\n  videoID: videoId,\n  'Compliance Status': complianceStatus,\n  'Compliance report': complianceResponse,\n  'Summary': allItems[1]?.json?.response || '',\n  'Chapters': allItems[2]?.json?.response || '',\n  'Highlights': allItems[3]?.json?.response || ''\n};\n\nreturn [{ json: result }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        192,
        288
      ],
      "id": "e0c2f845-57d2-4b2c-a8fa-1f98d61932d3",
      "name": "Clean TwelveLabs outputs"
    },
    {
      "parameters": {
        "content": "# \ud83d\udd0d Semantic Search with TwelveLabs\n\n**Search videos using natural language queries**\n\n**[\ud83d\udcd6 Documentation](https://docs.twelvelabs.io/v1.3/sdk-reference/node-js/search/semantic-search)**",
        "height": 368,
        "width": 864
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1376,
        432
      ],
      "typeVersion": 1,
      "id": "6cfa36e0-b64f-4a9d-bce3-85b4f52e0956",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "formTitle": "Semantic Search with TwelveLabs",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Search Query",
              "requiredField": true
            }
          ]
        },
        "options": {
          "customCss": ":root {\n\t--font-family: 'Inter', 'Open Sans', sans-serif;\n\t--color-background: #0A0B0D;\n\t--color-card-bg: #141518;\n\t--color-card-border: #2A2B30;\n\t--color-card-shadow: rgba(139, 92, 246, 0.15);\n\t--color-link: #8B5CF6;\n\t--color-header: #FFFFFF;\n\t--color-label: #E5E7EB;\n\t--color-submit-btn-bg: #8B5CF6;\n\t--color-submit-btn-text: #FFFFFF;\n\t--border-radius-card: 12px;\n\t--border-radius-input: 8px;\n\t--container-width: 520px;\n}\nbody {\n\tbackground: linear-gradient(135deg, #0A0B0D 0%, #1A1B1F 100%);\n\tmin-height: 100vh;\n}\nbutton[type=\"submit\"]:hover {\n\tbackground: #7C3AED;\n\ttransform: translateY(-1px);\n\tbox-shadow: 0 4px 12px rgba(139, 92, 246, 0.4);\n\ttransition: all 0.2s ease;\n}\ninput:focus, textarea:focus, select:focus {\n\tbox-shadow: 0 0 0 3px rgba(139, 92, 246, 0.2);\n\ttransition: box-shadow 0.2s ease;\n}"
        }
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.3,
      "position": [
        -1312,
        608
      ],
      "id": "b415acb0-a3da-4a36-8635-af6ab81d21a1",
      "name": "On form submission"
    },
    {
      "parameters": {
        "jsCode": "const searchData = $input.first().json.data;\nconst top10 = searchData.filter(result => result.rank <= 10);\n\nlet resultsHTML = `\n<table style=\"width: 100%; border-collapse: separate; border-spacing: 20px; margin: 20px 0;\">\n  <tr>\n    <td colspan=\"4\" style=\"text-align: center; padding-bottom: 20px;\">\n      <h2 style=\"color: #8B5CF6; font-size: 28px; margin: 0;\">Search Results (Top ${top10.length})</h2>\n    </td>\n  </tr>\n`;\n\nfor (let i = 0; i < top10.length; i += 4) {\n  resultsHTML += '<tr>';\n  for (let j = 0; j < 4; j++) {\n    if (i + j < top10.length) {\n      const result = top10[i + j];\n      resultsHTML += `\n        <td style=\"width: 25%; vertical-align: top;\">\n          <div style=\"background: #141518; border: 1px solid #2A2B30; border-radius: 12px; padding: 16px; box-shadow: 0px 4px 12px rgba(139, 92, 246, 0.1);\">\n            <div style=\"position: relative; margin-bottom: 12px;\">\n              <span style=\"position: absolute; top: 8px; left: 8px; background: #8B5CF6; color: #FFFFFF; padding: 6px 10px; border-radius: 6px; font-size: 14px; font-weight: 600; z-index: 10;\">#${result.rank}</span>\n              <img src=\"${result.thumbnail_url}\" alt=\"Result ${result.rank}\" style=\"width: 100%; height: 140px; object-fit: cover; border-radius: 8px; display: block;\"/>\n            </div>\n            <div style=\"color: #FFFFFF; font-size: 13px; margin-bottom: 6px;\">\n              <strong style=\"color: #FFFFFF;\">Video ID:</strong><br/>${result.video_id.substring(0, 12)}...\n            </div>\n            <div style=\"color: #E5E7EB; font-size: 12px; margin-bottom: 6px;\">\n              <strong style=\"color: #FFFFFF;\">Time:</strong> ${result.start}s - ${result.end}s\n            </div>\n            ${result.transcription ? `\n              <div style=\"color: #D1D5DB; font-size: 11px; font-style: italic; padding: 8px; background: #1A1B1F; border-radius: 6px; margin-top: 8px;\">\n                \"${result.transcription}\"\n              </div>\n            ` : ''}\n          </div>\n        </td>\n      `;\n    } else {\n      resultsHTML += '<td style=\"width: 25%;\"></td>';\n    }\n  }\n  resultsHTML += '</tr>';\n}\n\nresultsHTML += '</table>';\nreturn [{ json: { html: resultsHTML } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -896,
        608
      ],
      "id": "960a71bf-e6cf-45c1-955c-89354f9ee1e6",
      "name": "Parse search results"
    },
    {
      "parameters": {
        "operation": "completion",
        "completionTitle": "Search results",
        "completionMessage": "={{ $json.html }}",
        "options": {
          "customCss": ":root {\n\t--font-family: 'Inter', 'Open Sans', sans-serif;\n\t--color-background: #0A0B0D;\n\t--color-card-bg: #141518;\n\t--color-header: #FFFFFF;\n\t--color-html-text: #FFFFFF;\n\t--container-width: 100% !important;\n}\nbody {\n\tbackground: linear-gradient(135deg, #0A0B0D 0%, #1A1B1F 100%);\n\tmin-height: 100vh;\n\tcolor: #FFFFFF;\n}\n.container, .form-container, .completion-container {\n\tmax-width: 100% !important;\n\twidth: 100% !important;\n}\ndiv, p, span, strong, h1, h2, h3 {\n\tcolor: inherit !important;\n}"
        }
      },
      "type": "n8n-nodes-base.form",
      "typeVersion": 2.3,
      "position": [
        -688,
        608
      ],
      "id": "3cc3a564-741f-4d58-96b1-37bd123a70a4",
      "name": "Show results"
    },
    {
      "parameters": {
        "function": "arn:aws:lambda:<YOUR_REGION>:<YOUR_AWS_ACCOUNT_ID>:function:tl-generate-pre-signed-urls",
        "payload": "={{ JSON.stringify({ bucketName: \"<YOUR_S3_BUCKET>\", files: $input.all().map(item => item.json), expiresIn: 3600 }) }}"
      },
      "type": "n8n-nodes-base.awsLambda",
      "typeVersion": 1,
      "position": [
        -1120,
        208
      ],
      "id": "4ec00502-b621-4d73-a3ef-b81d4aa41fad",
      "name": "Generate pre-signed URLs",
      "credentials": {
        "aws": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "search",
        "indexId": "<YOUR_TWELVELABS_INDEX_ID>",
        "queryText": "={{ $json[\"Search Query\"] }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-twelve-labs.twelveLabs",
      "typeVersion": 1,
      "position": [
        -1104,
        608
      ],
      "id": "c70f784e-1525-4f66-add9-865610e619a7",
      "name": "Search videos",
      "credentials": {
        "twelveLabsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "# \ud83d\ude80 TwelveLabs Workflows on SaaS\n\n**Multimodal Video AI Pipeline: End-to-end video indexing, search & analysis**\n\n**[\ud83d\udcd6 TwelveLabs Documentation](https://docs.twelvelabs.io)**",
        "height": 976,
        "width": 1792,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1392,
        -144
      ],
      "typeVersion": 1,
      "id": "b4237691-6e29-4f85-a0ba-ea62f05131e8",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "operation": "getAll",
        "bucketName": "<YOUR_S3_BUCKET>",
        "returnAll": true,
        "options": {}
      },
      "type": "n8n-nodes-base.awsS3",
      "typeVersion": 2,
      "position": [
        -1328,
        208
      ],
      "id": "16dbfb0d-49be-4af0-9018-64dbbafeb684",
      "name": "Get asset(s) from S3",
      "credentials": {
        "aws": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "getAll",
        "bucketName": "<YOUR_S3_BUCKET>",
        "returnAll": true,
        "options": {
          "folderKey": "bedrock/"
        }
      },
      "type": "n8n-nodes-base.awsS3",
      "typeVersion": 2,
      "position": [
        -1248,
        1024
      ],
      "id": "ec6018bf-efac-4896-b354-88754d018455",
      "name": "Get asset(s) from AWS S3",
      "credentials": {
        "aws": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "function": "arn:aws:lambda:<YOUR_REGION>:<YOUR_AWS_ACCOUNT_ID>:function:bedrock-pegasus-video-analysis-n8n",
        "payload": "={{ JSON.stringify({ s3Uri: $json.s3Uri, textPrompt: \"Summarize this video in detail\" }) }}"
      },
      "type": "n8n-nodes-base.awsLambda",
      "typeVersion": 1,
      "position": [
        -800,
        1024
      ],
      "id": "e66afc69-1eba-4875-8ecb-9a189aa8b083",
      "name": "Analyze with Bedrock Pegasus",
      "credentials": {
        "aws": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const bucketName = '<YOUR_S3_BUCKET>';\nconst results = [];\n\nfor (const item of $input.all()) {\n  results.push({\n    json: {\n      Key: item.json.Key,\n      s3Uri: `s3://${bucketName}/${item.json.Key}`\n    }\n  });\n}\n\nreturn results;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1024,
        1024
      ],
      "id": "91e16872-8137-4920-9bc0-ed370395dc52",
      "name": "Build S3 URI for Bedrock"
    },
    {
      "parameters": {
        "content": "# \ud83c\udfac Analyze with AWS Bedrock Pegasus\n\n**Generate insights from videos using TwelveLabs Pegasus via AWS Bedrock**\n\n[\ud83d\udcd6 Documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-pegasus.html)",
        "height": 384,
        "width": 896,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1392,
        848
      ],
      "typeVersion": 1,
      "id": "fc6d67c1-1b54-4786-a253-54b20bf0789d",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "operation": "getAll",
        "bucketName": "<YOUR_S3_BUCKET>",
        "returnAll": true,
        "options": {
          "folderKey": "bedrock/"
        }
      },
      "type": "n8n-nodes-base.awsS3",
      "typeVersion": 2,
      "position": [
        -336,
        1008
      ],
      "id": "046590c5-57b1-4d4c-8bf7-17fee19dd26f",
      "name": "Get asset(s) from AWS S3 storage",
      "credentials": {
        "aws": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const bucketName = '<YOUR_S3_BUCKET>';\nconst results = [];\n\nfor (const item of $input.all()) {\n  results.push({\n    json: {\n      Key: item.json.Key,\n      s3Uri: `s3://${bucketName}/${item.json.Key}`\n    }\n  });\n}\n\nreturn results;"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -112,
        1008
      ],
      "id": "f4183446-ea78-4578-a22a-f7f612e90792",
      "name": "Build AWS S3 URI for Bedrock"
    },
    {
      "parameters": {
        "function": "arn:aws:lambda:<YOUR_REGION>:<YOUR_AWS_ACCOUNT_ID>:function:bedrock-marengo-embeddings-n8n",
        "payload": "={{ JSON.stringify({ s3Uri: $json.s3Uri }) }}"
      },
      "type": "n8n-nodes-base.awsLambda",
      "typeVersion": 1,
      "position": [
        96,
        1008
      ],
      "id": "f0ee8b91-137f-4856-8b8c-a71d18727646",
      "name": "Create embeddings with Bedrock Marengo",
      "credentials": {
        "aws": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "# \ud83e\uddec AWS Bedrock Marengo Embeddings\n\n**Generate video embeddings using TwelveLabs Marengo via AWS Bedrock**\n\n[\ud83d\udcd6 Marengo Documentation](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-marengo-3.html)",
        "height": 384,
        "width": 880,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -480,
        848
      ],
      "typeVersion": 1,
      "id": "beac45d3-daf9-40fc-9a20-95d268d3b162",
      "name": "Sticky Note5"
    }
  ],
  "connections": {
    "Get pre-signed URLs": {
      "main": [
        [
          {
            "node": "Index to TwelveLabs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Index to TwelveLabs": {
      "main": [
        [
          {
            "node": "Analyze for compliance",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate summary",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate chapters",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate highlights",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate summary": {
      "main": [
        [
          {
            "node": "Merge TwelveLabs analysis",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Generate chapters": {
      "main": [
        [
          {
            "node": "Merge TwelveLabs analysis",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Analyze for compliance": {
      "main": [
        [
          {
            "node": "Merge TwelveLabs analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate highlights": {
      "main": [
        [
          {
            "node": "Merge TwelveLabs analysis",
            "type": "main",
            "index": 3
          }
        ]
      ]
    },
    "Merge TwelveLabs analysis": {
      "main": [
        [
          {
            "node": "Clean TwelveLabs outputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking 'Execute workflow'": {
      "main": [
        [
          {
            "node": "Get asset(s) from S3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clean TwelveLabs outputs": {
      "main": [
        [
          {
            "node": "Create or update a record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Search videos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse search results": {
      "main": [
        [
          {
            "node": "Show results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate pre-signed URLs": {
      "main": [
        [
          {
            "node": "Get pre-signed URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search videos": {
      "main": [
        [
          {
            "node": "Parse search results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get asset(s) from S3": {
      "main": [
        [
          {
            "node": "Generate pre-signed URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get asset(s) from AWS S3": {
      "main": [
        [
          {
            "node": "Build S3 URI for Bedrock",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build S3 URI for Bedrock": {
      "main": [
        [
          {
            "node": "Analyze with Bedrock Pegasus",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get asset(s) from AWS S3 storage": {
      "main": [
        [
          {
            "node": "Build AWS S3 URI for Bedrock",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build AWS S3 URI for Bedrock": {
      "main": [
        [
          {
            "node": "Create embeddings with Bedrock Marengo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "timeSavedMode": "fixed",
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": true
  },
  "versionId": "<VERSION_ID>",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "<WORKFLOW_ID>",
  "tags": []
}

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

N8N whitepaper. Uses n8n-nodes-twelve-labs, airtable, formTrigger, form. Event-driven trigger; 28 nodes.

Source: https://gist.github.com/jordanwwoods/a7641821ed1cdbd916fa7e785d32362c — 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

Splitout Code. Uses airtable, formTrigger, form, splitOut. Event-driven trigger; 34 nodes.

Airtable, Form Trigger, Form +1
Data & Sheets

This n8n template showcases a cool feature of n8n Forms where the form itself can be defined dynamically using the form fields schema.

Airtable, Form Trigger, Form +1
Data & Sheets

Extractfromfile Form Export. Uses extractFromFile, lmChatOpenAi, outputParserStructured, formTrigger. Event-driven trigger; 23 nodes.

OpenAI Chat, Output Parser Structured, Form Trigger +5
Data & Sheets

Extractfromfile Form. Uses extractFromFile, lmChatOpenAi, outputParserStructured, formTrigger. Event-driven trigger; 23 nodes.

OpenAI Chat, Output Parser Structured, Form Trigger +5
Data & Sheets

Workflow Importer. Uses extractFromFile, executeCommand, readWriteFile, httpRequest. Event-driven trigger; 58 nodes.

Execute Command, Read Write File, HTTP Request +3