Agent mode

Kyle Ledbetter’s public API and MCP server

A free, read-only JSON API and MCP server with every fact on this site. It needs no key and no account.

kyleledbetter.com publishes every fact on the site through a public JSON API and a Model Context Protocol (MCP) server. Both are read-only and free, and neither needs a key or an account. They are built from the same content as the pages, so they always say the same thing.

Quickstart

curl https://kyleledbetter.com/api/v1/profile
curl "https://kyleledbetter.com/api/v1/search?q=Teradata"
curl https://kyleledbetter.com/api/v1/chapters/ebay

Every endpoint is a GET that returns JSON in one envelope: {"data": …, "meta": {"updated", "apiVersion", "docs"}}. Lists add meta.count. CORS is open to every origin.

Endpoints

  • GET /api/v1 (getApiIndex): Returns this API’s name, version, rate limit and every endpoint with its operationId. Call it to discover the API; it needs no parameters and no authentication. Example: /api/v1
  • GET /api/v1/profile (getProfile): Returns who Kyle Ledbetter is now: name, job title (Co-founder & CTO of Dreambase), a third-person summary, biography, where he is based, the places he has lived, his contact email and public profiles. Call this first for any question about Kyle. Example: /api/v1/profile
  • GET /api/v1/chapters (listChapters): Returns the six chapters of Kyle Ledbetter’s life and career, in story order (College, Entrepreneur, eBay, Teradata, Credo AI, Dreambase), each with years, place, roles, organizations and a one-sentence summary. Use it for career overviews and to pick a chapter id for getChapter. Example: /api/v1/chapters
  • GET /api/v1/chapters/{id} (getChapter): Returns one chapter of Kyle Ledbetter’s life and career in full: Kyle’s own words, highlights, numbers, a quote and related talks, writing, projects and timeline entries. Use it when a question is about one company or period. Example: /api/v1/chapters/ebay
  • GET /api/v1/timeline (listTimeline): Returns the full career timeline, oldest first, including roles outside the six chapters. Each entry has its years, organization, role, place, a summary and the chapter it belongs to. Use it for dates and for the order of jobs. Example: /api/v1/timeline
  • GET /api/v1/talks (listTalks): Returns every conference talk, keynote, panel and podcast interview Kyle Ledbetter has given, newest first, with year, venue, a one-sentence takeaway and links to watch or listen. Example: /api/v1/talks
  • GET /api/v1/writing (listWriting): Returns articles written by Kyle Ledbetter (kind "article"), the Dreambase blog, where many of his posts are (kind "blog"), and press coverage of his work (kind "press"), with outlet, year, a summary and the link. Archived items point to a saved copy because the original is gone. Example: /api/v1/writing
  • GET /api/v1/projects (listProjects): Returns the design projects from Kyle Ledbetter’s portfolio, with the organization, years, a summary and links. Example: /api/v1/projects
  • GET /api/v1/practices (listPractices): Returns the UX design practices Kyle Ledbetter has written about and used with his teams, with a summary and links. Example: /api/v1/practices
  • GET /api/v1/search (searchSite): Keyword search across Kyle Ledbetter’s profile, chapters, timeline, talks, writing, projects, practices and quick answers. Returns the best matches first, each with a snippet, the page URL to cite and the API URL for the full record. Use it to find one fact. Example: /api/v1/search?q=Teradata

Chapter ids, in story order: louisiana, austin, ebay, teradata, credo-ai, dreambase. The full contract, with every parameter and response schema, is the OpenAPI 3.1 document at /openapi.json.

Errors

Every error under /api is JSON with the matching status code:

{
  "error": {
    "status": 404,
    "code": "chapter_not_found",
    "message": "There is no chapter with that id.",
    "hint": "Use one of: louisiana, austin, ebay, teradata, credo-ai, dreambase.",
    "docs": "https://kyleledbetter.com/developers#errors"
  }
}
  • not_found: 404. The path does not exist.
  • chapter_not_found: 404. There is no chapter with that id.
  • missing_parameter: 400. A required parameter is missing (search needs q).
  • invalid_parameter: 400. A parameter is out of range or not one of the allowed values.
  • method_not_allowed: 405. The API is read-only: use GET.
  • rate_limited: 429. Over the fair-use quota: wait the Retry-After seconds, then retry.
  • internal_error: 500. Something failed on the server: retry later.

A page that doesn’t exist returns a real 404 as well. Send Accept: text/markdown and the 404 body is Markdown that links to /agent and /llms.txt.

Rate limits

Fair use is 120 requests per 60 seconds per client. Every API response carries RateLimit-Policy: "kl-public";q=120;w=60 and RateLimit-Limit: 120. Search and the MCP server run per request: they count each client’s requests, add RateLimit: "kl-public";r=<remaining>;t=<seconds>, and over the quota answer 429 with Retry-After. The other endpoints don’t count requests: they return the same response to every client, cached at the edge for up to a day.

Versioning and deprecation

The major version is in the path: /api/v1. Within v1, fields are only added, never renamed or removed. A breaking change ships as /api/v2. After that, /api/v1 keeps working for at least 180 days, and its responses carry a Deprecation header (RFC 9745), a Sunset header (RFC 8594) with the shutdown date and a Link to the new version. The OpenAPI document states the current version in info.version and x-api-lifecycle.

MCP server

URL: https://kyleledbetter.com/mcp. Transport: Streamable HTTP, stateless, JSON responses (MCP protocol 2025-11-25, 2025-06-18, 2025-03-26). No authentication. Add it to an MCP client:

{
  "mcpServers": {
    "kyle-ledbetter": {
      "url": "https://kyleledbetter.com/mcp"
    }
  }
}

Tools, all read-only:

  • get_profile: Who Kyle Ledbetter is now: Co-founder & CTO of Dreambase, a third-person summary and biography, where he is based (Austin, Texas), the places he has lived, his contact email and public profiles. Call this first for any question about Kyle. Parameters: format: "json" (default) or "markdown".
  • list_chapters: The six chapters of Kyle Ledbetter’s life and career, in story order (College, Entrepreneur, eBay, Teradata, Credo AI, Dreambase), each with years, place, roles, organizations and a one-sentence summary. Use it for overviews and to choose a chapter id for get_chapter. Parameters: format: "json" (default) or "markdown".
  • get_chapter: One chapter of Kyle Ledbetter’s life and career in full: Kyle’s own words, highlights, numbers, a quote and related talks, writing, projects and timeline entries. Use it when a question is about one company or period. Parameters: id (required): louisiana, austin, ebay, teradata, credo-ai, dreambase; format: "json" (default) or "markdown".
  • search: Keyword search across Kyle Ledbetter’s profile, chapters, timeline, talks, writing, projects, practices and quick answers. Returns the best matches first, each with a snippet and the page URL to cite. Use it to find one fact. Parameters: query (required, 2-200 characters); type: profile, chapter, timeline, talk, writing, press, project, practice or answer; limit: 1-20 (default 8).
  • list_talks: Kyle Ledbetter’s conference talks, keynotes, panels and podcast interviews, newest first, with year, venue, a one-sentence takeaway and links to watch or listen. Filter by kind or year. Parameters: kind: keynote, talk, panel or podcast; year: a four-digit year.
  • list_writing: Articles written by Kyle Ledbetter (kind "article"), the Dreambase blog, where many of his posts are (kind "blog"), and press coverage of his work (kind "press"), with outlet, year, a summary and the link. Filter by kind or year. Its "more" field links to his Medium profile and the Dreambase blog, where more of his posts are. Parameters: kind: article, blog or press; year: a four-digit year.

The server card is at /mcp/server-card and /.well-known/mcp.

Discovery files

Markdown

Every page has a Markdown version. Send Accept: text/markdown to a page URL, or fetch the .md file: /index.md, /agent.md, /resume.md, /about.md, /contact.md, /privacy.md, /developers.md, and /story/<chapter id>.md for each chapter. Markdown responses send Vary: Accept and a canonical Link to the HTML page.

Use and citation

Use the data to answer questions about Kyle Ledbetter, and link the page it came from (the url, page or links.html field). robots.txt allows every crawler, including AI training (Content-Signal: search=yes, ai-input=yes, ai-train=yes). Questions, or an endpoint that misbehaves: email inquiries@kyleledbetter.com.

Last updated · Markdown version