{"openapi":"3.1.0","info":{"title":"Kyle Ledbetter public API","summary":"Read-only facts about Kyle Ledbetter, co-founder and CTO of Dreambase.","description":"A small public JSON API with every fact on kyleledbetter.com: Kyle Ledbetter’s profile, the six chapters of his life and career, his timeline, talks, writing, projects and UX practices, and keyword search across all of it. It is generated from the same content as the website.\n\nRead-only, free and open: no API key, no OAuth, CORS allowed from any origin. Responses are JSON, cached at the edge and refreshed when the site’s content changes.\n\nErrors always look like {\"error\": {\"status\", \"code\", \"message\", \"hint\", \"docs\"}}. Fair use: 120 requests per 60 seconds per client (RateLimit headers on every response).\n\nVersioning: the major version is in the path (/api/v1). Breaking changes ship as a new major version; /api/v1 keeps working for at least 180 days after that, and its responses then carry Deprecation and Sunset headers.\n\nThe same data is available over MCP at https://kyleledbetter.com/mcp and as Markdown at https://kyleledbetter.com/llms.txt.","version":"1.0.0","contact":{"name":"Kyle Ledbetter","url":"https://kyleledbetter.com/contact","email":"inquiries@kyleledbetter.com"}},"externalDocs":{"description":"Developer documentation: endpoints, errors, rate limits, versioning and the MCP server","url":"https://kyleledbetter.com/developers"},"servers":[{"url":"https://kyleledbetter.com","description":"Production"}],"security":[],"tags":[{"name":"Meta"},{"name":"Profile"},{"name":"Story"},{"name":"Career"},{"name":"Talks and writing"},{"name":"Work"},{"name":"Search"}],"paths":{"/api/v1":{"get":{"operationId":"getApiIndex","summary":"List the API’s endpoints","description":"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.","tags":["Meta"],"security":[],"parameters":[],"responses":{"200":{"description":"List the API’s endpoints","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndexResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/profile":{"get":{"operationId":"getProfile","summary":"Get Kyle Ledbetter’s profile","description":"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.","tags":["Profile"],"security":[],"parameters":[],"responses":{"200":{"description":"Get Kyle Ledbetter’s profile","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/chapters":{"get":{"operationId":"listChapters","summary":"List the six chapters of Kyle’s life and career","description":"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.","tags":["Story"],"security":[],"parameters":[],"responses":{"200":{"description":"List the six chapters of Kyle’s life and career","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterListResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/chapters/{id}":{"get":{"operationId":"getChapter","summary":"Get one chapter in full","description":"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.","tags":["Story"],"security":[],"parameters":[{"name":"id","in":"path","required":true,"description":"Chapter id, in story order: louisiana, austin, ebay, teradata, credo-ai, dreambase.","schema":{"type":"string","enum":["louisiana","austin","ebay","teradata","credo-ai","dreambase"]},"example":"ebay"}],"responses":{"200":{"description":"Get one chapter in full","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChapterResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/timeline":{"get":{"operationId":"listTimeline","summary":"List Kyle’s career timeline","description":"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.","tags":["Career"],"security":[],"parameters":[],"responses":{"200":{"description":"List Kyle’s career timeline","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimelineResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/talks":{"get":{"operationId":"listTalks","summary":"List Kyle’s talks, keynotes and podcasts","description":"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.","tags":["Talks and writing"],"security":[],"parameters":[],"responses":{"200":{"description":"List Kyle’s talks, keynotes and podcasts","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalkListResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/writing":{"get":{"operationId":"listWriting","summary":"List Kyle’s articles and press coverage","description":"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.","tags":["Talks and writing"],"security":[],"parameters":[],"responses":{"200":{"description":"List Kyle’s articles and press coverage","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WritingListResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/projects":{"get":{"operationId":"listProjects","summary":"List Kyle’s design projects","description":"Returns the design projects from Kyle Ledbetter’s portfolio, with the organization, years, a summary and links.","tags":["Work"],"security":[],"parameters":[],"responses":{"200":{"description":"List Kyle’s design projects","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectListResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/practices":{"get":{"operationId":"listPractices","summary":"List Kyle’s UX practices","description":"Returns the UX design practices Kyle Ledbetter has written about and used with his teams, with a summary and links.","tags":["Work"],"security":[],"parameters":[],"responses":{"200":{"description":"List Kyle’s UX practices","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PracticeListResponse"}}}},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/api/v1/search":{"get":{"operationId":"searchSite","summary":"Search everything on kyleledbetter.com","description":"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.","tags":["Search"],"security":[],"parameters":[{"name":"q","in":"query","required":true,"description":"Search words, 2 to 200 characters. Example: \"Teradata San Diego\".","schema":{"type":"string","minLength":2,"maxLength":200},"example":"Teradata"},{"name":"limit","in":"query","required":false,"description":"Maximum number of results, 1 to 50. Default 10.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10},"example":5},{"name":"type","in":"query","required":false,"description":"Only return results of this type.","schema":{"type":"string","enum":["profile","chapter","timeline","talk","writing","press","project","practice","answer"]},"example":"talk"}],"responses":{"200":{"description":"Search everything on kyleledbetter.com","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"405":{"$ref":"#/components/responses/MethodNotAllowed"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}}}}},"components":{"schemas":{"Meta":{"type":"object","description":"About this response.","required":["updated","apiVersion","docs"],"properties":{"updated":{"type":"string","description":"The day the site’s content last changed (YYYY-MM-DD).","format":"date"},"apiVersion":{"type":"string","description":"API version."},"docs":{"type":"string","format":"uri","description":"Developer documentation."}}},"ListMeta":{"type":"object","description":"About this response.","required":["updated","apiVersion","docs","count"],"properties":{"updated":{"type":"string","description":"The day the site’s content last changed (YYYY-MM-DD).","format":"date"},"apiVersion":{"type":"string","description":"API version."},"docs":{"type":"string","format":"uri","description":"Developer documentation."},"count":{"type":"integer","description":"Number of items in data.","minimum":0}}},"Link":{"type":"object","description":"A link.","required":["label","url","archived"],"properties":{"label":{"type":"string","description":"Link text."},"url":{"type":"string","format":"uri","description":"Link."},"archived":{"type":"boolean","description":"True when the link is a saved copy of a page that is gone."}}},"Error":{"type":"object","description":"Every error from /api uses this shape.","required":["error"],"properties":{"error":{"type":"object","description":"The error.","required":["status","code","message","hint","docs"],"properties":{"status":{"type":"integer","description":"HTTP status code.","minimum":400,"maximum":599},"code":{"type":"string","enum":["not_found","chapter_not_found","missing_parameter","invalid_parameter","method_not_allowed","rate_limited","internal_error"],"description":"Machine-readable error code."},"message":{"type":"string","description":"What went wrong, in one sentence."},"hint":{"type":"string","description":"How to fix the request."},"docs":{"type":"string","format":"uri","description":"Documentation for this error."}}}}},"Profile":{"type":"object","description":"Kyle Ledbetter.","required":["id","name","givenName","familyName","jobTitle","company","summary","description","bio","basedIn","birthplace","places","contact","profiles","links","updated"],"properties":{"id":{"type":"string","enum":["kyle-ledbetter"],"description":"Stable id."},"name":{"type":"string","description":"Full name."},"givenName":{"type":"string","description":"Given name."},"familyName":{"type":"string","description":"Family name."},"jobTitle":{"type":"string","description":"Current job title."},"company":{"type":"object","description":"Where Kyle works now.","required":["name","url","tagline","backedBy"],"properties":{"name":{"type":"string","description":"Company name."},"url":{"type":"string","format":"uri","description":"Company website."},"tagline":{"type":"string","description":"The company’s one-liner."},"backedBy":{"type":"string","description":"Partner and backer."}}},"summary":{"type":"string","description":"Third-person summary, 60 to 90 words."},"description":{"type":"string","description":"One-paragraph identity."},"bio":{"type":"string","description":"Biography, paragraphs separated by a blank line."},"basedIn":{"type":"object","description":"Where Kyle is based today.","required":["city","region","country","label"],"properties":{"city":{"type":"string","description":"City."},"region":{"type":"string","description":"State."},"country":{"type":"string","description":"ISO country code."},"label":{"type":"string","description":"Display form."}}},"birthplace":{"type":"object","description":"Where Kyle was born.","required":["city","region","country","label"],"properties":{"city":{"type":"string","description":"City."},"region":{"type":"string","description":"State."},"country":{"type":"string","description":"ISO country code."},"label":{"type":"string","description":"Display form."}}},"places":{"type":"array","items":{"type":"object","description":"A place Kyle lived.","required":["place","why"],"properties":{"place":{"type":"string","description":"City and state."},"why":{"type":"string","description":"What happened there."}}},"description":"Where Kyle has lived, in order."},"contact":{"type":"object","description":"How to reach Kyle.","required":["email","note","page"],"properties":{"email":{"type":"string","description":"Email address.","format":"email"},"note":{"type":"string","description":"What to write about."},"page":{"type":"string","format":"uri","description":"Contact page."}}},"profiles":{"type":"array","items":{"type":"object","description":"A public profile.","required":["name","handle","url"],"properties":{"name":{"type":"string","description":"Network."},"handle":{"type":"string","description":"Handle."},"url":{"type":"string","format":"uri","description":"Profile."}}},"description":"Public profiles."},"links":{"type":"object","description":"Where to read more.","required":["site","agent","agentMarkdown","resume","llms","llmsFull","openapi","mcp","developers"],"properties":{"site":{"type":"string","format":"uri","description":"The 3D site’s home page."},"agent":{"type":"string","format":"uri","description":"Agent mode: every fact as plain HTML."},"agentMarkdown":{"type":"string","format":"uri","description":"Agent mode as Markdown."},"resume":{"type":"string","format":"uri","description":"Resume."},"llms":{"type":"string","format":"uri","description":"llms.txt index."},"llmsFull":{"type":"string","format":"uri","description":"Everything in one Markdown file."},"openapi":{"type":"string","format":"uri","description":"This API’s OpenAPI description."},"mcp":{"type":"string","format":"uri","description":"MCP server (Streamable HTTP)."},"developers":{"type":"string","format":"uri","description":"Developer documentation."}}},"updated":{"type":"string","description":"The day the content last changed (YYYY-MM-DD).","format":"date"}}},"ChapterSummary":{"type":"object","description":"A chapter of Kyle’s life and career.","required":["id","number","name","title","years","period","place","part","oneLiner","summary","roles","organizations","links"],"properties":{"id":{"type":"string","enum":["louisiana","austin","ebay","teradata","credo-ai","dreambase"],"description":"Chapter id (stable)."},"number":{"type":"integer","description":"Position in story order, 1 to 6.","minimum":1,"maximum":6},"name":{"type":"string","description":"Short name of the chapter (\"eBay\")."},"title":{"type":"string","description":"Chapter title."},"years":{"type":["string","null"],"description":"Start year as shown on the 3D site; null when none is shown (no school years are shown, so the first chapter, College, has none)."},"period":{"type":"string","description":"Years of the chapter in words (\"2015-2021\", \"From 2021\")."},"place":{"type":["string","null"],"description":"Where Kyle lived during the chapter."},"part":{"type":"string","description":"Which part of the robot on the 3D site shows this chapter."},"oneLiner":{"type":"string","description":"One-line description."},"summary":{"type":"string","description":"One self-contained third-person sentence about the chapter."},"roles":{"type":"array","items":{"type":"object","description":"A role Kyle held.","required":["title","organization"],"properties":{"title":{"type":"string","description":"Role title."},"organization":{"type":"string","description":"Organization."}}},"description":"Roles, oldest first."},"organizations":{"type":"array","items":{"type":"object","description":"An organization.","required":["name","fullName","url"],"properties":{"name":{"type":"string","description":"Name."},"fullName":{"type":["string","null"],"description":"Full name, when different."},"url":{"type":["string","null"],"format":"uri","description":"Website."}}},"description":"Organizations in the chapter."},"links":{"type":"object","description":"Where to read the chapter.","required":["api","html","markdown","home"],"properties":{"api":{"type":"string","format":"uri","description":"This chapter in the API."},"html":{"type":"string","format":"uri","description":"The chapter on /agent (cite this)."},"markdown":{"type":"string","format":"uri","description":"The chapter as Markdown."},"home":{"type":"string","format":"uri","description":"The chapter on the 3D site."}}}}},"ChapterDetail":{"type":"object","description":"A chapter of Kyle’s life and career, in full.","required":["id","number","name","title","years","period","place","part","oneLiner","summary","roles","organizations","links","panel","text","highlights","stats","quote","related"],"properties":{"id":{"type":"string","enum":["louisiana","austin","ebay","teradata","credo-ai","dreambase"],"description":"Chapter id (stable)."},"number":{"type":"integer","description":"Position in story order, 1 to 6.","minimum":1,"maximum":6},"name":{"type":"string","description":"Short name of the chapter (\"eBay\")."},"title":{"type":"string","description":"Chapter title."},"years":{"type":["string","null"],"description":"Start year as shown on the 3D site; null when none is shown (no school years are shown, so the first chapter, College, has none)."},"period":{"type":"string","description":"Years of the chapter in words (\"2015-2021\", \"From 2021\")."},"place":{"type":["string","null"],"description":"Where Kyle lived during the chapter."},"part":{"type":"string","description":"Which part of the robot on the 3D site shows this chapter."},"oneLiner":{"type":"string","description":"One-line description."},"summary":{"type":"string","description":"One self-contained third-person sentence about the chapter."},"roles":{"type":"array","items":{"type":"object","description":"A role Kyle held.","required":["title","organization"],"properties":{"title":{"type":"string","description":"Role title."},"organization":{"type":"string","description":"Organization."}}},"description":"Roles, oldest first."},"organizations":{"type":"array","items":{"type":"object","description":"An organization.","required":["name","fullName","url"],"properties":{"name":{"type":"string","description":"Name."},"fullName":{"type":["string","null"],"description":"Full name, when different."},"url":{"type":["string","null"],"format":"uri","description":"Website."}}},"description":"Organizations in the chapter."},"links":{"type":"object","description":"Where to read the chapter.","required":["api","html","markdown","home"],"properties":{"api":{"type":"string","format":"uri","description":"This chapter in the API."},"html":{"type":"string","format":"uri","description":"The chapter on /agent (cite this)."},"markdown":{"type":"string","format":"uri","description":"The chapter as Markdown."},"home":{"type":"string","format":"uri","description":"The chapter on the 3D site."}}},"panel":{"type":"string","description":"The chapter’s text on the 3D site’s reading panel."},"text":{"type":"string","description":"Kyle’s own words, first person, Markdown paragraphs with inline links."},"highlights":{"type":"array","items":{"type":"string","description":"Highlight."},"description":"Highlights."},"stats":{"type":"array","items":{"type":"object","description":"A number.","required":["value","label"],"properties":{"value":{"type":"string","description":"Number."},"label":{"type":"string","description":"What it counts."}}},"description":"Numbers."},"quote":{"type":["object","null"],"description":"A quote, or null.","required":["text","source","url"],"properties":{"text":{"type":"string","description":"Quote."},"source":{"type":"string","description":"Who said it, where."},"url":{"type":["string","null"],"format":"uri","description":"Where to read it."}}},"related":{"type":"object","description":"Related items on /agent.","required":["timeline","talks","writing","press","projects","practices"],"properties":{"timeline":{"type":"array","items":{"type":"object","description":"A related item.","required":["id","title","url"],"properties":{"id":{"type":"string","description":"Item id."},"title":{"type":"string","description":"Title."},"url":{"type":"string","format":"uri","description":"The item on /agent."}}},"description":"Timeline entries."},"talks":{"type":"array","items":{"type":"object","description":"A related item.","required":["id","title","url"],"properties":{"id":{"type":"string","description":"Item id."},"title":{"type":"string","description":"Title."},"url":{"type":"string","format":"uri","description":"The item on /agent."}}},"description":"Talks."},"writing":{"type":"array","items":{"type":"object","description":"A related item.","required":["id","title","url"],"properties":{"id":{"type":"string","description":"Item id."},"title":{"type":"string","description":"Title."},"url":{"type":"string","format":"uri","description":"The item on /agent."}}},"description":"Articles."},"press":{"type":"array","items":{"type":"object","description":"A related item.","required":["id","title","url"],"properties":{"id":{"type":"string","description":"Item id."},"title":{"type":"string","description":"Title."},"url":{"type":"string","format":"uri","description":"The item on /agent."}}},"description":"Press coverage."},"projects":{"type":"array","items":{"type":"object","description":"A related item.","required":["id","title","url"],"properties":{"id":{"type":"string","description":"Item id."},"title":{"type":"string","description":"Title."},"url":{"type":"string","format":"uri","description":"The item on /agent."}}},"description":"Projects."},"practices":{"type":"array","items":{"type":"object","description":"A related item.","required":["id","title","url"],"properties":{"id":{"type":"string","description":"Item id."},"title":{"type":"string","description":"Title."},"url":{"type":"string","format":"uri","description":"The item on /agent."}}},"description":"UX practices."}}}}},"TimelineItem":{"type":"object","description":"A timeline entry.","required":["id","when","start","end","current","label","organization","role","place","summary","chapter","url"],"properties":{"id":{"type":"string","description":"Stable id."},"when":{"type":"string","description":"Years in words."},"start":{"type":["integer","null"],"description":"Start year."},"end":{"type":["integer","null"],"description":"End year, or null when unknown or ongoing."},"current":{"type":"boolean","description":"True for the current role."},"label":{"type":"string","description":"What happened."},"organization":{"type":["string","null"],"description":"Organization."},"role":{"type":["string","null"],"description":"Role."},"place":{"type":["string","null"],"description":"Where."},"summary":{"type":"string","description":"One or two sentences."},"chapter":{"type":["string","null"],"enum":["louisiana","austin","ebay","teradata","credo-ai","dreambase",null],"description":"Chapter id, or null."},"url":{"type":"string","format":"uri","description":"The entry on /agent."}}},"Talk":{"type":"object","description":"A talk, keynote, panel or podcast.","required":["id","title","kind","year","venue","location","with","takeaway","url","archived","links","chapters","page"],"properties":{"id":{"type":"string","description":"Stable id."},"title":{"type":"string","description":"Title."},"kind":{"type":"string","enum":["keynote","talk","panel","podcast"],"description":"Format."},"year":{"type":["integer","null"],"description":"Year."},"venue":{"type":"string","description":"Event or show."},"location":{"type":["string","null"],"description":"City."},"with":{"type":"array","items":{"type":"string","description":"Name."},"description":"Co-speakers or hosts."},"takeaway":{"type":"string","description":"One-sentence takeaway."},"url":{"type":"string","format":"uri","description":"Where to watch, listen or read."},"archived":{"type":"boolean","description":"True when url is a saved copy of a page that is gone."},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"},"description":"More links."},"chapters":{"type":"array","items":{"type":"string","enum":["louisiana","austin","ebay","teradata","credo-ai","dreambase"],"description":"Chapter id (stable)."},"description":"Related chapters."},"page":{"type":"string","format":"uri","description":"The talk on /agent."}}},"WritingItem":{"type":"object","description":"An article, a blog or a press item.","required":["id","kind","title","outlet","year","summary","url","archived","chapters","page"],"properties":{"id":{"type":"string","description":"Stable id."},"kind":{"type":"string","enum":["article","blog","press"],"description":"article: one post by Kyle. blog: a blog where many of his posts are (the Dreambase blog). press: about his work."},"title":{"type":"string","description":"Title."},"outlet":{"type":"string","description":"Publication."},"year":{"type":["integer","null"],"description":"Year."},"summary":{"type":["string","null"],"description":"One-sentence summary."},"url":{"type":"string","format":"uri","description":"Where to read it."},"archived":{"type":"boolean","description":"True when url is a saved copy of a page that is gone."},"chapters":{"type":"array","items":{"type":"string","enum":["louisiana","austin","ebay","teradata","credo-ai","dreambase"],"description":"Chapter id (stable)."},"description":"Related chapters."},"page":{"type":"string","format":"uri","description":"The item on /agent."}}},"Project":{"type":"object","description":"A design project.","required":["id","title","organization","years","summary","quote","links","chapters","page"],"properties":{"id":{"type":"string","description":"Stable id."},"title":{"type":"string","description":"Title."},"organization":{"type":["string","null"],"description":"Organization."},"years":{"type":["string","null"],"description":"Years."},"summary":{"type":"string","description":"Summary."},"quote":{"type":["string","null"],"description":"Kyle’s words about it."},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"},"description":"Links."},"chapters":{"type":"array","items":{"type":"string","enum":["louisiana","austin","ebay","teradata","credo-ai","dreambase"],"description":"Chapter id (stable)."},"description":"Related chapters."},"page":{"type":"string","format":"uri","description":"The project on /agent."}}},"Practice":{"type":"object","description":"A UX practice.","required":["id","title","summary","links","chapters","page"],"properties":{"id":{"type":"string","description":"Stable id."},"title":{"type":"string","description":"Title."},"summary":{"type":"string","description":"Summary."},"links":{"type":"array","items":{"$ref":"#/components/schemas/Link"},"description":"Links."},"chapters":{"type":"array","items":{"type":"string","enum":["louisiana","austin","ebay","teradata","credo-ai","dreambase"],"description":"Chapter id (stable)."},"description":"Related chapters."},"page":{"type":"string","format":"uri","description":"The practice on /agent."}}},"SearchResult":{"type":"object","description":"A search result.","required":["type","id","title","snippet","url","api","score"],"properties":{"type":{"type":"string","enum":["profile","chapter","timeline","talk","writing","press","project","practice","answer"],"description":"What kind of record matched."},"id":{"type":"string","description":"Record id."},"title":{"type":"string","description":"Title."},"snippet":{"type":"string","description":"The sentence that matched."},"url":{"type":"string","format":"uri","description":"The page to read and cite."},"api":{"type":["string","null"],"format":"uri","description":"The full record in this API, or null."},"score":{"type":"integer","description":"Relevance, higher is better.","minimum":0}}},"ApiIndex":{"type":"object","description":"The API’s own description.","required":["name","version","description","authentication","rateLimit","endpoints","links"],"properties":{"name":{"type":"string","description":"API name."},"version":{"type":"string","description":"API version."},"description":{"type":"string","description":"What the API is for."},"authentication":{"type":"string","enum":["none"],"description":"No key, no OAuth."},"rateLimit":{"type":"object","description":"Fair-use policy.","required":["policy","quota","windowSeconds"],"properties":{"policy":{"type":"string","description":"RateLimit-Policy value."},"quota":{"type":"integer","description":"Requests per window."},"windowSeconds":{"type":"integer","description":"Window length in seconds."}}},"endpoints":{"type":"array","items":{"type":"object","description":"An endpoint.","required":["operationId","method","path","summary","url"],"properties":{"operationId":{"type":"string","description":"operationId in the OpenAPI document."},"method":{"type":"string","enum":["GET"],"description":"HTTP method."},"path":{"type":"string","description":"Path."},"summary":{"type":"string","description":"What it returns."},"url":{"type":"string","format":"uri","description":"Example URL."}}},"description":"Every endpoint."},"links":{"type":"object","description":"Related resources.","required":["openapi","docs","errors","mcp","llms","agent"],"properties":{"openapi":{"type":"string","format":"uri","description":"OpenAPI 3.1 description."},"docs":{"type":"string","format":"uri","description":"Developer documentation."},"errors":{"type":"string","format":"uri","description":"Error reference."},"mcp":{"type":"string","format":"uri","description":"MCP server."},"llms":{"type":"string","format":"uri","description":"llms.txt."},"agent":{"type":"string","format":"uri","description":"Agent mode."}}}}},"ApiIndexResponse":{"type":"object","description":"The API index.","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ApiIndex"},"meta":{"$ref":"#/components/schemas/Meta"}}},"ProfileResponse":{"type":"object","description":"Kyle Ledbetter’s profile.","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/Profile"},"meta":{"$ref":"#/components/schemas/Meta"}}},"ChapterListResponse":{"type":"object","description":"The six chapters.","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ChapterSummary"},"description":"Chapters in story order."},"meta":{"$ref":"#/components/schemas/ListMeta"}}},"ChapterResponse":{"type":"object","description":"One chapter.","required":["data","meta"],"properties":{"data":{"$ref":"#/components/schemas/ChapterDetail"},"meta":{"$ref":"#/components/schemas/Meta"}}},"TimelineResponse":{"type":"object","description":"The career timeline.","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TimelineItem"},"description":"Entries, oldest first."},"meta":{"$ref":"#/components/schemas/ListMeta"}}},"TalkListResponse":{"type":"object","description":"Talks.","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Talk"},"description":"Talks, newest first."},"meta":{"$ref":"#/components/schemas/ListMeta"}}},"WritingListResponse":{"type":"object","description":"Writing and press.","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WritingItem"},"description":"Articles, then press."},"meta":{"type":"object","description":"About this response.","required":["updated","apiVersion","docs","count","more"],"properties":{"updated":{"type":"string","description":"The day the site’s content last changed (YYYY-MM-DD).","format":"date"},"apiVersion":{"type":"string","description":"API version."},"docs":{"type":"string","format":"uri","description":"Developer documentation."},"count":{"type":"integer","description":"Number of items in data.","minimum":0},"more":{"type":"array","items":{"type":"object","description":"A link.","required":["label","url"],"properties":{"label":{"type":"string","description":"Link text."},"url":{"type":"string","format":"uri","description":"Link."}}},"description":"Where to read more of Kyle’s writing: his Medium profile and the Dreambase blog."}}}}},"ProjectListResponse":{"type":"object","description":"Projects.","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"},"description":"Projects."},"meta":{"$ref":"#/components/schemas/ListMeta"}}},"PracticeListResponse":{"type":"object","description":"UX practices.","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Practice"},"description":"Practices."},"meta":{"$ref":"#/components/schemas/ListMeta"}}},"SearchResponse":{"type":"object","description":"Search results.","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SearchResult"},"description":"Best matches first."},"meta":{"type":"object","description":"About this response.","required":["updated","apiVersion","docs","count","query","limit","type"],"properties":{"updated":{"type":"string","description":"The day the site’s content last changed (YYYY-MM-DD).","format":"date"},"apiVersion":{"type":"string","description":"API version."},"docs":{"type":"string","format":"uri","description":"Developer documentation."},"count":{"type":"integer","description":"Number of results.","minimum":0},"query":{"type":"string","description":"The query as received."},"limit":{"type":"integer","description":"The limit applied.","minimum":1,"maximum":50},"type":{"type":["string","null"],"enum":["profile","chapter","timeline","talk","writing","press","project","practice","answer",null],"description":"The type filter, or null."}}}}}},"responses":{"BadRequest":{"description":"A parameter is missing or invalid (code missing_parameter or invalid_parameter).","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"No such resource (code not_found or chapter_not_found).","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"MethodNotAllowed":{"description":"Only GET, HEAD and OPTIONS are allowed (code method_not_allowed).","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Allow":{"description":"Allowed methods.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"TooManyRequests":{"description":"Over the fair-use quota (code rate_limited).","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalError":{"description":"Unexpected server error (code internal_error). Retry later.","headers":{"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"headers":{"RateLimit-Policy":{"description":"Quota policy (IETF RateLimit fields): \"kl-public\";q=120;w=60.","schema":{"type":"string"}},"RateLimit-Limit":{"description":"Requests allowed per window (compatibility form).","schema":{"type":"integer"}},"RateLimit":{"description":"Remaining quota and seconds to reset, on endpoints that run per request (search).","schema":{"type":"string"}},"Retry-After":{"description":"Seconds to wait before retrying (429 only).","schema":{"type":"integer"}},"Deprecation":{"description":"Sent only once this API version is deprecated (RFC 9745).","schema":{"type":"string"}},"Sunset":{"description":"Sent only once a shutdown date is set for this API version (RFC 8594).","schema":{"type":"string"}},"Link":{"description":"Links to this OpenAPI document (rel=\"service-desc\"), the docs (rel=\"service-doc\") and the API catalog.","schema":{"type":"string"}}}},"x-rate-limit-policy":{"name":"kl-public","quota":120,"window_seconds":60,"partition":"client IP address","headers":["RateLimit-Policy","RateLimit-Limit","RateLimit","Retry-After"]},"x-api-lifecycle":{"current_major_version":"v1","status":"stable","deprecation_policy_url":"https://kyleledbetter.com/developers#versioning-and-deprecation","minimum_deprecation_notice_days":180,"signals":["Deprecation header (RFC 9745)","Sunset header (RFC 8594)","Link rel=\"successor-version\""]}}
