{"id":2080,"date":"2021-06-15T16:08:09","date_gmt":"2021-06-15T16:08:09","guid":{"rendered":"https:\/\/readmeprd.wpenginepowered.com\/?p=2080"},"modified":"2025-12-16T19:50:51","modified_gmt":"2025-12-17T01:50:51","slug":"how-to-write-good-api-errors","status":"publish","type":"post","link":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors","title":{"rendered":"How to Write API Errors That Keep Your Users Moving Forward"},"content":{"rendered":"\n<p>The secret to good DX is doing the right thing when things go wrong. Most error messages are a dead end, telling what went wrong but offering no help. The best error messages feel more like guardrails, gently guiding the developer back onto the path and keeping things moving forward.<\/p>\n\n\n\n<p>This guide will focus mostly on RESTful APIs, however they should be applicable to any sort of error thrown by a dev tool.<\/p>\n\n\n\n<p>(If you&#8217;re more of a show-don&#8217;t-tell kind of person, you can just <a href=\"https:\/\/readme-error-codes.herokuapp.com\/\">browse all our error codes<\/a>!)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.readme.com\/content\/images\/2021\/06\/fine.gif\" alt=\"Gif version of the This Is Fine meme, featuring Owlbert\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"what-a-good-api-error-response-looks-like\">What a good API error response looks like<\/h1>\n\n\n\n<p>Error messages from APIs tend to look a bit like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"JavaScript\" class=\"language-JavaScript\">{\"error\": \"Not Found\", \"description\": \"Version not found\", \"errors\": null }<\/code><\/pre>\n\n\n\n<p>It&#8217;s not wrong, but&#8230; it&#8217;s not very helpful. We&#8217;re going to aim to make them look a bit more like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"JavaScript\" class=\"language-JavaScript\">{\n  \"error\": \"VERSION_FORK_NOT_FOUND\",\n  \"message\": \"We couldn't find the version (1.0.2) you're trying to fork from\",\n  \"suggestion\": \"You need to pass an existing version (1.0.0, 1.0.1) in via the `for` parameter\",\n  \"docs\": \"https:\/\/developer.example.com\/logs\/1a70daae-c1a7-11ea-b3de-0242ac130004\",\n  \"help\": \"If you need help, email support@readme.io and mention log '1a70daae-c1a7-11ea-b3de-0242ac130004'.\",\n  \"poem\": [\n    \"This request unfortunately failed\",\n    \"But hey, I guess that's life\",\n    \"We couldn't find your version fork\",\n    \"Or your version spoon or version knife\"\n  ]\n}<\/code><\/pre>\n\n\n\n<p>Let&#8217;s break it down.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"error-a-unique-id-for-every-error-message\"><strong><code>error<\/code>: A unique ID for every error message<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"JavaScript\" class=\"language-JavaScript\">\"error\": \"VERSION_FORK_NOT_FOUND\"<\/code><\/pre>\n\n\n\n<p>The nice thing about RESTful APIs is they come with built-in status codes. <strong>But the codes mean so many different things in different situations, and some are general enough that they don&#8217;t really help. <\/strong>Sure, 401 means the user is unauthorized, but why? Is their API key invalid, or is it missing? Or maybe you had a security breach and rotated everyone&#8217;s API keys? We know 404 is Not Found, but it doesn&#8217;t specify what couldn&#8217;t be found.<\/p>\n\n\n\n<p>Normally, APIs rely on error messages like <code>Not Found<\/code> or <code>Bad Request<\/code> as the identifier. That makes it hard to handle specific errors in the code, so it&#8217;s good to include something more unique and specific.<\/p>\n\n\n\n<p><strong>You want people to know they can check for these in the code. <\/strong>Status codes are helpful but too vague sometimes, and error messages meant for humans tend to be a bit long to check for in code. These are meant to be referenced by the code, so they should be short and immutable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"message-descriptive-message-of-what-went-wrong\"><strong><code>message:<\/code> Descriptive message of what went wrong<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"JavaScript\" class=\"language-JavaScript\">\"message\": \"We couldn't find the version (1.0.2) you're trying to fork from\"<\/code><\/pre>\n\n\n\n<p><strong>Don&#8217;t just explain what went wrong, tailor it to the user. <\/strong>Be as verbose as possible in diagnosing the error, so that the person reading the message knew exactly what&#8217;s going on. The <code>error<\/code> above is for computers; this <code>message<\/code> is for all the humans out there!<\/p>\n\n\n\n<p>In our API errors, we have the ability for us to include variables. So, rather than just saying \u201cthe version you specified&#8230;\u201d, we do our best to do things like show them what we\u2019re seeing (such as &#8220;the version you specified (v1.0)&#8230;&#8221;). <\/p>\n\n\n\n<p>Here&#8217;s some examples:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When we say your API key isn\u2019t right, we show you a few characters of what we&#8217;re seeing you sent us to help with debugging (Such as &#8220;Your API key that starts with X341 is invalid&#8221;)<\/li>\n\n\n\n<li>If you don\u2019t have permission to do something, we do our best to tell you who does<\/li>\n\n\n\n<li>When you pick a value that doesn\u2019t exist, we list the available things that do exist (&#8220;&#8230;you need to pick an existing version (1.0, 1.1, 1.2)&#8230;&#8221;)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"suggestion-how-to-fix-it\"><strong><code>suggestion:<\/code> How to fix it<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"JavaScript\" class=\"language-JavaScript\">\"suggestion\": \"You need to pass an existing version (1.0.0, 1.0.1) in via the `for` parameter\"<\/code><\/pre>\n\n\n\n<p>Most of the time, error messages focus on the problem and leaves it at that. How negative!<\/p>\n\n\n\n<p>They dutifully report what went wrong, which makes sense\u2026 but they usually stop just short of telling us what we <em>actually<\/em> want to know, which is how to fix the problem. That\u2019s a job for Stack Overflow or something, I suppose.<\/p>\n\n\n\n<p><strong>Always have a <code>suggestion<\/code> field for every error message. <\/strong>While the <code>message<\/code> field answers \u201cwhat\u2019s wrong\u201d, the <code>suggestion<\/code> answers \u201chow to fix it\u201d. We don\u2019t want our users to have to do much detective work when they hit an error. We also do our best to be specific, like linking directly to the correct docs page or telling them what to change.<\/p>\n\n\n\n<p>If there&#8217;s an issue with their API key, tell them where to find their proper API key. If they formatted something wrong, tell them how to format it correctly. If they&#8217;re missing a parameter, show them the docs for that parameter.<\/p>\n\n\n\n<p><strong><em>Bonus:<\/em> As you&#8217;re writing these out, you&#8217;ll start to notice something: &#8220;wait, I can just fix this on the backend!&#8221; <\/strong>Rather than telling the user to send the API key as the password rather than the user via Basic Auth, just accept it in both places. Rather than telling the user to pass in a Content Type, assume it&#8217;s JSON if your API only supports JSON. Good error messages are awesome, but skipping error messages completely is even better.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"docs-a-link-to-more-information\"><strong><code>docs:<\/code> A link to more information<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"JavaScript\" class=\"language-JavaScript\">\"docs\": \"https:\/\/developer.example.com\/logs\/1a70daae-c1a7-11ea-b3de-0242ac130004\"<\/code><\/pre>\n\n\n\n<p>In every one of our errors, we include a link to the documentation. And not just any documentation! <strong>It&#8217;s a specific link to docs for the endpoint, and has the user&#8217;s full request embedded right in it.<\/strong><\/p>\n\n\n\n<p>So, not only can the user see everything about the endpoint they&#8217;re dealing with, they can also see the exact request they made. They can replay it in the UI, see what incorrect data they sent, and share the link with our support team to get more help.<\/p>\n\n\n\n<p><strong>Even if you don&#8217;t have the ability to embed data into the docs, it&#8217;s still a good habit to include a link for every single error. <\/strong>It saves people from Googling, gives a clear next step for people who are stuck, and ensures there actually is a doc associated with each error.<\/p>\n\n\n\n<p>(If this seems cool, check out <a href=\"https:\/\/readme.com\/resources\/using-my-developers-to-understand-api-usage-and-debug-issues\/\">the metrics included in My Developers<\/a>!)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.readme.com\/content\/images\/2021\/06\/image.png\" alt=\"Screenshot of API Logs in ReadMe-powered documentation\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"help-how-to-contact-you\"><strong><code>help:<\/code> How to contact you<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"JavaScript\" class=\"language-JavaScript\">\"help\": \"If you need help, email support@readme.io and mention log '1a70daae-c1a7-11ea-b3de-0242ac130004'.\"<\/code><\/pre>\n\n\n\n<p>Have some sort of way to contact you. We include our email address and a way to reference each log (for example, &#8220;If you need help, email <a>support@readme.io<\/a> and mention log &#8216;1a70daae-c1a7-11ea-b3de-0242ac130004&#8242;&#8221;).<\/p>\n\n\n\n<p><strong>You want to give users as many ways as possible to fix their problem. <\/strong>Developers tend to prefer to figure things out themselves, however giving them explicit permission to email you will go a long way toward resolving issues quickly!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"poem-err-on-the-side-of-whimsy\"><strong><code>poem:<\/code> Err on the side of whimsy<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"JavaScript\" class=\"language-JavaScript\">\"poem\": [\n  \"This request unfortunately failed\",\n  \"But hey, I guess that's life\",\n  \"We couldn't find your version fork\",\n  \"Or your version spoon or version knife\"\n]<\/code><\/pre>\n\n\n\n<p>Okay, you don&#8217;t need this one&#8230; but one of our <a href=\"https:\/\/readme.com\/handbook\">core values<\/a> at ReadMe is to <em>err on the side of whimsy<\/em>, and what better place to live up to it than in an error? So we wrote a unique poem for each error message:<\/p>\n\n\n\n<p><!--kg-card-begin: html--><iframe class=\"errors\" src=\"https:\/\/readme-error-codes.herokuapp.com\/embed\"><\/iframe><\/p>\n\n\n\n<p><style>  .errors {    border: 0 none;    width: 1300px;    left: 50%;    position: relative;    margin-left: -650px;    height: 720px;  }      code.language-json.hljs {    background: #0a1b35;  }  @media screen and (max-width: 1300px) {    .errors {      left: 0;      position: relative;      margin-left: 0;      border: 0 none;      width: 650px;      position: relative;      height: 1440px;    }  }  @media screen and (max-width: 650px) {    .errors {      left: 0;      position: relative;      margin-left: 0;      border: 0 none;      width: 100%;      position: relative;      height: 1440px;    }  }<\/style><\/p>\n\n\n\n<p>If you&#8217;re interested, <a href=\"https:\/\/readme-error-codes.herokuapp.com\/\">here&#8217;s a list of all our error poems<\/a>.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"thats-a-wrap\">That&#8217;s a wrap!<\/h1>\n\n\n\n<p>Here&#8217;s a recap of what your error messages should contain:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>error: <\/strong>Unique code for every error message<\/li>\n\n\n\n<li><strong>message: <\/strong>Descriptive messages of what went wrong<\/li>\n\n\n\n<li><strong>suggestion: <\/strong>How to fix the issue<\/li>\n\n\n\n<li><strong>docs:<\/strong> Link to more information<\/li>\n\n\n\n<li><strong>help:<\/strong> How to contact you<\/li>\n\n\n\n<li><strong>poem:<\/strong> Our company-mandated dose of whimsy! <em>(optional)<\/em><\/li>\n<\/ul>\n\n\n\n<p>Hopefully, your users never see errors. But when they inevitably do, they&#8217;ll appreciate you put in the time to make the experience as pleasant and possible.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The secret to good DX is doing the right thing when things go wrong. Most error messages are a dead end, telling what went wrong but offering no help. The best error messages feel more like guardrails, gently guiding the developer back onto the path and keeping things moving forward. This guide will focus mostly [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":2902,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","inline_featured_image":false,"footnotes":""},"categories":[23,33],"tags":[42],"ppma_author":[55],"class_list":["post-2080","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-developer-experience","category-improving-dx","tag-api-tips"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Write API Errors That Keep Your Users Moving Forward - ReadMe: Resource Library<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Write API Errors That Keep Your Users Moving Forward - ReadMe: Resource Library\" \/>\n<meta property=\"og:description\" content=\"The secret to good DX is doing the right thing when things go wrong. Most error messages are a dead end, telling what went wrong but offering no help. The best error messages feel more like guardrails, gently guiding the developer back onto the path and keeping things moving forward. This guide will focus mostly [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors\" \/>\n<meta property=\"og:site_name\" content=\"ReadMe: Resource Library\" \/>\n<meta property=\"article:published_time\" content=\"2021-06-15T16:08:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-17T01:50:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/readme.com\/resources\/wp-content\/uploads\/2021\/06\/How-to-Write-API-Errors-That-Keep-Your-Users-Moving-Forward-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"200\" \/>\n\t<meta property=\"og:image:height\" content=\"200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Gregory Koberger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Miche Nickolaisen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors\",\"url\":\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors\",\"name\":\"How to Write API Errors That Keep Your Users Moving Forward - ReadMe: Resource Library\",\"isPartOf\":{\"@id\":\"https:\/\/readme.com\/resources\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#primaryimage\"},\"image\":{\"@id\":\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#primaryimage\"},\"thumbnailUrl\":\"https:\/\/readme.com\/resources\/wp-content\/uploads\/2021\/06\/How-to-Write-API-Errors-That-Keep-Your-Users-Moving-Forward-1.png\",\"datePublished\":\"2021-06-15T16:08:09+00:00\",\"dateModified\":\"2025-12-17T01:50:51+00:00\",\"author\":{\"@id\":\"https:\/\/readme.com\/resources\/#\/schema\/person\/770bcc036178743133b5ba515195981b\"},\"breadcrumb\":{\"@id\":\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#primaryimage\",\"url\":\"https:\/\/readme.com\/resources\/wp-content\/uploads\/2021\/06\/How-to-Write-API-Errors-That-Keep-Your-Users-Moving-Forward-1.png\",\"contentUrl\":\"https:\/\/readme.com\/resources\/wp-content\/uploads\/2021\/06\/How-to-Write-API-Errors-That-Keep-Your-Users-Moving-Forward-1.png\",\"width\":200,\"height\":200},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/readme.com\/resources\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Write API Errors That Keep Your Users Moving Forward\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/readme.com\/resources\/#website\",\"url\":\"https:\/\/readme.com\/resources\/\",\"name\":\"ReadMe: Resource Library\",\"description\":\"Making API documentation better for everyone\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/readme.com\/resources\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/readme.com\/resources\/#\/schema\/person\/770bcc036178743133b5ba515195981b\",\"name\":\"Miche Nickolaisen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/readme.com\/resources\/#\/schema\/person\/image\/a24e32f88df84934c107cef6fa8d3223\",\"url\":\"https:\/\/readme.com\/resources\/wp-content\/uploads\/2024\/06\/IMG_7151-scaled-e1718387764646.jpg\",\"contentUrl\":\"https:\/\/readme.com\/resources\/wp-content\/uploads\/2024\/06\/IMG_7151-scaled-e1718387764646.jpg\",\"caption\":\"Miche Nickolaisen\"},\"description\":\"An Austin resident since 2009, Miche grew up in rural southwestern Missouri. When not working on ReadMe's content marketing, you can find them doing a number of hobbies, including (but not limited to) bouldering, martial arts, playing tabletop RPGs and\/or video games, bullet journaling, and making art. They live with a large menagerie of indoor pets and a smaller (outdoor) menagerie of feral cats they take care of (sometimes including a few possums and raccoons, just for good measure).\",\"url\":\"https:\/\/readme.com\/resources\/author\/miche\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Write API Errors That Keep Your Users Moving Forward - ReadMe: Resource Library","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors","og_locale":"en_US","og_type":"article","og_title":"How to Write API Errors That Keep Your Users Moving Forward - ReadMe: Resource Library","og_description":"The secret to good DX is doing the right thing when things go wrong. Most error messages are a dead end, telling what went wrong but offering no help. The best error messages feel more like guardrails, gently guiding the developer back onto the path and keeping things moving forward. This guide will focus mostly [&hellip;]","og_url":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors","og_site_name":"ReadMe: Resource Library","article_published_time":"2021-06-15T16:08:09+00:00","article_modified_time":"2025-12-17T01:50:51+00:00","og_image":[{"width":200,"height":200,"url":"https:\/\/readme.com\/resources\/wp-content\/uploads\/2021\/06\/How-to-Write-API-Errors-That-Keep-Your-Users-Moving-Forward-1.png","type":"image\/png"}],"author":"Gregory Koberger","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Miche Nickolaisen","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors","url":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors","name":"How to Write API Errors That Keep Your Users Moving Forward - ReadMe: Resource Library","isPartOf":{"@id":"https:\/\/readme.com\/resources\/#website"},"primaryImageOfPage":{"@id":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#primaryimage"},"image":{"@id":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#primaryimage"},"thumbnailUrl":"https:\/\/readme.com\/resources\/wp-content\/uploads\/2021\/06\/How-to-Write-API-Errors-That-Keep-Your-Users-Moving-Forward-1.png","datePublished":"2021-06-15T16:08:09+00:00","dateModified":"2025-12-17T01:50:51+00:00","author":{"@id":"https:\/\/readme.com\/resources\/#\/schema\/person\/770bcc036178743133b5ba515195981b"},"breadcrumb":{"@id":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/readme.com\/resources\/how-to-write-good-api-errors"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#primaryimage","url":"https:\/\/readme.com\/resources\/wp-content\/uploads\/2021\/06\/How-to-Write-API-Errors-That-Keep-Your-Users-Moving-Forward-1.png","contentUrl":"https:\/\/readme.com\/resources\/wp-content\/uploads\/2021\/06\/How-to-Write-API-Errors-That-Keep-Your-Users-Moving-Forward-1.png","width":200,"height":200},{"@type":"BreadcrumbList","@id":"https:\/\/readme.com\/resources\/how-to-write-good-api-errors#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/readme.com\/resources\/"},{"@type":"ListItem","position":2,"name":"How to Write API Errors That Keep Your Users Moving Forward"}]},{"@type":"WebSite","@id":"https:\/\/readme.com\/resources\/#website","url":"https:\/\/readme.com\/resources\/","name":"ReadMe: Resource Library","description":"Making API documentation better for everyone","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/readme.com\/resources\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/readme.com\/resources\/#\/schema\/person\/770bcc036178743133b5ba515195981b","name":"Miche Nickolaisen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/readme.com\/resources\/#\/schema\/person\/image\/a24e32f88df84934c107cef6fa8d3223","url":"https:\/\/readme.com\/resources\/wp-content\/uploads\/2024\/06\/IMG_7151-scaled-e1718387764646.jpg","contentUrl":"https:\/\/readme.com\/resources\/wp-content\/uploads\/2024\/06\/IMG_7151-scaled-e1718387764646.jpg","caption":"Miche Nickolaisen"},"description":"An Austin resident since 2009, Miche grew up in rural southwestern Missouri. When not working on ReadMe's content marketing, you can find them doing a number of hobbies, including (but not limited to) bouldering, martial arts, playing tabletop RPGs and\/or video games, bullet journaling, and making art. They live with a large menagerie of indoor pets and a smaller (outdoor) menagerie of feral cats they take care of (sometimes including a few possums and raccoons, just for good measure).","url":"https:\/\/readme.com\/resources\/author\/miche"}]}},"authors":[{"term_id":55,"user_id":0,"is_guest":1,"slug":"greg-koberger","display_name":"Gregory Koberger","avatar_url":{"url":"https:\/\/readme.com\/resources\/wp-content\/uploads\/2024\/06\/lSQSlvk3_400x400.jpeg","url2x":"https:\/\/readme.com\/resources\/wp-content\/uploads\/2024\/06\/lSQSlvk3_400x400.jpeg"},"first_name":"Gregory","last_name":"Koberger","position":"Founder, CEO","slogan":"","description":"Greg hails from the lovely town of Schaghticoke in upstate New York. After attending RIT he made the move to San Francisco where he worked for Mozilla and freelanced for a bunch of startups. He founded ReadMe after building docs sites for most of them. You can find him drinking coffee or obsessively competing for Swarm mayorships."}],"_links":{"self":[{"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/posts\/2080","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/comments?post=2080"}],"version-history":[{"count":0,"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/posts\/2080\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/media\/2902"}],"wp:attachment":[{"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/media?parent=2080"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/categories?post=2080"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/tags?post=2080"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/readme.com\/resources\/wp-json\/wp\/v2\/ppma_author?post=2080"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}