{"id":2042,"date":"2022-12-29T15:45:07","date_gmt":"2022-12-29T10:15:07","guid":{"rendered":"https:\/\/www.ninjacart.in\/blog\/?p=2042"},"modified":"2022-12-29T15:59:11","modified_gmt":"2022-12-29T10:29:11","slug":"codeless-microservice-generic-microservice-at-ninjacart","status":"publish","type":"post","link":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/","title":{"rendered":"Codeless Microservice &#8211; Generic Microservice at Ninjacart"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\"><strong>The Problem Statement<\/strong><\/h2>\n\n\n\n<p>In Ninjacart, the requirement for developing API for multiple domains comes up quite often. Traditionally, for developing an API we design the Data Model, define Interface, and service implementation for a domain entity. So for a given entity, supporting all SCRUD API developers used to take around 2 to 3 days.&nbsp;<\/p>\n\n\n\n<p>In case we have to support N entities, a lot of time was spent on writing the same boilerplate code again and again. In short, below are the problems we wanted to solve:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>How to get the developer to focus more on Entity Design?<\/li><li>How to reduce the time to write the same SCRUP API?<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>The Solution<\/strong><\/h2>\n\n\n\n<p>As discussed in the above section, to solve the problem, we thought of using the <strong><em>schema-on-read<\/em><\/strong> concept. In <em>schema-on-read<\/em>, data is applied to a schema as it is pulled out of a stored location, rather than as it goes in.<\/p>\n\n\n\n<p>&nbsp;Below are the focus points to keep in mind while using the schema-on-read concept<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>We need to have a schema store<\/li><li>We should have the ability to validate the schema structure<\/li><li>Once the schema is created in the store, the API should be readily available for consumption for that schema<\/li><li>Support for Schema Evolution<\/li><li>Strictly abide by the rule of the Microservice design principle &#8211; Loosely coupled with the external system using Hexagonal Design Pattern<\/li><li>Support for Audit<\/li><li>Support for Multiple Data Sources<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Core Component<\/strong><\/h2>\n\n\n\n<p>The core component of this system is the Schema Store. We decided to go ahead with<a href=\"https:\/\/www.apicur.io\/\" target=\"_blank\" rel=\"noopener\"> https:\/\/www.apicur.io\/<\/a> since they support multiple formats of a schema like json, JSON-LD, XML, Avro, graphql etc. By default, they support schema versioning as well. They provide client SDK to read and update schema as well based on versions.<\/p>\n\n\n\n<p>The data store we started supporting is Mongo DB and for search, we use elastic search. For Audit, we want to use an event-based architecture.<\/p>\n\n\n\n<p>Below is the architecture for our <strong><em>Generic Entity Service.<\/em><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"844\" src=\"https:\/\/www.ninjacart.in\/blog\/wp-content\/uploads\/2022\/12\/Blog-content-img-01-1-1024x844.png\" alt=\"\" class=\"wp-image-2049\" srcset=\"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-content-img-01-1-1024x844.png 1024w, https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-content-img-01-1-300x247.png 300w, https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-content-img-01-1-768x633.png 768w, https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-content-img-01-1-600x495.png 600w, https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-content-img-01-1-1536x1266.png 1536w, https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-content-img-01-1-2048x1689.png 2048w, https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-content-img-01-1-1170x965.png 1170w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In the above architecture, the developer just focuses on Data Model Design and uploads the schema in the JSON-LD format in apicur.io. The core 6 API which is BSCRUD (Bulk, Search, Create, Read, Update and Delete) are written in Spring boot and deployed.<\/p>\n\n\n\n<p>The responsibility of the clients invoking the above APIs is to pass the entity type in the path param to use BSCRUP API after the model is deployed. At run-time, based on the entity type in the path param, we load the schema and validate the schema against the given JSON. Any schema validation error API won&#8217;t be succeeded. Below is the sample API Signature:<\/p>\n\n\n\n<p>\/api\/v1\/{entityType}<\/p>\n\n\n\n<p>The entity type is the name of the entity we uploaded to the schema store<\/p>\n\n\n\n<p>The search is supported via Elastic Search and the rest of the CREATE and READ API is on top of Mongo DB.<\/p>\n\n\n\n<p>&nbsp;Once the record persists in Mongo DB, an async request is passed to persist the record in Elastic Search as well as generate an event in Azure Event Hub for Audit. All our services are deployed on Azure.<\/p>\n\n\n\n<p><strong>What\u2019s Next?<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Once the schema is uploaded to apicur.io, we would like to generate SDL (Schema Definition Language) automatically.<\/li><li>This will enable us to introduce authorization in our generic entity services with row-level filtering as well as column-level filtering.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h2>\n\n\n\n<p>With the above architecture, do we not need to write API at all hereafter?&nbsp;<\/p>\n\n\n\n<p><strong>The answer is No<\/strong>.&nbsp;<\/p>\n\n\n\n<p>This architecture will solve the following problems:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>For the APIs where no Business logic is involved or more static data, this architecture is well suited.<\/li><li>Reduce development time by avoiding unnecessary boilerplate code on our services<\/li><li>The developer could focus only on business logic APIs alone<\/li><\/ul>\n\n\n\n<p>With this approach in our Ninjacart, we were able to fast-track all our releases well ahead of time.<\/p>\n\n\n\n<p><strong>Written by<\/strong><br>Karthikeyan Karunanithi<\/p>\n\n\n\n<p>Architect &#8211; 1.2<\/p>\n\n\n\n<p>Software Development<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Problem Statement In Ninjacart, the requirement for developing API for multiple domains comes up quite often. Traditionally, for developing an API we design the Data Model, define Interface, and service implementation for a domain entity. So for a given entity, supporting all SCRUD API developers used to take around 2 to 3 days.&nbsp; In [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2044,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","_wp_applaud_exclude":false,"footnotes":""},"categories":[167],"tags":[109,15,101,10],"class_list":["post-2042","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-architecture","tag-microservices","tag-ninjacart","tag-problem-solving","tag-technology"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Codeless Microservice - Generic Microservice at Ninjacart - Ninjacart Blogs<\/title>\n<meta name=\"robots\" content=\"noindex, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Codeless Microservice - Generic Microservice at Ninjacart - Ninjacart Blogs\" \/>\n<meta property=\"og:description\" content=\"The Problem Statement In Ninjacart, the requirement for developing API for multiple domains comes up quite often. Traditionally, for developing an API we design the Data Model, define Interface, and service implementation for a domain entity. So for a given entity, supporting all SCRUD API developers used to take around 2 to 3 days.&nbsp; In [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/\" \/>\n<meta property=\"og:site_name\" content=\"Ninjacart Blogs\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ninjacart\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-29T10:15:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-29T10:29:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2661\" \/>\n\t<meta property=\"og:image:height\" content=\"1300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ninjacart\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ninjacart\" \/>\n<meta name=\"twitter:site\" content=\"@ninjacart\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ninjacart\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/\"},\"author\":{\"name\":\"Ninjacart\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/person\/b25ebe6f3ec9398a74ab52d78814689e\"},\"headline\":\"Codeless Microservice &#8211; Generic Microservice at Ninjacart\",\"datePublished\":\"2022-12-29T10:15:07+00:00\",\"dateModified\":\"2022-12-29T10:29:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/\"},\"wordCount\":655,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png\",\"keywords\":[\"microservices\",\"Ninjacart\",\"problem solving\",\"Technology\"],\"articleSection\":[\"Architecture\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/\",\"url\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/\",\"name\":\"Codeless Microservice - Generic Microservice at Ninjacart - Ninjacart Blogs\",\"isPartOf\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png\",\"datePublished\":\"2022-12-29T10:15:07+00:00\",\"dateModified\":\"2022-12-29T10:29:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#primaryimage\",\"url\":\"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png\",\"contentUrl\":\"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png\",\"width\":2661,\"height\":1300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/dev.ninjacart.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Codeless Microservice &#8211; Generic Microservice at Ninjacart\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#website\",\"url\":\"https:\/\/dev.ninjacart.com\/blog\/\",\"name\":\"Ninjacart Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/dev.ninjacart.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#organization\",\"name\":\"Ninjacart\",\"url\":\"https:\/\/dev.ninjacart.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.ninjacart.in\/blog\/wp-content\/uploads\/2022\/03\/NC-Logo-_white-BG-01.png\",\"contentUrl\":\"https:\/\/www.ninjacart.in\/blog\/wp-content\/uploads\/2022\/03\/NC-Logo-_white-BG-01.png\",\"width\":200,\"height\":200,\"caption\":\"Ninjacart\"},\"image\":{\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/ninjacart\/\",\"https:\/\/x.com\/ninjacart\",\"https:\/\/www.instagram.com\/ninjacart_official\/\",\"https:\/\/www.linkedin.com\/company\/ninja-cart\/mycompany\/verification\/\",\"https:\/\/www.youtube.com\/channel\/UCYjRMgDjCp6wat86aUt_5aw\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/person\/b25ebe6f3ec9398a74ab52d78814689e\",\"name\":\"Ninjacart\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2024\/08\/cropped-favicon-300x300-1-96x96.png\",\"contentUrl\":\"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2024\/08\/cropped-favicon-300x300-1-96x96.png\",\"caption\":\"Ninjacart\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Codeless Microservice - Generic Microservice at Ninjacart - Ninjacart Blogs","robots":{"index":"noindex","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"en_US","og_type":"article","og_title":"Codeless Microservice - Generic Microservice at Ninjacart - Ninjacart Blogs","og_description":"The Problem Statement In Ninjacart, the requirement for developing API for multiple domains comes up quite often. Traditionally, for developing an API we design the Data Model, define Interface, and service implementation for a domain entity. So for a given entity, supporting all SCRUD API developers used to take around 2 to 3 days.&nbsp; In [&hellip;]","og_url":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/","og_site_name":"Ninjacart Blogs","article_publisher":"https:\/\/www.facebook.com\/ninjacart\/","article_published_time":"2022-12-29T10:15:07+00:00","article_modified_time":"2022-12-29T10:29:11+00:00","og_image":[{"width":2661,"height":1300,"url":"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png","type":"image\/png"}],"author":"Ninjacart","twitter_card":"summary_large_image","twitter_creator":"@ninjacart","twitter_site":"@ninjacart","twitter_misc":{"Written by":"Ninjacart","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#article","isPartOf":{"@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/"},"author":{"name":"Ninjacart","@id":"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/person\/b25ebe6f3ec9398a74ab52d78814689e"},"headline":"Codeless Microservice &#8211; Generic Microservice at Ninjacart","datePublished":"2022-12-29T10:15:07+00:00","dateModified":"2022-12-29T10:29:11+00:00","mainEntityOfPage":{"@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/"},"wordCount":655,"commentCount":0,"publisher":{"@id":"https:\/\/dev.ninjacart.com\/blog\/#organization"},"image":{"@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#primaryimage"},"thumbnailUrl":"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png","keywords":["microservices","Ninjacart","problem solving","Technology"],"articleSection":["Architecture"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/","url":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/","name":"Codeless Microservice - Generic Microservice at Ninjacart - Ninjacart Blogs","isPartOf":{"@id":"https:\/\/dev.ninjacart.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#primaryimage"},"image":{"@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#primaryimage"},"thumbnailUrl":"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png","datePublished":"2022-12-29T10:15:07+00:00","dateModified":"2022-12-29T10:29:11+00:00","breadcrumb":{"@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#primaryimage","url":"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png","contentUrl":"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2022\/12\/Blog-Header-_-Generic-Entity-01-1.png","width":2661,"height":1300},{"@type":"BreadcrumbList","@id":"https:\/\/dev.ninjacart.com\/blog\/codeless-microservice-generic-microservice-at-ninjacart\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dev.ninjacart.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Codeless Microservice &#8211; Generic Microservice at Ninjacart"}]},{"@type":"WebSite","@id":"https:\/\/dev.ninjacart.com\/blog\/#website","url":"https:\/\/dev.ninjacart.com\/blog\/","name":"Ninjacart Blog","description":"","publisher":{"@id":"https:\/\/dev.ninjacart.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dev.ninjacart.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/dev.ninjacart.com\/blog\/#organization","name":"Ninjacart","url":"https:\/\/dev.ninjacart.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.ninjacart.in\/blog\/wp-content\/uploads\/2022\/03\/NC-Logo-_white-BG-01.png","contentUrl":"https:\/\/www.ninjacart.in\/blog\/wp-content\/uploads\/2022\/03\/NC-Logo-_white-BG-01.png","width":200,"height":200,"caption":"Ninjacart"},"image":{"@id":"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ninjacart\/","https:\/\/x.com\/ninjacart","https:\/\/www.instagram.com\/ninjacart_official\/","https:\/\/www.linkedin.com\/company\/ninja-cart\/mycompany\/verification\/","https:\/\/www.youtube.com\/channel\/UCYjRMgDjCp6wat86aUt_5aw"]},{"@type":"Person","@id":"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/person\/b25ebe6f3ec9398a74ab52d78814689e","name":"Ninjacart","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dev.ninjacart.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2024\/08\/cropped-favicon-300x300-1-96x96.png","contentUrl":"https:\/\/dev.ninjacart.com\/blog\/wp-content\/uploads\/2024\/08\/cropped-favicon-300x300-1-96x96.png","caption":"Ninjacart"}}]}},"_links":{"self":[{"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/posts\/2042"}],"collection":[{"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/comments?post=2042"}],"version-history":[{"count":4,"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/posts\/2042\/revisions"}],"predecessor-version":[{"id":2051,"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/posts\/2042\/revisions\/2051"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/media\/2044"}],"wp:attachment":[{"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/media?parent=2042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/categories?post=2042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dev.ninjacart.com\/blog\/wp-json\/wp\/v2\/tags?post=2042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}