---
title: "Kyle Ledbetter’s public API and MCP server"
description: "Developer docs for kyleledbetter.com: a free, read-only JSON API (OpenAPI 3.1) and MCP server with Kyle Ledbetter’s profile, career, talks and writing. No key needed."
canonical_url: "https://kyleledbetter.com/developers"
last_updated: "2026-10-11"
llms_txt: "https://kyleledbetter.com/llms.txt"
---

> Markdown version of https://kyleledbetter.com/developers. Index of every agent-readable file on this site: https://kyleledbetter.com/llms.txt

# Kyle Ledbetter’s public API and MCP server

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

```sh
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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/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](https://kyleledbetter.com/openapi.json).

## Errors

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

```json
{
  "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](https://kyleledbetter.com/agent) and [/llms.txt](https://kyleledbetter.com/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:

```json
{
  "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](https://kyleledbetter.com/mcp/server-card) and [/.well-known/mcp](https://kyleledbetter.com/.well-known/mcp).

## Discovery files

- [/openapi.json](https://kyleledbetter.com/openapi.json): OpenAPI 3.1 description of the API
- [/.well-known/api-catalog](https://kyleledbetter.com/.well-known/api-catalog): RFC 9727 API catalog
- [/.well-known/mcp](https://kyleledbetter.com/.well-known/mcp): MCP server card
- [/.well-known/ard.json](https://kyleledbetter.com/.well-known/ard.json): Agentic Resource Discovery catalog (also at [/.well-known/ai-catalog.json](https://kyleledbetter.com/.well-known/ai-catalog.json))
- [/.well-known/agent-skills/index.json](https://kyleledbetter.com/.well-known/agent-skills/index.json): Agent Skills index with one skill
- [/llms.txt](https://kyleledbetter.com/llms.txt): llms.txt, the index for AI agents, and [/llms-full.txt](https://kyleledbetter.com/llms-full.txt), everything in one file
- [/developers/llms.txt](https://kyleledbetter.com/developers/llms.txt): llms.txt for the API and MCP server only
- [/sitemap.xml](https://kyleledbetter.com/sitemap.xml) and [/robots.txt](https://kyleledbetter.com/robots.txt)

## Markdown

Every page has a Markdown version. Send `Accept: text/markdown` to a page URL, or fetch the .md file: [/index.md](https://kyleledbetter.com/index.md), [/agent.md](https://kyleledbetter.com/agent.md), [/resume.md](https://kyleledbetter.com/resume.md), [/about.md](https://kyleledbetter.com/about.md), [/contact.md](https://kyleledbetter.com/contact.md), [/privacy.md](https://kyleledbetter.com/privacy.md), [/developers.md](https://kyleledbetter.com/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](https://kyleledbetter.com/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](mailto:inquiries@kyleledbetter.com).
