{"id":1873,"date":"2016-06-13T13:23:23","date_gmt":"2016-06-13T12:23:23","guid":{"rendered":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/?p=1873"},"modified":"2022-11-18T10:18:16","modified_gmt":"2022-11-18T09:18:16","slug":"introduction-to-apis-using-iiif","status":"publish","type":"post","link":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/2016\/06\/introduction-to-apis-using-iiif\/","title":{"rendered":"Introduction to APIs using IIIF"},"content":{"rendered":"<p>This &#8220;Introduction to APIs&#8221; was developed by Owen Stephens (<a href=\"mailto:owen@ostephens.com\">owen@ostephens.com<\/a>) on behalf of the British Library. This work is licensed under a Creative Commons Attribution 4.0 International License\u00a0<a href=\"http:\/\/creativecommons.org\/licenses\/by\/4.0\/\">http:\/\/creativecommons.org\/licenses\/by\/4.0\/<\/a>. It is suggested when crediting this work, you include the phrase &#8220;Developed by Owen Stephens on behalf of the British Library&#8221;<\/p>\n<h2>Purpose of these exercises<\/h2>\n<p>The purpose of this set of exercises is provide an insight into what it is like to work with an API on the web. Specifically the exercises here will introduce:<\/p>\n<ul>\n<li>the basics of how APIs work<\/li>\n<li>what questions you need to ask and challenges you can face when using an API to build an application, and so&#8230;<\/li>\n<li>what things you need to consider when providing an API for people to use (or selecting a system that offers an API)<\/li>\n<\/ul>\n<p>While the exercises here work, they are not a genuine attempt to build a useful application with an API. If you are interested in using APIs you may want to consider looking at the lessons and tutorials available from:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.librarieshacked.org\/tutorials\">https:\/\/www.librarieshacked.org\/tutorials<\/a><\/li>\n<li><a href=\"http:\/\/programminghistorian.org\/lessons\/\">http:\/\/programminghistorian.org\/lessons\/<\/a><\/li>\n<\/ul>\n<h2>How APIs work<\/h2>\n<p>There are many different types of API, and they don&#8217;t all work in the same way. However, broadly the user of the API (e.g. the developer or the software written by the developer) makes a request to the API, and gets back a response.<\/p>\n<p><a href=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/2016\/06\/introduction-to-apis-using-iiif\/screen-shot-2016-06-10-at-11-56-56\/\" rel=\"attachment wp-att-1874\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1874\" src=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.56.56-1024x353.png\" alt=\"API Illustration\" width=\"640\" height=\"221\" srcset=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.56.56-1024x353.png 1024w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.56.56-300x103.png 300w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.56.56-768x265.png 768w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.56.56.png 1160w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>A single API may support different types of request. For example, the Twitter\u00a0API\u00a0supports a range of requests including:<\/p>\n<ul>\n<li>search<\/li>\n<li>status update (i.e. post a Tweet)<\/li>\n<li>get list of follower<\/li>\n<\/ul>\n<p>Sometimes these different API requests are called &#8216;API calls&#8217;.<\/p>\n<p>The API will define what information can be included in a request and what information will be sent back in the response (and in what format).<\/p>\n<p>This is where good documentation for an API is essential &#8211; it is really difficult to use an API when you are left guessing what information you need to send it and what information you can expect to get back. When assessing an API, assessing the quality and availability of the documentation should be taken into account.<\/p>\n<p>To use an API, you also need to know where to send the request to &#8211; when working with web APIs this will be a URL.<\/p>\n<h2>Exercise 1: Using an API for the first time<\/h2>\n<h3>Introduction<\/h3>\n<p>In this exercise you are going to use a Google Spreadsheet to display and manipulate an image using the IIIF Image API.<\/p>\n<h3>Understanding the API<\/h3>\n<p>The API you are going to use is the IIIF Image API. The IIIF Image API is designed to enable you to work with a single image, requesting either the image itself OR information about the image. The IIIF Image API is documented at <a href=\"http:\/\/iiif.io\/api\/image\/2.1\/\">http:\/\/iiif.io\/api\/image\/2.1\/<\/a>.<\/p>\n<p>The IIIF Image API supports two types of requests &#8211; the &#8220;Image Request&#8221; (gets back an Image) and the &#8220;Image Information Request&#8221; (gets back information(!) about the image &#8211; this includes data such as the size of the image and the types of image manipulation that can be requested using the Image Request parameters).<a href=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/2016\/06\/introduction-to-apis-using-iiif\/screen-shot-2016-06-10-at-11-55-17\/\" rel=\"attachment wp-att-1875\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1875\" src=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.55.17-1024x697.png\" alt=\"Illustration of IIIF Image API\" width=\"640\" height=\"436\" srcset=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.55.17-1024x697.png 1024w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.55.17-300x204.png 300w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.55.17-768x522.png 768w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-11.55.17.png 1182w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>The place you send the request to will depend on what digital library (or other IIIF compliant service) you want to get the image from.<\/p>\n<p>In this first exercise you are going to use the &#8216;Image Request&#8217; API call. The request to the API is made using a URL, and you can vary the details of the request by modifying different parts of the URL. The parts of the request you can modify are sometimes called &#8216;parameters&#8217;. The IIIF Image Request URI is structured as follows:<\/p>\n<pre style=\"padding-left: 30px;\">{scheme}:\/\/{server}{\/prefix}\/{identifier}\/{region}\/{size}\/{rotation}\/{quality}.{format}<\/pre>\n<p>Each word in curly bracket { } represents a part of the URL you need to create to make a request to the Image Request API.<\/p>\n<p>You can look at these using an example from the Bodleian&#8217;s IIIF compliant service:<\/p>\n<pre style=\"padding-left: 30px;\">http:\/\/iiif.bodleian.ox.ac.uk\/iiif\/image\/a1795520-e3c8-44a0-a077-c80a398978b9\/full\/full\/0\/default.jpg<\/pre>\n<p>You can see how this URL maps to the structured described by the IIIF Image Request documentation.<\/p>\n<table style=\"border: 1px solid black;\" cellspacing=\"10\" cellpadding=\"10\">\n<tbody>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" colspan=\"3\" valign=\"top\"><b>Breakdown of URL&#8230;<\/b><\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{scheme}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">http<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" rowspan=\"3\" valign=\"top\">Together these three parts of the URL essentially form the address to which the API request can be made<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{server}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">iiif.bodleian.ox.ac.uk<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{prefix}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">iiif\/image<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{identifier}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">a1795520-e3c8-44a0-a077-c80a398978b9<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">This is an identifier for the digital object you want the API to use as the basis of its response<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{region}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">full<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">The &#8216;region&#8217; parameter lets you define whether the API will return the whole object, or just a specific region of the object. In the example &#8216;full&#8217; is used indicating the whole image<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{size}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">full<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">The &#8216;size&#8217; parameter lets you define the size of the image returned by the API. In the example &#8216;full&#8217; is used indicating the API should respond with full size image<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{rotation}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">0<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">The &#8216;rotation&#8217; parameter lets you specify if you want the API to rotate the image in the response<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{quality}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">default<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">The &#8216;quality&#8217; parameter tells the API whether to respond with a colour, gray scale, or bitonal image. In the example &#8216;default&#8217; is used to indicate that the API should respond with whichever format is the default for the requested image<\/td>\n<\/tr>\n<tr>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">{format}<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">jpg<\/td>\n<td style=\"border: 1px solid black; padding: 15px;\" valign=\"top\">The &#8216;format&#8217; parameter tells the API what image format to use when it sends its response. In the example &#8216;jpg&#8217; is used to indicate that a JPEG image should be sent.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The response you get from a request to this URI is an image.<\/p>\n<p>The key things you need to know to work with this API are:<\/p>\n<ul>\n<li>The address of the API (the first three rows in the table above)<\/li>\n<li>The parameters that the API expects in a request (the remaining rows in the table above)<\/li>\n<li>What the API will send in response to a request (an image)<\/li>\n<\/ul>\n<p>Now you&#8217;ve got this information, you are ready to start using the API.<\/p>\n<blockquote>\n<h3>Going Further<\/h3>\n<p>To find out what valid values can be used for each of the parameters in the IIIF Image Request API, read <a href=\"http:\/\/iiif.io\/api\/image\/2.1\/\">the documentation available at\u00a0http:\/\/iiif.io\/api\/image\/2.1\/<\/a>.<\/p><\/blockquote>\n<h2>Using the IIIF Image Request API to retrieve and display an Image<\/h2>\n<p>To use the API, you are going to use a Google Spreadsheet. A template spreadsheet has already been setup which you will use for this exercise.<\/p>\n<p>Go to <a href=\"http:\/\/drive.google.com\">http:\/\/drive.google.com<\/a> and login to your Google account. In a separate browser tab or window, visit the following URL:<\/p>\n<p style=\"padding-left: 30px;\"><b> <\/b><a href=\"http:\/\/bit.ly\/BL109-1\"><b>http:\/\/bit.ly\/BL109-1<\/b><\/a><\/p>\n<p>Click on &#8220;File&#8221; and choose &#8220;Make a copy&#8221;. You should be prompted to set a name for your copy, and once you click &#8216;OK&#8217;, this should make a copy of the Google Spreadsheet in your own Google account.<\/p>\n<p>You should now have an editable spreadsheet that looks something like:<\/p>\n<p><a href=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/2016\/06\/introduction-to-apis-using-iiif\/screen-shot-2016-06-10-at-14-11-57\/\" rel=\"attachment wp-att-1878\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1878 size-medium\" src=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.11.57-300x258.png\" alt=\"Illustration of template spreadsheet\" width=\"300\" height=\"258\" srcset=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.11.57-300x258.png 300w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.11.57-768x660.png 768w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.11.57.png 884w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>The way this spreadsheet is laid out is to have one cell per parameter for a valid IIIIF Image request. By filling out the rest of this spreadsheet, and then telling it to send the request to the API, you will be able to retrieve and display an image.<\/p>\n<p>Based on the information you obtained by understanding the API (see above) you can complete the parameters in column B as follows:<\/p>\n<ul>\n<li>B3: full<\/li>\n<li>B4: full<\/li>\n<li>B5: 0<\/li>\n<li>B6: default<\/li>\n<li>B7: jpg<\/li>\n<\/ul>\n<p>You now have all the parameters we need to build the API call. To do this you want to create a URL very similar to the one you looked at above. You can do this using a handy spreadsheet function\/formula called &#8220;Concatenate&#8221; which allows you to combine the contents of a number of spreadsheet cells with other text.<\/p>\n<p><strong>In Cell B8 type the following formula:<\/strong><\/p>\n<pre style=\"padding-left: 30px;\">=concatenate(B1,\"\/\",B2,\"\/\",B3,\"\/\",B4,\"\/\",B5,\"\/\",B6,\".\",B7)<\/pre>\n<p>This joins the contents of cells B1 to B7, with the appropriate characters in between to make a valid IIIF Image Request URL. Once you have entered this formula and pressed enter your spreadsheet should look like:<\/p>\n<p><a href=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/2016\/06\/introduction-to-apis-using-iiif\/screen-shot-2016-06-10-at-14-43-01\/\" rel=\"attachment wp-att-1880\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-1880\" src=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.43.01-1024x456.png\" alt=\"Illustration of template with well formatted IIIF Image request URL\" width=\"640\" height=\"285\" srcset=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.43.01-1024x456.png 1024w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.43.01-300x134.png 300w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.43.01-768x342.png 768w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-14.43.01.png 1514w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>The final step is to send this query display the response. Since we know the API &#8216;request&#8217; takes the form of a URL, and the response is going to be a JPEG image, we can take advantage of the fact that Google Spreadsheets has a special function for retrieving and displaying Images.<\/p>\n<p><strong>To use this, in Cell B9 type the following formula:<\/strong><\/p>\n<pre style=\"padding-left: 30px;\">=image(B8)<\/pre>\n<p><strong>Now, hit enter, and see the result.<\/strong><\/p>\n<p>Congratulations! You have built an API request, and displayed the response.<\/p>\n<h2>Modify the API request to change how the image is displayed<\/h2>\n<p>Now you have a working API request, you can start to modify the request to control exactly what image is returned in the response. We have to use valid values for the parameters in order that the API knows how to respond correct.<\/p>\n<p>For example, the &#8216;Rotation&#8217; parameter controls whether the image is rotated in the API response. The Rotation parameter is a numeric value expressed in degrees of rotation, that is a number between 0 and 360 inclusive. Some images (including the one used in this example) only allow rotations in steps of 90 degrees, so in this particular case on values of 0, 90, 180, 270 and 360 are allowed.<\/p>\n<p><b>To change the rotation, modify the value of the &#8216;Rotation&#8217; parameter (in cell B5) from &#8216;0&#8217; to &#8217;90&#8217;.<\/b><\/p>\n<p>The value in the &#8216;Rotation&#8217; parameter can also be preceded by an exclamation mark &#8216;!&#8217; to request a mirror image version of the digital object.<\/p>\n<p><b>Try modifying the value of the &#8216;Rotation&#8217; parameter to &#8216;!0&#8217;<\/b><\/p>\n<p>The &#8216;Region&#8217; parameter defines a rectangular portion of the full image to be returned. This can be expressed in a number of different ways (all described in the API documentation). In this case you are going to display a rectangular area of the image by specifying the coordinates of the top left corner of the rectangle in pixels (a unit of measure for digital images) and the width and height of the rectangle, also in pixels. An example from the IIIF documentation is illustrated here:<\/p>\n<p><a href=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/2016\/06\/introduction-to-apis-using-iiif\/screen-shot-2016-06-10-at-15-14-52\/\" rel=\"attachment wp-att-1881\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1881 size-medium\" src=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-15.14.52-300x241.png\" alt=\"Graphic from IIIF documentation explaining the 'region' parameter in an Image Request\" width=\"300\" height=\"241\" srcset=\"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-15.14.52-300x241.png 300w, http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-content\/uploads\/2016\/06\/Screen-Shot-2016-06-10-at-15.14.52.png 698w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>In this example, by setting the &#8216;range&#8217; parameter to &#8220;125,15,120,140&#8221;, the API will respond with a rectangle from the original image that is 120 pixels wide, and 140 pixels high, starting 125 pixels from the left of the image and 15 pixels from the top of the image.<\/p>\n<ul>\n<li><b>Try changing the Region parameter to &#8220;1090,860,360,250&#8221;<\/b><\/li>\n<li><b>You can play around with these numbers to show different areas of the original image.<\/b><\/li>\n<li><b>Change the Region parameter back to &#8216;full&#8217; to display the whole image again<\/b><\/li>\n<\/ul>\n<p>You have:<\/p>\n<ul>\n<li>Explored the IIIF Image Request API<\/li>\n<li>Seen how you can create a request (aka Call) for the API by constructing a URL with appropriate parameters<\/li>\n<li>Retrieved an Image using the IIIF Image Request API<\/li>\n<li>Modified the request to control how the image is returned to you<\/li>\n<\/ul>\n<blockquote>\n<h2>Going Further<\/h2>\n<p>This spreadsheet will work with any service which supports the IIIF Image Request API. To try this you can replace the &#8216;Base URL&#8217; with the URL of the British Library&#8217;s IIIF API, and enter an identifier for an image on the British Library server. Try replacing the Base URL and Identifier in the spreadsheet above with the following information:<\/p>\n<ul>\n<li>Base URL: <a href=\"http:\/\/api.bl.uk\/image\/iiif\">http:\/\/api.bl.uk\/image\/iiif<\/a><\/li>\n<li>Identifier: ark:\/81055\/vdc_100004173859.0x000002<\/li>\n<\/ul>\n<p>This image is part of a digitised magazine. By modifying the identifier you can view other pages from the magazine. E.g.:<\/p>\n<ul>\n<li>ark:\/81055\/vdc_100004173859.0x000003<\/li>\n<li>ark:\/81055\/vdc_100004173859.0x000004<\/li>\n<li>ark:\/81055\/vdc_100004173859.0x000005<\/li>\n<\/ul>\n<p>etc.<\/p>\n<p>Can you modify the spreadsheet to make it easy to move from page to page without having to re-type the identifier each time?<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>This &#8220;Introduction to APIs&#8221; was developed by Owen Stephens (owen@ostephens.com) on behalf of the British Library. This work is licensed under a Creative Commons Attribution 4.0 International License\u00a0http:\/\/creativecommons.org\/licenses\/by\/4.0\/. It is suggested when crediting this work, you include the phrase &#8220;Developed by Owen Stephens on behalf of the British Library&#8221; Purpose of these exercises The purpose [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1873","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/posts\/1873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/comments?post=1873"}],"version-history":[{"count":15,"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/posts\/1873\/revisions"}],"predecessor-version":[{"id":1936,"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/posts\/1873\/revisions\/1936"}],"wp:attachment":[{"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/media?parent=1873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/categories?post=1873"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.meanboyfriend.com\/overdue_ideas\/wp-json\/wp\/v2\/tags?post=1873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}