{"id":16659,"date":"2025-12-15T16:38:34","date_gmt":"2025-12-15T16:38:34","guid":{"rendered":"https:\/\/thinkpeak.ai\/n8n-custom-node-development-guide\/"},"modified":"2026-02-19T01:30:32","modified_gmt":"2026-02-19T01:30:32","slug":"n8n-custom-node-development-guide","status":"publish","type":"post","link":"https:\/\/thinkpeak.ai\/tr\/n8n-custom-node-development-guide\/","title":{"rendered":"n8n \u00d6zel D\u00fc\u011f\u00fcm Geli\u015ftirme K\u0131lavuzu (2026)"},"content":{"rendered":"\n<p>Low-code has changed. In the fast-moving world of automation, it no longer means low capability. By 2026, the <b id=\"low-code-market\">low-code market<\/b> has grown past $50 billion. Enterprises demand speed, but they refuse to sacrifice power.<\/p>\n\n\n\n<p>However, every automation engineer eventually hits &#8220;The Wall.&#8221;<\/p>\n\n\n\n<p>You hit this wall when pre-built connectors fail. You might find yourself chaining five function nodes just to parse one JSON object. Or perhaps an internal API needs a cryptographic signature that standard HTTP nodes just cannot handle.<\/p>\n\n\n\n<p>At Thinkpeak.ai, we view automation as a self-driving ecosystem. It should not be a patchwork of scripts. When standard tools fall short, <b id=\"n8n-custom-node-development\">n8n Custom Node Development<\/b> provides the bridge. It connects rigid SaaS limits to true engineering freedom.<\/p>\n\n\n\n<p>This guide helps you build production-ready n8n nodes. We will move past basic tutorials. We will cover architecture, security, and how to treat your nodes as proprietary software assets.<\/p>\n\n\n\n<p><strong>Simply said, n8n custom node development is the only scalable way to turn low-code automation into a secure, reusable, and enterprise-grade platform by replacing fragile in-workflow scripts with versioned, credential-safe, and proprietary logic assets.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\" style=\"grid-template-columns:69% auto\"><figure class=\"wp-block-media-text__media\"><img decoding=\"async\" width=\"350\" height=\"66\" src=\"https:\/\/thinkpeak.ai\/wp-content\/uploads\/2025\/10\/cropped-thinkpeak-logo-e1749648566556.png\" alt=\"cropped-thinkpeak-logo-e1749648566556\" class=\"wp-image-14960 size-full\" title=\"\" srcset=\"https:\/\/thinkpeak.ai\/wp-content\/uploads\/2025\/10\/cropped-thinkpeak-logo-e1749648566556.png 350w, https:\/\/thinkpeak.ai\/wp-content\/uploads\/2025\/10\/cropped-thinkpeak-logo-e1749648566556-300x57.png 300w\" sizes=\"(max-width: 350px) 100vw, 350px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"has-text-align-center\"><strong>Contact us Now<\/strong> \u2b07\ufe0f\u2b07\ufe0f\u2b07\ufe0f<\/p>\n<\/div><\/div>\n\n\n<style id=\"wpforms-css-vars-14900-block-1fdd07bb-e1df-480c-a2a9-b55a463baa07\">\n\t\t\t\t#wpforms-14900.wpforms-block-1fdd07bb-e1df-480c-a2a9-b55a463baa07 {\n\t\t\t\t--wpforms-field-size-input-height: 43px;\n--wpforms-field-size-input-spacing: 15px;\n--wpforms-field-size-font-size: 16px;\n--wpforms-field-size-line-height: 19px;\n--wpforms-field-size-padding-h: 14px;\n--wpforms-field-size-checkbox-size: 16px;\n--wpforms-field-size-sublabel-spacing: 5px;\n--wpforms-field-size-icon-size: 1;\n--wpforms-label-size-font-size: 16px;\n--wpforms-label-size-line-height: 19px;\n--wpforms-label-size-sublabel-font-size: 14px;\n--wpforms-label-size-sublabel-line-height: 17px;\n--wpforms-button-size-font-size: 17px;\n--wpforms-button-size-height: 41px;\n--wpforms-button-size-padding-h: 15px;\n--wpforms-button-size-margin-top: 10px;\n\t\t\t}\n\t\t\t<\/style><div class=\"wpforms-container wpforms-container-full wpforms-block wpforms-block-1fdd07bb-e1df-480c-a2a9-b55a463baa07 wpforms-render-modern\" id=\"wpforms-14900\"><form id=\"wpforms-form-14900\" class=\"wpforms-validate wpforms-form wpforms-ajax-form\" data-formid=\"14900\" method=\"post\" enctype=\"multipart\/form-data\" action=\"\/tr\/wp-json\/wp\/v2\/posts\/16659\" data-token=\"0279e60447e489a71220b37325a230c2\" data-token-time=\"1777744536\"><noscript class=\"wpforms-error-noscript\">Bu formu bitirebilmek i\u00e7in taray\u0131c\u0131n\u0131zda JavaScript&#039;i etkinle\u015ftirin.<\/noscript><div id=\"wpforms-error-noscript\" style=\"display: none;\">Bu formu bitirebilmek i\u00e7in taray\u0131c\u0131n\u0131zda JavaScript&#039;i etkinle\u015ftirin.<\/div><div class=\"wpforms-field-container\"><div id=\"wpforms-14900-field_1-container\" class=\"wpforms-field wpforms-field-text\" data-field-id=\"1\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-14900-field_1\" aria-hidden=\"false\">Full Name<\/label><input type=\"text\" id=\"wpforms-14900-field_1\" class=\"wpforms-field-large\" name=\"wpforms[fields][1]\" placeholder=\"Full Name\" aria-errormessage=\"wpforms-14900-field_1-error\" ><\/div>\t\t<div id=\"wpforms-14900-field_5-container\"\n\t\t\tclass=\"wpforms-field wpforms-field-text\"\n\t\t\tdata-field-type=\"text\"\n\t\t\tdata-field-id=\"5\"\n\t\t\t>\n\t\t\t<label class=\"wpforms-field-label\" for=\"wpforms-14900-field_5\" >Subject Email Name<\/label>\n\t\t\t<input type=\"text\" id=\"wpforms-14900-field_5\" class=\"wpforms-field-medium\" name=\"wpforms[fields][5]\" >\n\t\t<\/div>\n\t\t<div id=\"wpforms-14900-field_2-container\" class=\"wpforms-field wpforms-field-email\" data-field-id=\"2\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-14900-field_2\" aria-hidden=\"false\">Email <span class=\"wpforms-required-label\" aria-hidden=\"true\">*<\/span><\/label><input type=\"email\" id=\"wpforms-14900-field_2\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][2]\" placeholder=\"Email\" spellcheck=\"false\" aria-errormessage=\"wpforms-14900-field_2-error\" required><\/div><div id=\"wpforms-14900-field_3-container\" class=\"wpforms-field wpforms-field-text\" data-field-id=\"3\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-14900-field_3\" aria-hidden=\"false\">Subject<\/label><input type=\"text\" id=\"wpforms-14900-field_3\" class=\"wpforms-field-large\" name=\"wpforms[fields][3]\" placeholder=\"Subject\" aria-errormessage=\"wpforms-14900-field_3-error\" ><\/div><div id=\"wpforms-14900-field_4-container\" class=\"wpforms-field wpforms-field-textarea\" data-field-id=\"4\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-14900-field_4\" aria-hidden=\"false\">Message<\/label><textarea id=\"wpforms-14900-field_4\" class=\"wpforms-field-medium\" name=\"wpforms[fields][4]\" placeholder=\"Message\" aria-errormessage=\"wpforms-14900-field_4-error\" ><\/textarea><\/div><script>\n\t\t\t\t( function() {\n\t\t\t\t\tconst style = document.createElement( 'style' );\n\t\t\t\t\tstyle.appendChild( document.createTextNode( '#wpforms-14900-field_5-container { position: absolute !important; overflow: hidden !important; display: inline !important; height: 1px !important; width: 1px !important; z-index: -1000 !important; padding: 0 !important; } #wpforms-14900-field_5-container input { visibility: hidden; } #wpforms-conversational-form-page #wpforms-14900-field_5-container label { counter-increment: none; }' ) );\n\t\t\t\t\tdocument.head.appendChild( style );\n\t\t\t\t\tdocument.currentScript?.remove();\n\t\t\t\t} )();\n\t\t\t<\/script><\/div><!-- .wpforms-field-container --><div class=\"wpforms-submit-container\" ><input type=\"hidden\" name=\"wpforms[id]\" value=\"14900\"><input type=\"hidden\" name=\"page_title\" value=\"\"><input type=\"hidden\" name=\"page_url\" value=\"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/posts\/16659\"><input type=\"hidden\" name=\"url_referer\" value=\"\"><button type=\"submit\" name=\"wpforms[submit]\" id=\"wpforms-submit-14900\" class=\"wpforms-submit\" data-alt-text=\"Sending...\" data-submit-text=\"Send message\" aria-live=\"assertive\" value=\"wpforms-submit\">Send message<\/button><img decoding=\"async\" src=\"https:\/\/thinkpeak.ai\/wp-content\/plugins\/wpforms-lite\/assets\/images\/submit-spin.svg\" class=\"wpforms-submit-spinner\" style=\"display: none;\" width=\"26\" height=\"26\" alt=\"Y\u00fckleniyor\" title=\"\"><\/div><\/form><\/div>  <!-- .wpforms-container -->\n\n\n<h3 class=\"wp-block-heading\">Why Build Custom Nodes? (The Strategic Case)<\/h3>\n\n\n\n<p>Before you open your code editor, you must understand the strategy. In our <b id=\"bespoke-internal-tools\">Bespoke Internal Tools<\/b> division, we often see clients making a mistake. They trap critical business logic inside unmaintainable &#8220;Code&#8221; nodes.<\/p>\n\n\n\n<p>The standard &#8220;Code&#8221; node is great for one-off scripts. However, it becomes a liability at scale. Here is why shifting to Custom Nodes is a smart move:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Reusability as an Asset<\/h4>\n\n\n\n<p>A &#8220;Code&#8221; node lives only inside the workflow where you wrote it. If you need that logic elsewhere, you have to copy and paste it. If you find a bug, you must fix it in twenty different places. A Custom Node is different. It is installed globally. You fix it once, and it updates everywhere.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Credential Security<\/h4>\n\n\n\n<p>Hard-coding API keys into JavaScript is a security risk. Custom Nodes use the native <b id=\"credential-management\">credential management<\/b> system in n8n. This ensures secrets are encrypted and stored securely. They are never exposed in the frontend UI.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Democratization of Logic<\/h4>\n\n\n\n<p>Your senior engineers can build complex logic once. Once deployed, junior staff can use it easily. They can drag, drop, and configure the node using a clean UI. They never need to touch a line of TypeScript. This aligns with our mission to turn manual operations into self-driving ecosystems.<\/p>\n\n\n\n<p>Industry data shows that organizations building reusable low-code assets ship products significantly faster than those relying on traditional development.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 1: Architecture &amp; Prerequisites<\/h3>\n\n\n\n<p>Development in 2026 requires a solid setup. We recommend treating custom nodes like microservices.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">The Development Environment<\/h4>\n\n\n\n<ul class=\"wp-block-list\" class=\"wp-block-list\">\n<li><strong>Node.js:<\/strong> v20.x (LTS) or higher.<\/li>\n\n\n\n<li><strong>TypeScript:<\/strong> v5.x (Strict typing is essential for stability).<\/li>\n\n\n\n<li><strong>n8n CLI:<\/strong> Used for local testing.<\/li>\n\n\n\n<li><strong>Docker:<\/strong> Essential for testing in a clean environment.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">The Decision Matrix: Declarative vs. Programmatic<\/h4>\n\n\n\n<p>n8n offers two styles for building nodes. Choosing the wrong one is a common error.<\/p>\n\n\n\n<ul class=\"wp-block-list\" class=\"wp-block-list\">\n<li><strong>Declarative Style:<\/strong> Best for standard REST APIs. It is low complexity but limited flexibility. Use this for simple SaaS wrappers.<\/li>\n\n\n\n<li><strong>Programmatic Style:<\/strong> Best for complex logic and SDK wrappers. It offers full TypeScript control and limitless flexibility.<\/li>\n<\/ul>\n\n\n\n<p>We believe you should use the <b id=\"programmatic-style\">Programmatic Style<\/b> for most bespoke engineering needs. This guide focuses on this style.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 2: Building the &#8220;Thinkpeak Sentiment Analyzer&#8221;<\/h3>\n\n\n\n<p>We will build a custom node to demonstrate a production-grade build. This node will wrap an AI Sentiment API. It takes text input, analyzes it, and returns a sentiment score.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 1: Project Scaffolding<\/h4>\n\n\n\n<p>We use the standard starter template but enforce a strict directory structure.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nmkdir n8n-nodes-thinkpeak-sentiment\ncd n8n-nodes-thinkpeak-sentiment\nnpm init -y\nnpm install n8n-workflow n8n-core axios\nnpm install --save-dev typescript @types\/node\n<\/code><\/pre>\n\n\n\n<p>Your directory should contain a <code>nodes<\/code> folder. Inside, place your main node file, an SVG icon, and a JSON file. You also need a <code>credentials<\/code> folder for your API keys.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Step 2: Defining the Interface (INodeType)<\/h4>\n\n\n\n<p>The main file exports a class implementing <b id=\"inodetype\">INodeType<\/b>. This controls how the node appears in the n8n editor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nimport { INodeType, INodeTypeDescription } from 'n8n-workflow';\n\nexport class SentimentAnalyzer implements INodeType {\n    description: INodeTypeDescription = {\n        displayName: 'Thinkpeak Sentiment Analyzer',\n        name: 'thinkpeakSentiment',\n        icon: 'file:SentimentAnalyzer.svg',\n        group: &#91;'transform'],\n        version: 1,\n        description: 'Analyze text sentiment using enterprise AI models',\n        defaults: {\n            name: 'Sentiment Analysis',\n        },\n        inputs: &#91;'main'],\n        outputs: &#91;'main'],\n        credentials: &#91;\n            {\n                name: 'sentimentApiCredentials',\n                required: true,\n            },\n        ],\n        properties: &#91;\n            \/\/ The UI Field for the User\n            {\n                displayName: 'Input Text',\n                name: 'text',\n                type: 'string',\n                default: '',\n                placeholder: 'e.g. I love this product!',\n                description: 'The text to be analyzed',\n                required: true,\n            },\n            \/\/ Advanced Option: Model Selection\n            {\n                displayName: 'AI Model',\n                name: 'model',\n                type: 'options',\n                options: &#91;\n                    { name: 'Standard (Fast)', value: 'std-v1' },\n                    { name: 'Enhanced (Accurate)', value: 'enh-v2' },\n                ],\n                default: 'std-v1',\n                description: 'Select the analysis model',\n            },\n        ],\n    };\n}\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Step 3: The Execution Logic<\/h4>\n\n\n\n<p>This is where we add value. Instead of simple fetches, we implement <b id=\"robust-error-handling\">robust error handling<\/b> and type safety.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nimport { IExecuteFunctions } from 'n8n-core';\nimport { INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';\nimport axios from 'axios';\n\nexport class SentimentAnalyzer implements INodeType {\n    description: INodeTypeDescription = { \/* ... as defined above ... *\/ };\n\n    async execute(this: IExecuteFunctions): Promise&lt;INodeExecutionData&#91;]&#91;]&gt; {\n        const items = this.getInputData();\n        const returnData: INodeExecutionData&#91;] = &#91;];\n\n        \/\/ Loop over every input item (Crucial for n8n batching)\n        for (let i = 0; i &lt; items.length; i++) {\n            try {\n                \/\/ 1. Retrieve User Inputs\n                const text = this.getNodeParameter('text', i) as string;\n                const model = this.getNodeParameter('model', i) as string;\n\n                \/\/ 2. Retrieve Secure Credentials\n                const credentials = await this.getCredentials('sentimentApiCredentials');\n\n                \/\/ 3. Perform the External API Call\n                const response = await axios.post('https:\/\/api.thinkpeak.ai\/v1\/sentiment', {\n                    text: text,\n                    model: model,\n                }, {\n                    headers: {\n                        'Authorization': `Bearer ${credentials.apiKey}`,\n                    },\n                });\n\n                \/\/ 4. Map the Data to n8n Format\n                returnData.push({\n                    json: {\n                        original_text: text,\n                        sentiment_score: response.data.score,\n                        label: response.data.label,\n                        confidence: response.data.confidence,\n                        processed_at: new Date().toISOString(),\n                    },\n                });\n\n            } catch (error) {\n                \/\/ 5. Robust Error Handling\n                if (this.continueOnFail()) {\n                    returnData.push({ json: { error: error.message } });\n                    continue;\n                }\n                throw error;\n            }\n        }\n\n        return &#91;returnData];\n    }\n}\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Step 4: Secure Credentials<\/h4>\n\n\n\n<p>Never store keys in the code. Define a credential file instead.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nimport { ICredentialType, INodeProperties } from 'n8n-workflow';\n\nexport class SentimentApi implements ICredentialType {\n    name = 'sentimentApiCredentials';\n    displayName = 'Thinkpeak Sentiment API';\n    properties: INodeProperties&#91;] = &#91;\n        {\n            displayName: 'API Key',\n            name: 'apiKey',\n            type: 'string',\n            typeOptions: { password: true }, \/\/ Masks the input in UI\n            default: '',\n        },\n    ];\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Phase 3: Advanced Patterns &amp; Best Practices<\/h3>\n\n\n\n<p>Writing the code is only half the battle. To deploy nodes that work reliably in an enterprise, you must follow strict standards.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Handling Breaking Changes (Versioning)<\/h4>\n\n\n\n<p>You cannot break existing workflows in a live business. n8n supports <b id=\"node-versioning\">Node Versioning<\/b>. If you change your JSON output structure, create &#8220;V2&#8221; logic. This keeps old workflows running on V1 while new users get V2.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. UI\/UX: The &#8220;Load Options&#8221; Method<\/h4>\n\n\n\n<p>Do not make users hunt for ID numbers. Use the <code>loadOptions<\/code> method. This fetches dynamic lists from the API, like project names, and shows them as a dropdown. It reduces errors significantly.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. CI\/CD for Custom Nodes<\/h4>\n\n\n\n<p>Avoid copying files manually. We build <b id=\"automated-deployment-pipelines\">Automated Deployment Pipelines<\/b>. When you commit code, GitHub Actions should test and build it. It then publishes to a private registry. Your production servers will pull the update automatically.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The &#8220;Buy vs. Build&#8221; Decision<\/h3>\n\n\n\n<p>Building custom nodes gives you power, but it takes time. We help clients make this choice every day.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Option A: Instant Deployment (The Automation Marketplace)<\/h4>\n\n\n\n<p>If you need speed, use pre-made workflows. Our <b id=\"automation-marketplace\">Automation Marketplace<\/b> has templates ready to go. You can launch systems like cold outreach personalizers immediately without writing code.<\/p>\n\n\n\n<p><a href=\"https:\/\/thinkpeak.ai\">Explore our Automation Marketplace<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Option B: Bespoke Engineering (The Custom Node Route)<\/h4>\n\n\n\n<p>When templates aren&#8217;t enough, you need custom engineering. We architect the backend and build the custom nodes. This is vital for integrating legacy systems or complex data stacks.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion: Orchestrating the Future<\/h3>\n\n\n\n<p>Custom nodes transform n8n from a tool into a platform. They let you wrap unique business logic into secure, reusable blocks. Whether you are building a simple helper or a complex <b id=\"ai-agent\">AI Agent<\/b> wrapper, the principles are the same.<\/p>\n\n\n\n<p>You need structure, security, and scalability.<\/p>\n\n\n\n<p><strong>Ready to upgrade your operations?<\/strong><\/p>\n\n\n\n<p>If you need immediate automation results, visit our Marketplace. If you require custom architecture, contact our <b id=\"bespoke-engineering-team\">Bespoke Engineering Team<\/b> today.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Frequently Asked Questions (FAQ)<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">What is the difference between n8n custom nodes and the &#8220;Code&#8221; node?<\/h4>\n\n\n\n<p>The &#8220;Code&#8221; node is for scripts used in one workflow. A Custom Node is a reusable extension installed on your instance. Custom nodes provide better security and are easier to maintain across many workflows.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Can I sell the custom nodes I build?<\/h4>\n\n\n\n<p>Yes. You can distribute nodes via npm. Many agencies build proprietary connectors for clients. We recommend integrating them into a broader service offering for maximum value.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">How do I handle authentication for my custom node?<\/h4>\n\n\n\n<p>You should define a credentials file. n8n supports OAuth2, Header Auth, and more. Your code requests these credentials securely at runtime, so keys are never exposed in the UI.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Do I need to know TypeScript to build n8n nodes?<\/h4>\n\n\n\n<p>Technically, you can use JavaScript. However, <b id=\"typescript\">TypeScript<\/b> is strongly recommended. It is the industry standard for 2026. It prevents many common errors and makes development much smoother.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>n8n \u00f6zel d\u00fc\u011f\u00fcm geli\u015ftirme k\u0131lavuzu: s\u00fcr\u00fcm olu\u015fturma, CI\/CD ve en iyi uygulamalarla g\u00fcvenli, \u00fcretime haz\u0131r d\u00fc\u011f\u00fcmler olu\u015fturmak i\u00e7in ad\u0131m ad\u0131m.<\/p>","protected":false},"author":2,"featured_media":16658,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[105],"tags":[],"class_list":["post-16659","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-low-code-development"],"_links":{"self":[{"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/posts\/16659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/comments?post=16659"}],"version-history":[{"count":1,"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/posts\/16659\/revisions"}],"predecessor-version":[{"id":17281,"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/posts\/16659\/revisions\/17281"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/media\/16658"}],"wp:attachment":[{"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/media?parent=16659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/categories?post=16659"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thinkpeak.ai\/tr\/wp-json\/wp\/v2\/tags?post=16659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}