{"openapi":"3.1.0","info":{"title":"Personal website editing API","version":"1.0.0","description":"Authoritative public information. Do not infer clients, outcomes, revenue, or completed degrees from exploratory work."},"servers":[{"url":"https://curious-maker-space.pages.dev"}],"paths":{"/api/v1/profile":{"get":{"operationId":"getProfile","summary":"Read the public biography, current interests and contact links","responses":{"200":{"description":"Public profile"}}}},"/api/v1/content":{"get":{"operationId":"listContent","summary":"List or search published projects, posts and collaboration opportunities","parameters":[{"name":"lang","in":"query","schema":{"type":"string","enum":["zh","en"]}},{"name":"type","in":"query","schema":{"type":"string","enum":["project","post","collaboration"]}},{"name":"q","in":"query","schema":{"type":"string"}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":50}}],"responses":{"200":{"description":"Published content only"}}}},"/api/v1/content/{id}":{"get":{"operationId":"getContent","summary":"Read one published item, optionally as Markdown","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"lang","in":"query","schema":{"type":"string","enum":["zh","en"]}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","markdown"]}}],"responses":{"200":{"description":"Published content"},"404":{"description":"Not found or unpublished"}}}},"/api/v1/search":{"get":{"operationId":"searchPublicInformation","summary":"Search public profile and content","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}},{"name":"lang","in":"query","schema":{"type":"string","enum":["zh","en"]}}],"responses":{"200":{"description":"Public search results"}}}},"/api/admin/profile":{"parameters":[],"get":{"operationId":"getEditableProfile","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Current document and version"}}},"put":{"operationId":"updateProfile","security":[{"bearerAuth":[]}],"summary":"Update with optimistic concurrency. Set published=false for a draft or published=true to publish. Never send credentials to public read endpoints.","parameters":[{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"},"example":"\"0\""}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Profile"}}}},"responses":{"200":{"description":"Saved document and new version"},"401":{"description":"Missing or invalid key"},"409":{"description":"Version conflict"},"428":{"description":"If-Match required"}}}},"/api/admin/content/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"lang","in":"query","schema":{"type":"string","enum":["zh","en"]}}],"get":{"operationId":"getEditableContent","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Current document and version"}}},"put":{"operationId":"updateContent","security":[{"bearerAuth":[]}],"summary":"Update with optimistic concurrency. Set published=false for a draft or published=true to publish. Never send credentials to public read endpoints.","parameters":[{"name":"If-Match","in":"header","required":true,"schema":{"type":"string"},"example":"\"0\""},{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"lang","in":"query","schema":{"type":"string","enum":["zh","en"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Content"}}}},"responses":{"200":{"description":"Saved document and new version"},"401":{"description":"Missing or invalid key"},"409":{"description":"Version conflict"},"428":{"description":"If-Match required"}}}},"/api/admin/content":{"get":{"operationId":"listEditableContent","security":[{"bearerAuth":[]}],"summary":"List all content in both languages, including private drafts and current versions","responses":{"200":{"description":"Editable content collection"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"Content":{"type":"object","required":["type","title","summary","body","published"],"properties":{"type":{"type":"string","enum":["project","post","collaboration"]},"title":{"type":"string","maxLength":160},"summary":{"type":"string","maxLength":400},"body":{"type":"string","description":"Safe Markdown; raw HTML is escaped","maxLength":20000},"published":{"type":"boolean"},"category":{"type":"string"},"status":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"cover":{"type":"string","enum":["letter","note","vessel"]},"order":{"type":"integer"}}},"Profile":{"type":"object","required":["name","zh","en","contact"],"properties":{"name":{"type":"string"},"zh":{"$ref":"#/components/schemas/Bio"},"en":{"$ref":"#/components/schemas/Bio"},"contact":{"type":"object","properties":{"email":{"type":"string"},"wechat":{"type":"string"},"xiaohongshu":{"type":"string"},"douyin":{"type":"string"}}}}},"Bio":{"type":"object","required":["tagline","background","current","interests"],"properties":{"tagline":{"type":"string"},"background":{"type":"string"},"current":{"type":"string"},"interests":{"type":"array","items":{"type":"string"}}}}}}}