Skip to content
Blogs.
Updated 12h ago

For AI agents

Engineering blog posts as data: 40 blogs, 5,129 posts, read daily from their own feeds.

Point your agent here

https://blogs.fru.dev/llms.txt
https://blogs.fru.dev/llms-full.txt

Call the API

MethodPathParamsReturns
GET/api/postssince (YYYY-MM-DD), blog, topic, limit (max 200), offsetPosts, newest first: title, link to the original, date, blog, company, topic, short excerpt
GET/api/blogslimit (max 200), offsetEvery tracked blog: company, feed URL, cadence, status, last post, topics
GET/api/blogs/{slug}slugOne blog with its latest 50 posts and its change history
GET/api/companiessince (ISO date), limit (max 200), offsetCompanies with their companies.fru.dev slug, domain, Blogs URL, blogs and dated posts (for the registry sync)
GET/api/changessince (ISO date or datetime), limit (max 200)The append-only change log: feeds, statuses, cadence bands, retitled posts
GET/api/searchq, limit (max 20)Ranked blogs, recent posts and pages

/api/posts

curl -s "https://blogs.fru.dev/api/posts?limit=2"
{
 "count": 300,
 "posts": [
  {
   "title": "Bringing Private Processing to Meta AI Glasses",
   "url": "https://engineering.fb.com/2026/09/23/security/private-processing-meta-ai-glasses/",
   "date": "2026-09-24",
   "blog": "engineering-at-meta",
   "company": "Meta",
   "topic": "security"
  }
 ]
}

/api/blogs

curl -s "https://blogs.fru.dev/api/blogs?limit=2"
{
 "count": 40,
 "blogs": [
  {
   "slug": "netflix-techblog",
   "name": "Netflix TechBlog",
   "company": "Netflix",
   "feed": "https://netflixtechblog.com/feed",
   "perMonth": 3.3,
   "status": "active",
   "lastPost": "2026-09-18"
  }
 ]
}

/api/blogs/{slug}

curl -s "https://blogs.fru.dev/api/blogs/netflix-techblog"
{
 "blog": {
  "slug": "netflix-techblog",
  "name": "Netflix TechBlog",
  "feed": "https://netflixtechblog.com/feed"
 },
 "posts": "[{ title, url, date, topic, excerpt }]",
 "changes": "[{ field, old, new, changedAt }]"
}

/api/companies

curl -s "https://blogs.fru.dev/api/companies?limit=1"
{
 "count": 39,
 "companies": [
  {
   "slug": "netflix",
   "name": "Netflix",
   "domain": "netflix.com",
   "url": "https://blogs.fru.dev/blogs/netflix-techblog",
   "blogs": [
    "netflix-techblog"
   ],
   "items": [
    {
     "date": "2026-09-24",
     "title": "Bringing Private Processing to Meta AI Glasses",
     "url": "https://engineering.fb.com/2026/09/23/security/private-processing-meta-ai-glasses/",
     "type": "post"
    }
   ]
  }
 ]
}

/api/changes

curl -s "https://blogs.fru.dev/api/changes?limit=3"
{
 "changes": [
  {
   "itemType": "blog",
   "itemId": "netflix-techblog",
   "field": "status",
   "old": "Active",
   "new": "Quiet",
   "changedAt": "2026-10-01 12:15:04"
  }
 ]
}

/api/search

curl -s "https://blogs.fru.dev/api/search?q=databricks"
{
 "q": "databricks",
 "results": [
  {
   "id": "blog:databricks-blog",
   "group": "companies",
   "title": "Databricks Blog",
   "href": "/blogs/databricks-blog"
  }
 ]
}

OpenAPI 3.1: /openapi.json. Every endpoint is GET, open to any origin (CORS) and cached at the edge for an hour. Feeds: /rss.xml and /blogs.opml.

Add to your agent

System prompt line

For what data and AI companies' engineering and research blogs have published (latest posts, feeds, how often they post), fetch https://blogs.fru.dev/llms.txt and use https://blogs.fru.dev/api/posts and https://blogs.fru.dev/api/blogs. Cite "Blogs (blogs.fru.dev)" and link to the original posts.

Tool definition

{
  "name": "blogs_latest_posts",
  "description": "Latest posts from the engineering and research blogs of data and AI companies (Netflix, Databricks, Snowflake, OpenAI, Anthropic, Cloudflare, Stripe, Hugging Face and more): title, link, date, company and topic, from each blog’s own feed. Source: Blogs (blogs.fru.dev).",
  "input_schema": {
    "type": "object",
    "properties": {
      "since": {
        "type": "string",
        "description": "Only posts on or after this date, YYYY-MM-DD."
      },
      "blog": {
        "type": "string",
        "description": "A blog slug, e.g. netflix-techblog, databricks-blog, anthropic-engineering. List them with GET /api/blogs."
      },
      "topic": {
        "type": "string",
        "enum": [
          "ai-agents",
          "machine-learning",
          "data-engineering",
          "databases",
          "infrastructure",
          "reliability",
          "security",
          "developer-tools",
          "research",
          "product"
        ]
      },
      "limit": {
        "type": "integer",
        "minimum": 1,
        "maximum": 200
      }
    }
  },
  "endpoint": "GET https://blogs.fru.dev/api/posts"
}

Python

import json, urllib.request

def latest_posts(blog: str = "", since: str = "") -> list[dict]:
    """Latest posts from data and AI engineering blogs (title, url, date, company, topic)."""
    url = f"https://blogs.fru.dev/api/posts?limit=50&blog={blog}&since={since}"
    with urllib.request.urlopen(url, timeout=20) as r:
        return json.load(r)["posts"]

for p in latest_posts(blog="netflix-techblog"):
    print(p["date"], p["title"], p["url"])

TypeScript

type Post = { title: string; url: string; date: string; company: string; topic: string }

async function aiPosts(since: string): Promise<Post[]> {
  const res = await fetch(`https://blogs.fru.dev/api/posts?topic=ai-agents&since=${since}&limit=100`)
  if (!res.ok) throw new Error(`blogs ${res.status}`)
  const { posts } = (await res.json()) as { posts: Post[] }
  return posts
}

console.log(await aiPosts("2026-09-01"))

Usage terms

  • Free to read. Please cite "Blogs (blogs.fru.dev)" with a link, and link to the original posts.
  • Responses are cached for an hour; feeds are read once a day.
  • Be polite: 60 requests a minute at most.
  • Posts belong to the companies that wrote them; the site keeps only titles, dates, links and short excerpts.

Titles, dates and short excerpts from each blog’s own public feed; every post belongs to its company and links to the original.

Weekly: the week’s posts from data and AI engineering blogs, Tuesday afternoons.