{"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":"960f0c92-cd18-4170-b7cc-be4efa449f47","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":"Format Limit Message","type":"n8n-nodes-base.code","position":[1900,300],"parameters":{"jsCode":"const apiKey = $('Set2').first().json.apiKey;\nconst consumed = $('Redis1').first().json[apiKey];\nconst body = $input.all().map((item) => {\n  const fields = item.json.fields || {};\n  return { name: fields.name, url: fields.url };\n});\nreturn [{ json: { message: `Limit consumed: ${consumed}`, body } }];"},"typeVersion":2},{"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":"={{$('Webhook1').first().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[$('Set2').first().json[\"apiKey\"]]}}","value2":60}],"string":[]}},"typeVersion":1},{"name":"Per minute","type":"n8n-nodes-base.if","position":[800,600],"parameters":{"conditions":{"number":[{"value1":"={{$json[$('Set').first().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":"Format Limit Message","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"}