{"id":22267,"date":"2021-01-18T17:22:47","date_gmt":"2021-01-18T17:22:47","guid":{"rendered":"http:\/\/implement_dynamism_in_static_sites_with_serverless_functions"},"modified":"2025-08-21T12:22:56","modified_gmt":"2025-08-21T19:22:56","slug":"implement_dynamism_in_static_sites_with_serverless_functions","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions","title":{"rendered":"Implement Dynamism in Static Sites With Serverless Functions"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>In this age of most sites being static, a frequently asked question is how much dynamic functionality you can derive from Jamstack. The answer is a lot because you can incorporate <a href=\"https:\/\/cloudinary.com\/blog\/developer_experience_for_a_modern_web_jamstack_delivers#reusable_apis\">reusable APIs<\/a> in that architecture and leverage serverless, back-end-oriented functions with no back ends in place.<\/p>\n<p>Serverless functions, also called functions as a service, do <strong>not<\/strong> mean functions without servers. Rather, they are functions that come into play only when necessary, saving you bandwidth and time. Examples are dynamic data or processes\u2014form submission, authentication, administrator routes, user routes\u2014on sites with <a href=\"https:\/\/cloudinary.com\/glossary\/static-content\">static content<\/a>. In other words, serverless functions enable you to add dynamic capabilities to applications. This article shows you how to do that with simple code examples.<\/p>\n<h2>A Use Case and Its Setup Procedure<\/h2>\n<p>Companies like Amazon, Microsoft, and Netlify make frequent use of serverless functions. Here\u2019s how to build and apply a <a href=\"https:\/\/www.netlify.com\/products\/functions\/\">Netlify function<\/a>:<\/p>\n<p><strong>1.<\/strong> Create in the root of your application a configuration file called <code>netlify.toml<\/code> in which to specify where your functions reside, in this case the <code>functions<\/code> folder. Add this code to <code>netlify.toml<\/code>:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>[build]\n  command = &quot;npm run build&quot;\n  publish = &quot;_site&quot;\n  functions = &quot;functions&quot;\n<\/code><\/pre>\n<p><strong>2.<\/strong> Install the Netlify CLI by running <code>npm install netlify-cli<\/code>.<\/p>\n<p>Most functions are asynchronous. Before initializing one, run the following code to have the function export a handler and incorporate a body:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>exports.handler = async () =&gt; {\n    return {\n        statusCode:200,\n        body: 'Hey, I am a serverless function.',\n    };\n};\n<\/code><\/pre>\n<p>Afterwards, you can execute the above function from your application, which runs on a different port, displaying the content of <code>body<\/code> at <code>http:\/\/localhost:8888\/.netlify\/functions\/function <\/code>.<\/p>\n<p>Additionally, you can update the Document Object Model (DOM) from the URL by means of query parameters. First, create a source file called <code>you-said.js<\/code> with this code:<\/p>\n<pre class=\"js-syntax-highlighted\"><code>exports.handler = async (event) =&gt; {\n    const {text}= event.queryStringParameters; \n    return {\n        statusCode : 200,\n        body : `you said ${text}`\n    }\n}\n<\/code><\/pre>\n<p>You can then set and display a value, e.g., <code>Obinna<\/code>, for the string parameter <code>text<\/code> with the URL <code>http:\/\/localhost:8888\/.netlify\/functions\/you-said?text=Obinna<\/code>.<\/p>\n<h2>Page Sourcing With IDs<\/h2>\n<p>Applying the above concept to page sourcing by means of IDs is a breeze. For a demo, go to the <code>functions<\/code> folder and create a source file called <code>projects-by-id.js<\/code> with the code below, which imports a list of projects in JSON.<\/p>\n<pre class=\"js-syntax-highlighted\"><code>const projects = require('..\/data\/projects.json');\nexports.handler = async ({queryStringParameters}) =&gt; {\n    const {id} = queryStringParameters;\n    const project = projects.find((m) =&gt; m.id === id);\n    if(!project){\n        return{\n            statusCode:404,\n            body:'Not Found',\n        };\n    }\n    return{\n        statusCode:200,\n        body: JSON.stringify(project),\n    }\n}\n<\/code><\/pre>\n<p>The above code defines the variable <code>id<\/code> as a string parameter and verifies if the input string is, in fact, an ID. If so, the screen response is displayed as JSON at  <code>http:\/\/localhost:8888\/.netlify\/functions\/project-by-id?id=tt2975590<\/code> .<\/p>\n<h2>Image Sourcing From Cloudinary<\/h2>\n<p>You can also source other data, such as images from third-party services like Cloudinary.  Follow the steps below:<\/p>\n<p><strong>1.<\/strong> Create a free <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">Cloudinary account<\/a>.<\/p>\n<p><strong>2.<\/strong> From your account\u2019s dashboard, grab your Cloudinary name, API key, and API secret and store them as environment variables in a file called <code>.env<\/code> (see the example below) in your project\u2019s root directory.<\/p>\n<pre class=\"js-syntax-highlighted\"><code>CLOUDINARY_NAME=my-project\nCLOUDINARY_API_KEY=xxxxxxxxxxxxxxxxxx\nCLOUDINARY_API_SECRET=xxxxxxxxxxxxxxxxxxxxx\n<\/code><\/pre>\n<p><strong>3.<\/strong> Create a cloudinary-upload.js file in the <code>functions<\/code> folder with the code below. Be sure to replace the three variables, <code>CLOUDINARY_NAME<\/code>, <code>CLOUDINARY_API_KEY, and <\/code>CLOUDINARY_API_SECRET`, with their values for your account.<\/p>\n<pre class=\"js-syntax-highlighted\"><code>const cloudinary = require(&quot;cloudinary&quot;).v2;\nconst dotenv = require(&quot;dotenv&quot;);\ndotenv.config();\n\ncloudinary.config({\n  cloud_name: process.env.CLOUDINARY_NAME,\n  api_key: process.env.CLOUDINARY_API_KEY,\n  api_secret: process.env.CLOUDINARY_API_SECRET\n});\n\n\/\/ When doing a signed upload, you'll use a function like this:\nexports.handler = async event =&gt; {\n  const { file } = JSON.parse(event.body);\n  const res = await cloudinary.uploader.upload(file, { ...JSON.parse(event.body) });\n  return {\n    statusCode: 200,\n    body: JSON.stringify(res)\n  };\n};\n<\/code><\/pre>\n<p>This code connects your application to Cloudinary and sets up the image-upload process. For details on how to upload files to Cloudinary with the serverless function and the <code>useUpload<\/code> component, see the <a href=\"https:\/\/use-cloudinary.netlify.app\/usage\/use-upload\/\">related  documentation<\/a>.<\/p>\n<h2>Numerous Application Scenarios<\/h2>\n<p>As evidenced by the above high-level use cases, Jamstack offers significant time and resource savings. Its many flexible capabilities alone make it well worth recommending as the default architecture for building web applications.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":22268,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[25,426,175],"class_list":["post-22267","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-asset-management","tag-featured","tag-jamstack"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Serverless Functions Deliver Dynamism to Static Sites<\/title>\n<meta name=\"description\" content=\"Serverless functions offer static sites dynamic features. Learn how to build those functions to source pages or upload images to Cloudinary.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implement Dynamism in Static Sites With Serverless Functions\" \/>\n<meta property=\"og:description\" content=\"Serverless functions offer static sites dynamic features. Learn how to build those functions to source pages or upload images to Cloudinary.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-18T17:22:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-21T19:22:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Implement Dynamism in Static Sites With Serverless Functions\",\"datePublished\":\"2021-01-18T17:22:47+00:00\",\"dateModified\":\"2025-08-21T19:22:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA\",\"keywords\":[\"Asset Management\",\"Featured\",\"JAMStack\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2021\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions\",\"url\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions\",\"name\":\"Serverless Functions Deliver Dynamism to Static Sites\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA\",\"datePublished\":\"2021-01-18T17:22:47+00:00\",\"dateModified\":\"2025-08-21T19:22:56+00:00\",\"description\":\"Serverless functions offer static sites dynamic features. Learn how to build those functions to source pages or upload images to Cloudinary.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implement Dynamism in Static Sites With Serverless Functions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Serverless Functions Deliver Dynamism to Static Sites","description":"Serverless functions offer static sites dynamic features. Learn how to build those functions to source pages or upload images to Cloudinary.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions","og_locale":"en_US","og_type":"article","og_title":"Implement Dynamism in Static Sites With Serverless Functions","og_description":"Serverless functions offer static sites dynamic features. Learn how to build those functions to source pages or upload images to Cloudinary.","og_url":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions","og_site_name":"Cloudinary Blog","article_published_time":"2021-01-18T17:22:47+00:00","article_modified_time":"2025-08-21T19:22:56+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions"},"author":{"name":"","@id":""},"headline":"Implement Dynamism in Static Sites With Serverless Functions","datePublished":"2021-01-18T17:22:47+00:00","dateModified":"2025-08-21T19:22:56+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions"},"wordCount":8,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA","keywords":["Asset Management","Featured","JAMStack"],"inLanguage":"en-US","copyrightYear":"2021","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions","url":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions","name":"Serverless Functions Deliver Dynamism to Static Sites","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA","datePublished":"2021-01-18T17:22:47+00:00","dateModified":"2025-08-21T19:22:56+00:00","description":"Serverless functions offer static sites dynamic features. Learn how to build those functions to source pages or upload images to Cloudinary.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/implement_dynamism_in_static_sites_with_serverless_functions#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Implement Dynamism in Static Sites With Serverless Functions"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718526\/Web_Assets\/blog\/serverless-dynamic-sites_22268a98c6\/serverless-dynamic-sites_22268a98c6.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=22267"}],"version-history":[{"count":6,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22267\/revisions"}],"predecessor-version":[{"id":30247,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22267\/revisions\/30247"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/22268"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=22267"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=22267"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=22267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}