{"id":1778,"date":"2026-08-26T07:32:00","date_gmt":"2026-08-26T14:32:00","guid":{"rendered":"https:\/\/www.kenwalger.com\/blog\/?p=1778"},"modified":"2026-08-14T10:44:27","modified_gmt":"2026-08-14T17:44:27","slug":"hiring-process-http-status-codes","status":"publish","type":"post","link":"https:\/\/www.kenwalger.com\/blog\/career\/hiring-process-http-status-codes\/","title":{"rendered":"Your Hiring Process Needs HTTP Status Codes"},"content":{"rendered":"<p><em>Because &#8220;we&#8217;ll be in touch&#8221; is not an observable state.<\/em><\/p>\n<p>I submitted a job application recently.<\/p>\n<p>It was one of those applications where you actually put in the effort. I read the job description carefully, tailored the resume, wrote a cover letter specifically for the organization, and answered the optional questions rather than pretending they were optional.<\/p>\n<p>Then I clicked <strong>Submit<\/strong> and got&#8230; nothing.<\/p>\n<p>No confirmation email. No &#8220;we received your application.&#8221; No indication that a candidate record had been created. Just a browser page telling me the submission had succeeded and the vague hope that somewhere, deep inside an applicant tracking system, my carefully assembled application had not been written directly to <code>\/dev\/null<\/code>.<\/p>\n<p>As a developer, I find this troubling. Not because I expect an interview, or because I think every recruiter owes me personalized feedback. I just want a status code.<\/p>\n<p>And I think that&#8217;s a smaller ask than it sounds like, for a reason I&#8217;ll come back to at the end: the states already exist. Somewhere in that ATS, my application is in one. The decision not to show me which one is a product decision, not a privacy constraint.<\/p>\n<h2>The Web Solved This Problem Decades Ago<\/h2>\n<p>When software sends a request to another system, we generally consider it useful for the receiving system to say what happened. Did it work? Is it still processing? Was the request malformed? Is the resource gone? Did something catch fire on the server?<\/p>\n<p>HTTP gives us an entire vocabulary for this.<\/p>\n<p>Hiring systems, meanwhile, have developed their own protocol:<\/p>\n<pre><code class=\"language-text\">POST \/careers\/applications\n\n[no observable response]\n<\/code><\/pre>\n<p>This is sometimes followed, anywhere from three minutes to six months later, by:<\/p>\n<pre><code class=\"language-text\">After careful consideration...\n<\/code><\/pre>\n<p>Instead of inventing vague candidate statuses like &#8220;Under Consideration,&#8221; perhaps hiring systems could adopt something developers already understand.<\/p>\n<h2>The 2xx Family: Success, Allegedly<\/h2>\n<h3><code>200 OK<\/code><\/h3>\n<p>A human being has reviewed your application.<\/p>\n<p>Nothing else is implied.<\/p>\n<p>Honestly, this alone would be revolutionary.<\/p>\n<h3><code>202 Accepted<\/code><\/h3>\n<p>Your application has been received and accepted for processing.<\/p>\n<p>This is the most important status code in the entire hiring protocol. The candidate does not need the hiring manager&#8217;s notes or a walkthrough of the internal workflow. They need:<\/p>\n<pre><code class=\"language-text\">202 APPLICATION_ACCEPTED\n<\/code><\/pre>\n<p>Now we know the thing exists.<\/p>\n<h3><code>204 No Content<\/code><\/h3>\n<p>Your application was successfully received.<\/p>\n<p>We have chosen not to acknowledge this in any way.<\/p>\n<h2>The 3xx Family: You Have Been Redirected<\/h2>\n<h3><code>302 Found<\/code><\/h3>\n<p>We found an internal candidate.<\/p>\n<p>Thanks for playing.<\/p>\n<h3><code>304 Not Modified<\/code><\/h3>\n<p>Your application has been &#8220;Under Review&#8221; for 47 days.<\/p>\n<p>There has been no change since the last time you checked, or the 23 times before that. There will be no change the next time either. Please consider caching this response locally.<\/p>\n<h3><code>410 Gone<\/code><\/h3>\n<p>The position existed when you applied. It no longer exists. No additional information is available.<\/p>\n<p>At least <code>410<\/code> would be useful. The current discovery mechanism is noticing that your bookmarked job posting has started redirecting to the careers homepage.<\/p>\n<h2>The 4xx Family: This One&#8217;s On You<\/h2>\n<h3><code>401 Unauthorized<\/code><\/h3>\n<p>You must create an account before applying.<\/p>\n<p>Your password must contain at least 14 characters, uppercase and lowercase letters, a number, a symbol, and one ancient Sumerian glyph. It cannot match any password you have used since 1997.<\/p>\n<p>You will then manually enter every field from the resume you just uploaded.<\/p>\n<p>You will never use this account again.<\/p>\n<h3><code>403 Forbidden<\/code><\/h3>\n<p>You have the required experience and qualifications.<\/p>\n<p>Unfortunately, you live 37 miles outside the geographic boundary within which we have determined this Zoom meeting can occur.<\/p>\n<h3><code>404 Not Found<\/code><\/h3>\n<p>Hiring manager not found. Recruiter not found. Job posting not found.<\/p>\n<p>Nobody knows who owns this requisition.<\/p>\n<h3><code>408 Request Timeout<\/code><\/h3>\n<p>After seven weeks without communication, the candidate has accepted another position.<\/p>\n<p>The hiring team will contact them tomorrow to schedule the second interview.<\/p>\n<h3><code>409 Conflict<\/code><\/h3>\n<p>The position requires 12 years of production experience with a technology introduced six years ago.<\/p>\n<p>The conflict cannot be resolved.<\/p>\n<h3><code>417 Expectation Failed<\/code><\/h3>\n<p>You expected the phrase &#8220;we&#8217;ll be in touch&#8221; to imply future communication.<\/p>\n<p>It did not.<\/p>\n<h3><code>422 Unprocessable Content<\/code><\/h3>\n<p>Your experience is relevant, but your career path does not fit cleanly into the predefined boxes in our applicant tracking system.<\/p>\n<p>Human intervention may be required.<\/p>\n<p>Human intervention is unavailable.<\/p>\n<h3><code>425 Too Early<\/code><\/h3>\n<p>You applied 14 minutes after the job was posted.<\/p>\n<p>LinkedIn reports 612 applicants.<\/p>\n<p>We have questions too.<\/p>\n<h3><code>451 Unavailable For Legal Reasons<\/code><\/h3>\n<p>Your qualifications are not the issue.<\/p>\n<p>The issue is a background check vendor, a non-compete of uncertain enforceability, or a sponsorship question nobody wants to be the one to ask about.<\/p>\n<h2>The 5xx Family: It Was Never You<\/h2>\n<h3><code>500 Internal Server Error<\/code><\/h3>\n<p>Something has gone wrong internally. Your recruiter left, the headcount was frozen, the hiring manager changed, Finance reconsidered the budget, the organization restructured, or the position was posted by accident.<\/p>\n<p>We will communicate all of these possibilities using the same message:<\/p>\n<blockquote><p>\n  We have decided to move forward with other candidates.\n<\/p><\/blockquote>\n<h3><code>502 Bad Gateway<\/code><\/h3>\n<p>The recruiter says they are waiting for the hiring manager.<\/p>\n<p>The hiring manager says recruiting owns the next step.<\/p>\n<p>Your request cannot be routed.<\/p>\n<h3><code>503 Service Unavailable<\/code><\/h3>\n<p>Your recruiter is no longer with the company.<\/p>\n<p>Their calendar link remains active.<\/p>\n<h3><code>504 Gateway Timeout<\/code><\/h3>\n<p>&#8220;We expect to have a decision by Friday.&#8221;<\/p>\n<p>Friday has passed. The specification does not define which Friday was intended.<\/p>\n<h2>Candidates Don&#8217;t Need Distributed Tracing<\/h2>\n<p>There&#8217;s a serious point hiding under all of this. Hiring has an observability problem, and it&#8217;s usually mistaken for a communication problem.<\/p>\n<p>Companies understandably cannot expose everything happening inside a recruiting process. Candidate evaluations are private. Interview feedback may be sensitive. Hiring managers need room to compare people and make decisions.<\/p>\n<p>That&#8217;s fine. Nobody is asking for:<\/p>\n<pre><code class=\"language-text\">GET \/hiring-manager\/private-thoughts\/about-me\n<\/code><\/pre>\n<p>But there is an enormous amount of territory between exposing confidential deliberations and providing no information at all.<\/p>\n<p>A hiring pipeline already has states. An application was received. It entered review. Someone reviewed it. An interview was requested. The requisition was paused. The position was filled. The position was canceled. The candidate was declined.<\/p>\n<p>Those state transitions already exist in the system. They are already recorded, timestamped, and reportable, because that&#8217;s how recruiting teams measure their own funnel. The candidate is the one participant in the process who cannot see the record they&#8217;re in.<\/p>\n<h2>Give Us the Boring Version<\/h2>\n<p>Imagine an applicant portal that reported nothing more than this:<\/p>\n<pre><code class=\"language-text\">202  APPLICATION_RECEIVED     Mar 04\n200  REVIEWED                 Mar 19\n304  NO_CHANGE                Apr 02\n304  NO_CHANGE                Apr 30\n410  POSITION_CLOSED          May 12\n<\/code><\/pre>\n<p>That&#8217;s not radical transparency. It&#8217;s barely transparency at all. But it tells you the system is functioning.<\/p>\n<p>It removes the need to wonder whether an application disappeared. It reduces pointless portal refreshing. And it prevents candidates from reading silence as information, when silence might mean anything from &#8220;the hiring manager is on vacation&#8221; to &#8220;the requisition was canceled two weeks ago.&#8221;<\/p>\n<p>Mostly, it treats applicants like participants in a process rather than packets transmitted into an undocumented endpoint.<\/p>\n<h2><code>200 OK<\/code><\/h2>\n<p>I don&#8217;t expect every application to result in an interview. I&#8217;ve submitted enough of them to have considerable empirical evidence supporting that position.<\/p>\n<p>I don&#8217;t expect detailed rejection feedback either. I understand why companies are reluctant to provide it. I don&#8217;t even particularly mind <code>403 REQUIREMENTS_NOT_MET<\/code> or <code>410 POSITION_FILLED<\/code>. Those are answers.<\/p>\n<p>What makes modern hiring uniquely frustrating isn&#8217;t rejection. It&#8217;s uncertainty about whether anything is happening at all.<\/p>\n<p>Software engineers have spent decades building systems around a simple principle: when one system asks another to do something, the response should carry enough information to understand what happened.<\/p>\n<p>Candidates aren&#8217;t asking for distributed tracing of your recruiting infrastructure.<\/p>\n<p>We&#8217;d settle for a status code.<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-48 synved-social-resolution-single synved-social-provider-facebook nolightbox\" data-provider=\"facebook\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Facebook\" href=\"https:\/\/www.facebook.com\/sharer.php?u=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F1778&amp;t=Your%20Hiring%20Process%20Needs%20HTTP%20Status%20Codes&amp;s=100&amp;p[url]=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F1778&amp;p[images][0]=&amp;p[title]=Your%20Hiring%20Process%20Needs%20HTTP%20Status%20Codes\" style=\"font-size: 0px;width:48px;height:48px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"Facebook\" title=\"Share on Facebook\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"48\" height=\"48\" style=\"display: inline;width:48px;height:48px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.kenwalger.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/96x96\/facebook.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-48 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F1778&amp;text=Hey%20check%20this%20out\" style=\"font-size: 0px;width:48px;height:48px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"48\" height=\"48\" style=\"display: inline;width:48px;height:48px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.kenwalger.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/96x96\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-48 synved-social-resolution-single synved-social-provider-reddit nolightbox\" data-provider=\"reddit\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Reddit\" href=\"https:\/\/www.reddit.com\/submit?url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F1778&amp;title=Your%20Hiring%20Process%20Needs%20HTTP%20Status%20Codes\" style=\"font-size: 0px;width:48px;height:48px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"reddit\" title=\"Share on Reddit\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"48\" height=\"48\" style=\"display: inline;width:48px;height:48px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.kenwalger.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/96x96\/reddit.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-48 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&amp;url=https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F1778&amp;title=Your%20Hiring%20Process%20Needs%20HTTP%20Status%20Codes\" style=\"font-size: 0px;width:48px;height:48px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"48\" height=\"48\" style=\"display: inline;width:48px;height:48px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.kenwalger.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/96x96\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-48 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Your%20Hiring%20Process%20Needs%20HTTP%20Status%20Codes&amp;body=Hey%20check%20this%20out:%20https%3A%2F%2Fwww.kenwalger.com%2Fblog%2Fwp-json%2Fwp%2Fv2%2Fposts%2F1778\" style=\"font-size: 0px;width:48px;height:48px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"48\" height=\"48\" style=\"display: inline;width:48px;height:48px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/www.kenwalger.com\/blog\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/96x96\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Because &#8220;we&#8217;ll be in touch&#8221; is not an observable state. I submitted a job application recently. It was one of those applications where you actually put in the effort. I read the job description carefully, tailored the resume, wrote a cover letter specifically for the organization, and answered the optional questions rather than pretending they &hellip; <a href=\"https:\/\/www.kenwalger.com\/blog\/career\/hiring-process-http-status-codes\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Your Hiring Process Needs HTTP Status Codes&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pmpro_default_level":"","_monsterinsights_skip_tracking":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[16],"tags":[1890,1891,1888,1892,1894,1837,1889,1895,1713,1893],"yst_prominent_words":[],"class_list":["post-1778","post","type-post","status-publish","format-standard","hentry","category-career","tag-applicant-tracking-systems","tag-candidate-experience","tag-hiring","tag-http-status-codes","tag-job-search","tag-observability","tag-recruiting","tag-satire","tag-system-design","tag-tech-hiring","pmpro-has-access"],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8lx70-sG","jetpack-related-posts":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/posts\/1778","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/comments?post=1778"}],"version-history":[{"count":2,"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/posts\/1778\/revisions"}],"predecessor-version":[{"id":1780,"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/posts\/1778\/revisions\/1780"}],"wp:attachment":[{"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/media?parent=1778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/categories?post=1778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/tags?post=1778"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/www.kenwalger.com\/blog\/wp-json\/wp\/v2\/yst_prominent_words?post=1778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}