{"id":263,"date":"2020-07-08T17:07:24","date_gmt":"2020-07-08T16:07:24","guid":{"rendered":"https:\/\/blog.thomarite.uk\/?p=263"},"modified":"2020-07-17T20:21:13","modified_gmt":"2020-07-17T19:21:13","slug":"netbox-api-troubleshooting","status":"publish","type":"post","link":"https:\/\/blog.thomarite.uk\/index.php\/2020\/07\/08\/netbox-api-troubleshooting\/","title":{"rendered":"Netbox &#8211; API Troubleshooting"},"content":{"rendered":"\n<p>Yesterday managed to get netbox and my lab connected. So today followed up with the original article, and found a new issue that took me several hours.<\/p>\n\n\n\n<p>Initially I was seeing an error that I couldn&#8217;t undestand &#8220;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong><em>netbox.exceptions.CreateException: This field is required<\/em><\/strong><\/pre>\n\n\n\n<p>From<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">(venv) \/netbox-example\/nornir-napalm-netbox-demo master$ python scripts\/create_interfaces.py\nnb_url = http:\/\/0.0.0.0:8080\nCreating Netbox Interface for device r1, interface Loopback1\nTraceback (most recent call last):\nFile \"scripts\/create_interfaces.py\", line 42, in\ntask=create_netbox_interface,\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/<strong>init<\/strong>.py\", line 146, in run\nresult = self._run_serial(task, run_on, **kwargs)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/<strong>init<\/strong>.py\", line 72, in _run_serial\nresult[host.name] = task.copy().start(host, self)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/task.py\", line 85, in start\nr = self.task(self, **self.params)\nFile \"scripts\/create_interfaces.py\", line 34, in create_netbox_interface\ndevice_id=device_id,\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/netbox\/dcim.py\", line 431, in create_interface\nreturn self.netbox_con.post('\/dcim\/interfaces\/', required_fields, **kwargs)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/netbox\/connection.py\", line 124, in post\nraise exceptions.CreateException(resp_data)\n<strong><em>netbox.exceptions.CreateException: This field is required<\/em><\/strong>.<\/pre>\n\n\n\n<p>So I started to follow the trace, adding &#8220;print&#8221; and using &#8220;ipdb&#8221; to see what was going on:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">....\n\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/netbox\/connection.py(71)__request()\n70 finally:\n---> 71 self.close()\n72\nipdb> dir(response)\n['<strong>attrs<\/strong>', '<strong>bool<\/strong>', '<strong>class<\/strong>', '<strong>delattr<\/strong>', '<strong>dict<\/strong>', '<strong>dir<\/strong>', '<strong>doc<\/strong>', '<strong>enter<\/strong>', '<strong>eq<\/strong>', '<strong>exit<\/strong>', '<strong>format<\/strong>', '<strong>ge<\/strong>', '<strong>getattribute<\/strong>', '<strong>getstate<\/strong>', '<strong>gt<\/strong>', '<strong>hash<\/strong>', '<strong>init<\/strong>', '<strong>init_subclass<\/strong>', '<strong>iter<\/strong>', '<strong>le<\/strong>', '<strong>lt<\/strong>', '<strong>module<\/strong>', '<strong>ne<\/strong>', '<strong>new<\/strong>', '<strong>nonzero<\/strong>', '<strong>reduce<\/strong>', '<strong>reduce_ex<\/strong>', '<strong>repr<\/strong>', '<strong>setattr<\/strong>', '<strong>setstate<\/strong>', '<strong>sizeof<\/strong>', '<strong>str<\/strong>', '<strong>subclasshook<\/strong>', '<strong>weakref<\/strong>', '_content', '_content_consumed', '_next', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']\nipdb> response.url\n'http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces\/'\nipdb> response.text\n'{\"type\":[\"This field is required.\"]}'\nipdb> response.status_code\n400\nipdb> response.content\nb'{\"type\":[\"This field is required.\"]}'\nipdb> response.reason\n'Bad Request'\nipdb> response.request\n\nipdb> prepared_request\n\nipdb> prepared_request.url\n'http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces\/'\nipdb> dir(prepared_request)\n['<strong>class<\/strong>', '<strong>delattr<\/strong>', '<strong>dict<\/strong>', '<strong>dir<\/strong>', '<strong>doc<\/strong>', '<strong>eq<\/strong>', '<strong>format<\/strong>', '<strong>ge<\/strong>', '<strong>getattribute<\/strong>', '<strong>gt<\/strong>', '<strong>hash<\/strong>', '<strong>init<\/strong>', '<strong>init_subclass<\/strong>', '<strong>le<\/strong>', '<strong>lt<\/strong>', '<strong>module<\/strong>', '<strong>ne<\/strong>', '<strong>new<\/strong>', '<strong>reduce<\/strong>', '<strong>reduce_ex<\/strong>', '<strong>repr<\/strong>', '<strong>setattr<\/strong>', '<strong>sizeof<\/strong>', '<strong>str<\/strong>', '<strong>subclasshook<\/strong>', '<strong>weakref<\/strong>', '_body_position', '_cookies', '_encode_files', '_encode_params', '_get_idna_encoded_host', 'body', 'copy', 'deregister_hook', 'headers', 'hooks', 'method', 'path_url', 'prepare', 'prepare_auth', 'prepare_body', 'prepare_content_length', 'prepare_cookies', 'prepare_headers', 'prepare_hooks', 'prepare_method', 'prepare_url', 'register_hook', 'url']\nipdb> prepared_request.path_url\n'\/api\/dcim\/interfaces\/'\nipdb> response.__content\n*** AttributeError: 'Response' object has no attribute '__content'\nipdb> response._content\nb'{\"type\":[\"This field is required.\"]}'\n<strong>ipdb> response.content\nb'{\"type\":[\"This field is required.\"]}'<\/strong>\nipdb> response.headers\n{'Server': 'nginx', 'Date': 'Wed, 08 Jul 2020 12:36:35 GMT', 'Content-Type': 'application\/json', 'Content-Length': '36', 'Connection': 'keep-alive', 'Vary': 'Accept, Cookie, Origin', 'Allow': 'GET, POST, HEAD, OPTIONS, TRACE', 'API-Version': '2.8', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'SAMEORIGIN'}\nipdb> response.reason\n'Bad Request'\nipdb> response.request\n\nipdb> response.test\n*** AttributeError: 'Response' object has no attribute 'test'\nipdb> response.text\n'{\"type\":[\"This field is required.\"]}'\nipdb> response.url\n'http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces\/'\nipdb> quit\nCreate Netbox Interfaces\nr1 ** changed : False\nvvvv Create Netbox Interfaces ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ERROR\n---- napalm_get ** changed : False --------------------------------------------- INFO\n(venv) go:1.12.5|py:3.7.3|tomas@athens:~\/storage\/technology\/netbox-example\/nornir-napalm-netbox-demo master$ python scripts\/create_interfaces.py\nnb_url = http:\/\/0.0.0.0:8080\nurl3=http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces?limit=0\nCreating Netbox Interface for device r1, interface Loopback1\nurl3=http:\/\/0.0.0.0:8080\/api\/dcim\/devices\/?name=r1&amp;limit=0\ndevice_id = 1\nurl3=http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces\/\nresp_ok=False resp_status=400\nbody_data= {'name': 'Loopback1', 'form_factor': 1200, 'device': 1}\nparams= \/dcim\/interfaces\/\n<strong><em>resp_data= {'type': ['This field is required.']}<\/em><\/strong>\nTraceback (most recent call last):\nFile \"scripts\/create_interfaces.py\", line 43, in\ntask=create_netbox_interface,\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/<strong>init<\/strong>.py\", line 146, in run\nresult = self._run_serial(task, run_on, **kwargs)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/<strong>init<\/strong>.py\", line 72, in _run_serial\nresult[host.name] = task.copy().start(host, self)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/task.py\", line 85, in start\nr = self.task(self, **self.params)\nFile \"scripts\/create_interfaces.py\", line 35, in create_netbox_interface\ndevice_id=device_id,\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/netbox\/dcim.py\", line 431, in create_interface\nreturn self.netbox_con.post('\/dcim\/interfaces\/', required_fields, **kwargs)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/netbox\/connection.py\", line 130, in post\nraise exceptions.CreateException(resp_data)\nnetbox.exceptions.CreateException: This field is required.<\/pre>\n\n\n\n<p>So it seems that at the end I realised that I was missing the parameter &#8220;type&#8221; !!!<\/p>\n\n\n\n<p>I was checking the documentation from netbox in github but I couldnt see clearly what kind of config I had to provide&#8230;<\/p>\n\n\n\n<p>I checked the &#8220;type&#8221; value for the only interfaces I already had in netbox: &#8220;<a href=\"http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces\/\">http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces\/<\/a>&#8220;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"846\" height=\"1024\" src=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-54-02-846x1024.png\" alt=\"\" class=\"wp-image-264\" srcset=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-54-02-846x1024.png 846w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-54-02-248x300.png 248w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-54-02-768x930.png 768w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-54-02.png 916w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p>So I tried to pass exactly that but it was still failing&#8230;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">(venv) go:1.12.5|py:3.7.3|tomas@athens:~\/storage\/technology\/netbox-example\/nornir-napalm-netbox-demo master$ python scripts\/create_interfaces.py\nnb_url = http:\/\/0.0.0.0:8080\nurl3=http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces?limit=0\nCreating Netbox Interface for device r1, interface Loopback1\nurl3=http:\/\/0.0.0.0:8080\/api\/dcim\/devices\/?name=r1&amp;limit=0\ndevice_id = 1\nurl3=http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces\/\nresp_ok=False resp_status=400\n<strong>body_data= {'name': 'Loopback1', 'form_factor': 1200, 'device': 1, 'type': {'value': '1000base-t', 'label': '1000BASE-T (1GE)', 'id': 1000}}\n<\/strong>params= \/dcim\/interfaces\/\nresp_data= {'type': ['Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary or list.']}\nTraceback (most recent call last):\nFile \"scripts\/create_interfaces.py\", line 50, in\ntask=create_netbox_interface,\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/<strong>init<\/strong>.py\", line 146, in run\nresult = self._run_serial(task, run_on, **kwargs)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/<strong>init<\/strong>.py\", line 72, in _run_serial\nresult[host.name] = task.copy().start(host, self)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/nornir\/core\/task.py\", line 85, in start\nr = self.task(self, **self.params)\nFile \"scripts\/create_interfaces.py\", line 42, in create_netbox_interface\n**interface_type,\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/netbox\/dcim.py\", line 431, in create_interface\nreturn self.netbox_con.post('\/dcim\/interfaces\/', required_fields, **kwargs)\nFile \"\/home\/tomas\/storage\/technology\/netbox-example\/venv\/lib\/python3.7\/site-packages\/netbox\/connection.py\", line 130, in post\nraise exceptions.CreateException(resp_data)\n<strong><em>netbox.exceptions.CreateException: Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary or list.\n<\/em><\/strong>(venv) go:1.12.5|py:3.7.3|tomas@athens:~\/storage\/technology\/netbox-example\/nornir-napalm-netbox-demo master$<\/pre>\n\n\n\n<p>Somehow the API had to be documented&#8230; by chance, looking at the bottom of the netbox page, there was an&#8221;API&#8221; link&#8230;.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"156\" src=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-17-05-13-1024x156.png\" alt=\"\" class=\"wp-image-268\" srcset=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-17-05-13-1024x156.png 1024w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-17-05-13-300x46.png 300w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-17-05-13-768x117.png 768w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-17-05-13-1536x233.png 1536w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-17-05-13-2048x311.png 2048w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-17-05-13-1200x182.png 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p>So, now I needed to look up the correct API call. Based on the script and logs, it was a &#8220;POST&#8221; for &#8220;\/dcim\/interfaces\/&#8221;. Here we go!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"424\" src=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-00-10-1024x424.png\" alt=\"\" class=\"wp-image-266\" srcset=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-00-10-1024x424.png 1024w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-00-10-300x124.png 300w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-00-10-768x318.png 768w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-00-10-1536x636.png 1536w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-00-10-2048x849.png 2048w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-00-10-1200x497.png 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n\n\n\n<p>So finally, I had the info. I confirmed what fields were mandatory and the value they needed!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface_type = {}\ninterface_type&#91;\"type\"] = \"1000base-t\"\nfor interface_name in interfaces.keys():\n    if not is_interface_present(nb_interfaces, f\"{task.host}\", interface_name):\n        print(\n            f\"* Creating Netbox Interface for device {task.host}, interface {interface_name}\"\n        )\n        device_id = get_device_id(f\"{task.host}\", netbox)\n        print(\"device_id = %s\" % device_id)\n        netbox.dcim.create_interface(\n           name=f\"{interface_name}\",\n           form_factor=1200,  # default\n           device_id=device_id,\n           **interface_type,\n        )<\/code><\/pre>\n\n\n\n<p>So the script ran fine for all my devices:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">netbox-example\/nornir-napalm-netbox-demo master$ python scripts\/create_interfaces.py\nnb_url = http:\/\/0.0.0.0:8080\nurl3=http:\/\/0.0.0.0:8080\/api\/dcim\/interfaces?limit=0\nCreate Netbox Interfaces\nr1 ** changed : False\nvvvv Create Netbox Interfaces ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\n---- napalm_get ** changed : False --------------------------------------------- INFO\n^^^^ END Create Netbox Interfaces ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nr2 ** changed : False\nvvvv Create Netbox Interfaces ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\n---- napalm_get ** changed : False --------------------------------------------- INFO\n^^^^ END Create Netbox Interfaces ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nr3 ** changed : False\nvvvv Create Netbox Interfaces ** changed : False vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv INFO\n---- napalm_get ** changed : False --------------------------------------------- INFO\n^^^^ END Create Netbox Interfaces ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^<\/pre>\n\n\n\n<p>And it is updated in GUI:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"356\" src=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-56-52-1-1024x356.png\" alt=\"\" class=\"wp-image-267\" srcset=\"https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-56-52-1-1024x356.png 1024w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-56-52-1-300x104.png 300w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-56-52-1-768x267.png 768w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-56-52-1-1536x534.png 1536w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-56-52-1-2048x712.png 2048w, https:\/\/blog.thomarite.uk\/wp-content\/uploads\/2020\/07\/Screenshot-from-2020-07-08-16-56-52-1-1200x417.png 1200w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Yesterday managed to get netbox and my lab connected. So today followed up with the original article, and found a new issue that took me several hours. Initially I was seeing an error that I couldn&#8217;t undestand &#8220; netbox.exceptions.CreateException: This field is required From (venv) \/netbox-example\/nornir-napalm-netbox-demo master$ python scripts\/create_interfaces.py nb_url = http:\/\/0.0.0.0:8080 Creating Netbox Interface &hellip; <a href=\"https:\/\/blog.thomarite.uk\/index.php\/2020\/07\/08\/netbox-api-troubleshooting\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Netbox &#8211; API Troubleshooting&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,2],"tags":[],"class_list":["post-263","post","type-post","status-publish","format-standard","hentry","category-automation","category-networks"],"_links":{"self":[{"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/posts\/263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/comments?post=263"}],"version-history":[{"count":1,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/posts\/263\/revisions"}],"predecessor-version":[{"id":269,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/posts\/263\/revisions\/269"}],"wp:attachment":[{"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/media?parent=263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/categories?post=263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.thomarite.uk\/index.php\/wp-json\/wp\/v2\/tags?post=263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}