{"openapi":"3.1.0","info":{"title":"Blogs API","version":"1.0.0","description":"Engineering and research blogs of data and AI companies and their latest posts, read daily from each blog’s own RSS or Atom feed. Titles, dates, links and short excerpts only; every post links to the original. Free to read; cite Blogs (blogs.fru.dev).","contact":{"email":"fru.dev3@gmail.com"}},"servers":[{"url":"https://blogs.fru.dev"}],"paths":{"/api/posts":{"get":{"summary":"Posts, newest first","parameters":[{"name":"since","in":"query","schema":{"type":"string","format":"date"}},{"name":"blog","in":"query","schema":{"type":"string"}},{"name":"topic","in":"query","schema":{"type":"string","enum":["ai-agents","machine-learning","data-engineering","databases","infrastructure","reliability","security","developer-tools","research","product"]}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/blogs":{"get":{"summary":"Every tracked blog","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/blogs/{slug}":{"get":{"summary":"One blog, its latest posts and its change history","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Unknown blog"}}}},"/api/companies":{"get":{"summary":"Companies (companies.fru.dev slug, domain, Blogs URL) with their blogs and dated posts","description":"For the companies.fru.dev nightly sync. `since` limits the dated items to posts on or after that date; every company is always listed.","parameters":[{"name":"since","in":"query","schema":{"type":"string","format":"date"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/changes":{"get":{"summary":"The append-only change log","parameters":[{"name":"since","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/api/search":{"get":{"summary":"Search blogs, recent posts and pages","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":20}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}}}}}}}