[{"data":1,"prerenderedAt":563},["ShallowReactive",2],{"project-38012032":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":29,"sentiment":30,"stance_mix":31,"scored_comments":36,"aspects":37,"strip":45,"post_text":48,"what":49,"said":97,"maker_in_thread":252,"shape":262,"grid":266,"attempts":528,"same_week":529,"maker_shows":18,"maker_hidden":555,"reader_version":556,"card":557},"38012032","OpenAPI DevTools","Chrome extension that generates an API spec","title","Show HN: OpenAPI DevTools – Chrome extension that generates an API spec","https:\u002F\u002Fgithub.com\u002FAndrewWalsh\u002Fopenapi-devtools","github.com","mrmagoo2",1698236659,2023,811,102,12,3109,1,"legend","dev_tools","api spec generator","browser_extension",[24,25,26,27,28],"openapi","api discovery","chrome extension","swagger","api documentation","loved",0.347,{"positive":32,"neutral":33,"mixed":34,"critical":35},21,33,2,3,59,{"idea":38,"execution":40,"privacy":42,"design":43,"docs":44},{"positive":39,"critical":18},14,{"positive":18,"critical":41},0,{"positive":41,"critical":18},{"positive":18,"critical":41},{"positive":41,"critical":18},[35,46,41,46,35,46,35,35,41,35,18,35,47,41,46,41,41,46,46,46,35,46,35,46,46,46,35,46,46,35,35,41,18,18,35,35,35,46,46,46],5,4,"Effortlessly discover API behaviour with a Chrome extension that automatically generates OpenAPI specifications in real time for any app or website.",{"problem":50,"audience":56,"pricing":68,"motivation":69,"time_to_build":68,"stack":74,"openness":95,"stage":96,"team_size":96},{"value":51,"source":52,"evidence":53},"Discovering undocumented API behaviour of apps and websites","maker",[54],{"id":55},"post",{"value":57,"source":58,"evidence":59},"Developers exploring undocumented web APIs","inferred",[60,64],{"id":61,"by":62,"text":63},"38012167","jpmonette","Had in mind to build something like this for quite some time to quickly explore undocumented APIs - looking forward to see your progress!",{"id":65,"by":66,"text":67},"38013617","ricberw","This is awesome! I'll second\u002Fthird the feature request for auto-including auth headers\u002Fcalls (as many of the sites I'm trying to understand\u002Fuse APIs from use persistent keys, and…",null,{"value":70,"source":71,"evidence":72},"Quickly explore undocumented APIs","commenter",[73],{"id":61,"by":62,"text":63},[75,81,85,89],{"value":76,"source":58,"evidence":77},"TypeScript",[78],{"id":79,"by":11,"text":80},"38018823","As a follow up, the algorithm that powers this makes use of the chrome.devtools.network API. Specifically it passes the Request object that is in the HAR 1.2 archive format. So…",{"value":82,"source":52,"evidence":83},"Chrome devtools network API",[84],{"id":79,"by":11,"text":80},{"value":86,"source":52,"evidence":87},"HAR 1.2 format",[88],{"id":79,"by":11,"text":80},{"value":90,"source":52,"evidence":91},"genson-js for JSON schema merging",[92],{"id":93,"by":11,"text":94},"38018766","Genson-js is used to merge JSON Schema objects. Essentially there are 5 schemas that we care about in each request, for request bodies, request headers, response bodies, response…","open_source","unknown",{"praise":98,"objections":126,"requests":151,"questions":193,"alternatives":215},[99,115],{"value":100,"source":71,"evidence":101},"Useful tool for reverse-engineering web APIs",[102,106,107,111],{"id":103,"by":104,"text":105},"38012337","adrianbr","This is amazing! to figure out the website apis has always been a huge pita. With our dlt library project we can turn the openapi spec into pipelines and have the data pushed…",{"id":61,"by":62,"text":63},{"id":108,"by":109,"text":110},"38012136","chris_nielsen","This looks super useful, can’t wait to try it at work tomorrow!",{"id":112,"by":113,"text":114},"38012270","RileyJames","Amazing. I’ve often wished this would exist. Thank you. It was always my step 1 towards Xxx. Keen to know what directions you were thinking? I’d love to see more remixing on top…",{"value":116,"source":71,"evidence":117},"Polished and well executed",[118,122],{"id":119,"by":120,"text":121},"38021340","pbnjay","Damn I literally built a really similar tool myself using HAR files just a couple weeks ago! Yours is way more polished though, nice work. I have a lot of ideas in this space…",{"id":123,"by":124,"text":125},"38012491","HanClinto","Okay, this is wonderful. Love it already!! Sometimes I click on a path parameter and it doesn't \"create\" it, even though there are several other examples in the list. Not sure if…",[127,134,144],{"value":128,"source":71,"evidence":129},"Generated specs are incomplete and only reflect observed traffic",[130],{"id":131,"by":132,"text":133},"38013635","ushakov","The problem with this type of tools is that they only produce specs based on infos they can get. The spec produced will be incomplete (missing paths, methods, response variants,…",{"value":135,"source":71,"evidence":136},"Criteria for what counts as an API request are unclear",[137,141],{"id":138,"by":139,"text":140},"38012906","wackget","The description doesn't explain exactly what this extension does. I assume it monitors all XHR requests as you browse a website, and if the request\u002Fresponse matches [some…",{"id":142,"by":139,"text":143},"38012980","Yeah but my question remains: by what criteria is a request classed as an \"API request\"? Websites make tons of XHR requests and not all of them are API requests. I want to know…",{"value":145,"source":71,"evidence":146},"Could capture session cookies or sensitive tokens",[147],{"id":148,"by":149,"text":150},"38015779","yread","wow what a perfect service to steal session cookies",[152,167,175,182],{"value":153,"source":71,"evidence":154},"Firefox support",[155,159,163],{"id":156,"by":157,"text":158},"38012798","a_c","Love it! I used https:\u002F\u002Fvite-plugin-web-extension.aklinker1.io\u002Fguide\u002F before to have cross browser extension support. If you don't mind I could take a look to add firefox support…",{"id":160,"by":161,"text":162},"38015878","distortedsignal","I'd love to see FF support on this.",{"id":164,"by":165,"text":166},"38016450","sdmike1","A Firefox version of this would be super handy! Does that already exist?",{"value":168,"source":71,"evidence":169},"Capture and document auth headers and token flows",[170,174],{"id":171,"by":172,"text":173},"38012423","the_absurdist","I wish this would document the auth headers. What would be particularly useful is if it saved token values and then (through search) joined them on the response of the auth call…",{"id":65,"by":66,"text":67},{"value":176,"source":71,"evidence":177},"Copy request as Python snippet",[178],{"id":179,"by":180,"text":181},"38014878","archiewood","My most common use case here is to then want to hit the API from python, and adjust the params \u002F url etc. Would love a \"copy to python requests\" button that grabs the headers…",{"value":183,"source":71,"evidence":184},"Filter out headers and handle enums and optional fields",[185,189],{"id":186,"by":187,"text":188},"38023181","pihentagy","Is there a way to filter out headers? The result contains headers like content-length and similar. Also it would be nice if it could factor out common schemas.",{"id":190,"by":191,"text":192},"38014045","ch_sm","Very nice! Auto generating type information from looking at permutations of values is hard though. Q: Does this handle optional values? Also, being able to mark string field as…",[194,201,208],{"value":195,"source":71,"evidence":196},"Does it capture server-side requests?",[197],{"id":198,"by":199,"text":200},"38013011","pmkelly4444","this is very cool! I just tried using it, unfortunately, my NextJS app dir project makes most requests from the server side, so it was only capturing \"posts\" made from the…",{"value":202,"source":71,"evidence":203},"Does it handle gRPC or protobuf?",[204],{"id":205,"by":206,"text":207},"38012843","voidmain0001","The documentation states 'automatically populate based on JSON requests that fire as you browse the web' so does this mean that gRPC protobuf are not captured?",{"value":209,"source":71,"evidence":210},"Is there a Safari version?",[211],{"id":212,"by":213,"text":214},"38012444","corry","Awesome! Any chance of a Safari extension too?",[216,223,234,241,245],{"value":217,"source":71,"evidence":218},"mitmproxy2swagger",[219],{"id":220,"by":221,"text":222},"38012866","lucasyvas","This reminds me a lot of: https:\u002F\u002Fgithub.com\u002Falufers\u002Fmitmproxy2swagger However, having the capability delivered in a browser extension is extremely handy!",{"value":224,"source":71,"evidence":225},"Akita (now Postman)",[226,230],{"id":227,"by":228,"text":229},"38013683","user3939382","There's a similar, more powerful tool if you're into this https:\u002F\u002Fwww.akitasoftware.com\u002F",{"id":231,"by":232,"text":233},"38014849","digitalsanctum","FYI, Akita was just bought by Postman: https:\u002F\u002Fwww.akitasoftware.com\u002Fblog-posts\u002Fannouncing-akita-has-joined-postman",{"value":235,"source":71,"evidence":236},"Optic",[237],{"id":238,"by":239,"text":240},"38018773","rattray","https:\u002F\u002Fwww.useoptic.com\u002F is another one, which is a little more tailored to building & updating OpenAPI specs. Works well on live traffic and\u002For tests.",{"value":242,"source":52,"evidence":243},"har-to-openapi",[244],{"id":93,"by":11,"text":94},{"value":246,"source":71,"evidence":247},"curlconverter",[248],{"id":249,"by":250,"text":251},"38014986","ea016","Steps to do so: - open the network console - right click on the request - click \"copy as curl\" - visit https:\u002F\u002Fcurlconverter.com\u002F to convert to Python\u002FNode\u002Fany language",{"comments":253,"answered":47,"key":254},13,[255,258,261],{"id":256,"text":257},"38018640","Great suggestion, I will look into this.",{"id":259,"text":260},"38012992","Hey absolutely please do, thank you!",{"id":79,"text":80},{"commenters":263,"max_depth":46,"maker_replies":253,"first_comment_mins":264,"lifespan_hours":265},70,15,151,[267,269,271,275,279,283,287,289,292,293,295,296,299,301,302,304,306,308,311,312,313,316,319,322,325,327,330,333,335,338,341,344,347,348,352,355,358,360,362,364,366,369,371,374,377,380,381,382,384,386,390,393,396,398,401,402,405,407,409,411,412,415,418,420,423,426,427,429,432,434,437,439,443,448,449,451,455,457,458,460,463,465,469,473,475,477,481,483,486,488,492,494,496,500,502,506,510,512,515,518,521,524],[171,41,35,268,172,41],"project\u002Fneutral\u002Fidea",[256,41,41,270,11,18],"maker\u002Fneutral\u002Fnone",[272,41,35,273,274,41],"38020906","project\u002Fneutral\u002Fnone","hoerzu",[276,41,46,277,278,41],"38050069","project\u002Fpositive\u002Fidea","truemotive",[280,18,41,281,282,41],"38019673","other\u002Fneutral\u002Fnone","ttul",[284,18,41,285,286,41],"38026409","commenter\u002Fneutral\u002Fnone","jhardy54",[288,18,41,285,282,41],"38051787",[290,18,41,285,291,41],"38089680","cxr",[156,34,46,277,157,41],[294,34,46,277,221,41],"38012893",[259,34,41,270,11,18],[297,34,35,273,298,41],"38014421","parhamn",[300,34,35,273,157,41],"38014647",[160,34,46,277,161,41],[79,34,41,303,11,18],"project\u002Fneutral\u002Fexecution",[305,34,35,303,157,41],"38022241",[307,34,35,303,157,41],"38024042",[309,34,35,273,310,41],"38019689","civilitty",[179,35,35,268,180,41],[249,35,35,273,250,41],[314,35,41,285,315,41],"38015097","tilne",[317,35,41,285,318,41],"38015992","MurageKabui",[320,35,41,285,321,41],"38016763","tech234a",[323,35,41,281,324,41],"38017869","verhovsky",[326,35,35,273,180,41],"38018114",[328,35,41,285,329,41],"38019101","novia",[331,35,35,273,332,41],"38015112","kej",[148,35,18,334,149,41],"project\u002Fcritical\u002Fprivacy",[336,35,35,273,337,41],"38015991","knowsuchagency",[339,35,41,281,340,41],"38017953","gabrielsroka",[342,35,35,273,343,41],"38019044","prometheon1",[345,35,35,273,346,41],"38030690","westurner",[220,47,46,277,221,41],[349,47,41,350,351,41],"38014830","commenter\u002Fpositive\u002Fnone","aeontech",[353,46,41,281,354,41],"38012282","jimmySixDOF",[356,46,41,281,357,41],"38012422","quan",[359,46,35,268,132,41],"38013554",[361,46,46,277,357,41],"38021411",[227,363,41,281,228,41],6,[365,363,41,281,132,41],"38013739",[367,363,41,281,368,41],"38014659","misnome",[370,363,41,281,228,41],"38016061",[372,363,41,281,373,41],"38016858","karaterobot",[375,363,41,281,376,41],"38019339","Aeolun",[378,363,46,379,351,41],"38014809","project\u002Fpositive\u002Fdesign",[231,363,41,281,232,41],[238,363,41,281,239,41],[103,383,46,277,104,41],7,[65,385,46,277,66,41],8,[387,388,41,281,389,41],"38015669",9,"autonomousErwin",[391,388,41,281,392,41],"38019179","toyg",[394,395,35,268,232,41],"38015244",10,[397,395,35,268,232,41],"38015431",[399,395,35,268,400,41],"38018302","worldsayshi",[93,395,41,303,11,18],[403,395,46,404,400,41],"38018880","project\u002Fpositive\u002Fnone",[406,395,41,270,11,18],"38018707",[190,408,35,268,191,41],11,[410,408,41,303,11,18],"38019250",[112,16,46,277,113,41],[413,16,41,414,11,18],"38012387","maker\u002Fneutral\u002Fidea",[416,253,46,404,417,41],"38012802","saran945",[419,253,35,268,132,41],"38013604",[421,253,41,422,11,18],"38019289","maker\u002Fneutral\u002Fexecution",[424,39,35,268,425,41],"38015180","jtbayly",[61,264,46,277,62,41],[428,264,41,270,11,18],"38012356",[123,430,35,431,124,41],16,"project\u002Fmixed\u002Fexecution",[433,430,41,422,11,18],"38012509",[119,435,46,436,120,41],17,"project\u002Fpositive\u002Fexecution",[131,438,35,431,132,41],18,[440,441,46,277,442,41],"38015206",19,"hubraumhugo",[444,445,35,446,447,41],"38014115",20,"project\u002Fneutral\u002Fdesign","albertgoeswoof",[164,32,35,273,165,41],[138,450,35,268,139,41],22,[452,450,41,453,454,41],"38012944","commenter\u002Fneutral\u002Fidea","iforgotpassword",[456,450,41,285,157,41],"38012951",[142,450,35,268,139,41],[459,450,41,414,11,18],"38013110",[461,450,41,285,462,41],"38012955","jameshart",[464,450,41,285,139,41],"38013000",[466,450,18,467,468,41],"38015956","project\u002Fcritical\u002Fidea","yencabulator",[470,471,41,472,132,41],"38013527",23,"other\u002Fneutral\u002Fidea",[205,474,35,303,206,41],24,[476,474,41,422,11,18],"38013610",[478,474,18,479,480,41],"38014182","project\u002Fcritical\u002Fdocs","mdaniel",[482,474,41,270,11,18],"38020142",[484,474,35,273,485,41],"38013834","jcrites",[487,474,41,281,206,41],"38014603",[489,490,35,268,491,41],"38012149",25,"Aarekaz",[186,493,35,303,187,41],26,[212,495,35,273,213,41],27,[497,498,35,268,499,41],"38015202",28,"lukeplato",[198,501,35,303,199,41],29,[503,504,46,277,505,41],"38012713",30,"siva7",[507,508,46,404,509,41],"38014274",31,"ec109685",[108,511,46,404,109,41],32,[513,511,35,268,514,41],"38014211","namtab00",[516,511,41,285,517,41],"38016276","zoover2020",[519,511,46,277,520,41],"38016418","imhoguy",[522,33,46,277,523,41],"38012201","jasfi",[525,526,46,404,527,41],"38020295",34,"fullofdev",[],[530,534,538,543,548,552],{"id":531,"name":532,"points":533,"category":20},"37943931","Autotab",376,{"id":535,"name":536,"points":537,"category":20},"37981683","Pypipe",213,{"id":539,"name":540,"points":541,"category":542},"38006814","Restaurants in Peace",181,"consumer_social",{"id":544,"name":545,"points":546,"category":547},"37956065","CFR[]",176,"creative",{"id":549,"name":550,"points":551,"category":20},"37995761","Revert",168,{"id":553,"name":554,"points":551,"category":547},"38011432","ArtistAssistApp",false,"v2",{"id":558,"name":5,"line":6,"ai":555,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":559,"top":18,"kw":560,"maker":11,"domain":10,"tier":19,"attempts":41,"strip":561,"url":9,"mix":562,"praise":100,"objection":128,"sub":21},38012032,0.35,[24,25,26,27,28],"3505353303134050055535355535533011333555",[32,33,34,35],1794036643716]