Skip to content
Updated 14h ago

For AI agents

Official vendor training as data: 69 courses from 13 vendors, 40 free, with an append-only change log. Refreshed weekly.

Point your agent here

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

Call the API

MethodPathParamsReturns
GET/api/coursesvendor, price (free|paid), format, level, topic, cert, state, limit (max 200), offsetOfficial courses: vendor, format, length, price, level, topic, the certification each prepares for, official and source URLs
GET/api/courses/{slug}slugOne course in full, with the evidence quoted from its source and its change history
GET/api/vendorsnoneVendor academies with course, free and certification counts
GET/api/changessince (YYYY-MM-DD or ISO), limit (max 500)The append-only change log: price, free status, length, level, certification and retirements
GET/api/companiessince (ISO), limit (max 200), offsetVendors in the companies.fru.dev registry shape: slug, name, domain, this site’s URL and dated items
GET/api/searchq, limit (max 20)Ranked courses, vendors and pages

/api/courses

curl -s "https://training.fru.dev/api/courses?vendor=databricks&price=free&limit=2"
{
 "count": 69,
 "courses": [
  {
   "slug": "anthropic-building-with-the-claude-api",
   "vendor": "anthropic",
   "title": "Building with the Claude API",
   "format": "self-paced",
   "length": "",
   "priceUsd": 0,
   "free": true,
   "level": "",
   "cert": "",
   "url": "https://anthropic.skilljar.com/claude-with-the-anthropic-api"
  },
  {
   "slug": "anthropic-claude-code-in-action",
   "vendor": "anthropic",
   "title": "Claude Code in Action",
   "format": "self-paced",
   "length": "",
   "priceUsd": 0,
   "free": true,
   "level": "",
   "cert": "",
   "url": "https://anthropic.skilljar.com/claude-code-in-action"
  }
 ]
}

/api/courses/{slug}

curl -s "https://training.fru.dev/api/courses/microsoft-implement-data-engineering-solutions-using-microsoft-fabric-dp-700t00"
{
 "course": {
  "slug": "microsoft-develop-ai-agents-on-azure",
  "vendor": "microsoft",
  "title": "Develop AI agents on Azure",
  "format": "self-paced",
  "length": "592 min",
  "priceUsd": 0,
  "free": true,
  "level": "intermediate",
  "cert": "Microsoft Certified: Azure AI Apps and Agents Developer Associate",
  "url": "https://learn.microsoft.com/en-us/training/paths/develop-ai-agents-azure/",
  "sourceUrl": "https://learn.microsoft.com/api/catalog/?locale=en-us&type=courses,learningPaths",
  "evidence": "Catalog API: learning path learn.wwl.develop-ai-agents-azure, duration_in_minutes 592, levels intermediate. Microsoft Learn training is free. Study material for"
 },
 "changes": []
}

/api/vendors

curl -s "https://training.fru.dev/api/vendors"
{
 "count": 13,
 "vendors": [
  {
   "slug": "microsoft",
   "name": "Microsoft",
   "academy": "Microsoft Learn",
   "courses": 13,
   "free": 5
  }
 ]
}

/api/changes

curl -s "https://training.fru.dev/api/changes?since=2026-09-01"
{
 "since": "2026-09-01",
 "changes": []
}

/api/companies

curl -s "https://training.fru.dev/api/companies?limit=1"
{
 "site": "training",
 "companies": [
  {
   "slug": "microsoft",
   "name": "Microsoft",
   "domain": "microsoft.com",
   "url": "https://training.fru.dev/vendors/microsoft",
   "items": "[{ date, type, title, url }]"
  }
 ]
}

/api/search

curl -s "https://training.fru.dev/api/search?q=fabric"
{
 "q": "fabric",
 "results": [
  {
   "id": "c:...",
   "group": "items",
   "title": "Implement a Lakehouse with Microsoft Fabric",
   "href": "/courses/..."
  }
 ]
}

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

Add to your agent

System prompt line

For official vendor training on data and AI platforms (courses, free or paid, length, level, which certification each prepares for), fetch https://training.fru.dev/llms.txt and use https://training.fru.dev/api/courses. Cite "Training (training.fru.dev)" and link the official course page.

Tool definition

{
  "name": "fru_training_courses",
  "description": "Find official vendor training for data and AI platforms (Databricks, Snowflake, AWS, Microsoft, Google Cloud, NVIDIA, Hugging Face, DeepLearning.AI, Anthropic, OpenAI, dbt Labs, MongoDB, Confluent): format, length, price (free marked), level and the certification each course prepares for, with the official link. Source: Training (training.fru.dev).",
  "input_schema": {
    "type": "object",
    "properties": {
      "vendor": {
        "type": "string",
        "description": "Vendor slug, e.g. databricks, snowflake, aws, microsoft, google-cloud, nvidia, hugging-face. List them with GET /api/vendors."
      },
      "price": {
        "type": "string",
        "enum": [
          "free",
          "paid"
        ]
      },
      "topic": {
        "type": "string",
        "enum": [
          "generative-ai",
          "agents",
          "machine-learning",
          "data-engineering",
          "analytics",
          "databases",
          "platform"
        ]
      },
      "cert": {
        "type": "string",
        "description": "Part of a certification name, e.g. \"Data Engineer Associate\"."
      }
    }
  },
  "endpoint": "GET https://training.fru.dev/api/courses"
}

Python

import json, urllib.parse, urllib.request

def courses(**filters) -> list[dict]:
    """Official data and AI courses, e.g. courses(vendor="databricks", price="free")."""
    url = "https://training.fru.dev/api/courses?" + urllib.parse.urlencode(filters)
    with urllib.request.urlopen(url, timeout=20) as r:
        return json.load(r)["courses"]

for c in courses(topic="agents", price="free"):
    print(c["vendor"], c["title"], c["length"], c["url"])

TypeScript

type Course = { vendor: string; title: string; free: boolean; length: string; cert: string; url: string }

async function prepFor(cert: string): Promise<Course[]> {
  const res = await fetch(`https://training.fru.dev/api/courses?cert=${encodeURIComponent(cert)}`)
  if (!res.ok) throw new Error(`training ${res.status}`)
  const { courses } = (await res.json()) as { courses: Course[] }
  return courses.sort((a, b) => Number(b.free) - Number(a.free))
}

console.log(await prepFor("Data Engineer Associate"))

Usage terms

  • Free to read. Please cite "Training (training.fru.dev)" with a link.
  • Responses are cached for an hour; the data changes weekly.
  • Be polite: 60 requests a minute at most.
  • Courses marked unverified have not been checked by hand. Confirm prices on the vendor page.

Facts from each vendor's own catalog, checked weekly. Prices and schedules change; confirm on the course page before you enroll.

Weekly at most: new courses, price changes, courses that became free or were retired.