{"name":"Use Redis To Rate Limit Your Low Code Api","nodes":[{"name":"Airtable","type":"n8n-nodes-base.airtable","position":[1650,300],"parameters":{"table":"Pokemon","operation":"list","additionalOptions":{}},"credentials":{"airtableApi":{"id":"REPLACE_WITH_YOUR_CREDENTIAL","name":"airtableApi, set in n8n"}},"typeVersion":1},{"name":"Redis","type":"n8n-nodes-base.redis","position":[600,600],"parameters":{"key":"={{$json[\"apiKey\"]}}","ttl":3600,"expire":true,"operation":"incr"},"credentials":{"redis":{"id":"REPLACE_WITH_YOUR_CREDENTIAL","name":"redis, set in n8n"}},"typeVersion":1},{"name":"Redis1","type":"n8n-nodes-base.redis","position":[1200,450],"parameters":{"key":"={{$json[\"apiKey\"]}}","operation":"incr"},"credentials":{"redis":{"id":"REPLACE_WITH_YOUR_CREDENTIAL","name":"redis, set in n8n"}},"typeVersion":1},{"name":"Set1","type":"n8n-nodes-base.set","position":[1600,550],"parameters":{"values":{"string":[{"name":"message","value":"You exceeded your limit"}]},"options":{},"keepOnlySet":true},"typeVersion":1},{"name":"Webhook1","type":"n8n-nodes-base.webhook","position":[200,600],"webhookId":"50fea7b7-42e9-4ad0-9754-a1453cb5891b","parameters":{"path":"a3167ed7-98d2-422c-bfe2-e3ba599d19f1","options":{},"responseMode":"lastNode","authentication":"headerAuth"},"credentials":{"httpHeaderAuth":{"id":"REPLACE_WITH_YOUR_CREDENTIAL","name":"httpHeaderAuth, set in n8n"}},"typeVersion":1},{"name":"Function","type":"n8n-nodes-base.function","position":[1900,300],"parameters":{"functionCode":" const limit = `Limit consumed: `+ $node['Redis1'].json[$node[\"Set2\"].json[\"apiKey\"]];\n return [\n  {\n    json: {\n      message:limit,\n      body: items.map(item => {\n        const name= item.json.fields.name\n        const url= item.json.fields.url\n        return {name,url}\n      })\n    }\n  }\n]\n"},"typeVersion":1},{"name":"Set","type":"n8n-nodes-base.set","position":[400,600],"parameters":{"values":{"string":[{"name":"apiKey","value":"={{$json[\"headers\"][\"x-api-key\"] +'-'+ new Date().getHours() +'-'+ new Date().getMinutes()}}"}]},"options":{},"keepOnlySet":true},"typeVersion":1},{"name":"Set2","type":"n8n-nodes-base.set","position":[1000,450],"parameters":{"values":{"string":[{"name":"apiKey","value":"={{$node['Webhook1'].json[\"headers\"][\"x-api-key\"] +'-'+ new Date().getHours()}}"}]},"options":{},"keepOnlySet":true},"typeVersion":1},{"name":"Set3","type":"n8n-nodes-base.set","position":[1000,700],"parameters":{"values":{"string":[{"name":"message","value":"You exceeded your limit"}]},"options":{},"keepOnlySet":true},"typeVersion":1},{"name":"Per hour","type":"n8n-nodes-base.if","position":[1400,450],"parameters":{"conditions":{"number":[{"value1":"={{$json[$node[\"Set2\"].json[\"apiKey\"]]}}","value2":60}],"string":[]}},"typeVersion":1},{"name":"Per minute","type":"n8n-nodes-base.if","position":[800,600],"parameters":{"conditions":{"number":[{"value1":"={{$json[$node[\"Set\"].json[\"apiKey\"]]}}","value2":10,"operation":"smallerEqual"}]}},"typeVersion":1},{"id":"b8d8a079-2ab0-4390-bc84-690a3da19079","name":"Set - Audit Trail","type":"n8n-nodes-base.set","position":[320,120],"parameters":{"options":{},"assignments":{"assignments":[{"id":"058ad1e5-7838-491e-bc99-bf715cd707f9","name":"timestamp","type":"string","value":"={{ $now }}"},{"id":"b55eaf38-96b0-44fe-bb3c-339091ab8382","name":"execution_id","type":"string","value":"={{ $execution.id }}"}]}},"typeVersion":3.4},{"id":"68806a3b-0f45-43ac-b5c8-e33c5da7ef9b","name":"Google Sheets - Audit Log","type":"n8n-nodes-base.googleSheets","position":[460,120],"parameters":{"columns":{"mapping":[{"value":"={{ $now }}","column":"Timestamp"},{"value":"={{ $json.event || 'run' }}","column":"Event"},{"value":"={{ $execution.id }}","column":"Execution ID"}],"mappingMode":"defineBelow"},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"id","value":"Logs"},"documentId":{"__rl":true,"mode":"id","value":"YOUR_SHEET_ID"}},"credentials":{"googleSheetsOAuth2Api":{"id":"REPLACE_WITH_YOUR_CREDENTIAL","name":"googleSheetsOAuth2Api, set in n8n"}},"typeVersion":4.4},{"id":"f4c74576-1c35-4fd4-a8e7-1b7c9a1379f3","name":"Slack - Error Alerts","type":"n8n-nodes-base.slack","position":[460,260],"parameters":{"text":"⚠️ 1236 Use Redis To Rate Limit Your Low Code Api Error: {{ $json.error }} at {{ $now }}","channel":"={{ $env.SLACK_ERROR_CHANNEL }}","otherOptions":{}},"credentials":{"slackApi":{"id":"REPLACE_WITH_YOUR_CREDENTIAL","name":"slackApi, set in n8n"}},"typeVersion":2.1},{"id":"89ed859e-19b1-4455-959f-a4414727a73a","name":"Wait - Rate Limit","type":"n8n-nodes-base.wait","position":[600,120],"parameters":{"unit":"seconds","amount":1},"typeVersion":1.1}],"connections":{"Set":{"main":[[{"node":"Redis","type":"main","index":0}]]},"Set2":{"main":[[{"node":"Redis1","type":"main","index":0}]]},"Redis":{"main":[[{"node":"Per minute","type":"main","index":0}]]},"Redis1":{"main":[[{"node":"Per hour","type":"main","index":0}]]},"Airtable":{"main":[[{"node":"Function","type":"main","index":0}]]},"Per hour":{"main":[[{"node":"Airtable","type":"main","index":0}],[{"node":"Set1","type":"main","index":0}]]},"Webhook1":{"main":[[{"node":"Set","type":"main","index":0}]]},"Per minute":{"main":[[{"node":"Set2","type":"main","index":0}],[{"node":"Set3","type":"main","index":0}]]},"Set - Audit Trail":{"main":[[{"node":"Google Sheets - Audit Log","type":"main","index":0}]]},"Google Sheets - Audit Log":{"main":[[{"node":"Wait - Rate Limit","type":"main","index":0}]]}},"pinData":{},"settings":{"executionOrder":"v1"},"meta":{"instanceId":"danielgrey.shop","author":"Daniel Grey","createdBy":"Daniel Grey"},"author":"Daniel Grey"}