{ "name": "TEMPLATE Neos Brand Guard Workflow", "nodes": [ { "parameters": { "jsCode": "/**\n * @typedef {Object} NodeContextPathDto\n * @property {string} identifier - Unique node identifier\n * @property {string} path - Full context path\n * @property {string} workspace - Workspace name\n * @property {Object} dimensions - Dimensions map\n */\n\n/**\n * @typedef {Object} NodeChangeDto\n * @property {NodeContextPathDto} nodeContextPath\n * @property {string} name - Node name\n * @property {\"created\"|\"updated\"|\"removed\"} changeType\n * @property {Object|null} propertiesBefore\n * @property {Object|null} propertiesAfter\n */\n\n/**\n * @typedef {Object} NodeChangeDtoWithChanges\n * @property {NodeContextPathDto} nodeContextPath\n * @property {string} id - New AI-friendly id\n * @property {string} name - Node name\n * @property {\"created\"|\"updated\"|\"removed\"} changeType\n * @property {Object|null} propertiesBefore\n * @property {Object|null} propertiesAfter\n * @property {Object<[propName: string], any>} changedProperties\n */\n\n/**\n * @typedef {Object} WorkspacePublishedDto\n * @property {string} event\n * @property {string} workspaceName\n * @property {NodeChangeDto[]} changes\n */\n\n/**\n * Processes the DTO to determine created/updated changes\n * and extract new/changed properties per node.\n * \n * @param {WorkspacePublishedDto} workspacePublishedDto\n * @returns {{\n * changedTextPerNode: NodeChangeDtoWithChanges[],\n * workspacePublishedDto: WorkspacePublishedDto\n * }}\n */\nfunction processWorkspaceDto(workspacePublishedDto) {\n /** @type {NodeChangeDtoWithChanges[]} */\n const changedTextPerNode = [];\n\n workspacePublishedDto.changes.forEach(change => {\n const { propertiesBefore, propertiesAfter } = change;\n\n if (!propertiesAfter) {\n // nothing to store if removed\n return;\n }\n\n // Determine changed props\n if (!propertiesBefore) {\n // created node: all properties are new\n changedTextPerNode.push({...change, id: changedTextPerNode.length, changedProperties: propertiesAfter});\n } else {\n /** @type {{[propName: string]: any}} */\n const diffs = {};\n Object.keys(propertiesAfter).forEach(key => {\n if (propertiesBefore[key] !== propertiesAfter[key]) {\n diffs[key] = propertiesAfter[key];\n }\n });\n if (Object.keys(diffs).length > 0) {\n changedTextPerNode.push({...change, id: changedTextPerNode.length, changedProperties: diffs});\n }\n }\n });\n\n return {\n changedTextPerNode,\n workspacePublishedDto\n };\n}\n\n/**\nExample usage\nconst data = {\n \"event\": \"WorkspacePublished\",\n \"workspaceName\": \"live\",\n \"changes\": [\n {\n \"nodeContextPath\": {\n \"identifier\": \"d90631f8-ff7a-4ae3-a7c1-0599a9a0540e\",\n \"path\": \"/sites/site/main/node-ud5iz97vjp8rd/content/node-fglho1gfw0cia\",\n \"workspace\": \"live\",\n \"dimensions\": {\n \"language\": [\n \"en\"\n ]\n }\n },\n \"name\": \"node-fglho1gfw0cia\",\n \"changeType\": \"updated\",\n \"propertiesBefore\": {\n \"size\": \"h1\",\n \"title\": \"A fully editable frontend setup for Neos CMS with Next.Js\",\n \"hierarchy\": \"h2\",\n \"marginMobile\": \"topExtraSmall\"\n },\n \"propertiesAfter\": {\n \"size\": \"h1\",\n \"title\": \"A fuly editable frontend setup for Neos CMS with Next.Js\",\n \"hierarchy\": \"h2\",\n \"marginMobile\": \"topExtraSmall\"\n }\n },\n {\n \"nodeContextPath\": {\n \"identifier\": \"05873ed8-2cd9-443b-a999-508623cdf968\",\n \"path\": \"/sites/site/main/node-ud5iz97vjp8rd/content/node-b3lcafm2fg4vy\",\n \"workspace\": \"live\",\n \"dimensions\": {\n \"language\": [\n \"en\"\n ]\n }\n },\n \"name\": \"node-b3lcafm2fg4vy\",\n \"changeType\": \"created\",\n \"propertiesBefore\": null,\n \"propertiesAfter\": {\n \"text\": \"

This text is new and has tha small error.

\"\n }\n },\n {\n \"nodeContextPath\": {\n \"identifier\": \"6b6b7306-a285-4863-b11f-5fde23bcbd88\",\n \"path\": \"/sites/site/main/node-ud5iz97vjp8rd/content/node-0ga9uvds77w5m\",\n \"workspace\": \"live\",\n \"dimensions\": {\n \"language\": [\n \"en\"\n ]\n }\n },\n \"name\": \"node-0ga9uvds77w5m\",\n \"changeType\": \"removed\",\n \"propertiesBefore\": {\n \"text\": \"

This will be deleted.

\"\n },\n \"propertiesAfter\": null\n }\n ]\n };\n\nconst result = processWorkspaceDto(data);\nconsole.log(result);\n*/\n\nreturn [{ json: processWorkspaceDto($('NeosWorkspacePublished').first().json.body) }];" }, "name": "Extract changed properties", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -1520, -120 ], "id": "2559aecb-c123-42a7-8238-aaa5f9a3f1f1" }, { "parameters": { "modelId": { "__rl": true, "value": "o4-mini-2025-04-16", "mode": "list", "cachedResultName": "O4-MINI-2025-04-16" }, "messages": { "values": [ { "content": "=# BRAND VOICE\n\nNEOSidekick is developer-focused. Avoid using the word \"generic\".\n\n\n# CHANGES\n```\n{{ JSON.stringify($json.changedTextPerNode.map(({id, changedProperties}) => ({id, changedProperties})), undefined, 2) }}\n\n# CONTEXT\nThis is everything the user changed\n```\n{{ JSON.stringify($('NeosWorkspacePublished').item.json.body.changes.map(item => ({...item, name: undefined, nodeContextPath: undefined})), undefined, 2) }}\n```\n\n# OUTPUT FORMAT\nAnswer with a JSON in following structure:\n\"changes\": object Same structure as CHANGES, but only with the values that need spelling or grammar correction, or that need to be adopted to match the BRAND VOICE based on the provided BRAND VOICE document only. Keep any HTML code and ids as before. If no corrections are needed, return an empty JSON object {}.\n\"changes-explained\": string A Markdown list of what was text was changed and based on which BRAND VOICE rule. Omit mentions of the keys or ids.\n\nStrictly output valid JSON only without any additional text." } ] }, "jsonOutput": true, "options": {} }, "type": "@n8n/n8n-nodes-langchain.openAi", "typeVersion": 1.8, "position": [ -980, -120 ], "id": "017da12f-49c0-415f-92ef-05773c819131", "name": "OpenAI", "retryOnFail": true, "notesInFlow": false, "credentials": {} }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "946d53c5-96da-4cae-ad39-167759d49ecc", "leftValue": "={{ $json.message.content }}", "rightValue": "", "operator": { "type": "object", "operation": "notEmpty", "singleValue": true } } ], "combinator": "and" }, "options": {} }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ -540, -120 ], "id": "d4ac3800-51bb-4430-b37a-cec51f893b0d", "name": "If has corrections" }, { "parameters": { "conditions": { "string": [ { "value1": "={{ $json.NEOS_CMS_URL }}", "operation": "notEqual", "value2": "https://example.net" } ] } }, "name": "If Neos URL is configured", "type": "n8n-nodes-base.if", "typeVersion": 1, "position": [ -1760, -120 ], "id": "dd40f3c8-e22a-4837-bd20-c046d01acba0" }, { "parameters": { "errorMessage": "Please configure your Neos website base uri as $vars.NEOS_CMS_URL " }, "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [ -1760, 40 ], "id": "2d9ceeb2-52e6-4294-a644-d398446f1257", "name": "Stop and Error" }, { "parameters": { "conditions": { "boolean": [ { "value1": "={{ Object.keys($json.changedTextPerNode).length > 0 }}", "value2": true } ] } }, "name": "IF has property changes?", "type": "n8n-nodes-base.if", "typeVersion": 1, "position": [ -1340, -120 ], "id": "c540916c-9ce8-4da3-8d04-610e3842e54c" }, { "parameters": { "content": "## If someone published to live in Neos and there are edits\n[Guide](https://neosidekick.com/n8n-integration)", "height": 440, "width": 1140, "color": 6 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -2280, -240 ], "id": "7469ed70-4cbb-4598-accf-c5aca09e3b67", "name": "Sticky Note" }, { "parameters": { "content": "## Ask AI to correct\n## EDIT THIS FOR YOUR OWN USE CASE", "height": 440, "width": 820, "color": 6 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -1100, -240 ], "id": "d3658c71-8db0-4358-b428-78a7c4f22d19", "name": "Sticky Note3" }, { "parameters": { "content": "## Update on Slack", "height": 440, "width": 820, "color": 6 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -1100, 240 ], "id": "739e4a5e-441b-4ad0-aa3c-24b5f034f7ef", "name": "Sticky Note4" }, { "parameters": { "modelId": { "__rl": true, "value": "gpt-4.1", "mode": "list", "cachedResultName": "GPT-4.1" }, "messages": { "values": [ { "content": "=Please summarize the content changes on the website in 1–2 sentences in text for a Slack message to keep the team informed about the website content. Keep it brief, no intro or outro.\n\nThese are the things the editor changed:\n{{ JSON.stringify($('NeosWorkspacePublished').item.json.body.changes.map(item => ({...item, name: undefined, nodeContextPath: undefined})), undefined, 2) }}" } ] }, "options": {} }, "type": "@n8n/n8n-nodes-langchain.openAi", "typeVersion": 1.8, "position": [ -940, 420 ], "id": "89a2c776-8eef-41b7-b9fb-f905a27dfbd4", "name": "OpenAI1", "credentials": {} }, { "parameters": { "authentication": "oAuth2", "select": "channel", "channelId": { "__rl": true, "value": "C08TL5HFJ3A", "mode": "list", "cachedResultName": "neos-n8n-demo" }, "text": "=â„šī¸ *Content Update:*\n{{ $json.message.content }}", "otherOptions": { "includeLinkToWorkflow": false } }, "type": "n8n-nodes-base.slack", "typeVersion": 2.3, "position": [ -540, 420 ], "id": "e455e05c-2284-46a7-86b4-685a8f04a09c", "name": "Slack1", "webhookId": "b2133b7b-199a-4aa3-b5a5-cb8da305e064", "credentials": {} }, { "parameters": { "content": "## Create a content PR as workspace", "height": 440, "width": 1080, "color": 6 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -240, -240 ], "id": "37aa8b4b-6774-4304-bd51-fb22c8f24eb0", "name": "Sticky Note6" }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "leftValue": "={{ $json.data.approved }}", "rightValue": "", "operator": { "type": "boolean", "operation": "true", "singleValue": true }, "id": "b13a129b-f08f-4264-be15-799c6b340cee" } ], "combinator": "and" }, "renameOutput": true, "outputKey": "approved" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "8f2a5312-f5d6-4017-a6e0-cc63281d30c0", "leftValue": "={{ $json.data.approved }}", "rightValue": "", "operator": { "type": "boolean", "operation": "false", "singleValue": true } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "declined" } ] }, "options": {} }, "type": "n8n-nodes-base.switch", "typeVersion": 3.2, "position": [ 1180, -120 ], "id": "9e36db27-53b7-42ef-9ba3-445cf1fcdbe8", "name": "Switch" }, { "parameters": { "authentication": "headerAuth", "requestMethod": "POST", "url": "={{ $('Variables').item.json.NEOS_TOOL_API }}", "jsonParameters": true, "options": {}, "bodyParametersJson": "={\"name\": \"PublishAndDeleteWorkspace\", \"arguments\": {\"workspaceName\": \"{{ $('Create Workspace').item.json.content.workspaceName}}\" }}" }, "name": "Publish and Delete Workspace", "type": "n8n-nodes-base.httpRequest", "typeVersion": 1, "position": [ 1440, -200 ], "id": "1268d3a4-035e-4fea-8f00-1051c2190062", "credentials": {}, "continueOnFail": true }, { "parameters": { "authentication": "headerAuth", "requestMethod": "POST", "url": "={{ $('Variables').item.json.NEOS_TOOL_API }}", "jsonParameters": true, "options": {}, "bodyParametersJson": "={\"name\": \"DiscardAndDeleteWorkspace\", \"arguments\": {\"workspaceName\": \"{{ $('Create Workspace').item.json.content.workspaceName}}\"}}" }, "name": "Discard Workspace", "type": "n8n-nodes-base.httpRequest", "typeVersion": 1, "position": [ 1440, 0 ], "id": "c8e3d038-31ce-4d10-a961-0271ecad7c45", "credentials": {}, "continueOnFail": true }, { "parameters": { "authentication": "oAuth2", "operation": "sendAndWait", "select": "channel", "channelId": { "__rl": true, "value": "C08TL5HFJ3A", "mode": "list", "cachedResultName": "neos-n8n-demo" }, "message": "=📝 *AI recommendations:*\n{{ $('OpenAI').first().json.message.content['changes-explained'] }}\n\n*👀 Review:* <{{ $('Variables').first().json.NEOS_CMS_URL }}/neos/management/workspaces?moduleArguments%5B%40package%5D=neos.neos&moduleArguments%5B%40controller%5D=module%5Cmanagement%5Cworkspaces&moduleArguments%5B%40action%5D=show&moduleArguments%5B%40format%5D=html&moduleArguments%5Bworkspace%5D%5B__identity%5D={{ $('Create Workspace').first().json.content.workspaceName }}&moduleArguments%5B%40subpackage%5D=|Open Workspace>", "approvalOptions": { "values": { "approvalType": "double", "approveLabel": "Approve to publish", "disapproveLabel": "Decline to discard" } }, "options": { "appendAttribution": false } }, "type": "n8n-nodes-base.slack", "typeVersion": 2.3, "position": [ 980, -120 ], "id": "7c4fde58-194f-4901-a3b2-e3d0d8205e1a", "name": "Slack", "webhookId": "7a02845c-8e34-4897-af28-4306e4da3a9a", "credentials": {} }, { "parameters": { "httpMethod": "POST", "path": "a6a1fb07-401f-4d7a-a4f5-fb41d7a5625a", "options": {} }, "name": "NeosWorkspacePublished", "type": "n8n-nodes-base.webhook", "typeVersion": 1, "position": [ -2220, -120 ], "id": "993a81be-aa15-453d-8097-9aaba105b2a5", "webhookId": "a6a1fb07-401f-4d7a-a4f5-fb41d7a5625a" }, { "parameters": { "jsCode": "// const NEOS_CMS_URL: 'https://example.net';\n// const NEOS_CMS_URL = 'https://rested-pheasant-vocal.ngrok-free.app';\nconst NEOS_CMS_URL = 'https://ai-agents-conf-talk.neosidekick.com';\n \nreturn {\n NEOS_CMS_URL,\n NEOS_TOOL_API: NEOS_CMS_URL + '/neosidekick/mcp/tools/call',\n};" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ -2000, -120 ], "id": "5cd00008-3aef-440f-888f-ce4efa2510ec", "name": "Variables" }, { "parameters": { "options": {} }, "type": "n8n-nodes-base.splitInBatches", "typeVersion": 3, "position": [ 440, -120 ], "id": "3b568425-6c54-40a5-a2cf-8d8a243f7175", "name": "Loop Over Items" }, { "parameters": { "method": "POST", "url": "={{ $('Variables').item.json.NEOS_TOOL_API }}", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "name", "value": "=CreateWorkspace" }, { "name": "arguments", "value": "={{ {workspaceName: 'BrandGuard'} }}" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ -200, -120 ], "id": "3caa111c-f9bd-4b7e-9c05-056dbbfc1c19", "name": "Create Workspace", "credentials": {} }, { "parameters": { "method": "POST", "url": "={{ $('Variables').item.json.NEOS_TOOL_API }}", "authentication": "genericCredentialType", "genericAuthType": "httpHeaderAuth", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "name", "value": "UpdateNodeProperties" }, { "name": "arguments", "value": "={{ ({\n \"nodeContextPath\": {\n \"nodePath\": $('Extract changed properties').item.json.changedTextPerNode.find(item => item.id === $json.id).nodeContextPath.path,\n \"workspaceName\": $('Create Workspace').item.json.content.workspaceName,\n \"dimensions\": $('Extract changed properties').item.json.changedTextPerNode.find(item => item.id === $json.id).nodeContextPath.dimensions,\n },\n \"updatedProperties\": $json.changedProperties\n }) }}" } ] }, "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 620, -120 ], "id": "4ac6493c-fd4f-4c40-be55-349b318d0645", "name": "UpdateNodeProperties", "credentials": {} }, { "parameters": { "fieldToSplitOut": "changes", "options": {} }, "type": "n8n-nodes-base.splitOut", "typeVersion": 1, "position": [ 240, -120 ], "id": "ef8d7cc0-13ae-4689-91ab-0bb481c3c2bc", "name": "Split Out" }, { "parameters": { "jsCode": "// Create Workspace was the last result, so let's get the OpenAI result again as last result\nreturn $('OpenAI').first().json.message.content" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 20, -120 ], "id": "53da6c54-7dfa-42c3-b00f-13dfd14f867f", "name": "GetChangesList" }, { "parameters": { "content": "## Get approval via Slack", "height": 440, "width": 780, "color": 6 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ 880, -240 ], "id": "05464f17-e6fd-4c43-b863-de31a9695626", "name": "Sticky Note7" } ], "pinData": { "NeosWorkspacePublished": [ { "json": { "headers": { "host": "neosidekick.app.n8n.cloud", "user-agent": "GuzzleHttp/7", "content-length": "1434", "accept-encoding": "gzip, br", "cdn-loop": "cloudflare; loops=1; subreqs=1", "cf-connecting-ip": "2a00:b580:8000:11:44e8:ab80:816:77b4", "cf-ew-via": "15", "cf-ipcountry": "DE", "cf-ray": "950ca675b3e3693f-FRA", "cf-visitor": "{\"scheme\":\"https\"}", "cf-worker": "n8n.cloud", "content-type": "application/json", "x-forwarded-for": "2a00:b580:8000:11:44e8:ab80:816:77b4, 162.158.86.167", "x-forwarded-host": "neosidekick.app.n8n.cloud", "x-forwarded-port": "443", "x-forwarded-proto": "https", "x-forwarded-server": "traefik-prod-users-gwc-52-6c4f4684d5-4lbkw", "x-is-trusted": "yes", "x-real-ip": "2a00:b580:8000:11:44e8:ab80:816:77b4" }, "params": {}, "query": {}, "body": { "event": "WorkspacePublished", "workspaceName": "live", "changes": [ { "nodeContextPath": { "identifier": "828714e1-285b-4e33-81dc-e60f8e02c5d2", "path": "/sites/site/main/node-n528x9wdqeai4", "workspace": "live", "dimensions": { "language": [ "de" ] } }, "name": "node-n528x9wdqeai4", "changeType": "created", "propertiesBefore": null, "propertiesAfter": { "jumpMarkerTitle": "", "spaceBelow": "medium", "containerWidth": "medium", "text": "

This is a new text with a smal error.

", "textAlign": "left" } }, { "nodeContextPath": { "identifier": "875bb655-2a28-45bd-83c7-6b8698f545cd", "path": "/sites/site/main/node-kc6aivxc7o446", "workspace": "live", "dimensions": { "language": [ "de" ] } }, "name": "node-kc6aivxc7o446", "changeType": "removed", "propertiesBefore": { "jumpMarkerTitle": "", "spaceBelow": "medium", "containerWidth": "medium", "text": "

This will be deleted.

", "textAlign": "left" }, "propertiesAfter": null }, { "nodeContextPath": { "identifier": "9f267b31-d78f-4e7d-8fbb-b3c423799867", "path": "/sites/site", "workspace": "live", "dimensions": { "language": [ "de" ] } }, "name": "site", "changeType": "updated", "propertiesBefore": { "uriPathSegment": "site", "heroTitle": "Letting Editors Go Wild with AI Agents", "heroText": "", "heroSpaceBelow": "medium", "footerInfo": "", "title": "Site" }, "propertiesAfter": { "uriPathSegment": "site", "heroTitle": "Leeting Editors Go Wild with AI Agents", "heroText": "", "heroSpaceBelow": "medium", "footerInfo": "", "title": "Site" } } ] }, "webhookUrl": "https://neosidekick.app.n8n.cloud/webhook-test/neos-workspace-published", "executionMode": "test" } } ] }, "connections": { "Extract changed properties": { "main": [ [ { "node": "IF has property changes?", "type": "main", "index": 0 } ] ] }, "OpenAI": { "main": [ [ { "node": "If has corrections", "type": "main", "index": 0 } ] ] }, "If has corrections": { "main": [ [ { "node": "Create Workspace", "type": "main", "index": 0 } ], [] ] }, "If Neos URL is configured": { "main": [ [ { "node": "Extract changed properties", "type": "main", "index": 0 } ], [ { "node": "Stop and Error", "type": "main", "index": 0 } ] ] }, "IF has property changes?": { "main": [ [ { "node": "OpenAI", "type": "main", "index": 0 }, { "node": "OpenAI1", "type": "main", "index": 0 } ], [] ] }, "OpenAI1": { "main": [ [ { "node": "Slack1", "type": "main", "index": 0 } ] ] }, "Switch": { "main": [ [ { "node": "Publish and Delete Workspace", "type": "main", "index": 0 } ], [ { "node": "Discard Workspace", "type": "main", "index": 0 } ] ] }, "Publish and Delete Workspace": { "main": [ [] ] }, "Slack": { "main": [ [ { "node": "Switch", "type": "main", "index": 0 } ] ] }, "NeosWorkspacePublished": { "main": [ [ { "node": "Variables", "type": "main", "index": 0 } ] ] }, "Variables": { "main": [ [ { "node": "If Neos URL is configured", "type": "main", "index": 0 } ] ] }, "Loop Over Items": { "main": [ [ { "node": "Slack", "type": "main", "index": 0 } ], [ { "node": "UpdateNodeProperties", "type": "main", "index": 0 } ] ] }, "Create Workspace": { "main": [ [ { "node": "GetChangesList", "type": "main", "index": 0 } ] ] }, "UpdateNodeProperties": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Split Out": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "GetChangesList": { "main": [ [ { "node": "Split Out", "type": "main", "index": 0 } ] ] } }, "active": false, "settings": { "executionOrder": "v1", "saveExecutionProgress": true, "callerPolicy": "workflowsFromSameOwner" }, "versionId": "e6c6f653-9b66-44af-91db-e5cd51683a5d", "meta": { "templateCredsSetupCompleted": true, "instanceId": "9bc5a79e0441d615cc47b3ed9bdf0af9ffe75c08ab48613a2b020fed53c3e812" }, "id": "G2AXhwOkow6fvx22", "tags": [] }