{"id":250,"date":"2019-12-09T09:00:22","date_gmt":"2019-12-09T09:00:22","guid":{"rendered":"https:\/\/keith.resar.org\/blog\/?p=250"},"modified":"2019-12-06T22:30:08","modified_gmt":"2019-12-06T22:30:08","slug":"earning-thousands-by-solving-the-wrong-email-problem-part-1","status":"publish","type":"post","link":"https:\/\/keith.resar.org\/blog\/earning-thousands-by-solving-the-wrong-email-problem-part-1\/","title":{"rendered":"Earning Thousands by Solving the Wrong Email Problem (Part 1)"},"content":{"rendered":"<p>Stumbling into a web site that actually pays (the email-format.com story) &#8211; Part 1<\/p>\n<p><!--more--><\/p>\n<p><span style=\"color: #999999;\"><em>I&#8217;m sharing my startup stories while building out my latest project &#8211; <a style=\"color: #999999;\" href=\"https:\/\/www.calenzen.com\/?utm_source=keith.resar.org_blog&amp;utm_medium=inline\">Calenzen<\/a> &#8211; fixes the meetings you&#8217;re invited to so you can always instantly click-to-dial. No special apps, calendar programs, or software is ever needed.\u00a0 <a style=\"color: #999999;\" href=\"https:\/\/www.calenzen.com\/?utm_source=keith.resar.org_blog&amp;utm_medium=inline\">Learn more about Calenzen<\/a>.<\/em><\/span><\/p>\n<p><b>My Problem, But Not <\/b><b><i>The<\/i><\/b><b> Problem<\/b><\/p>\n<p><span style=\"font-weight: 400;\">The idea behind this project came after a job interview. \u00a0I wanted to send the hiring manager a follow-up email, but I never got his address. \u00a0I spent a few minutes with a search engine looking for \u201cexample.com email address formats\u201d and similar searches. \u00a0It didn\u2019t take long to find what I was looking for. Drilling into the search results it showed a clear pattern of \u201cfirst.last@example.com.\u201d<\/span><\/p>\n<figure id=\"attachment_251\" aria-describedby=\"caption-attachment-251\" style=\"width: 2920px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"wp-image-251 size-full\" src=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.30.51-PM.png\" alt=\"\" width=\"2920\" height=\"1712\" srcset=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.30.51-PM.png 2920w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.30.51-PM-300x176.png 300w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.30.51-PM-768x450.png 768w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.30.51-PM-1024x600.png 1024w\" sizes=\"(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px\" \/><figcaption id=\"caption-attachment-251\" class=\"wp-caption-text\">While a current search brings <a href=\"http:\/\/email-format.com\">email-format.com<\/a> to the top of the results, historically finding the best format took sleuthing through dozens of search results pages.<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">The next day I spent a couple hours pondering how to automate this process. \u00a0Weren\u2019t there people in the same situation, looking to make a good final impression after an interview?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">I envisioned a web site that would do this work for me, so visitors could instantly find the email address format in use at every company. \u00a0It seemed easy enough that after just one evening hacking on code I could already see real results.<\/span><\/p>\n<p><b>The Real Problem<\/b><\/p>\n<p><span style=\"font-weight: 400;\">This project is a success story, to be sure. \u00a0I\u2019ll take you through all the gory details soon enough, but I\u2019d be remiss if I left my earlier vision of \u201cthe problem to be solved\u201d as anything near commonplace. \u00a0As the project grew, my understanding of actual customer drivers matured.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The typical visitor to my email format website wasn\u2019t looking for a resource to use as a one-time lookup. \u00a0They were using the site as a resource for complete customer contact information as part of lead generation campaigns. \u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Most visitor traffic came from repeat visitors, not organic, and it came primarily from off-shore sources. \u00a0In talking to customers, they were looking for lower cost access to data than is already available from other resources. \u00a0The cost difference was easily one or two orders of magnitude.<\/span><\/p>\n<figure id=\"attachment_252\" aria-describedby=\"caption-attachment-252\" style=\"width: 2920px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"wp-image-252 size-full\" src=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.35.42-PM.png\" alt=\"\" width=\"2920\" height=\"1514\" srcset=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.35.42-PM.png 2920w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.35.42-PM-300x156.png 300w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.35.42-PM-768x398.png 768w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.35.42-PM-1024x531.png 1024w\" sizes=\"(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px\" \/><figcaption id=\"caption-attachment-252\" class=\"wp-caption-text\">List price for Clearbit&#8217;s service. Expect similar metered prices from Salesforce, Discover Org, and others.<\/figcaption><\/figure>\n<p><b>The Solution<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Whatever the problem visitors to the <a href=\"http:\/\/email-format.com\">email-format.com<\/a> web site are looking to solve, the solution ultimately remains the same. \u00a0In the ten years this site has been running, it has gone through three major iterations.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">With each new version the UI, underlying technical model, and even the commercial model adapted to take advantage of changing traffic trends.<\/span><\/p>\n<p><b>Version 1, Where it all Began<\/b><\/p>\n<p><span style=\"font-weight: 400;\">I started this project questioning how best to get the data I needed. \u00a0There was no way I\u2019d consider any solution that required ongoing manual effort, so manual data collection was out of the question. \u00a0Additionally, given email-format.com\u2019s long-tail nature, each piece of data itself wasn\u2019t too valuable. Therefore the revenue model couldn\u2019t support paying for data sourced by another party.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The first thing I needed was a list of interesting domains. \u00a0Ideally, a zone transfer of the entire .com database (which of course isn\u2019t available). \u00a0Failing that, I found a friend in the Alexa top sites database. This offered a publicly accessible csv containing the top 1000 .com sites.<\/span><\/p>\n<figure id=\"attachment_253\" aria-describedby=\"caption-attachment-253\" style=\"width: 2920px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"wp-image-253 size-full\" src=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.39.39-PM.png\" alt=\"\" width=\"2920\" height=\"1514\" srcset=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.39.39-PM.png 2920w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.39.39-PM-300x156.png 300w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.39.39-PM-768x398.png 768w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.39.39-PM-1024x531.png 1024w\" sizes=\"(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px\" \/><figcaption id=\"caption-attachment-253\" class=\"wp-caption-text\">Access is more restricted now than 10 years ago, but as an original source the Alexa top sites list proved critical.<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">A thousand domains is a start of course. \u00a0And with that, the second thing I needed was to get the email address formats associated with these domains. \u00a0I wasn\u2019t about to create my own Google-style web index. But maybe I could take advantage of someone else\u2019s?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">At the time all major search engines &#8211; Yahoo, Bing, and Google &#8211; allowed limited API access to their search indexes. \u00a0Yahoo\u2019s offering was particularly attractive, permitting something on the order of 10,000 monthly searches without charge. \u00a0Given that individual data points weren\u2019t particularly valuable, any paid API access could never have been profitable, especially since only a small subset of search result pages contained email addresses to analyze. \u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">While staying within these small search limits, I slowly indexed all email addresses associated with those top Alexa sites. \u00a0That meant I needed a new source of domains. But how could I tell what new domains existed? And more importantly, of the millions of domains not yet in my index, how could I tell which ones would be the most valuable?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">I solved this with a neat plugin called the \u201cJob-a-Matic\u201d from simplyhired.com\u00a0 This was a snippet of JavaScript code that would run with each site visit that showed the visitor a list of available jobs. \u00a0If anyone clicked on a link and was hired, my website would get a small referral fee. <\/span><\/p>\n<figure id=\"attachment_255\" aria-describedby=\"caption-attachment-255\" style=\"width: 959px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"wp-image-255 size-full\" src=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2013-01-24-at-8.32.35-PM.png\" alt=\"\" width=\"959\" height=\"427\" srcset=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2013-01-24-at-8.32.35-PM.png 959w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2013-01-24-at-8.32.35-PM-300x134.png 300w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2013-01-24-at-8.32.35-PM-768x342.png 768w\" sizes=\"(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px\" \/><figcaption id=\"caption-attachment-255\" class=\"wp-caption-text\">Long since abandoned, SimplyHired hosted the &#8220;Job-a-matic&#8221; widget. I accessed the API from the backend and given keywords and the lat\/long coordinates of my visitor and it returned a list of domains.<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">While I was never paid out for referrals, I did get access to continual stream of \u201chot\u201d companies. \u00a0Remember &#8211; at this point I\u2019m still focussing on the niche use case of job hunters looking to connect with someone they know at a company, but whose email address they don\u2019t have. \u00a0In this context that means the companies (and therefore domains) to focus on should be actively recruiting.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">So using the \u201cJob-a-matic,\u201d I had a fresh stream of target domains that I could burn my no-charge Yahoo API search credits on.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">I built all of this over the course of a few evenings and didn\u2019t give it a second thought for a long time. \u00a0Traffic was low, and ad click through rate was even lower. Google AdSense owed me a few pennies, but they would not pay out until I reached $100 or more, which at the time was an insurmountable threshold.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">One day, after almost two years, traffic had increased enough that AdSense advertising was actually cutting a monthly check. \u00a0Out of nowhere I got an email from Google saying a check was in the mail.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Traffic increased slowly, but was very steady. \u00a0The site was the top search result for a number of highly trafficked domains so when visitors searched for \u201cemail address format at example.com,\u201d my site was the top hit.<\/span><\/p>\n<p><b>Version 2, Scaling Revenue<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Over the next 18 months as traffic grew, the total revenue from advertising grew as well. \u00a0While advertising was bringing in $200 or $300 a month, I was looking to increase that by an order of magnitude.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">My strategy was more domains, leads to more traffic, which drives my banner ad click throughs. \u00a0You don\u2019t have to be a genius to see that for a long-tail site like <a href=\"http:\/\/email-format.com\">email-format.com<\/a>, increasing your overall footprint will bring in more traffic.<\/span><\/p>\n<p><b>Getting Big Data for a Low Price<\/b><\/p>\n<p><span style=\"font-weight: 400;\">After a bit of research, I stumbled upon the <a href=\"https:\/\/index.commoncrawl.org\">Common Crawl Database<\/a>. \u00a0It was a fully accessible and searchable index of all the web pages they\u2019ve crawled. \u00a0This data set was like having my own personal Google index (without any of those fees and limits that originally sent me towards Yahoo).<\/span><\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-256\" src=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.49.55-PM.png\" alt=\"\" width=\"2920\" height=\"1514\" srcset=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.49.55-PM.png 2920w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.49.55-PM-300x156.png 300w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.49.55-PM-768x398.png 768w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.49.55-PM-1024x531.png 1024w\" sizes=\"(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">This database contained tens of terabytes of data. \u00a0All just sitting there for me to scan. There was a catch though &#8211; there\u2019s always a catch! \u00a0The Common Crawl index was hosted on Amazon S3 and downloading the content would cost a nickel for every GB &#8211; a potential cost of thousands of dollars. \u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The clear options were to either pay the network transport fee and process the data on my low cost server or to process the data directly on Amazon AWS compute instances and pay for the relatively expensive compute time but get a free ride on the network transport charges. \u00a0Given my total monthly expenses to keep the site up were less than $50, either option would quickly run into the multiple thousands of dollars range.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This seemed like a big commitment. \u00a0Wasn\u2019t there the risk that I wouldn\u2019t find new domains and email addresses? \u00a0What if the traffic didn\u2019t come?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">It was time to take a break from the idea. \u00a0While revisiting a few weeks later I had a stroke of genius. \u00a0My plan was to process the <a href=\"https:\/\/index.commoncrawl.org\">Common Crawl web index<\/a> on a special class of AWS hosted compute servers. \u00a0This meant zero network transport charges to access terabytes of data.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Instead of paying the rack rate for compute, I would take advantage of a broken marketplace Amazon ran that allowed you to bid on access to excess capacity for a discounted hourly rate. \u00a0This allowed me to get compute resources for $0.10\/hour instead of $1.50 or more. The downside is that if anyone else needed access to the resources, and they were willing to pay even an extra couple cents, then my computer would instantly terminate losing all progress.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">I spent a few nights building my own cluster manager that operated outside of this ephemeral \u201cspot\u201d compute instances from Amazon. \u00a0Once complete the processing flow looked like the following:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">I broke the entire Common Crawl database into 10,000 small segments and stored this on a master server.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Booted up a pool of 5 new servers on Amazon to act as my worker nodes.<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">When each new instance booted up, it would reach out to the central master requesting a small segment of work. \u00a0When the work was completed, it would submit its list of emails and domains back to the master. A Gigabyte of source data would easily be reduced down to a 100KB or less<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">When servers were inevitably terminated, my master server would eventually release the lock those worked nodes had and would reassign it elsewhere<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">After quickly piecing together an analytics dashboard, I got visibility into the rate of work being completed and I was growing impatient.<\/span><\/p>\n<figure id=\"attachment_257\" aria-describedby=\"caption-attachment-257\" style=\"width: 554px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"wp-image-257 size-full\" src=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/CIslpfSWcAABxSD.png\" alt=\"\" width=\"554\" height=\"247\" srcset=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/CIslpfSWcAABxSD.png 554w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/CIslpfSWcAABxSD-300x134.png 300w\" sizes=\"(max-width: 554px) 100vw, 554px\" \/><figcaption id=\"caption-attachment-257\" class=\"wp-caption-text\">With long processing time and hundreds of cloud servers driving the scanning process I depended on regular automated updated directly to my Slack feed.<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">The first phase of scanning was performed using this Amazon compute, but running only a handful of instances would still take two weeks or more to complete. \u00a0After quickly doing the math, I scaled up to 150 instances and before long, double that. The entire scanning operation was completed in an evening.<\/span><\/p>\n<p><b>Creating More Valuable Data with Some Smart Algorithms<\/b><\/p>\n<p><span style=\"font-weight: 400;\">With so much data, I finally had the opportunity to do more than just show a handful of representative email addresses and let site visitors guess how to extrapolate that for their own uses. \u00a0It was time to level up and actually show the email address formats!<\/span><\/p>\n<p><span style=\"font-weight: 400;\">I started by developing a suite of rules for how email addresses might be formatted. \u00a0These rules covered the basics, like:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">firstname . lastname<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">first initial . lastname<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">lastname<\/span><\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">etc.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Next, I needed a list of names. \u00a0I found a list of all registered voters across the state of Ohio which contained millions of first names and surnames. \u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">My name format algorithm would run against every domain containing a sufficient number of representative email addresses. \u00a0It mashed every email address against every combination of names and compared across the dozen-plus naming rules I\u2019d created. \u00a0At the end of this pipeline the algorithm spit out a score that showed a confidence rating &#8211; just how likely does this email address map to the specified format?<\/span><\/p>\n<figure id=\"attachment_258\" aria-describedby=\"caption-attachment-258\" style=\"width: 2920px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" class=\"wp-image-258 size-full\" src=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.57.20-PM.png\" alt=\"\" width=\"2920\" height=\"1174\" srcset=\"https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.57.20-PM.png 2920w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.57.20-PM-300x121.png 300w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.57.20-PM-768x309.png 768w, https:\/\/keith.resar.org\/blog\/wp-content\/uploads\/2019\/04\/Screen-Shot-2019-04-11-at-9.57.20-PM-1024x412.png 1024w\" sizes=\"(max-width: 706px) 89vw, (max-width: 767px) 82vw, 740px\" \/><figcaption id=\"caption-attachment-258\" class=\"wp-caption-text\">Feeding email addresses across a dozen naming algorithms fed by millions of first and last names delivers a confidence level for a number of possible formats.<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">The long tail on this new set of data was amazing and the search engine traffic skyrocketed, along with Adsense revenue. \u00a0It was at this point that Google Analytics began to show a trend change away from organic traffic towards repeat visitors. \u00a0They saw the value of knowing the exact address format. Now that I had coverage of hundreds of millions of domains, my new visitors also came to rely on email-format.com by name. \u00a0The site had clearly become a universal clearinghouse for email address formats.<\/span><\/p>\n<p>&nbsp;<\/p>\n<p><i><span style=\"font-weight: 400;\">Stay tuned for the next installment coming out in just two days. \u00a0Learn how I capitalized on this new data with a whole new customer segment. \u00a0At the same time, higher-touch sales requests, integration opportunities, and unwanted traffic force the entire site operation to go from hands-off to hands-on. \u00a0Will the revenue model support this? Or will the time requirements force the entire operation to halt?<\/span><\/i><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Stumbling into a web site that actually pays (the email-format.com story) &#8211; Part 1<\/p>\n","protected":false},"author":1,"featured_media":344,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/posts\/250"}],"collection":[{"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/comments?post=250"}],"version-history":[{"count":8,"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/posts\/250\/revisions"}],"predecessor-version":[{"id":345,"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/posts\/250\/revisions\/345"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/media\/344"}],"wp:attachment":[{"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/media?parent=250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/categories?post=250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keith.resar.org\/blog\/wp-json\/wp\/v2\/tags?post=250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}