{"endpoints":{"assignments":{"create":"POST /assignments (requires token)","delete":"DELETE /assignments/{id} (requires token)","get":"GET /assignments/{id} (requires token)","list":"GET /assignments (requires token)","update":"PUT /assignments/{id} (requires token)"},"auth":{"login":"POST /auth/login (public)","me":"GET /auth/me (requires token)","register":"POST /auth/register (public)"},"boats":{"create":"POST /boats (requires token, body: {name?, type?, brand?, builder?, seat?, steering?, year?, description?, length?, width?, status?, bought?, condition?, buying_price?, sold_date?, sold_price?, depreciated})","delete":"DELETE /boats/{id} (requires token)","get":"GET /boats/{id} (requires token)","list":"GET /boats (requires token)","list_filtered":"GET /boats?status={status}&type={type}&depreciated={depreciated} (requires token)","statuses":"GET /boats/statuses (requires token)","types":"GET /boats/types (requires token)","update":"PUT /boats/{id} (requires token, body: {any boat fields})"},"categories":{"create":"POST /categories (requires token)","delete":"DELETE /categories/{id} (requires token)","get":"GET /categories/{id} (requires token)","list":"GET /categories (requires token)","list_by_club":"GET /categories?club_id={club_id} (requires token)","update":"PUT /categories/{id} (requires token)"},"clubs":{"create":"POST /clubs (requires token)","delete":"DELETE /clubs/{id} (requires token)","get":"GET /clubs/{id} (requires token)","list":"GET /clubs (public)","update":"PUT /clubs/{id} (requires token)"},"departments":{"create":"POST /departments (requires token)","delete":"DELETE /departments/{id} (requires token)","get":"GET /departments/{id} (requires token)","list":"GET /departments (requires token)","update":"PUT /departments/{id} (requires token)"},"events":{"create":"POST /events (requires token)","delete":"DELETE /events/{id} (requires token)","get":"GET /events/{id} (requires token)","list":"GET /events (requires token)","list_by_club":"GET /events?club_id={club_id} (requires token)","update":"PUT /events/{id} (requires token)"},"groups":{"create":"POST /groups (requires token, body: {name, clubId, tag?, visibility?, notes?, memberIds?})","delete":"DELETE /groups/{id} (requires token)","duplicate":"POST /groups/{id}/duplicate (requires token)","get":"GET /groups/{id} (requires token)","list":"GET /groups (requires token)","list_filtered":"GET /groups?clubId={clubId}&search={search}&visibility={visibility}&includeMembers={true|false} (requires token)","members":{"add":"POST /groups/{id}/members (requires token, body: {personId})","list":"GET /groups/{id}/members (requires token)","remove":"DELETE /groups/{id}/members/{personId} (requires token)"},"update":"PUT /groups/{id} (requires token, body: {name?, tag?, visibility?, notes?, memberIds?})"},"menu":{"allowed_pages":"GET /menu/allowed-pages?role_id={role_id}&person_id={person_id} (requires token)"},"minutes":{"by_department":"GET /minutes/department/{department_id} (requires token)","create":"POST /minutes (requires token)","delete":"DELETE /minutes/{id} (requires token)","finalize":"PUT /minutes/{id}/finalize (requires token)","get":"GET /minutes/{id} (requires token)","list":"GET /minutes (requires token)","past":"GET /minutes/past (requires token)","upcoming":"GET /minutes/upcoming (requires token)","update":"PUT /minutes/{id} (requires token)"},"newsletters":{"archive":"POST /newsletters/{id}/archive (requires token)","blocks":{"create":"POST /newsletters/{newsletter_id}/blocks (requires token, body: {block_type, content, sort_order?})","delete":"DELETE /newsletters/{newsletter_id}/blocks/{block_id} (requires token)","list":"GET /newsletters/{newsletter_id}/blocks (requires token)","reorder":"PUT /newsletters/{newsletter_id}/blocks/reorder (requires token, body: {block_orders: [{block_id, sort_order}]})","update":"PUT /newsletters/{newsletter_id}/blocks/{block_id} (requires token, body: {content?, sort_order?})"},"create":"POST /newsletters (requires token, body: {club_id, title, status?, blocks?})","delete":"DELETE /newsletters/{id} (requires token)","get":"GET /newsletters/{id} (requires token)","list":"GET /newsletters (requires token)","list_by_club":"GET /newsletters?club_id={club_id} (requires token)","list_by_status":"GET /newsletters?status={status} (requires token)","publish":"POST /newsletters/{id}/publish (requires token)","recipients":{"create":"POST /newsletters/{newsletter_id}/recipients (requires token, body: {person_id, email})","delete":"DELETE /newsletters/{newsletter_id}/recipients/{recipient_id} (requires token)","list":"GET /newsletters/{newsletter_id}/recipients (requires token)","mark_opened":"POST /newsletters/{newsletter_id}/recipients/{recipient_id}/mark-opened (requires token)","mark_sent":"POST /newsletters/{newsletter_id}/recipients/{recipient_id}/mark-sent (requires token)"},"send":"POST /newsletters/{id}/send (requires token)","statistics":"GET /newsletters/{id}/statistics (requires token)","update":"PUT /newsletters/{id} (requires token, body: {title?, status?})"},"person_in_club":{"clubs_by_person":"GET /persons/{person_id}/clubs (requires token)","create":"POST /person-in-club (requires token)","delete":"DELETE /person-in-club/{id} (requires token)","get":"GET /person-in-club/{id} (requires token)","list":"GET /person-in-club (requires token)","persons_by_club":"GET /clubs/{club_id}/persons (requires token)","update":"PUT /person-in-club/{id} (requires token)"},"person_override_role_with_page":{"create":"POST /person-override-role-with-page (requires token)","delete":"DELETE /person-override-role-with-page/{id} (requires token)","get":"GET /person-override-role-with-page/{id} (requires token)","list":"GET /person-override-role-with-page (requires token)"},"persons":{"create":"POST /persons (requires token)","delete":"DELETE /persons/{id} (requires token)","get":"GET /persons/{id} (requires token)","list":"GET /persons (requires token)","update":"PUT /persons/{id} (requires token)","update_subscriber":"PUT /persons/{id}/subscriber (requires token)"},"role_with_page":{"create":"POST /role-with-page (requires token)","delete":"DELETE /role-with-page/{id} (requires token)","get":"GET /role-with-page/{id} (requires token)","list":"GET /role-with-page (requires token)","update":"PUT /role-with-page/{id} (requires token)"},"roles":{"create":"POST /roles (requires token)","delete":"DELETE /roles/{id} (requires token)","get":"GET /roles/{id} (requires token)","list":"GET /roles (requires token)","update":"PUT /roles/{id} (requires token)"},"tasks":{"cancel":"POST /tasks/{id}/cancel (requires token)","create":"POST /tasks (requires token)","delete":"DELETE /tasks/{id} (requires token)","get":"GET /tasks/{id} (requires token)","list":"GET /tasks (requires token)","log_work":"POST /tasks/log-work (requires token, body: {person_id, task_id, helper_id, work_date, hours})","logged_hours":"POST /tasks/logged-hours (requires token, body: {person_id})","open_tasks":"POST /tasks/open (requires token)","signup":"POST /tasks/{id}/signup (requires token)","to_log":"POST /tasks/to-log (requires token, body: {person_id})","update":"PUT /tasks/{id} (requires token)"}},"message":"Rowing Club API is running","success":true,"version":"1.0.0"}
