{"id":4006,"date":"2016-05-02T02:14:00","date_gmt":"2016-05-02T02:14:00","guid":{"rendered":"http:\/\/www.garysieling.com\/blog\/?p=4006"},"modified":"2020-03-30T02:42:52","modified_gmt":"2020-03-30T02:42:52","slug":"using-watson-api-node","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/","title":{"rendered":"Using the Watson API from Node"},"content":{"rendered":"<p>The IBM Watson API is part of IBM Bluemix, which appears to be be a fairly similar offerings to AWS.<\/p>\n<p>The &#8220;Watson&#8221; part of the offering has several analysis APIs, including image recognition, text analysis, speech to text, translation, etc.<\/p>\n<p>In this example, I&#8217;ll show how to access the <a href=\"http:\/\/www.alchemyapi.com\">&#8220;Alchemy&#8221; API<\/a> from Node. Alchemy gives you a wide range of basic natural language processing &#8211; in this case I&#8217;ll test out the sentiment analysis API (https:\/\/gateway-a.watsonplatform.net\/calls\/text\/TextGetTextSentiment). If you&#8217;re looking to use this, it gives you 1,000 free API calls per day, and then is metered. Pricing per API call varies depending on which call it is, and how difficult or commoditized the operation is. The APIs that are in Beta appear to be generally more free as well.<\/p>\n<p>When you set up an account, you can activate one of these APIs on your account through the portal:<br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"1169\" height=\"929\" alt=\"\" class=\"alignnone size-full wp-image-4008\" src=\"http:\/\/172.104.26.128\/wp-content\/uploads\/2016\/05\/img_5726b46cf3add.png\" srcset=\"https:\/\/www.garysieling.com\/blog\/wp-content\/uploads\/2016\/05\/img_5726b46cf3add.png 1169w, https:\/\/www.garysieling.com\/blog\/wp-content\/uploads\/2016\/05\/img_5726b46cf3add-300x238.png 300w, https:\/\/www.garysieling.com\/blog\/wp-content\/uploads\/2016\/05\/img_5726b46cf3add-1024x814.png 1024w, https:\/\/www.garysieling.com\/blog\/wp-content\/uploads\/2016\/05\/img_5726b46cf3add-768x610.png 768w\" sizes=\"(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Note that if you use the free version they require you to include sourcing in your application:<\/p>\n<pre>Usage Restrictions\n\nUsage of AlchemyAPI should abide by the restrictions of your respective API tier. Approved academic users are permitted to make a maximum of 30,000 API calls each day (or 1,000 daily calls for commercial use). More daily API calls (up to 200,000,000 daily) are available through an AlchemyAPI Subscription Plan.\n\nUsers of the AlchemyAPI Free service tier must provide proper attribution within their website or application:\n\nProvide a clickable hyperlink to www.alchemyapi.com with the text \"Text Analysis by AlchemyAPI\" within your website or application; and\n\nProvide attribution to AlchemyAPI within any published works that are based on or mention AlchemyAPI, or content generated by AlchemyAPI, including but not limited to research papers and journal articles.\n\nProvide attribution to AlchemyAPI within all web pages or documents where AlchemyAPI content and\/or API results are used or displayed.\n\nOther usage restrictions are listed in the AlchemyAPI Terms of Use policy.\n<\/pre>\n<p>When you call this API, you just need an API key, and then a payload of request parameters:<\/p>\n<pre lang=\"javascript\">let apiCall = {\n  apikey: apikey,\n  text: text,\n  outputMode: 'json',\n  showSourceMode: 0\n};\n\npost('https:\/\/gateway-a.watsonplatform.net' + baseUrl + endpoint,\n  {form: apiCall},\n    (err, response, body) =&gt; {\n      if (!!err) {\n        console.log(err);  \n      }\n          \n      writeFile(\n        filename,\n        body\n      );             \n    }\n);\n<\/pre>\n<p>I like to write each API call out to it&#8217;s own JSON file &#8211; this way I don&#8217;t risk calling the same API call multiple times and wasting resources, so around the above code I leave a check to make sure that the API output isn&#8217;t already downloaded:<\/p>\n<pre lang=\"javascript\">let filename: string = \n  \"json\/watson\/\" + field + \"_\" + endpoint + \"_\" + id + \".json\";\n\nif (existsSync(filename)) {\n  console.log(\"Skipping \" + filename);\n} else {\n   console.log(\"Analyzing \" + filename);\n\n   ... \n}\n<\/pre>\n<p>When I do this, I&#8217;m starting from a folder where I have a series of JSON files I want to analyse. To do this, you need to read the folder:<\/p>\n<pre lang=\"javascript\">readdir(\"json\/1\",\n  (err, files) =&gt; {\n    process(files, 1, () =&gt; {console.log(\"finished!\")});\n  });\n<\/pre>\n<p>Then the &#8220;process&#8221; function is recursive, or else you get a &#8220;too many open files&#8221; error.<\/p>\n<pre lang=\"javascript\">function process(files, i, finish) {\n  let filename = files[i];\n  let id = (filename.split(\".\"))[0];\n  \n  readFile(\n    \"json\/1\/\" + filename,\n    (err, content) =&gt; {   \n      fields.map(\n        (field) =&gt; {\n          apiCalls.map(\n            (endpoint) =&gt; \n              Try( () =&gt; {       \n                if (!!err) {               \n                  console.log(err);\n                  return;\n                }\n                \n                let json: string = JSON.parse(content + '');\n                let text: string = json[field];\n                \n                analyze(field, endpoint, id, text);\n                \n                if (i &lt; files.length) {\n                  process(files, i + 1, finish);\n                } else {\n                  finish();\n                }\n              }, \"Parsing file \" + id) \n          )\n        })\n    });\n}\n<\/pre>\n<p>When this runs successfully, you get output that looks like the following example &#8211; this is using the transcript from a university lecture. I did find it a little disappointing that this only gives you a single data value, where the Watson demo gives you hundreds, so it appears that you pay for every data point that you get out.<\/p>\n<pre lang=\"javascript\">{\n    \"status\": \"OK\",\n    \"usage\": \"By accessing AlchemyAPI or using information generated by AlchemyAPI, you are agreeing to be bound by the AlchemyAPI Terms of Use: http:\/\/www.alchemyapi.com\/company\/terms.html\",\n    \"totalTransactions\": \"1\",\n    \"language\": \"english\",\n    \"docSentiment\": {\n        \"mixed\": \"1\",\n        \"score\": \"0.214952\",\n        \"type\": \"positive\"\n    }\n}\n<\/pre>\n<p>If you run this too many times, you&#8217;ll get an API call that looks like this:<\/p>\n<pre lang=\"json\">{\n    \"status\": \"ERROR\",\n    \"statusInfo\": \"daily-transaction-limit-exceeded\"\n}\n<\/pre>\n<p>This is a bit of a pain, because you can get a lot of these (the sentiment API is quite fast, so it takes less than a minute to run out of calls).<\/p>\n<p>When running this, I found it was helpful to inject a logging utility to print out HTTP calls &#8211; this helps in the event you screw up something in the Node library to do external requests:<\/p>\n<pre lang=\"javascript\">requestLogger(require('https'));\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A basic node example that shows how to access the IBM Watson API<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[6,21],"tags":[53,302,378,385,387,388,557,583],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"A basic node example that shows how to access the IBM Watson API\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"gary\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Gary Sieling - Software Engineer\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Using the Watson API from Node - Gary Sieling\" \/>\n\t\t<meta property=\"og:description\" content=\"A basic node example that shows how to access the IBM Watson API\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2016-05-02T02:14:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-30T02:42:52+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Using the Watson API from Node - Gary Sieling\" \/>\n\t\t<meta name=\"twitter:description\" content=\"A basic node example that shows how to access the IBM Watson API\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#blogposting\",\"name\":\"Using the Watson API from Node - Gary Sieling\",\"headline\":\"Using the Watson API from Node\",\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"http:\\\/\\\/172.104.26.128\\\/wp-content\\\/uploads\\\/2016\\\/05\\\/img_5726b46cf3add.png\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#articleImage\"},\"datePublished\":\"2016-05-02T02:14:00+00:00\",\"dateModified\":\"2020-03-30T02:42:52+00:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#webpage\"},\"articleSection\":\"Data Science, Projects, api, javascript, natural language processing, nlp, node, node.js, typescript, watson\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/data-science\\\/#listItem\",\"name\":\"Data Science\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/data-science\\\/#listItem\",\"position\":2,\"name\":\"Data Science\",\"item\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/data-science\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#listItem\",\"name\":\"Using the Watson API from Node\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#listItem\",\"position\":3,\"name\":\"Using the Watson API from Node\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/category\\\/data-science\\\/#listItem\",\"name\":\"Data Science\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/\",\"name\":\"gary\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g\",\"width\":96,\"height\":96,\"caption\":\"gary\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#webpage\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/\",\"name\":\"Using the Watson API from Node - Gary Sieling\",\"description\":\"A basic node example that shows how to access the IBM Watson API\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/using-watson-api-node\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/author\\\/gary\\\/#author\"},\"datePublished\":\"2016-05-02T02:14:00+00:00\",\"dateModified\":\"2020-03-30T02:42:52+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/\",\"name\":\"Gary Sieling\",\"description\":\"Software Engineer\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.garysieling.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Using the Watson API from Node - Gary Sieling","description":"A basic node example that shows how to access the IBM Watson API","canonical_url":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#blogposting","name":"Using the Watson API from Node - Gary Sieling","headline":"Using the Watson API from Node","author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"},"image":{"@type":"ImageObject","url":"http:\/\/172.104.26.128\/wp-content\/uploads\/2016\/05\/img_5726b46cf3add.png","@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#articleImage"},"datePublished":"2016-05-02T02:14:00+00:00","dateModified":"2020-03-30T02:42:52+00:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#webpage"},"isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#webpage"},"articleSection":"Data Science, Projects, api, javascript, natural language processing, nlp, node, node.js, typescript, watson"},{"@type":"BreadcrumbList","@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.garysieling.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/#listItem","name":"Data Science"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/#listItem","position":2,"name":"Data Science","item":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#listItem","name":"Using the Watson API from Node"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#listItem","position":3,"name":"Using the Watson API from Node","previousItem":{"@type":"ListItem","@id":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/#listItem","name":"Data Science"}}]},{"@type":"Organization","@id":"https:\/\/www.garysieling.com\/blog\/#organization","name":"Gary Sieling","description":"Software Engineer","url":"https:\/\/www.garysieling.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author","url":"https:\/\/www.garysieling.com\/blog\/author\/gary\/","name":"gary","image":{"@type":"ImageObject","@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/0be925276d848ffe98a6a9dc8cf33e67?s=96&d=identicon&r=g","width":96,"height":96,"caption":"gary"}},{"@type":"WebPage","@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#webpage","url":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/","name":"Using the Watson API from Node - Gary Sieling","description":"A basic node example that shows how to access the IBM Watson API","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.garysieling.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/#breadcrumblist"},"author":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"creator":{"@id":"https:\/\/www.garysieling.com\/blog\/author\/gary\/#author"},"datePublished":"2016-05-02T02:14:00+00:00","dateModified":"2020-03-30T02:42:52+00:00"},{"@type":"WebSite","@id":"https:\/\/www.garysieling.com\/blog\/#website","url":"https:\/\/www.garysieling.com\/blog\/","name":"Gary Sieling","description":"Software Engineer","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.garysieling.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Gary Sieling - Software Engineer","og:type":"article","og:title":"Using the Watson API from Node - Gary Sieling","og:description":"A basic node example that shows how to access the IBM Watson API","og:url":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/","article:published_time":"2016-05-02T02:14:00+00:00","article:modified_time":"2020-03-30T02:42:52+00:00","twitter:card":"summary_large_image","twitter:title":"Using the Watson API from Node - Gary Sieling","twitter:description":"A basic node example that shows how to access the IBM Watson API"},"aioseo_meta_data":{"post_id":"4006","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2023-02-04 16:53:36","updated":"2026-07-06 01:54:41","ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.garysieling.com\/blog\/category\/data-science\/\" title=\"Data Science\">Data Science<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tUsing the Watson API from Node\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.garysieling.com\/blog"},{"label":"Data Science","link":"https:\/\/www.garysieling.com\/blog\/category\/data-science\/"},{"label":"Using the Watson API from Node","link":"https:\/\/www.garysieling.com\/blog\/using-watson-api-node\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/4006"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=4006"}],"version-history":[{"count":1,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/4006\/revisions"}],"predecessor-version":[{"id":6468,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/4006\/revisions\/6468"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=4006"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=4006"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=4006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}