[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"sanity-LyyaFTPliK_zx8PHxQ5Bap2aIPe92VnFnDDZTP-5gnM":3,"sanity-h_lNQDKgWNde_GzGTZnFJjeBx5kkLlI_mYGl0kGLO0g":761},{"data":4,"sourceMap":-1},{"latestPodcast":5,"latestReleases":14,"post":39,"recent":736},[6],{"_id":7,"publishedAt":8,"slug":9,"sponsored":12,"title":13},"4d0175f4-40a8-47eb-9bb3-a453b326aa7d","2026-07-03T07:40:00.000Z",{"_type":10,"current":11},"slug","the-good-the-bad-and-the-ai-apps",null,"The good, the bad, and the AI apps",[15,21,27,33],{"_id":16,"publishedAt":17,"slug":18,"title":20},"eb5b66eb-9410-4329-83bb-22bbff39402a","2026-04-28T13:00:00.000Z",{"_type":10,"current":19},"turn-scattered-knowledge-into-trusted-intelligence","Turning scattered knowledge into trusted intelligence: Stack Internal 2026.3",{"_id":22,"publishedAt":23,"slug":24,"title":26},"369c2401-b62e-4a37-8ff8-bf603023ecad","2026-03-02T15:03:00.988Z",{"_type":10,"current":25},"what-s-new-at-stack-overflow-march-2026","What’s new at Stack Overflow: March 2026",{"_id":28,"publishedAt":29,"slug":30,"title":32},"5e9053a4-07ea-447c-91ea-29e0b6228537","2026-02-02T15:00:00.000Z",{"_type":10,"current":31},"what-s-new-at-stack-overflow-february-2026","What’s new at Stack Overflow: February 2026",{"_id":34,"publishedAt":35,"slug":36,"title":38},"a1b538eb-a8a6-46d0-80a1-ac70ec9bb935","2026-01-05T10:00:00.000-05:00",{"_type":10,"current":37},"what-s-new-at-stack-overflow-january-2026","What’s new at Stack Overflow: January 2026",{"_createdAt":40,"_id":41,"_rev":42,"_type":43,"_updatedAt":44,"author":45,"body":62,"comments":676,"dateUrl":677,"excerpt":678,"image":679,"legacyBody":682,"product":12,"publishedAt":685,"slug":686,"sponsored":12,"tags":688,"title":735,"visible":676},"2023-05-24T12:50:59Z","wp-post-19686","LIB4H7UiOBRX1pcyriPQDK","blogPost","2025-04-25T20:02:09Z",[46],{"_createdAt":47,"_id":48,"_rev":49,"_type":50,"_updatedAt":51,"avatar":52,"bio":57,"employee":58,"name":59,"slug":60},"2023-05-23T16:27:18Z","wp-author-cap-19510","dgl3SCUzppW3U2LvCoP6c0","blogAuthor","2023-06-20T15:05:12Z",{"_type":53,"asset":54},"image",{"_ref":55,"_type":56},"image-7c4e91f7a46bfdc5870dd420f29a964da6830fbe-1920x1920-jpg","reference","Joyce Lin is the head of developer relations at Postman, an API Platform used by 17M+ users to access bazillions of APIs every month. She is a culinary magician who specializes in tacos and boba.","none","Joyce Lin",{"current":61},"joyce-lin",[63,74,82,92,100,108,116,126,134,142,150,158,166,172,203,210,229,237,252,267,282,297,312,318,325,333,341,353,414,442,480,492,534,550,556,564,572,580,588,596,604,612,620,628,636,648,660,668],{"_key":64,"_type":65,"children":66,"markDefs":72,"style":73},"987b4742fe41","block",[67],{"_key":68,"_type":69,"marks":70,"text":71},"987b4742fe410","span",[],"What do you do when an API returns something unexpected? Is the issue user inputs, the API itself, or something completely unrelated? For API consumers, debugging means identifying and fixing issues with a single API call or sequence of calls. In many cases, you are debugging code that you might not control, and you are at the mercy of what is observable. In addition to experiencing unexpected behavior while accessing an API, you can also make mistakes parsing the output or passing through variables.",[],"normal",{"_key":75,"_type":65,"children":76,"markDefs":81,"style":73},"9001376d2ed1",[77],{"_key":78,"_type":69,"marks":79,"text":80},"9001376d2ed10",[],"In this article, let’s dig into methodologies and principles for debugging REST APIs more quickly and reliably.",[],{"_key":83,"_type":65,"children":84,"markDefs":90,"style":91},"06627282faae",[85],{"_key":86,"_type":69,"marks":87,"text":89},"06627282faae0",[88],"strong","What is API debugging?",[],"h2",{"_key":93,"_type":65,"children":94,"markDefs":99,"style":73},"65ece47eac95",[95],{"_key":96,"_type":69,"marks":97,"text":98},"65ece47eac950",[],"The debugging process aims to understand the relationship between inputs and outputs. Most of the effort goes toward locating the root cause of the issue based on what can be observed. This can get tricky if you are stringing together a sequence of API calls from different providers or accessing different resources.",[],{"_key":101,"_type":65,"children":102,"markDefs":107,"style":73},"13278b5a5d9b",[103],{"_key":104,"_type":69,"marks":105,"text":106},"13278b5a5d9b0",[],"Ideally, you have a robust testing and monitoring system to alert you when something goes wrong and pinpoint where the problem might be. But even if you don’t have this level of observability, a consistent approach can reduce the time and effort required to find and fix issues.",[],{"_key":109,"_type":65,"children":110,"markDefs":115,"style":73},"6a042f32aa0b",[111],{"_key":112,"_type":69,"marks":113,"text":114},"6a042f32aa0b0",[],"Here is one approach to identifying bugs:",[],{"_key":117,"_type":65,"children":118,"level":123,"listItem":124,"markDefs":125,"style":73},"3f0d357e227d",[119],{"_key":120,"_type":69,"marks":121,"text":122},"3f0d357e227d0",[],"Isolate the API issue",1,"bullet",[],{"_key":127,"_type":65,"children":128,"level":123,"listItem":124,"markDefs":133,"style":73},"73cadf8da047",[129],{"_key":130,"_type":69,"marks":131,"text":132},"73cadf8da0470",[],"Check the status messages",[],{"_key":135,"_type":65,"children":136,"level":123,"listItem":124,"markDefs":141,"style":73},"4cd55edf05b2",[137],{"_key":138,"_type":69,"marks":139,"text":140},"4cd55edf05b20",[],"Inspect the data more deeply",[],{"_key":143,"_type":65,"children":144,"markDefs":149,"style":73},"d5f936e747eb",[145],{"_key":146,"_type":69,"marks":147,"text":148},"d5f936e747eb0",[],"I’ll demonstrate these debugging examples in Postman, but feel free to use your favorite developer tool or API client.",[],{"_key":151,"_type":65,"children":152,"markDefs":156,"style":157},"6dfcc5f18f64",[153],{"_key":154,"_type":69,"marks":155,"text":122},"6dfcc5f18f640",[],[],"h3",{"_key":159,"_type":65,"children":160,"markDefs":165,"style":73},"e270310ca1cb",[161],{"_key":162,"_type":69,"marks":163,"text":164},"e270310ca1cb0",[],"The first step is to isolate the API issue and determine if the issue stems from calling the API, the API itself, processing the output, or something completely unrelated. Reproduce the issue in your favorite developer tool or API client for deeper inspection. This allows you to more easily inspect and tweak the request parameters, headers, and body to compare against the response. If you can’t reliably discern a relationship between the input and output, the problem may not be with the API call itself. For example, there might be a third-party service or a change in infrastructure causing the unexpected behavior.",[],{"_key":167,"_type":53,"alt":168,"asset":169,"caption":171,"markDefs":12},"8bad7f4ea0ba","The Postman interface showing the results of a test API query. ",{"_ref":170,"_type":56},"image-d01aeac41707b2db8c63f476b8c546e60c5f28e8-1600x1023-png","Reproduce the issue in a developer tool, like Postman, for deeper inspection",{"_key":173,"_type":65,"children":174,"markDefs":197,"style":73},"ca33a5e4cd80",[175,179,184,188,193],{"_key":176,"_type":69,"marks":177,"text":178},"ca33a5e4cd800",[],"If you want to import an API call into Postman, you can ",{"_key":180,"_type":69,"marks":181,"text":183},"ca33a5e4cd801",[182],"8e55f5465bbb","paste a cURL command",{"_key":185,"_type":69,"marks":186,"text":187},"ca33a5e4cd802",[]," as raw text. You can also ",{"_key":189,"_type":69,"marks":190,"text":192},"ca33a5e4cd803",[191],"2728ec02a186","capture a sequence of calls with a proxy",{"_key":194,"_type":69,"marks":195,"text":196},"ca33a5e4cd804",[]," for replay or recording.",[198,201],{"_key":182,"_type":199,"href":200,"reference":12},"link","https:\u002F\u002Flearning.postman.com\u002Fdocs\u002Fgetting-started\u002Fimporting-and-exporting-data\u002F#importing-postman-data",{"_key":191,"_type":199,"href":202,"reference":12},"https:\u002F\u002Flearning.postman.com\u002Fdocs\u002Fsending-requests\u002Fcapturing-request-data\u002Finterceptor\u002F",{"_key":204,"_type":65,"children":205,"markDefs":209,"style":157},"00ea886cc11b",[206],{"_key":207,"_type":69,"marks":208,"text":132},"00ea886cc11b0",[],[],{"_key":211,"_type":65,"children":212,"markDefs":226,"style":73},"b02afc7164eb",[213,217,222],{"_key":214,"_type":69,"marks":215,"text":216},"b02afc7164eb0",[],"When you’re talking to an API, the server returns an ",{"_key":218,"_type":69,"marks":219,"text":221},"b02afc7164eb1",[220],"7340abd0f403","HTTP status code",{"_key":223,"_type":69,"marks":224,"text":225},"b02afc7164eb2",[]," that signals the status of your API request. Status codes and error messages are determined by the API provider, so they vary in meaningfulness and accuracy. But most API providers follow the established convention of defining the class of response using the first digit of their status code. For example, status codes in the 400s indicate an issue with the client. This means that you can update the request to potentially solve the issue. Status codes in the 500s indicate an issue with the server. Besides verifying that you are accessing the proper resource and checking back later, there’s not much you can do unless you are also the API provider.",[227],{"_key":220,"_type":199,"href":228,"reference":12},"https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc7231#section-6",{"_key":230,"_type":65,"children":231,"markDefs":236,"style":73},"da1018067fb9",[232],{"_key":233,"_type":69,"marks":234,"text":235},"da1018067fb90",[],"Assuming the server returns reliable status messages, this is our first clue to tracking down the source of the bug. Here are some common client error codes in the 400s and what you can do when you encounter one of these errors:",[],{"_key":238,"_type":65,"children":239,"level":123,"listItem":124,"markDefs":249,"style":73},"70f3cdea68a3",[240,245],{"_key":241,"_type":69,"marks":242,"text":244},"70f3cdea68a30",[243],"e6711cb98d9b","400 Bad Request",{"_key":246,"_type":69,"marks":247,"text":248},"70f3cdea68a31",[],": Look for syntax errors like typos or a malformed JSON body.",[250],{"_key":243,"_type":199,"href":251,"reference":12},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F400",{"_key":253,"_type":65,"children":254,"level":123,"listItem":124,"markDefs":264,"style":73},"b4897c0bc952",[255,260],{"_key":256,"_type":69,"marks":257,"text":259},"b4897c0bc9520",[258],"4bb78b5414bb","401 Unauthorized",{"_key":261,"_type":69,"marks":262,"text":263},"b4897c0bc9521",[],": Verify that you have valid authentication credentials for the target resource and check your syntax for header values.",[265],{"_key":258,"_type":199,"href":266,"reference":12},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F401",{"_key":268,"_type":65,"children":269,"level":123,"listItem":124,"markDefs":279,"style":73},"f02e37ab7f5a",[270,275],{"_key":271,"_type":69,"marks":272,"text":274},"f02e37ab7f5a0",[273],"09ecd9832687","403 Forbidden",{"_key":276,"_type":69,"marks":277,"text":278},"f02e37ab7f5a1",[],": Check your permissions and scope to ensure you are authorized to access the resource.",[280],{"_key":273,"_type":199,"href":281,"reference":12},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F403",{"_key":283,"_type":65,"children":284,"level":123,"listItem":124,"markDefs":294,"style":73},"5c3fc3d1c68b",[285,290],{"_key":286,"_type":69,"marks":287,"text":289},"5c3fc3d1c68b0",[288],"93b16497447b","418 I’m a Teapot",{"_key":291,"_type":69,"marks":292,"text":293},"5c3fc3d1c68b1",[],": May indicate the request is one the provider does not want to handle, such as automated queries.",[295],{"_key":288,"_type":199,"href":296,"reference":12},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F418",{"_key":298,"_type":65,"children":299,"level":123,"listItem":124,"markDefs":309,"style":73},"196456f006a5",[300,305],{"_key":301,"_type":69,"marks":302,"text":304},"196456f006a50",[303],"1235d8f92e10","429 Too Many Requests",{"_key":306,"_type":69,"marks":307,"text":308},"196456f006a51",[],": Check the documentation to understand the rate limits or try again later.",[310],{"_key":303,"_type":199,"href":311,"reference":12},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F429",{"_key":313,"_type":53,"alt":314,"asset":315,"caption":317,"markDefs":12},"1f1a3f948730","The Postman interface showing a 401 Unauthorized error response from an API call. ",{"_ref":316,"_type":56},"image-bad50d9930c7babc7db9be599c6b77a8704adab9-1600x1023-png","HTTP status codes in the 400s indicate a client error",{"_key":319,"_type":65,"children":320,"markDefs":324,"style":157},"2db0d761692f",[321],{"_key":322,"_type":69,"marks":323,"text":140},"2db0d761692f0",[],[],{"_key":326,"_type":65,"children":327,"markDefs":332,"style":73},"abaafcfc4bf7",[328],{"_key":329,"_type":69,"marks":330,"text":331},"abaafcfc4bf70",[],"The next step is to dig deeper and validate your assumptions. You can validate that you have formatted each request properly and parsed each response correctly. You can also validate that variables are defined and referenced properly as you pass data along a sequence of API calls.",[],{"_key":334,"_type":65,"children":335,"markDefs":340,"style":73},"f9e55db22125",[336],{"_key":337,"_type":69,"marks":338,"text":339},"f9e55db221250",[],"Here are common issues when dealing with HTTP APIs:",[],{"_key":342,"_type":65,"children":343,"level":123,"listItem":124,"markDefs":352,"style":73},"3ad197326fa9",[344,348],{"_key":345,"_type":69,"marks":346,"text":347},"3ad197326fa90",[88],"Malformed JSON:",{"_key":349,"_type":69,"marks":350,"text":351},"3ad197326fa91",[]," Newcomers make some common mistakes when sending JSON bodies. Single quotes are invalid within the JSON string, so make sure you surround strings and property names with double quotes. Additionally, comments are not supported by JSON, so either minify them or don’t add them at all.",[],{"_key":354,"_type":65,"children":355,"level":123,"listItem":124,"markDefs":413,"style":73},"9c03f095d3b3",[356,360,364,369,373,377,381,385,389,393,397,401,405,409],{"_key":357,"_type":69,"marks":358,"text":359},"9c03f095d3b30",[88],"Serializing data:",{"_key":361,"_type":69,"marks":362,"text":363},"9c03f095d3b31",[]," REST APIs frequently store and send data as JSON objects. For the data to transmit properly, make sure to encode the data with ",{"_key":365,"_type":69,"marks":366,"text":368},"9c03f095d3b32",[367],"code","JSON.stringify()",{"_key":370,"_type":69,"marks":371,"text":372},"9c03f095d3b33",[]," and decode it with ",{"_key":374,"_type":69,"marks":375,"text":376},"9c03f095d3b34",[367],"JSON.parse()",{"_key":378,"_type":69,"marks":379,"text":380},"9c03f095d3b35",[],". Additionally, servers may require that you set a ",{"_key":382,"_type":69,"marks":383,"text":384},"9c03f095d3b36",[367],"Content-Type",{"_key":386,"_type":69,"marks":387,"text":388},"9c03f095d3b37",[]," header with the value of ",{"_key":390,"_type":69,"marks":391,"text":392},"9c03f095d3b38",[367],"application\u002Fjson",{"_key":394,"_type":69,"marks":395,"text":396},"9c03f095d3b39",[],". Upon further inspection, if you see values like ",{"_key":398,"_type":69,"marks":399,"text":400},"9c03f095d3b310",[367],"[object Object]",{"_key":402,"_type":69,"marks":403,"text":404},"9c03f095d3b311",[]," or ",{"_key":406,"_type":69,"marks":407,"text":408},"9c03f095d3b312",[367],"Unexpected token",{"_key":410,"_type":69,"marks":411,"text":412},"9c03f095d3b313",[],", this indicates improper serialization and deserialization.",[],{"_key":415,"_type":65,"children":416,"level":123,"listItem":124,"markDefs":441,"style":73},"842030e2408c",[417,421,425,429,433,437],{"_key":418,"_type":69,"marks":419,"text":420},"842030e2408c0",[88],"Type casting:",{"_key":422,"_type":69,"marks":423,"text":424},"842030e2408c1",[]," Values can be cast from one type to another as you prepare to send a request or parse a response. Depending on the programming language, performing a math calculation on a ",{"_key":426,"_type":69,"marks":427,"text":428},"842030e2408c2",[367],"string",{"_key":430,"_type":69,"marks":431,"text":432},"842030e2408c3",[]," may fail, but casting the value to a ",{"_key":434,"_type":69,"marks":435,"text":436},"842030e2408c4",[367],"number",{"_key":438,"_type":69,"marks":439,"text":440},"842030e2408c5",[]," allows you to work with the data.",[],{"_key":443,"_type":65,"children":444,"level":123,"listItem":124,"markDefs":477,"style":73},"229ad9843439",[445,449,453,456,460,465,469,473],{"_key":446,"_type":69,"marks":447,"text":448},"229ad98434390",[88],"Extracting information:",{"_key":450,"_type":69,"marks":451,"text":452},"229ad98434391",[]," Once you deserialize a JSON response using ",{"_key":454,"_type":69,"marks":455,"text":376},"229ad98434392",[367],{"_key":457,"_type":69,"marks":458,"text":459},"229ad98434393",[],", you can ",{"_key":461,"_type":69,"marks":462,"text":464},"229ad98434394",[463],"e94d22692fe3","access properties",{"_key":466,"_type":69,"marks":467,"text":468},"229ad98434395",[]," with dot or bracket notation and loop through arrays. If you are trying to access deeply nested information within a complex structure, you may need to break it down step-by-step to precisely reference that information and guarantee that you are not trying to drill deeper into something that is ",{"_key":470,"_type":69,"marks":471,"text":472},"229ad98434396",[367],"undefined",{"_key":474,"_type":69,"marks":475,"text":476},"229ad98434397",[],".",[478],{"_key":463,"_type":199,"href":479,"reference":12},"https:\u002F\u002Fstackoverflow.com\u002Fa\u002F11922384",{"_key":481,"_type":65,"children":482,"level":123,"listItem":124,"markDefs":491,"style":73},"2a4261deed53",[483,487],{"_key":484,"_type":69,"marks":485,"text":486},"2a4261deed530",[88],"Authentication vs. authorization:",{"_key":488,"_type":69,"marks":489,"text":490},"2a4261deed531",[]," Authentication verifies users are who they say they are, while authorization confirms that users have permission to access a resource. If you have the proper authorization header(s) included with a request but still cannot access a resource, doublecheck the permissions and scopes associated with your credentials.",[],{"_key":493,"_type":65,"children":494,"level":123,"listItem":124,"markDefs":533,"style":73},"fba947f5f620",[495,499,503,506,510,514,518,522,526,529],{"_key":496,"_type":69,"marks":497,"text":498},"fba947f5f6200",[88],"Content type headers:",{"_key":500,"_type":69,"marks":501,"text":502},"fba947f5f6201",[]," The ",{"_key":504,"_type":69,"marks":505,"text":384},"fba947f5f6202",[367],{"_key":507,"_type":69,"marks":508,"text":509},"fba947f5f6203",[]," and ",{"_key":511,"_type":69,"marks":512,"text":513},"fba947f5f6204",[367],"Accept",{"_key":515,"_type":69,"marks":516,"text":517},"fba947f5f6205",[]," headers facilitate the content negotiation between client and server. A ",{"_key":519,"_type":69,"marks":520,"text":521},"fba947f5f6206",[367],"Content-type",{"_key":523,"_type":69,"marks":524,"text":525},"fba947f5f6207",[]," request header tells the server what type of information is being sent from the client. On the other hand, an ",{"_key":527,"_type":69,"marks":528,"text":513},"fba947f5f6208",[367],{"_key":530,"_type":69,"marks":531,"text":532},"fba947f5f6209",[]," request header tells the server what type of content the client can understand. Some APIs require specific request headers and only work with certain content types.",[],{"_key":535,"_type":65,"children":536,"markDefs":549,"style":73},"f638e771bf76",[537,541,545],{"_key":538,"_type":69,"marks":539,"text":540},"f638e771bf760",[],"With these common errors, you can rely on syntax highlighting, linters, and other inspection features to provide more visibility into issues. Developer consoles can also provide more visibility into your application’s network calls and log statements to further help you isolate issues with inputs, outputs, and passing data from one call to another. For example, if you have a sequence of synchronous or asynchronous calls, logging values at critical junctions or setting up conditional breakpoints can help you quickly pinpoint the issue. Using console statements like ",{"_key":542,"_type":69,"marks":543,"text":544},"f638e771bf761",[367],"console.log()",{"_key":546,"_type":69,"marks":547,"text":548},"f638e771bf762",[]," throughout the call execution can further validate your assumptions parsing outputs.",[],{"_key":551,"_type":53,"alt":552,"asset":553,"caption":555,"markDefs":12},"e5f936416917","The Postman interface showing the console log results from a test. ",{"_ref":554,"_type":56},"image-1b427f69bdc72b1aca8a0b03b68701c06d5a59d1-1600x1023-png","Use consoles for visibility into network calls, call execution order, and variable values",{"_key":557,"_type":65,"children":558,"markDefs":563,"style":91},"b982743412fa",[559],{"_key":560,"_type":69,"marks":561,"text":562},"b982743412fa0",[88],"Types of debugging strategies",[],{"_key":565,"_type":65,"children":566,"markDefs":571,"style":73},"f0969e4d514a",[567],{"_key":568,"_type":69,"marks":569,"text":570},"f0969e4d514a0",[],"A number of debugging strategies can narrow down the cause of the issue. These strategies fall into three general categories.",[],{"_key":573,"_type":65,"children":574,"markDefs":579,"style":157},"eea6f5239108",[575],{"_key":576,"_type":69,"marks":577,"text":578},"eea6f52391080",[],"Brute force strategy",[],{"_key":581,"_type":65,"children":582,"markDefs":587,"style":73},"23195a4efbcd",[583],{"_key":584,"_type":69,"marks":585,"text":586},"23195a4efbcd0",[],"If you have limited observability into a system, this means that you are tweaking and logging everything. Adding strategic log statements at certain points throughout a sequence of API calls can be helpful. However, the volume of logs has diminishing returns as it takes more time to interpret the logged data.",[],{"_key":589,"_type":65,"children":590,"markDefs":595,"style":157},"c99ba3fbd697",[591],{"_key":592,"_type":69,"marks":593,"text":594},"c99ba3fbd6970",[],"Backtracking strategy",[],{"_key":597,"_type":65,"children":598,"markDefs":603,"style":73},"ffbba1dcd4ef",[599],{"_key":600,"_type":69,"marks":601,"text":602},"ffbba1dcd4ef0",[],"This strategy refers to moving backwards from the point where an error is first observed to find the root cause. Similarly, you can start from an API call that is displaying behavior you expect, and then step through subsequent calls until you find the bug. This strategy works well when you have reasonable hypotheses of what might be causing the problem, but is less effective when the error is far from the root cause.",[],{"_key":605,"_type":65,"children":606,"markDefs":611,"style":157},"28a4e74a405f",[607],{"_key":608,"_type":69,"marks":609,"text":610},"28a4e74a405f0",[],"Divide-and-conquer strategy",[],{"_key":613,"_type":65,"children":614,"markDefs":619,"style":73},"7617bc498902",[615],{"_key":616,"_type":69,"marks":617,"text":618},"7617bc4989020",[],"In complex systems, breaking the system into smaller sections may allow you to spot problems more easily.Binary search is one example of this strategy, where you input a log statement or breakpoint in the middle of a longer sequence of calls. If the defect does not occur by that breakpoint, repeat the process with the second half of the calls, and so on. Another strategy is to use mock servers to isolate the system under test. You can rely on mock responses to stub external dependencies or provide a starting point for your scenarios.",[],{"_key":621,"_type":65,"children":622,"markDefs":627,"style":91},"7d7df625289b",[623],{"_key":624,"_type":69,"marks":625,"text":626},"7d7df625289b0",[88],"Get in the debugging mindset",[],{"_key":629,"_type":65,"children":630,"markDefs":635,"style":73},"581f6bb87e5a",[631],{"_key":632,"_type":69,"marks":633,"text":634},"581f6bb87e5a0",[],"After a while, focusing on a problem without making progress can become counterproductive as you lose sight of the forest for the trees. The following tactics can help you get in a more effective debugging mindset.",[],{"_key":637,"_type":65,"children":638,"level":123,"listItem":124,"markDefs":647,"style":73},"d08bb6b0a1d6",[639,643],{"_key":640,"_type":69,"marks":641,"text":642},"d08bb6b0a1d60",[88],"Rubber duck debugging:",{"_key":644,"_type":69,"marks":645,"text":646},"d08bb6b0a1d61",[]," Articulating the problem and hypothesis to someone else may shift your own perspective by forcing you to slow down and explicitly state your assumptions.",[],{"_key":649,"_type":65,"children":650,"level":123,"listItem":124,"markDefs":659,"style":73},"b53cf5fb1b99",[651,655],{"_key":652,"_type":69,"marks":653,"text":654},"b53cf5fb1b990",[88],"Switch from a focused to diffused mode",{"_key":656,"_type":69,"marks":657,"text":658},"b53cf5fb1b991",[],": Switching to a different activity altogether, like taking a hike, moves your brain into a different gear. The diffused mode of learning is when your brain passively establishes new connections and may result in creative insights. This is one reason why you get the best ideas in the shower or when you first wake up.",[],{"_key":661,"_type":65,"children":662,"markDefs":667,"style":91},"1718fabf0dd1",[663],{"_key":664,"_type":69,"marks":665,"text":666},"1718fabf0dd10",[88],"Save time and heartache while debugging",[],{"_key":669,"_type":65,"children":670,"markDefs":675,"style":73},"0a006d6489c9",[671],{"_key":672,"_type":69,"marks":673,"text":674},"0a006d6489c90",[],"Whether you are new to consuming REST APIs or a seasoned veteran, a consistent and methodical approach to debugging saves time and heartache. The debugging strategy you choose depends on the observability of the system. If your system has extensive monitoring in place with predefined logs and stack traces, you can uncover issues quickly and may be able to spot the bug right away. If these measures aren’t in place, you can simplify the problem to reduce the search area and utilize some of these debugging tactics for more visibility.",[],true,"2022\u002F02\u002F28","How you can debug the APIs that you consume but don't own.",{"_type":53,"asset":680},{"_ref":681,"_type":56},"image-0737afecafd6c096e754b86037245ebc06d862a9-2400x1260-jpg",{"code":683,"language":684},"\u003C!-- wp:paragraph -->\n\u003Cp>What do you do when an API returns something unexpected? Is the issue user inputs, the API itself, or something completely unrelated? For API consumers, debugging means identifying and fixing issues with a single API call or sequence of calls. In many cases, you are debugging code that you might not control, and you are at the mercy of what is observable. In addition to experiencing unexpected behavior while accessing an API, you can also make mistakes parsing the output or passing through variables.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In this article, let’s dig into methodologies and principles for debugging REST APIs more quickly and reliably.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2 id=\"h-what-is-api-debugging\">\u003Cstrong>What is API debugging?\u003C\u002Fstrong>\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The debugging process aims to understand the relationship between inputs and outputs. Most of the effort goes toward locating the root cause of the issue based on what can be observed. This can get tricky if you are stringing together a sequence of API calls from different providers or accessing different resources.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Ideally, you have a robust testing and monitoring system to alert you when something goes wrong and pinpoint where the problem might be. But even if you don’t have this level of observability, a consistent approach can reduce the time and effort required to find and fix issues.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Here is one approach to identifying bugs:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:list -->\n\u003Cul>\u003Cli>Isolate the API issue\u003C\u002Fli>\u003Cli>Check the status messages\u003C\u002Fli>\u003Cli>Inspect the data more deeply\u003C\u002Fli>\u003C\u002Ful>\n\u003C!-- \u002Fwp:list -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>I’ll demonstrate these debugging examples in Postman, but feel free to use your favorite developer tool or API client.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3 id=\"h-isolate-the-api-issue\">Isolate the API issue\u003C\u002Fh3>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The first step is to isolate the API issue and determine if the issue stems from calling the API, the API itself, processing the output, or something completely unrelated. Reproduce the issue in your favorite developer tool or API client for deeper inspection. This allows you to more easily inspect and tweak the request parameters, headers, and body to compare against the response. If you can’t reliably discern a relationship between the input and output, the problem may not be with the API call itself. For example, there might be a third-party service or a change in infrastructure causing the unexpected behavior. \u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:image -->\n\u003Cfigure class=\"wp-block-image\">\u003Cimg src=\"https:\u002F\u002Flh4.googleusercontent.com\u002FI8pp51qR2oceFsNa2A6qnBqu5wd7gL7GO63WEogcqXPuwBHxEYjVT64DQcPYKQpZzN2g4sdtQ7wnM0tP25waRd6S5aUgbvA7oajfHLCVPxX3z3_b1N8j8E8TFDMXqyJxYkCbjPaQ\" alt=\"The Postman interface showing the results of a test API query. \"\u002F>\u003Cfigcaption>Reproduce the issue in a developer tool, like Postman, for deeper inspection\u003C\u002Ffigcaption>\u003C\u002Ffigure>\n\u003C!-- \u002Fwp:image -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>If you want to import an API call into Postman, you can \u003Ca href=\"https:\u002F\u002Flearning.postman.com\u002Fdocs\u002Fgetting-started\u002Fimporting-and-exporting-data\u002F#importing-postman-data\">paste a cURL command\u003C\u002Fa> as raw text. You can also \u003Ca href=\"https:\u002F\u002Flearning.postman.com\u002Fdocs\u002Fsending-requests\u002Fcapturing-request-data\u002Finterceptor\u002F\">capture a sequence of calls with a proxy\u003C\u002Fa> for replay or recording.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3 id=\"h-check-the-status-messages\">Check the status messages\u003C\u002Fh3>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>When you’re talking to an API, the server returns an \u003Ca href=\"https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc7231#section-6\">HTTP status code\u003C\u002Fa> that signals the status of your API request. Status codes and error messages are determined by the API provider, so they vary in meaningfulness and accuracy. But most API providers follow the established convention of defining the class of response using the first digit of their status code. For example, status codes in the 400s indicate an issue with the client. This means that you can update the request to potentially solve the issue. Status codes in the 500s indicate an issue with the server. Besides verifying that you are accessing the proper resource and checking back later, there’s not much you can do unless you are also the API provider.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Assuming the server returns reliable status messages, this is our first clue to tracking down the source of the bug. Here are some common client error codes in the 400s and what you can do when you encounter one of these errors:&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:list -->\n\u003Cul>\u003Cli>\u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F400\">400 Bad Request\u003C\u002Fa>: Look for syntax errors like typos or a malformed JSON body.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F401\">401 Unauthorized\u003C\u002Fa>: Verify that you have valid authentication credentials for the target resource and check your syntax for header values.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F403\">403 Forbidden\u003C\u002Fa>: Check your permissions and scope to ensure you are authorized to access the resource.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F418\">418 I’m a Teapot\u003C\u002Fa>: May indicate the request is one the provider does not want to handle, such as automated queries.\u003C\u002Fli>\u003Cli>\u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus\u002F429\">429 Too Many Requests\u003C\u002Fa>: Check the documentation to understand the rate limits or try again later.\u003C\u002Fli>\u003C\u002Ful>\n\u003C!-- \u002Fwp:list -->\n\n\u003C!-- wp:image -->\n\u003Cfigure class=\"wp-block-image\">\u003Cimg src=\"https:\u002F\u002Flh6.googleusercontent.com\u002FZtNSbhohrBwfyf5lC8t4nv8mPg-1cvA7razZBKUglCfAn5vvgfnGzRYSDSObNQLGy_fA7xWM8zA8YJc9QeV9BNqInLOQz9pKfPoptvhDPgu7AsNat7V7xZSHvnrsicrEVpcHC-y-\" alt=\"The Postman interface showing a 401 Unauthorized error response from an API call. \"\u002F>\u003Cfigcaption>HTTP status codes in the 400s indicate a client error\u003C\u002Ffigcaption>\u003C\u002Ffigure>\n\u003C!-- \u002Fwp:image -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3 id=\"h-inspect-the-data-more-deeply\">Inspect the data more deeply\u003C\u002Fh3>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>The next step is to dig deeper and validate your assumptions. You can validate that you have formatted each request properly and parsed each response correctly. You can also validate that variables are defined and referenced properly as you pass data along a sequence of API calls.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Here are common issues when dealing with HTTP APIs:\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:list -->\n\u003Cul>\u003Cli>\u003Cstrong>Malformed JSON:\u003C\u002Fstrong> Newcomers make some common mistakes when sending JSON bodies. Single quotes are invalid within the JSON string, so make sure you surround strings and property names with double quotes. Additionally, comments are not supported by JSON, so either minify them or don’t add them at all. \u003C\u002Fli>\u003Cli>\u003Cstrong>Serializing data:\u003C\u002Fstrong> REST APIs frequently store and send data as JSON objects. For the data to transmit properly, make sure to encode the data with \u003Ccode>JSON.stringify()\u003C\u002Fcode> and decode it with \u003Ccode>JSON.parse()\u003C\u002Fcode>. Additionally, servers may require that you set a \u003Ccode>Content-Type\u003C\u002Fcode> header with the value of \u003Ccode>application\u002Fjson\u003C\u002Fcode>. Upon further inspection, if you see values like \u003Ccode>[object Object]\u003C\u002Fcode> or \u003Ccode>Unexpected token\u003C\u002Fcode>, this indicates improper serialization and deserialization.\u003C\u002Fli>\u003Cli>\u003Cstrong>Type casting:\u003C\u002Fstrong> Values can be cast from one type to another as you prepare to send a request or parse a response. Depending on the programming language, performing a math calculation on a \u003Ccode>string\u003C\u002Fcode> may fail, but casting the value to a \u003Ccode>number\u003C\u002Fcode> allows you to work with the data.\u003C\u002Fli>\u003Cli>\u003Cstrong>Extracting information:\u003C\u002Fstrong> Once you deserialize a JSON response using \u003Ccode>JSON.parse()\u003C\u002Fcode>, you can \u003Ca href=\"https:\u002F\u002Fstackoverflow.com\u002Fa\u002F11922384\">access properties\u003C\u002Fa> with dot or bracket notation and loop through arrays. If you are trying to access deeply nested information within a complex structure, you may need to break it down step-by-step to precisely reference that information and guarantee that you are not trying to drill deeper into something that is \u003Ccode>undefined\u003C\u002Fcode>.\u003C\u002Fli>\u003Cli>\u003Cstrong>Authentication vs. authorization:\u003C\u002Fstrong> Authentication verifies users are who they say they are, while authorization confirms that users have permission to access a resource. If you have the proper authorization header(s) included with a request but still cannot access a resource, doublecheck the permissions and scopes associated with your credentials.\u003C\u002Fli>\u003Cli>\u003Cstrong>Content type headers:\u003C\u002Fstrong> The \u003Ccode>Content-Type\u003C\u002Fcode> and \u003Ccode>Accept\u003C\u002Fcode> headers facilitate the content negotiation between client and server. A \u003Ccode>Content-type\u003C\u002Fcode> request header tells the server what type of information is being sent from the client. On the other hand, an \u003Ccode>Accept\u003C\u002Fcode> request header tells the server what type of content the client can understand. Some APIs require specific request headers and only work with certain content types. \u003C\u002Fli>\u003C\u002Ful>\n\u003C!-- \u002Fwp:list -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>With these common errors, you can rely on syntax highlighting, linters, and other inspection features to provide more visibility into issues. Developer consoles can also provide more visibility into your application’s network calls and log statements to further help you isolate issues with inputs, outputs, and passing data from one call to another. For example, if you have a sequence of synchronous or asynchronous calls, logging values at critical junctions or setting up conditional breakpoints can help you quickly pinpoint the issue. Using console statements like \u003Ccode>console.log()\u003C\u002Fcode> throughout the call execution can further validate your assumptions parsing outputs.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:image -->\n\u003Cfigure class=\"wp-block-image\">\u003Cimg src=\"https:\u002F\u002Flh3.googleusercontent.com\u002F15fjGE5YzOJpM9idn_sedHCX_Pl2uTDZGJfg12gQVFW5ygQ12T1zZfAS-n8H5vejqM33gufjjIaNjkzPdp4OnXISCAUrWBRJ-FX54GtTLdzq_Sh40sHgNunKdIc2ozyPMzumk8kv\" alt=\"The Postman interface showing the console log results from a test. \"\u002F>\u003Cfigcaption>Use consoles for visibility into network calls, call execution order, and variable values\u003C\u002Ffigcaption>\u003C\u002Ffigure>\n\u003C!-- \u002Fwp:image -->\n\n\u003C!-- wp:heading -->\n\u003Ch2 id=\"h-types-of-debugging-strategies\">\u003Cstrong>Types of debugging strategies\u003C\u002Fstrong>\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>A number of debugging strategies can narrow down the cause of the issue. These strategies fall into three general categories.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3 id=\"h-brute-force-strategy\">Brute force strategy\u003C\u002Fh3>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>If you have limited observability into a system, this means that you are tweaking and logging everything. Adding strategic log statements at certain points throughout a sequence of API calls can be helpful. However, the volume of logs has diminishing returns as it takes more time to interpret the logged data.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3 id=\"h-backtracking-strategy\">Backtracking strategy\u003C\u002Fh3>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>This strategy refers to moving backwards from the point where an error is first observed to find the root cause. Similarly, you can start from an API call that is displaying behavior you expect, and then step through subsequent calls until you find the bug. This strategy works well when you have reasonable hypotheses of what might be causing the problem, but is less effective when the error is far from the root cause.\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading {\"level\":3} -->\n\u003Ch3 id=\"h-divide-and-conquer-strategy\">Divide-and-conquer strategy\u003C\u002Fh3>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>In complex systems, breaking the system into smaller sections may allow you to spot problems more easily.\u003Cstrong> \u003C\u002Fstrong>Binary search is one example of this strategy, where you input a log statement or breakpoint in the middle of a longer sequence of calls. If the defect does not occur by that breakpoint, repeat the process with the second half of the calls, and so on. Another strategy is to use mock servers to isolate the system under test. You can rely on mock responses to stub external dependencies or provide a starting point for your scenarios.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:heading -->\n\u003Ch2 id=\"h-get-in-the-debugging-mindset\">\u003Cstrong>Get in the debugging mindset\u003C\u002Fstrong>\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>After a while, focusing on a problem without making progress can become counterproductive as you lose sight of the forest for the trees. The following tactics can help you get in a more effective debugging mindset.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->\n\n\u003C!-- wp:list -->\n\u003Cul>\u003Cli>\u003Cstrong>Rubber duck debugging:\u003C\u002Fstrong> Articulating the problem and hypothesis to someone else may shift your own perspective by forcing you to slow down and explicitly state your assumptions.&nbsp;\u003C\u002Fli>\u003Cli>\u003Cstrong>Switch from a focused to diffused mode\u003C\u002Fstrong>: Switching to a different activity altogether, like taking a hike, moves your brain into a different gear. The diffused mode of learning is when your brain passively establishes new connections and may result in creative insights. This is one reason why you get the best ideas in the shower or when you first wake up.\u003C\u002Fli>\u003C\u002Ful>\n\u003C!-- \u002Fwp:list -->\n\n\u003C!-- wp:heading -->\n\u003Ch2 id=\"h-save-time-and-heartache-while-debugging\">\u003Cstrong>Save time and heartache while debugging\u003C\u002Fstrong>\u003C\u002Fh2>\n\u003C!-- \u002Fwp:heading -->\n\n\u003C!-- wp:paragraph -->\n\u003Cp>Whether you are new to consuming REST APIs or a seasoned veteran, a consistent and methodical approach to debugging saves time and heartache. The debugging strategy you choose depends on the observability of the system. If your system has extensive monitoring in place with predefined logs and stack traces, you can uncover issues quickly and may be able to spot the bug right away. If these measures aren’t in place, you can simplify the problem to reduce the search area and utilize some of these debugging tactics for more visibility.&nbsp;\u003C\u002Fp>\n\u003C!-- \u002Fwp:paragraph -->","html","2022-02-28T15:01:18.000Z",{"current":687},"debugging-best-practices-for-rest-api-consumers",[689,697,702,706,711,715],{"_createdAt":690,"_id":691,"_rev":692,"_type":693,"_updatedAt":690,"slug":694,"title":696},"2023-05-23T16:43:21Z","wp-tagcat-api","9HpbCsT2tq0xwozQfkc4ih","blogTag",{"current":695},"api","API",{"_createdAt":690,"_id":698,"_rev":692,"_type":693,"_updatedAt":690,"slug":699,"title":701},"wp-tagcat-code-for-a-living",{"current":700},"code-for-a-living","Code for a Living",{"_createdAt":690,"_id":703,"_rev":692,"_type":693,"_updatedAt":690,"slug":704,"title":705},"wp-tagcat-debugging",{"current":705},"debugging",{"_createdAt":690,"_id":707,"_rev":692,"_type":693,"_updatedAt":690,"slug":708,"title":710},"wp-tagcat-rest-api",{"current":709},"rest-api","rest api",{"_createdAt":690,"_id":712,"_rev":692,"_type":693,"_updatedAt":690,"slug":713,"title":714},"wp-tagcat-testing",{"current":714},"testing",{"_createdAt":716,"_id":717,"_rev":718,"_system":719,"_type":693,"_updatedAt":722,"description":723,"slug":732,"title":734},"2025-04-24T16:28:57Z","797b8797-6e65-4723-b53f-8bc005305384","IpfPEqg1c3Byvj9RrB3Xaj",{"base":720},{"id":717,"rev":721},"oc42Nphz1oZNOg9ttSv7Tn","2026-05-07T14:43:30Z",[724],{"_key":725,"_type":65,"children":726,"markDefs":731,"style":73},"bb32f75814b4",[727],{"_key":728,"_type":69,"marks":729,"text":730},"dbcf27ef29b3",[],"Community-generated articles submitted for your reading pleasure. If you’re interested in seeing your work here, log in with your Stack Overflow account and click the link below. Articles will be licensed under a CC BY-SA 4.0 grant. ",[],{"_type":10,"current":733},"contributed","The Heap","Debugging best practices for REST API consumers",[737,743,749,755],{"_id":738,"publishedAt":739,"slug":740,"sponsored":12,"title":742},"28e560af-f0aa-4d46-bd90-f435ad604aa7","2026-06-26T14:00:27.102Z",{"_type":10,"current":741},"paging-charity-how-can-engineering-leaders-avoid-becoming-bond-villains","Paging Charity! How can engineering leaders avoid becoming Bond villains?",{"_id":744,"publishedAt":745,"slug":746,"sponsored":12,"title":748},"4b22c2a3-3779-4966-93eb-5230391dbdce","2026-06-23T14:08:58.595Z",{"_type":10,"current":747},"your-ai-shipped-a-backend-that-boots-that-is-the-whole-problem","Your AI shipped a backend that boots. That is the whole problem.",{"_id":750,"publishedAt":751,"slug":752,"sponsored":12,"title":754},"5cf362e1-fe7b-45af-b69c-914731c6a052","2026-06-23T14:00:00.000Z",{"_type":10,"current":753},"the-2026-developer-survey-is-now-open-for-human-developers-only","The 2026 Developer Survey is now open (for human developers only)!",{"_id":756,"publishedAt":757,"slug":758,"sponsored":12,"title":760},"30b995f7-7cb9-4dd8-bf71-d0685940a32b","2026-06-19T14:00:00.000Z",{"_type":10,"current":759},"dispatches-from-o-reilly-from-capabilities-to-responsibilities","Dispatches from O'Reilly: From capabilities to responsibilities",{"data":762,"sourceMap":-1},{"count":763,"lastTimestamp":764},2,"2023-05-25T09:47:44Z"]