{"success":true,"data":{"service":"Ekoli Yeden Digital Home API","tagline":"Preserving Our Past. Celebrating Our Present. Building Our Future.","version":"1.0.0","environment":"production","documentation":"/docs/architecture.md","endpoints":[{"method":"POST","path":"/api/auth/register","description":"Create a contributor account"},{"method":"POST","path":"/api/auth/login","description":"Sign in and receive an access token"},{"method":"POST","path":"/api/auth/refresh","description":"Exchange a refresh token for a new session"},{"method":"POST","path":"/api/auth/logout","description":"End the current session"},{"method":"GET","path":"/api/auth/me","description":"The signed-in user, their roles and their permissions"},{"method":"GET","path":"/api/contribute/types","description":"What may be contributed, and what happens next"},{"method":"POST","path":"/api/contribute","description":"Submit material to the archive for review"},{"method":"POST","path":"/api/contribute/media","description":"Attach a photograph, document or recording to a contribution"},{"method":"GET","path":"/api/contribute/status/:reference","description":"Check the progress of a contribution using its reference code"},{"method":"GET","path":"/api/editorial/dashboard","description":"Draft, pending, published and rejected counts for the Editorial Team"},{"method":"GET","path":"/api/editorial/strings","description":"All editable website text, grouped, with drafts"},{"method":"PUT","path":"/api/editorial/strings/:key","description":"Save a draft change to a piece of website text"},{"method":"POST","path":"/api/editorial/strings/:key/submit","description":"Submit a text draft for review"},{"method":"POST","path":"/api/editorial/strings/:key/review","description":"Approve or reject a submitted text change"},{"method":"POST","path":"/api/editorial/strings/:key/publish","description":"Publish an approved text change to the live website"},{"method":"GET","path":"/api/editorial/hero","description":"The five homepage hero slides, including unpublished ones"},{"method":"PUT","path":"/api/editorial/hero/:slide","description":"Edit one hero slide"},{"method":"GET","path":"/api/editorial/navigation","description":"Navigation menus"},{"method":"PATCH","path":"/api/editorial/navigation/:id","description":"Edit a navigation label, destination or order"},{"method":"GET","path":"/api/editorial/sources","description":"The citation library"},{"method":"POST","path":"/api/editorial/sources","description":"Record a new source"},{"method":"POST","path":"/api/editorial/sources/attach","description":"Cite a source on a record"},{"method":"GET","path":"/api/editorial/versions/:resourceType/:resourceId","description":"The edit history of one record"},{"method":"GET","path":"/api/editorial/versions/:resourceType/:resourceId/:version","description":"One earlier version of a record, in full"},{"method":"GET","path":"/api/admin/dashboard","description":"Counts per content type and status, and the moderation queue"},{"method":"GET","path":"/api/admin/settings","description":"All site settings, grouped"},{"method":"PUT","path":"/api/admin/settings","description":"Update site setting values"},{"method":"GET","path":"/api/admin/media","description":"Browse the R2 media library"},{"method":"POST","path":"/api/admin/media","description":"Upload a file to R2 and record it in D1"},{"method":"PATCH","path":"/api/admin/media/:id","description":"Catalogue a media item — title, credit, location, date taken"},{"method":"DELETE","path":"/api/admin/media/:id","description":"Delete a media item from R2 and D1"},{"method":"GET","path":"/api/admin/submissions","description":"The community contribution queue"},{"method":"GET","path":"/api/admin/submissions/:id","description":"One contribution in full"},{"method":"PATCH","path":"/api/admin/submissions/:id/review","description":"Approve, reject or archive a contribution"},{"method":"GET","path":"/api/admin/roles","description":"Platform roles and the Preservation Team structure"},{"method":"GET","path":"/api/admin/users","description":"List platform users"},{"method":"POST","path":"/api/admin/users","description":"Create an account for a team member"},{"method":"PATCH","path":"/api/admin/users/:id","description":"Update a user profile, status or Preservation Team position"},{"method":"POST","path":"/api/admin/users/:id/password","description":"Reset another user password and end their sessions"},{"method":"POST","path":"/api/admin/users/:id/roles","description":"Grant a role to a user"},{"method":"DELETE","path":"/api/admin/users/:id/roles/:role","description":"Remove a role from a user"},{"method":"POST","path":"/api/admin/account/password","description":"Change your own password"},{"method":"GET","path":"/api/admin/audit-logs","description":"The audit trail"},{"method":"GET","path":"/api/admin/pages","description":"List all page records in every status"},{"method":"GET","path":"/api/admin/pages/:identifier","description":"Read one page in any status"},{"method":"POST","path":"/api/admin/pages","description":"Create a page"},{"method":"PUT","path":"/api/admin/pages/:id","description":"Update a page"},{"method":"PATCH","path":"/api/admin/pages/:id","description":"Partially update a page"},{"method":"PATCH","path":"/api/admin/pages/:id/status","description":"Move a page through the editorial workflow"},{"method":"DELETE","path":"/api/admin/pages/:id","description":"Delete a page"},{"method":"GET","path":"/api/admin/history","description":"List all history entry records in every status"},{"method":"GET","path":"/api/admin/history/:identifier","description":"Read one history entry in any status"},{"method":"POST","path":"/api/admin/history","description":"Create a history entry"},{"method":"PUT","path":"/api/admin/history/:id","description":"Update a history entry"},{"method":"PATCH","path":"/api/admin/history/:id","description":"Partially update a history entry"},{"method":"PATCH","path":"/api/admin/history/:id/status","description":"Move a history entry through the editorial workflow"},{"method":"DELETE","path":"/api/admin/history/:id","description":"Delete a history entry"},{"method":"GET","path":"/api/admin/leaders","description":"List all leader records in every status"},{"method":"GET","path":"/api/admin/leaders/:identifier","description":"Read one leader in any status"},{"method":"POST","path":"/api/admin/leaders","description":"Create a leader"},{"method":"PUT","path":"/api/admin/leaders/:id","description":"Update a leader"},{"method":"PATCH","path":"/api/admin/leaders/:id","description":"Partially update a leader"},{"method":"PATCH","path":"/api/admin/leaders/:id/status","description":"Move a leader through the editorial workflow"},{"method":"DELETE","path":"/api/admin/leaders/:id","description":"Delete a leader"},{"method":"GET","path":"/api/admin/people","description":"List all person records in every status"},{"method":"GET","path":"/api/admin/people/:identifier","description":"Read one person in any status"},{"method":"POST","path":"/api/admin/people","description":"Create a person"},{"method":"PUT","path":"/api/admin/people/:id","description":"Update a person"},{"method":"PATCH","path":"/api/admin/people/:id","description":"Partially update a person"},{"method":"PATCH","path":"/api/admin/people/:id/status","description":"Move a person through the editorial workflow"},{"method":"DELETE","path":"/api/admin/people/:id","description":"Delete a person"},{"method":"GET","path":"/api/admin/news","description":"List all news item records in every status"},{"method":"GET","path":"/api/admin/news/:identifier","description":"Read one news item in any status"},{"method":"POST","path":"/api/admin/news","description":"Create a news item"},{"method":"PUT","path":"/api/admin/news/:id","description":"Update a news item"},{"method":"PATCH","path":"/api/admin/news/:id","description":"Partially update a news item"},{"method":"PATCH","path":"/api/admin/news/:id/status","description":"Move a news item through the editorial workflow"},{"method":"DELETE","path":"/api/admin/news/:id","description":"Delete a news item"},{"method":"GET","path":"/api/admin/events","description":"List all event records in every status"},{"method":"GET","path":"/api/admin/events/:identifier","description":"Read one event in any status"},{"method":"POST","path":"/api/admin/events","description":"Create a event"},{"method":"PUT","path":"/api/admin/events/:id","description":"Update a event"},{"method":"PATCH","path":"/api/admin/events/:id","description":"Partially update a event"},{"method":"PATCH","path":"/api/admin/events/:id/status","description":"Move a event through the editorial workflow"},{"method":"DELETE","path":"/api/admin/events/:id","description":"Delete a event"},{"method":"GET","path":"/api/admin/festivals","description":"List all festival records in every status"},{"method":"GET","path":"/api/admin/festivals/:identifier","description":"Read one festival in any status"},{"method":"POST","path":"/api/admin/festivals","description":"Create a festival"},{"method":"PUT","path":"/api/admin/festivals/:id","description":"Update a festival"},{"method":"PATCH","path":"/api/admin/festivals/:id","description":"Partially update a festival"},{"method":"PATCH","path":"/api/admin/festivals/:id/status","description":"Move a festival through the editorial workflow"},{"method":"DELETE","path":"/api/admin/festivals/:id","description":"Delete a festival"},{"method":"GET","path":"/api/admin/language-categories","description":"List all language category records in every status"},{"method":"GET","path":"/api/admin/language-categories/:identifier","description":"Read one language category in any status"},{"method":"POST","path":"/api/admin/language-categories","description":"Create a language category"},{"method":"PUT","path":"/api/admin/language-categories/:id","description":"Update a language category"},{"method":"PATCH","path":"/api/admin/language-categories/:id","description":"Partially update a language category"},{"method":"PATCH","path":"/api/admin/language-categories/:id/status","description":"Move a language category through the editorial workflow"},{"method":"DELETE","path":"/api/admin/language-categories/:id","description":"Delete a language category"},{"method":"GET","path":"/api/admin/language","description":"List all ekoli word records in every status"},{"method":"GET","path":"/api/admin/language/:identifier","description":"Read one ekoli word in any status"},{"method":"POST","path":"/api/admin/language","description":"Create a ekoli word"},{"method":"PUT","path":"/api/admin/language/:id","description":"Update a ekoli word"},{"method":"PATCH","path":"/api/admin/language/:id","description":"Partially update a ekoli word"},{"method":"PATCH","path":"/api/admin/language/:id/status","description":"Move a ekoli word through the editorial workflow"},{"method":"DELETE","path":"/api/admin/language/:id","description":"Delete a ekoli word"},{"method":"GET","path":"/api/admin/galleries","description":"List all gallery records in every status"},{"method":"GET","path":"/api/admin/galleries/:identifier","description":"Read one gallery in any status"},{"method":"POST","path":"/api/admin/galleries","description":"Create a gallery"},{"method":"PUT","path":"/api/admin/galleries/:id","description":"Update a gallery"},{"method":"PATCH","path":"/api/admin/galleries/:id","description":"Partially update a gallery"},{"method":"PATCH","path":"/api/admin/galleries/:id/status","description":"Move a gallery through the editorial workflow"},{"method":"DELETE","path":"/api/admin/galleries/:id","description":"Delete a gallery"},{"method":"GET","path":"/api/admin/videos","description":"List all video records in every status"},{"method":"GET","path":"/api/admin/videos/:identifier","description":"Read one video in any status"},{"method":"POST","path":"/api/admin/videos","description":"Create a video"},{"method":"PUT","path":"/api/admin/videos/:id","description":"Update a video"},{"method":"PATCH","path":"/api/admin/videos/:id","description":"Partially update a video"},{"method":"PATCH","path":"/api/admin/videos/:id/status","description":"Move a video through the editorial workflow"},{"method":"DELETE","path":"/api/admin/videos/:id","description":"Delete a video"},{"method":"GET","path":"/api/admin/businesses","description":"List all business records in every status"},{"method":"GET","path":"/api/admin/businesses/:identifier","description":"Read one business in any status"},{"method":"POST","path":"/api/admin/businesses","description":"Create a business"},{"method":"PUT","path":"/api/admin/businesses/:id","description":"Update a business"},{"method":"PATCH","path":"/api/admin/businesses/:id","description":"Partially update a business"},{"method":"PATCH","path":"/api/admin/businesses/:id/status","description":"Move a business through the editorial workflow"},{"method":"DELETE","path":"/api/admin/businesses/:id","description":"Delete a business"},{"method":"GET","path":"/api/admin/organizations","description":"List all organization records in every status"},{"method":"GET","path":"/api/admin/organizations/:identifier","description":"Read one organization in any status"},{"method":"POST","path":"/api/admin/organizations","description":"Create a organization"},{"method":"PUT","path":"/api/admin/organizations/:id","description":"Update a organization"},{"method":"PATCH","path":"/api/admin/organizations/:id","description":"Partially update a organization"},{"method":"PATCH","path":"/api/admin/organizations/:id/status","description":"Move a organization through the editorial workflow"},{"method":"DELETE","path":"/api/admin/organizations/:id","description":"Delete a organization"},{"method":"GET","path":"/api/admin/culture","description":"List all culture article records in every status"},{"method":"GET","path":"/api/admin/culture/:identifier","description":"Read one culture article in any status"},{"method":"POST","path":"/api/admin/culture","description":"Create a culture article"},{"method":"PUT","path":"/api/admin/culture/:id","description":"Update a culture article"},{"method":"PATCH","path":"/api/admin/culture/:id","description":"Partially update a culture article"},{"method":"PATCH","path":"/api/admin/culture/:id/status","description":"Move a culture article through the editorial workflow"},{"method":"DELETE","path":"/api/admin/culture/:id","description":"Delete a culture article"},{"method":"GET","path":"/api/admin/age-grades","description":"List all age grade records in every status"},{"method":"GET","path":"/api/admin/age-grades/:identifier","description":"Read one age grade in any status"},{"method":"POST","path":"/api/admin/age-grades","description":"Create a age grade"},{"method":"PUT","path":"/api/admin/age-grades/:id","description":"Update a age grade"},{"method":"PATCH","path":"/api/admin/age-grades/:id","description":"Partially update a age grade"},{"method":"PATCH","path":"/api/admin/age-grades/:id/status","description":"Move a age grade through the editorial workflow"},{"method":"DELETE","path":"/api/admin/age-grades/:id","description":"Delete a age grade"},{"method":"GET","path":"/api/admin/cultural-groups","description":"List all cultural group records in every status"},{"method":"GET","path":"/api/admin/cultural-groups/:identifier","description":"Read one cultural group in any status"},{"method":"POST","path":"/api/admin/cultural-groups","description":"Create a cultural group"},{"method":"PUT","path":"/api/admin/cultural-groups/:id","description":"Update a cultural group"},{"method":"PATCH","path":"/api/admin/cultural-groups/:id","description":"Partially update a cultural group"},{"method":"PATCH","path":"/api/admin/cultural-groups/:id/status","description":"Move a cultural group through the editorial workflow"},{"method":"DELETE","path":"/api/admin/cultural-groups/:id","description":"Delete a cultural group"},{"method":"GET","path":"/api/admin/music","description":"List all cultural music records in every status"},{"method":"GET","path":"/api/admin/music/:identifier","description":"Read one cultural music in any status"},{"method":"POST","path":"/api/admin/music","description":"Create a cultural music"},{"method":"PUT","path":"/api/admin/music/:id","description":"Update a cultural music"},{"method":"PATCH","path":"/api/admin/music/:id","description":"Partially update a cultural music"},{"method":"PATCH","path":"/api/admin/music/:id/status","description":"Move a cultural music through the editorial workflow"},{"method":"DELETE","path":"/api/admin/music/:id","description":"Delete a cultural music"},{"method":"GET","path":"/api/admin/community","description":"List all community project records in every status"},{"method":"GET","path":"/api/admin/community/:identifier","description":"Read one community project in any status"},{"method":"POST","path":"/api/admin/community","description":"Create a community project"},{"method":"PUT","path":"/api/admin/community/:id","description":"Update a community project"},{"method":"PATCH","path":"/api/admin/community/:id","description":"Partially update a community project"},{"method":"PATCH","path":"/api/admin/community/:id/status","description":"Move a community project through the editorial workflow"},{"method":"DELETE","path":"/api/admin/community/:id","description":"Delete a community project"},{"method":"GET","path":"/api/health","description":"Service health check"},{"method":"GET","path":"/api/health/ready","description":"Deep readiness check across D1, R2 and configuration"},{"method":"GET","path":"/api/settings","description":"Public site settings used to render the website"},{"method":"GET","path":"/api/cms/bundle","description":"All published website text, hero slides and navigation, in one request"},{"method":"GET","path":"/api/cms/hero","description":"The five homepage hero slides with their images resolved"},{"method":"GET","path":"/api/sources/:resourceType/:resourceId","description":"The sources and references cited by one record"},{"method":"GET","path":"/api/contributors/:resourceType/:resourceId","description":"Contributor acknowledgement for one record"},{"method":"GET","path":"/api/search","description":"Search the whole archive"},{"method":"GET","path":"/api/search/sources","description":"What the archive search covers"},{"method":"GET","path":"/api/language/categories","description":"Ekoli language categories"},{"method":"GET","path":"/api/language/categories/:slug","description":"One language category and its words"},{"method":"GET","path":"/api/language","description":"Ekoli language entries"},{"method":"GET","path":"/api/language/:identifier","description":"One Ekoli language entry with its pronunciation recordings"},{"method":"GET","path":"/api/festivals","description":"All published festivals, with the featured edition separated out"},{"method":"GET","path":"/api/festivals/:identifier","description":"One festival with its events, gallery and videos"},{"method":"GET","path":"/api/leboku","description":"The Leboku festival series, year by year"},{"method":"GET","path":"/api/leboku/:year","description":"One Leboku edition, e.g. /api/leboku/2026"},{"method":"GET","path":"/api/media/config","description":"Accepted media folders, types and size limits"},{"method":"GET","path":"/api/media/file/*","description":"Stream a file from R2 by storage key"},{"method":"GET","path":"/api/preservation-team","description":"Structure of the Ekoli-Yeden Preservation Team"},{"method":"GET","path":"/api/pages","description":"List published page records"},{"method":"GET","path":"/api/pages/:identifier","description":"Read one published page by slug or id"},{"method":"GET","path":"/api/history","description":"List published history entry records"},{"method":"GET","path":"/api/history/:identifier","description":"Read one published history entry by slug or id"},{"method":"GET","path":"/api/culture","description":"List published culture article records"},{"method":"GET","path":"/api/culture/:identifier","description":"Read one published culture article by slug or id"},{"method":"GET","path":"/api/age-grades","description":"List published age grade records"},{"method":"GET","path":"/api/age-grades/:identifier","description":"Read one published age grade by slug or id"},{"method":"GET","path":"/api/cultural-groups","description":"List published cultural group records"},{"method":"GET","path":"/api/cultural-groups/:identifier","description":"Read one published cultural group by slug or id"},{"method":"GET","path":"/api/music","description":"List published cultural music records"},{"method":"GET","path":"/api/music/:identifier","description":"Read one published cultural music by slug or id"},{"method":"GET","path":"/api/leaders","description":"List published leader records"},{"method":"GET","path":"/api/leaders/:identifier","description":"Read one published leader by slug or id"},{"method":"GET","path":"/api/people","description":"List published person records"},{"method":"GET","path":"/api/people/:identifier","description":"Read one published person by slug or id"},{"method":"GET","path":"/api/news","description":"List published news item records"},{"method":"GET","path":"/api/news/:identifier","description":"Read one published news item by slug or id"},{"method":"GET","path":"/api/events","description":"List published event records"},{"method":"GET","path":"/api/events/:identifier","description":"Read one published event by slug or id"},{"method":"GET","path":"/api/galleries","description":"List published gallery records"},{"method":"GET","path":"/api/galleries/:identifier","description":"Read one published gallery by slug or id"},{"method":"GET","path":"/api/videos","description":"List published video records"},{"method":"GET","path":"/api/videos/:identifier","description":"Read one published video by slug or id"},{"method":"GET","path":"/api/businesses","description":"List published business records"},{"method":"GET","path":"/api/businesses/:identifier","description":"Read one published business by slug or id"},{"method":"GET","path":"/api/organizations","description":"List published organization records"},{"method":"GET","path":"/api/organizations/:identifier","description":"Read one published organization by slug or id"},{"method":"GET","path":"/api/community","description":"List published community project records"},{"method":"GET","path":"/api/community/:identifier","description":"Read one published community project by slug or id"}]}}