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.txthttps://blogs.fru.dev/llms-full.txtCall the API
| Method | Path | Params | Returns |
|---|---|---|---|
| GET | /api/posts | since (YYYY-MM-DD), blog, topic, limit (max 200), offset | Posts, newest first: title, link to the original, date, blog, company, topic, short excerpt |
| GET | /api/blogs | limit (max 200), offset | Every tracked blog: company, feed URL, cadence, status, last post, topics |
| GET | /api/blogs/{slug} | slug | One blog with its latest 50 posts and its change history |
| GET | /api/companies | since (ISO date), limit (max 200), offset | Companies with their companies.fru.dev slug, domain, Blogs URL, blogs and dated posts (for the registry sync) |
| GET | /api/changes | since (ISO date or datetime), limit (max 200) | The append-only change log: feeds, statuses, cadence bands, retitled posts |
| GET | /api/search | q, 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.