[{"data":1,"prerenderedAt":561},["ShallowReactive",2],{"node-red-\u002Fnode-red\u002Fintegration-technologies\u002Frest":3},{"id":4,"title":5,"body":6,"description":553,"extension":554,"meta":555,"navigation":556,"path":557,"seo":558,"stem":559,"__hash__":560},"nodeRed\u002Fnode-red\u002Fintegration-technologies\u002Frest.md","Creating REST API's with Node-RED",{"type":7,"value":8,"toc":538},"minimark",[9,17,21,26,47,52,56,73,76,79,82,93,97,100,105,108,124,127,148,152,159,168,171,175,178,182,185,285,288,292,299,305,316,320,323,330,333,336,339,347,354,370,381,388,392,400,411,423,437,447,453,456,461,477,487,494,497,503,507,519,531,534],[10,11,13],"h1",{"id":12},"",[14,15],"binding",{"value":16},"meta.title",[18,19,20],"p",{},"REST APIs are how applications talk to each other over the web. They use standard HTTP methods (GET, POST, PUT, DELETE) to send and receive data, usually in JSON format. This guide shows you how to build your own REST APIs in Node-RED and how to pull data from existing APIs.",[22,23,25],"h2",{"id":24},"creating-a-get-api","Creating a GET API",[27,28,29,33,41,44],"ol",{},[30,31,32],"li",{},"Drag an \"http-in\" onto the workspace, double click on it and select the Method to for which operation you need, set URL endpoint.",[30,34,35,36,40],{},"Drag an chagne node onto the workspace and set the ",[37,38,39],"code",{},"msg.payload"," to data you want to send as response.",[30,42,43],{},"Then Drag an http response node, in it and set the status code if want.",[30,45,46],{},"Connect the \"http-in\" node's output to the input of the function node and the function node's output to the input of the http response node.",[48,49],"render-flow",{":height":50,"flow":51},"200","W3siaWQiOiIyNzMzM2Y2Nzc5NGJkYzcyIiwidHlwZSI6Imh0dHAgaW4iLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiIiLCJ1cmwiOiIvdGVzdCIsIm1ldGhvZCI6ImdldCIsInVwbG9hZCI6ZmFsc2UsInN3YWdnZXJEb2MiOiIiLCJ4IjozMjAsInkiOjIyMCwid2lyZXMiOltbImYzNTEwMzMyMjY5NTMxNTAiXV19LHsiaWQiOiJhN2VlNDg2MTY1NDFhMzZhIiwidHlwZSI6Imh0dHAgcmVzcG9uc2UiLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiIiLCJzdGF0dXNDb2RlIjoiMjAwIiwiaGVhZGVycyI6e30sIngiOjc2MCwieSI6MjIwLCJ3aXJlcyI6W119LHsiaWQiOiJkY2ZjOGQxMTI2ZjEzOWQ1IiwidHlwZSI6ImNvbW1lbnQiLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiJIdHRwLWluIG5vZGUgY3JlYXRlZCBBUEkgc2VuZGluZyB0b2RvIGxpc3QgYXMgcmVzcG9uc2UiLCJpbmZvIjoiIiwieCI6NTQwLCJ5IjoxNDAsIndpcmVzIjpbXX0seyJpZCI6ImYzNTEwMzMyMjY5NTMxNTAiLCJ0eXBlIjoiY2hhbmdlIiwieiI6Ijk3NzE0M2VkYjA5N2I2ODUiLCJuYW1lIjoiIiwicnVsZXMiOlt7InQiOiJzZXQiLCJwIjoicGF5bG9hZCIsInB0IjoibXNnIiwidG8iOiJ0b2RvcyIsInRvdCI6Imdsb2JhbCJ9XSwiYWN0aW9uIjoiIiwicHJvcGVydHkiOiIiLCJmcm9tIjoiIiwidG8iOiIiLCJyZWciOmZhbHNlLCJ4Ijo1NDAsInkiOjIyMCwid2lyZXMiOltbImE3ZWU0ODYxNjU0MWEzNmEiXV19XQ==",[22,53,55],{"id":54},"creating-a-post-put-and-delete-api","Creating a POST, PUT, and DELETE API",[27,57,58,61,67,70],{},[30,59,60],{},"Drag an \"HTTP In\" node onto the workspace. Double-click on it and select the desired method (POST, PUT, DELETE).",[30,62,63,64,66],{},"Add a node to the canvas based on your application's needs. For example, if you've selected DELETE, you may use a Change node to perform operations to delete data stored in Node-RED context. Set ",[37,65,39],{}," to the response data you want to send, make sure the msg.payload is originated from \"http-in\" node.",[30,68,69],{},"Drag an \"HTTP Response\" node onto the workspace. Configure it and set the status code if needed.",[30,71,72],{},"Connect the output of the \"HTTP In\" node to the input of the node handling your application logic (e.g., Change node for DELETE operation). Then, connect the output of this node to the input of the HTTP Response node.",[48,74],{":height":50,"flow":75},"W3siaWQiOiI4ODkzZmM4NGIzMzkxYjM0IiwidHlwZSI6Imh0dHAgaW4iLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiIiLCJ1cmwiOiIvdG9kby9kZWxldGUiLCJtZXRob2QiOiJkZWxldGUiLCJ1cGxvYWQiOnRydWUsInN3YWdnZXJEb2MiOiIiLCJ4IjoyNTAsInkiOjcyMCwid2lyZXMiOltbIjA4ODgwODQ4NDU4NmZkYzEiXV19LHsiaWQiOiIwNGE2MGU3YWY0ZDZkNTIyIiwidHlwZSI6Imh0dHAgcmVzcG9uc2UiLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiIiLCJzdGF0dXNDb2RlIjoiMjA0IiwiaGVhZGVycyI6e30sIngiOjc0MCwieSI6NzIwLCJ3aXJlcyI6W119LHsiaWQiOiIwODg4MDg0ODQ1ODZmZGMxIiwidHlwZSI6ImZ1bmN0aW9uIiwieiI6Ijk3NzE0M2VkYjA5N2I2ODUiLCJuYW1lIjoiRGVsZXRlIHRoZSB0b2RvIGl0ZW0iLCJmdW5jIjoibGV0IHRvZG9MaXN0ID0gZ2xvYmFsLmdldCgndG9kb3MnKSB8fCBbXTtcbmxldCBpZCA9IG1zZy5wYXlsb2FkLmlkO1xuXG4vLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byBkZWxldGVcbmxldCBpbmRleCA9IHRvZG9MaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IGlkKTtcblxuaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIC8vIFJlbW92ZSB0aGUgaXRlbSBmcm9tIHRoZSB0b2RvTGlzdCBhcnJheVxuICAgIHRvZG9MaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgZ2xvYmFsLnNldCgndG9kb3MnLCB0b2RvTGlzdCk7XG4gICAgbXNnLnBheWxvYWQgPSBcIkl0ZW0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuXCI7XG4gICAgbXNnLnN0YXR1c0NvZGUgPSAyMDQ7IC8vIE5vIENvbnRlbnRcbn0gZWxzZSB7XG4gICAgbXNnLnBheWxvYWQgPSBcIkl0ZW0gbm90IGZvdW5kLlwiO1xuICAgIG1zZy5zdGF0dXNDb2RlID0gNDA0OyAvLyBOb3QgRm91bmRcbn1cblxucmV0dXJuIG1zZztcbiIsIm91dHB1dHMiOjEsInRpbWVvdXQiOjAsIm5vZXJyIjowLCJpbml0aWFsaXplIjoiIiwiZmluYWxpemUiOiIiLCJsaWJzIjpbXSwieCI6NTIwLCJ5Ijo3MjAsIndpcmVzIjpbWyIwNGE2MGU3YWY0ZDZkNTIyIl1dfV0=",[48,77],{":height":50,"flow":78},"W3siaWQiOiI4MjVhNjI5NjQ1NmI3YzI3IiwidHlwZSI6Imh0dHAgaW4iLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiIiLCJ1cmwiOiIvdG9kbyIsIm1ldGhvZCI6InBvc3QiLCJ1cGxvYWQiOnRydWUsInN3YWdnZXJEb2MiOiIiLCJ4IjoyNjAsInkiOjE0NjAsIndpcmVzIjpbWyIwMTMzNDk0ODIxY2Y5OWNhIiwiOWZlNDg0MTA1MTQ2MzFmOCJdXX0seyJpZCI6IjAxMzM0OTQ4MjFjZjk5Y2EiLCJ0eXBlIjoiZGVidWciLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiJkZWJ1ZyAxIiwiYWN0aXZlIjp0cnVlLCJ0b3NpZGViYXIiOnRydWUsImNvbnNvbGUiOmZhbHNlLCJ0b3N0YXR1cyI6ZmFsc2UsImNvbXBsZXRlIjoidHJ1ZSIsInRhcmdldFR5cGUiOiJmdWxsIiwic3RhdHVzVmFsIjoiIiwic3RhdHVzVHlwZSI6ImF1dG8iLCJ4Ijo1NDAsInkiOjE0MjAsIndpcmVzIjpbXX0seyJpZCI6IjUyODRhMDYzNjVhN2Y4ZjciLCJ0eXBlIjoiaHR0cCByZXNwb25zZSIsInoiOiI5NzcxNDNlZGIwOTdiNjg1IiwibmFtZSI6IiIsInN0YXR1c0NvZGUiOiIyMDEiLCJoZWFkZXJzIjp7fSwieCI6ODYwLCJ5IjoxNTAwLCJ3aXJlcyI6W119LHsiaWQiOiI5ZmU0ODQxMDUxNDYzMWY4IiwidHlwZSI6ImZ1bmN0aW9uIiwieiI6Ijk3NzE0M2VkYjA5N2I2ODUiLCJuYW1lIjoic3RvcmUgdG9kbyBpbiB0b2RvbGlzdCAiLCJmdW5jIjoibGV0IHRvZG9MaXN0ID0gZ2xvYmFsLmdldCgndG9kb3MnKSB8fCBbXTtcbmxldCBuZXdUb2RvID0gbXNnLnBheWxvYWQ7XG5cbnRvZG9MaXN0LnB1c2gobmV3VG9kbyk7XG5nbG9iYWwuc2V0KCd0b2RvcycsdG9kb0xpc3QpXG5yZXR1cm4gbXNnOyIsIm91dHB1dHMiOjEsInRpbWVvdXQiOjAsIm5vZXJyIjowLCJpbml0aWFsaXplIjoiIiwiZmluYWxpemUiOiIiLCJsaWJzIjpbXSwieCI6NTYwLCJ5IjoxNTAwLCJ3aXJlcyI6W1siNTI4NGEwNjM2NWE3ZjhmNyJdXX1d",[48,80],{":height":50,"flow":81},"W3siaWQiOiI4ODkzZmM4NGIzMzkxYjM0IiwidHlwZSI6Imh0dHAgaW4iLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiIiLCJ1cmwiOiIvdG9kby91cGRhdGUiLCJtZXRob2QiOiJwdXQiLCJ1cGxvYWQiOnRydWUsInN3YWdnZXJEb2MiOiIiLCJ4Ijo0MDAsInkiOjI4MCwid2lyZXMiOltbIjA4ODgwODQ4NDU4NmZkYzEiXV19LHsiaWQiOiIwNGE2MGU3YWY0ZDZkNTIyIiwidHlwZSI6Imh0dHAgcmVzcG9uc2UiLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiIiLCJzdGF0dXNDb2RlIjoiMjAwIiwiaGVhZGVycyI6e30sIngiOjkwMCwieSI6MjgwLCJ3aXJlcyI6W119LHsiaWQiOiIwODg4MDg0ODQ1ODZmZGMxIiwidHlwZSI6ImZ1bmN0aW9uIiwieiI6Ijk3NzE0M2VkYjA5N2I2ODUiLCJuYW1lIjoidXBkYXRlIHRoZSB0b2RvIGl0ZW0iLCJmdW5jIjoibGV0IHRvZG9MaXN0ID0gZ2xvYmFsLmdldCgndG9kb3MnKSB8fCBbXTtcbmxldCBpZCA9IG1zZy5wYXlsb2FkLmlkO1xubGV0IG5ld1RvZG8gPSBtc2cucGF5bG9hZC5uZXd0b2RvO1xuXG4vLyBGaW5kIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbmxldCBpbmRleCA9IHRvZG9MaXN0LmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IGlkKTtcblxuaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIC8vIFVwZGF0ZSB0aGUgdG9kbyBpdGVtXG4gICAgdG9kb0xpc3RbaW5kZXhdLnRhc2sgPSBuZXdUb2RvO1xuICAgIGdsb2JhbC5zZXQoJ3RvZG9zJywgdG9kb0xpc3QpO1xuICAgIG1zZy5wYXlsb2FkID0gXCJJdGVtIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiO1xuICAgIG1zZy5zdGF0dXNDb2RlID0gMjAwOyAvLyBPS1xufSBlbHNlIHtcbiAgICBtc2cucGF5bG9hZCA9IFwiSXRlbSBub3QgZm91bmQuXCI7XG4gICAgbXNnLnN0YXR1c0NvZGUgPSA0MDQ7IC8vIE5vdCBGb3VuZFxufVxuXG5yZXR1cm4gbXNnO1xuIiwib3V0cHV0cyI6MSwidGltZW91dCI6MCwibm9lcnIiOjAsImluaXRpYWxpemUiOiIiLCJmaW5hbGl6ZSI6IiIsImxpYnMiOltdLCJ4Ijo2NjAsInkiOjI4MCwid2lyZXMiOltbIjA0YTYwZTdhZjRkNmQ1MjIiXV19LHsiaWQiOiJlYTNlN2U5NmJiY2NmNTMwIiwidHlwZSI6ImNvbW1lbnQiLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiJIdHRwIGluIG5vZGUgY3JlYXRlZCBhcGkgZm9yIHVwZGF0aW5nIHRoZSB0b2RvIGl0ZW0iLCJpbmZvIjoiIiwieCI6NjUwLCJ5IjoyMDAsIndpcmVzIjpbXX1d",[18,83,84,85,92],{},"For more details, refer to the ",[86,87,91],"a",{"href":88,"rel":89},"https:\u002F\u002Fflowfuse.com\u002Fblueprints\u002Fgetting-started\u002Fcrud\u002F",[90],"nofollow","CRUD API Blueprint",", where we have created CRUD APIs to store, retrieve, delete, and update the data from MongoDB database.",[22,94,96],{"id":95},"securing-your-apis","Securing Your APIs",[18,98,99],{},"APIs without security are open doors to your application. Here are essential practices for protecting your endpoints:",[101,102,104],"h3",{"id":103},"authentication","Authentication",[18,106,107],{},"The simplest approach is HTTP Basic Authentication. Add authentication to your http-in nodes:",[27,109,110,118,121],{},[30,111,112,113,117],{},"Open your ",[114,115,116],"strong",{},"http-in"," node",[30,119,120],{},"Enable \"Use authentication\"",[30,122,123],{},"Set a username and password",[18,125,126],{},"Node-RED will reject requests without valid credentials. For production systems, consider more robust options like:",[128,129,130,136,142],"ul",{},[30,131,132,135],{},[114,133,134],{},"API Keys",": Send a secret key in headers that your flow validates",[30,137,138,141],{},[114,139,140],{},"OAuth 2.0",": Industry-standard authorization for third-party access",[30,143,144,147],{},[114,145,146],{},"JWT Tokens",": Stateless authentication tokens that carry user information",[101,149,151],{"id":150},"rate-limiting","Rate Limiting",[18,153,154,155,158],{},"Prevent abuse by limiting how often someone can hit your endpoints. Use the ",[37,156,157],{},"node-red-contrib-rate-limit"," node to throttle requests:",[160,161,166],"pre",{"className":162,"code":164,"language":165},[163],"language-text","npm install node-red-contrib-rate-limit\n","text",[37,167,164],{"__ignoreMap":12},[18,169,170],{},"Place it after your http-in node to block excessive requests from the same source.",[101,172,174],{"id":173},"https-only","HTTPS Only",[18,176,177],{},"Never expose APIs over plain HTTP in production. Always use HTTPS to encrypt data in transit. If you're using FlowFuse, HTTPS is handled automatically. For self-hosted instances, configure Node-RED behind a reverse proxy (nginx, Apache) with SSL certificates.",[101,179,181],{"id":180},"input-validation","Input Validation",[18,183,184],{},"Always validate incoming data. Don't trust anything users send:",[160,186,190],{"className":187,"code":188,"language":189,"meta":12,"style":12},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F In a function node\nif (!msg.payload.id || typeof msg.payload.id !== 'string') {\n    msg.statusCode = 400;\n    msg.payload = { error: \"Invalid ID\" };\n    return msg;\n}\n","javascript",[37,191,192,201,237,253,270,279],{"__ignoreMap":12},[193,194,197],"span",{"class":195,"line":196},"line",1,[193,198,200],{"class":199},"sJ8bj","\u002F\u002F In a function node\n",[193,202,204,208,212,215,218,221,224,227,230,234],{"class":195,"line":203},2,[193,205,207],{"class":206},"szBVR","if",[193,209,211],{"class":210},"sVt8B"," (",[193,213,214],{"class":206},"!",[193,216,217],{"class":210},"msg.payload.id ",[193,219,220],{"class":206},"||",[193,222,223],{"class":206}," typeof",[193,225,226],{"class":210}," msg.payload.id ",[193,228,229],{"class":206},"!==",[193,231,233],{"class":232},"sZZnC"," 'string'",[193,235,236],{"class":210},") {\n",[193,238,240,243,246,250],{"class":195,"line":239},3,[193,241,242],{"class":210},"    msg.statusCode ",[193,244,245],{"class":206},"=",[193,247,249],{"class":248},"sj4cs"," 400",[193,251,252],{"class":210},";\n",[193,254,256,259,261,264,267],{"class":195,"line":255},4,[193,257,258],{"class":210},"    msg.payload ",[193,260,245],{"class":206},[193,262,263],{"class":210}," { error: ",[193,265,266],{"class":232},"\"Invalid ID\"",[193,268,269],{"class":210}," };\n",[193,271,273,276],{"class":195,"line":272},5,[193,274,275],{"class":206},"    return",[193,277,278],{"class":210}," msg;\n",[193,280,282],{"class":195,"line":281},6,[193,283,284],{"class":210},"}\n",[18,286,287],{},"Check data types, required fields, and acceptable values before processing.",[101,289,291],{"id":290},"cors-configuration","CORS Configuration",[18,293,294,295,298],{},"If your API is called from web browsers, configure CORS properly. Add an ",[114,296,297],{},"http response"," node and set headers:",[160,300,303],{"className":301,"code":302,"language":165},[163],"Access-Control-Allow-Origin: https:\u002F\u002Fyourdomain.com\nAccess-Control-Allow-Methods: GET, POST, PUT, DELETE\nAccess-Control-Allow-Headers: Content-Type, Authorization\n",[37,304,302],{"__ignoreMap":12},[18,306,307,308,311,312,315],{},"Never use ",[37,309,310],{},"*"," for ",[37,313,314],{},"Allow-Origin"," in production—specify exact domains.",[22,317,319],{"id":318},"example-reading-data","Example: Reading Data",[18,321,322],{},"Now that you've learned how to create REST APIs in Node-RED, let's explore an example of reading data using a HTTP GET request. This example will demonstrate how to fetch data from an external API and process it and display on dashboard chart.",[18,324,325,326,329],{},"For the example we will fetch the data of Node-RED Dashboard 2.0 Downloads from npm registry api.\n",[37,327,328],{},"https:\u002F\u002Fapi.npmjs.org\u002Fdownloads\u002Frange\u002Flast-month\u002F@flowforge\u002Fnode-red-dashboard",".",[18,331,332],{},"A simple flow to fetch data from npm registry  would be:",[48,334],{":height":50,"flow":335},"W3siaWQiOiIzMmIwODNkMGNhNjcyNjVmIiwidHlwZSI6ImluamVjdCIsInoiOiI5NzcxNDNlZGIwOTdiNjg1IiwibmFtZSI6IiIsInByb3BzIjpbeyJwIjoicGF5bG9hZCJ9LHsicCI6InRvcGljIiwidnQiOiJzdHIifV0sInJlcGVhdCI6IiIsImNyb250YWIiOiIiLCJvbmNlIjpmYWxzZSwib25jZURlbGF5IjowLjEsInRvcGljIjoiIiwicGF5bG9hZCI6IiIsInBheWxvYWRUeXBlIjoiZGF0ZSIsIngiOjI0MCwieSI6MTEwMCwid2lyZXMiOltbIjUzZGIxNGI5YTg0OGQ1Y2UiXV19LHsiaWQiOiI1M2RiMTRiOWE4NDhkNWNlIiwidHlwZSI6Imh0dHAgcmVxdWVzdCIsInoiOiI5NzcxNDNlZGIwOTdiNjg1IiwibmFtZSI6IiIsIm1ldGhvZCI6IkdFVCIsInJldCI6Im9iaiIsInBheXRvcXMiOiJpZ25vcmUiLCJ1cmwiOiJodHRwczovL2FwaS5ucG1qcy5vcmcvZG93bmxvYWRzL3JhbmdlL2xhc3QtbW9udGgvQGZsb3dmb3JnZS9ub2RlLXJlZC1kYXNoYm9hcmQiLCJ0bHMiOiIiLCJwZXJzaXN0IjpmYWxzZSwicHJveHkiOiIiLCJpbnNlY3VyZUhUVFBQYXJzZXIiOmZhbHNlLCJhdXRoVHlwZSI6IiIsInNlbmRlcnIiOmZhbHNlLCJoZWFkZXJzIjpbXSwieCI6NDEwLCJ5IjoxMTAwLCJ3aXJlcyI6W1siOWUwOGZhOGQyNWExOWYyNCJdXX0seyJpZCI6IjllMDhmYThkMjVhMTlmMjQiLCJ0eXBlIjoiZGVidWciLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiJkZWJ1ZyAxIiwiYWN0aXZlIjp0cnVlLCJ0b3NpZGViYXIiOnRydWUsImNvbnNvbGUiOmZhbHNlLCJ0b3N0YXR1cyI6ZmFsc2UsImNvbXBsZXRlIjoiZmFsc2UiLCJzdGF0dXNWYWwiOiIiLCJzdGF0dXNUeXBlIjoiYXV0byIsIngiOjU4MCwieSI6MTEwMCwid2lyZXMiOltdfV0=",[18,337,338],{},"Where we paste the API URL into the settings panel:",[18,340,341],{},[342,343],"img",{"alt":344,"src":345,"title":346},"\"HTTP GET URL setting\"","\u002Fnode-red-media\u002Fintegration-technologies\u002Fimages\u002Fhttp-get-npmapi.png","HTTP GET URL setting",[18,348,349,350,353],{},"When running this flow you'll see a blob of text in the ",[37,351,352],{},"Debug"," pane. This is a\ngreat first start, but a blob isn't useful for the rest of the flow.",[18,355,356,357,361,362,365,366,369],{},"We need to parse the data as JSON. While the ",[86,358,360],{"href":359},"\u002Fnode-red\u002Fcore-nodes\u002Fjson","JSON node","\nwould work, the HTTP request node can do this natively. Let ",[37,363,364],{},"a parsed JSON object","\nthe ",[37,367,368],{},"Return"," settings of the HTTP request node.",[18,371,372,373,376,377,329],{},"So now we got the data, and a little more than we need, so let's change the\nmessage output to keep only what we're interested in; ",[37,374,375],{},"payload.downloads",". To\ndo this, we'll use the ",[86,378,380],{"href":379},"\u002Fnode-red\u002Fcore-nodes\u002Fchange","change node",[18,382,383],{},[342,384],{"alt":385,"src":386,"title":387},"Change node to set the payload with downloads","\u002Fnode-red-media\u002Fintegration-technologies\u002Fimages\u002Fchange-node-set-downloads-payload.png","Change node to set the payload",[101,389,391],{"id":390},"building-the-dashboard","Building the Dashboard",[18,393,394,395,399],{},"Follow the ",[86,396,398],{"href":397},"\u002Fblog\u002F2024\u002F03\u002Fdashboard-getting-started\u002F","Dashboard getting started guide"," to get up and running.",[18,401,402,403,406,407,410],{},"Now we drag in the ",[37,404,405],{},"chart"," node that's available after installing the dashboard\npackage and make sure it' input comes from the configured ",[37,408,409],{},"change"," node. Before\nhitting the deploy button the dashboard itself needs configuring:",[18,412,413,414,417,418],{},"First add configuration for the ",[37,415,416],{},"ui-group",": ",[342,419],{"alt":420,"src":421,"title":422},"Configure the UI Group","\u002Fnode-red-media\u002Fintegration-technologies\u002Fimages\u002Fdashboard-config-chart.png","Configure the chart",[18,424,425,426,428,429,417,432,329],{},"To setup the ",[37,427,416],{}," correctly you'll need to add configuration for the ",[37,430,431],{},"ui-page",[342,433],{"alt":434,"src":435,"title":436},"\"Configure the ui-group\"","\u002Fnode-red-media\u002Fintegration-technologies\u002Fimages\u002Fdashboard-config-ui-group.png","Configure the UI group",[18,438,439,440,443,444,329],{},"To create the UI page it requires another 2 config settings, ",[37,441,442],{},"ui-base",", and the theming through ",[37,445,446],{},"ui-theme",[18,448,449],{},[342,450],{"alt":451,"src":452},"Configure the UI Base","\u002Fnode-red-media\u002Fintegration-technologies\u002Fimages\u002Fdashboard-config-ui-base.png",[18,454,455],{},"The default theme is great, so just accept that, and save all dialogs to continue the chart creation.",[457,458,460],"h4",{"id":459},"normalizing-the-data","Normalizing the data",[18,462,463,464,467,468,471,472,476],{},"The data for the chart needs to be changed before we can show it. The messages should have a ",[37,465,466],{},"x"," and ",[37,469,470],{},"y"," key. So let's prepare the data with\na combination of the ",[86,473,475],{"href":474},"\u002Fnode-red\u002Fcore-nodes\u002Fsplit","Split"," and change node.",[18,478,479,480,467,483,486],{},"The Split node with the default configuration allows to 30 elements of the array\nto be mapped individually. The change node will set the ",[37,481,482],{},"payload.x",[37,484,485],{},"payload.y","\non the message:",[18,488,489],{},[342,490],{"alt":491,"src":492,"title":493},"Change node to prepare the data for a chart","\u002Fnode-red-media\u002Fintegration-technologies\u002Fimages\u002Fchange-node-prepare-data-chart.png","Prepare data for the chart",[18,495,496],{},"Connect the change node output to a new chart node, and voila:",[18,498,499],{},[342,500],{"alt":501,"src":502},"Data in the chart node","\u002Fnode-red-media\u002Fintegration-technologies\u002Fimages\u002Fchart-with-data.png",[101,504,506],{"id":505},"keeping-the-data-up-to-date","Keeping the data up-to-date",[18,508,509,510,513,514,518],{},"While we created a chart and it has some data, there's one more thing to explain.\nHow can the data be kept up-to-date? It's straight forward to have the ",[37,511,512],{},"Inject","\nnode ",[86,515,517],{"href":516},"\u002Fnode-red\u002Fcore-nodes\u002Finject\u002F","run every night",",\nbut the chart would now have multiple data points\nfor the same day. This paints multiple lines on top of each other. While that works,\nthe hover of the chart will display the duplication and it's wastefull.",[18,520,521,522,530],{},"So before we update the chart we need to send a message to the chart where the\n",[86,523,526,527],{"href":524,"rel":525},"https:\u002F\u002Fdashboard.flowfuse.com\u002Fnodes\u002Fwidgets\u002Fui-chart.html#removing-data",[90],"payload is ",[37,528,529],{},"[]",".\nThat way the chart is emptied first, and right afterwards it will\nreceive the new data to write.",[48,532],{":height":50,"flow":533},"W3siaWQiOiJkYTlhNjdlOGMzZWE3NzQyIiwidHlwZSI6ImluamVjdCIsInoiOiI5NzcxNDNlZGIwOTdiNjg1IiwibmFtZSI6IiIsInByb3BzIjpbeyJwIjoicGF5bG9hZCJ9XSwicmVwZWF0IjoiIiwiY3JvbnRhYiI6IjAwIDEyICogKiAqIiwib25jZSI6ZmFsc2UsIm9uY2VEZWxheSI6MC4xLCJ0b3BpYyI6IiIsInBheWxvYWQiOiJbXSIsInBheWxvYWRUeXBlIjoianNvbiIsIngiOjI1MCwieSI6OTYwLCJ3aXJlcyI6W1siZWZkMjJhODlhYmMzYzA2ZiIsImE2ODUxYTQxZGJhMmMzOWIiXV19LHsiaWQiOiJhNjg1MWE0MWRiYTJjMzliIiwidHlwZSI6Imh0dHAgcmVxdWVzdCIsInoiOiI5NzcxNDNlZGIwOTdiNjg1IiwibmFtZSI6IiIsIm1ldGhvZCI6IkdFVCIsInJldCI6Im9iaiIsInBheXRvcXMiOiJpZ25vcmUiLCJ1cmwiOiJodHRwczovL2FwaS5ucG1qcy5vcmcvZG93bmxvYWRzL3JhbmdlL2xhc3QtbW9udGgvQGZsb3dmb3JnZS9ub2RlLXJlZC1kYXNoYm9hcmQiLCJ0bHMiOiIiLCJwZXJzaXN0IjpmYWxzZSwicHJveHkiOiIiLCJpbnNlY3VyZUhUVFBQYXJzZXIiOmZhbHNlLCJhdXRoVHlwZSI6IiIsInNlbmRlcnIiOmZhbHNlLCJoZWFkZXJzIjpbXSwieCI6NDMwLCJ5Ijo5NjAsIndpcmVzIjpbWyI3OTMxZjc0NTc4ODBmN2MzIl1dfSx7ImlkIjoiNzkzMWY3NDU3ODgwZjdjMyIsInR5cGUiOiJjaGFuZ2UiLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiJPbmx5IGdldCB0aGUgRG93bmxvYWRzIiwicnVsZXMiOlt7InQiOiJzZXQiLCJwIjoicGF5bG9hZCIsInB0IjoibXNnIiwidG8iOiJwYXlsb2FkLmRvd25sb2FkcyIsInRvdCI6Im1zZyJ9XSwiYWN0aW9uIjoiIiwicHJvcGVydHkiOiIiLCJmcm9tIjoiIiwidG8iOiIiLCJyZWciOmZhbHNlLCJ4Ijo2NTAsInkiOjk2MCwid2lyZXMiOltbIjc0ZTNiMTVjN2IwOTcyNmEiXV19LHsiaWQiOiI3NGUzYjE1YzdiMDk3MjZhIiwidHlwZSI6Imxpbmsgb3V0IiwieiI6Ijk3NzE0M2VkYjA5N2I2ODUiLCJuYW1lIjoibGluayBvdXQgMSIsIm1vZGUiOiJsaW5rIiwibGlua3MiOlsiNDNlNGFmZjM0Yjk4OWU4MyJdLCJ4Ijo4MTUsInkiOjk2MCwid2lyZXMiOltdfSx7ImlkIjoiNDNlNGFmZjM0Yjk4OWU4MyIsInR5cGUiOiJsaW5rIGluIiwieiI6Ijk3NzE0M2VkYjA5N2I2ODUiLCJuYW1lIjoiTm9ybWFsaXplIGRhaWx5IGRhdGEiLCJsaW5rcyI6WyI3NGUzYjE1YzdiMDk3MjZhIl0sIngiOjE5NSwieSI6MTA0MCwid2lyZXMiOltbImNhOGM2MmJmYmRmNzU3MTUiXV19LHsiaWQiOiJjYThjNjJiZmJkZjc1NzE1IiwidHlwZSI6InNwbGl0IiwieiI6Ijk3NzE0M2VkYjA5N2I2ODUiLCJuYW1lIjoiIiwic3BsdCI6IlxcbiIsInNwbHRUeXBlIjoic3RyIiwiYXJyYXlTcGx0IjoxLCJhcnJheVNwbHRUeXBlIjoibGVuIiwic3RyZWFtIjpmYWxzZSwiYWRkbmFtZSI6IiIsIngiOjMxMCwieSI6MTA0MCwid2lyZXMiOltbIjNmNDYyZDJjN2UzYmNhNTAiXV19LHsiaWQiOiIzZjQ2MmQyYzdlM2JjYTUwIiwidHlwZSI6ImNoYW5nZSIsInoiOiI5NzcxNDNlZGIwOTdiNjg1IiwibmFtZSI6IlByZXBhcmUgZGF0YSBmb3IgdGhlIGNoYXJ0IiwicnVsZXMiOlt7InQiOiJzZXQiLCJwIjoicGF5bG9hZC54IiwicHQiOiJtc2ciLCJ0byI6IiR0b01pbGxpcyhwYXlsb2FkLmRheSkiLCJ0b3QiOiJqc29uYXRhIn0seyJ0Ijoic2V0IiwicCI6InBheWxvYWQueSIsInB0IjoibXNnIiwidG8iOiJwYXlsb2FkLmRvd25sb2FkcyIsInRvdCI6Im1zZyJ9LHsidCI6ImRlbGV0ZSIsInAiOiJwYXlsb2FkLmRheSIsInB0IjoibXNnIn0seyJ0IjoiZGVsZXRlIiwicCI6InBheWxvYWQuZG93bmxvYWRzIiwicHQiOiJtc2cifV0sImFjdGlvbiI6IiIsInByb3BlcnR5IjoiIiwiZnJvbSI6IiIsInRvIjoiIiwicmVnIjpmYWxzZSwieCI6NTEwLCJ5IjoxMDQwLCJ3aXJlcyI6W1siZjRlNmE4NWI4Y2I4ZGFjMCJdXX0seyJpZCI6IjRiNzFmYzI4YzJkYTY2ZTciLCJ0eXBlIjoidWktY2hhcnQiLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsImdyb3VwIjoiYmFjOGVmZmFjNTc2OTRlMSIsIm5hbWUiOiIiLCJsYWJlbCI6IkRhaWx5IERvd25sb2FkcyIsIm9yZGVyIjo5MDA3MTk5MjU0NzQwOTkxLCJjaGFydFR5cGUiOiJsaW5lIiwieEF4aXNUeXBlIjoidGltZSIsInJlbW92ZU9sZGVyIjoxLCJyZW1vdmVPbGRlclVuaXQiOiIzNjAwIiwicmVtb3ZlT2xkZXJQb2ludHMiOiIiLCJjb2xvcnMiOlsiIzFmNzdiNCIsIiNhZWM3ZTgiLCIjZmY3ZjBlIiwiIzJjYTAyYyIsIiM5OGRmOGEiLCIjZDYyNzI4IiwiI2ZmOTg5NiIsIiM5NDY3YmQiLCIjYzViMGQ1Il0sIndpZHRoIjowLCJoZWlnaHQiOjAsImNsYXNzTmFtZSI6IiIsIngiOjMzMCwieSI6MTEyMCwid2lyZXMiOltbXV19LHsiaWQiOiJmNGU2YTg1YjhjYjhkYWMwIiwidHlwZSI6Imxpbmsgb3V0IiwieiI6Ijk3NzE0M2VkYjA5N2I2ODUiLCJuYW1lIjoibGluayBvdXQgMiIsIm1vZGUiOiJsaW5rIiwibGlua3MiOlsiNmY3MDY4NDQ1YmZlNDMxMSJdLCJ4Ijo2NzUsInkiOjEwNDAsIndpcmVzIjpbXX0seyJpZCI6IjZmNzA2ODQ0NWJmZTQzMTEiLCJ0eXBlIjoibGluayBpbiIsInoiOiI5NzcxNDNlZGIwOTdiNjg1IiwibmFtZSI6IlVwZGF0ZSB0aGUgY2hhcnQiLCJsaW5rcyI6WyJmNGU2YTg1YjhjYjhkYWMwIiwiNzkwNjcyMTVlZTU5MmVjOSIsImVmZDIyYTg5YWJjM2MwNmYiXSwieCI6MTk1LCJ5IjoxMTIwLCJ3aXJlcyI6W1siNGI3MWZjMjhjMmRhNjZlNyJdXX0seyJpZCI6ImVmZDIyYTg5YWJjM2MwNmYiLCJ0eXBlIjoibGluayBvdXQiLCJ6IjoiOTc3MTQzZWRiMDk3YjY4NSIsIm5hbWUiOiJsaW5rIG91dCAzIiwibW9kZSI6ImxpbmsiLCJsaW5rcyI6WyI2ZjcwNjg0NDViZmU0MzExIl0sIngiOjQxNSwieSI6OTIwLCJ3aXJlcyI6W119LHsiaWQiOiJiYWM4ZWZmYWM1NzY5NGUxIiwidHlwZSI6InVpLWdyb3VwIiwibmFtZSI6Ik5QTSBEb3dubG9hZHMiLCJwYWdlIjoiZjEwYjRkMDI1OWU0M2FlYiIsIndpZHRoIjoiNiIsImhlaWdodCI6IjEiLCJvcmRlciI6LTF9LHsiaWQiOiJmMTBiNGQwMjU5ZTQzYWViIiwidHlwZSI6InVpLXBhZ2UiLCJuYW1lIjoiTWFpbiIsInVpIjoiY2I3OWJjNDUyMDkyNWUzMiIsInBhdGgiOiIvIiwibGF5b3V0IjoiZ3JpZCIsInRoZW1lIjoiMmM1ZDcwMmIxMWRlN2RkMSIsIm9yZGVyIjotMX0seyJpZCI6ImNiNzliYzQ1MjA5MjVlMzIiLCJ0eXBlIjoidWktYmFzZSIsIm5hbWUiOiJNeSBVSSIsInBhdGgiOiIvZGFzaGJvYXJkIiwiaW5jbHVkZUNsaWVudERhdGEiOnRydWUsImFjY2VwdHNDbGllbnRDb25maWciOlsidWktbm90aWZpY2F0aW9uIiwidWktY29udHJvbCJdLCJzaG93UGF0aEluU2lkZWJhciI6ZmFsc2V9LHsiaWQiOiIyYzVkNzAyYjExZGU3ZGQxIiwidHlwZSI6InVpLXRoZW1lIiwibmFtZSI6IlRoZW1lIE5hbWUiLCJjb2xvcnMiOnsic3VyZmFjZSI6IiNmZmZmZmYiLCJwcmltYXJ5IjoiIzAwOTRjZSIsImJnUGFnZSI6IiNlZWVlZWUiLCJncm91cEJnIjoiI2ZmZmZmZiIsImdyb3VwT3V0bGluZSI6IiNjY2NjY2MifX1d",[535,536,537],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":12,"searchDepth":203,"depth":203,"links":539},[540,541,542,549],{"id":24,"depth":203,"text":25},{"id":54,"depth":203,"text":55},{"id":95,"depth":203,"text":96,"children":543},[544,545,546,547,548],{"id":103,"depth":239,"text":104},{"id":150,"depth":239,"text":151},{"id":173,"depth":239,"text":174},{"id":180,"depth":239,"text":181},{"id":290,"depth":239,"text":291},{"id":318,"depth":203,"text":319,"children":550},[551,552],{"id":390,"depth":239,"text":391},{"id":505,"depth":239,"text":506},"Learn how to create REST APIs in Node-RED and fetch data from an API.","md",{},true,"\u002Fnode-red\u002Fintegration-technologies\u002Frest",{"title":5,"description":553},"node-red\u002Fintegration-technologies\u002Frest","sY-2NBzU1JDBW04HDNrKGZ9-5WskaE19n0Ansc-4GJA",1780070557528]