# Route Descriptions

Generated: 2026-02-19

| Endpoint | Description | Source |
|---|---|---|
| `DELETE /api/v1/comments/{commentId}` | Deletes a public post comment if owner or authorized moderator. | `docs/api/routes/comments-delete.md` |
| `DELETE /api/v1/hubs/{hubId}/admins/{userId}` | Super admin demotes or removes an admin role. | `docs/api/routes/hubs-admins-delete.md` |
| `DELETE /api/v1/hubs/{hubId}/discussions/{discussionId}/save` | Removes a saved hub discussion/chat item for the current user. | `docs/api/routes/hubs-discussion-save-delete.md` |
| `DELETE /api/v1/hubs/{hubId}/membership` | Leaves a hub. Super admin cannot leave until ownership is transferred. | `docs/api/routes/hubs-leave.md` |
| `DELETE /api/v1/posts/{postId}` | Deletes a post owned by current user. | `docs/api/routes/posts-delete.md` |
| `DELETE /api/v1/users/{userId}/block` | Unblocks a previously blocked user. | `docs/api/routes/users-block-delete.md` |
| `DELETE /api/v1/users/{userId}/follow` | Removes follow relationship from current user to target user. | `docs/api/routes/users-follow-delete.md` |
| `GET /api/v1/auth/login-config` | Returns data needed to render the phone login screen: app logo URL, enabled login methods, OTP settings, and legal text references. | `docs/api/routes/auth-login-config.md` |
| `GET /api/v1/hubs/{hubId}` | Returns hub profile details, member counts, active user count, and viewer status/role. | `docs/api/routes/hubs-get.md` |
| `GET /api/v1/hubs/{hubId}/admins` | Lists admin and super-admin users in a hub. | `docs/api/routes/hubs-admins-list.md` |
| `GET /api/v1/hubs/{hubId}/discussions` | Lists post-bound hub discussions for active members; previews identify active authors by verified phone within that Hub. | `docs/api/routes/hubs-discussions-list.md` |
| `GET /api/v1/hubs/{hubId}/discussions/{discussionId}/messages` | Returns private Hub messages with one-level threading and active-author phone identity visible only to active members of that Hub. | `docs/api/routes/hubs-discussion-messages-list.md` |
| `GET /api/v1/hubs/{hubId}/feed` | Returns posts feed scoped to one hub, including native and shared posts. | `docs/api/routes/hubs-feed-list.md` |
| `GET /api/v1/hubs/{hubId}/invitations` | Lists outstanding hub invitations and dark invitees. Active members see safe placeholders; admins see management details. | `docs/api/routes/hubs-invitations-list.md` |
| `GET /api/v1/hubs/{hubId}/join-requests` | Lists pending hub join requests that require manager/admin approval. | `docs/api/routes/hubs-join-requests-list.md` |
| `GET /api/v1/hubs/{hubId}/members` | Lists hub members with local search. Active members may receive phone numbers; dark/pending viewers receive public-only member previews. | `docs/api/routes/hubs-members-list.md` |
| `GET /api/v1/hubs/{hubId}/notification-settings` | Returns the current user's notification settings for one active hub membership. | `docs/api/routes/hubs-notification-settings-get.md` |
| `GET /api/v1/hub-invite-links/{token}` | Returns a safe public preview for a hub invite link before the viewer requests to join. | `docs/api/routes/hub-invite-links-get.md` |
| `GET /api/v1/notifications` | Returns notifications feed, including vote, comment, repost, follow, hub post/share, invite, join-request, member, and role-change events. | `docs/api/routes/notifications-list.md` |
| `GET /api/v1/notifications/stream` | Server-Sent Events stream for user-facing notification events. Hub chat, saves, reports, and blocks are excluded. | `docs/api/routes/notifications-stream.md` |
| `GET /api/v1/posts` | Returns the Home feed from own posts, followed users, hub co-members, joined hubs, social interactions, and default feed users. | `docs/api/routes/posts-feed-list.md` |
| `GET /api/v1/posts/{postId}` | Returns post detail, including the requested post frame's optional article, thoughtText, sliderText/slider, visibility, permissions, and repost metadata. | `docs/api/routes/posts-get.md` |
| `GET /api/v1/posts/{postId}/comments` | Returns public comments with public usernames and one-level threading; rejects `private_locked_hub` posts. | `docs/api/routes/posts-comments-list.md` |
| `GET /api/v1/posts/{postId}/frames` | Returns visible original and repost frames for the same source lineage. | `docs/api/routes/posts-frames-list.md` |
| `GET /api/v1/posts/{postId}/share-link` | Returns canonical deep link for external sharing. Private locked hub posts do not expose share links. | `docs/api/routes/posts-share-link-get.md` |
| `GET /api/v1/posts/{postId}/vote/distribution` | Returns the detailed 5-position vote distribution from the first vote. | `docs/api/routes/posts-vote-distribution-get.md` |
| `GET /api/v1/posts/{postId}/vote/hubs` | Returns hub-specific voting analytics from the first vote in every visible Hub scope. | `docs/api/routes/posts-vote-hubs-get.md` |
| `GET /api/v1/posts/{postId}/vote/me` | Returns current user's vote status without exposing the selected position. | `docs/api/routes/posts-vote-me-get.md` |
| `GET /api/v1/posts/{postId}/vote/summary` | Returns aggregate vote analytics from the first vote. | `docs/api/routes/posts-vote-summary-get.md` |
| `GET /api/v1/search/hubs` | Searches hubs by name and returns recommended hubs when `q` is empty, including active user count. | `docs/api/routes/search-hubs.md` |
| `GET /api/v1/search/users` | Lists recent public profiles when `q` is empty or searches by name or username. Authentication is optional and only enriches viewer follow state. | `docs/api/routes/search-users.md` |
| `GET /api/v1/users/{userId}/feed` | Returns profile feed: original posts and reposts published by the user, plus posts they shared to hubs. Authentication is optional; private locked hub posts are omitted. | `docs/api/routes/users-feed-list.md` |
| `GET /api/v1/users/{userId}/followers` | Returns paginated followers for a user with display names and per-item viewer-follow state. Supports local list search via query `q`. | `docs/api/routes/users-followers-list.md` |
| `GET /api/v1/users/{userId}/following` | Returns paginated following list for a user with display names and per-item viewer-follow state. Supports local list search via query `q`. | `docs/api/routes/users-following-list.md` |
| `GET /api/v1/users/by-username/{username}` | Returns the public profile page data for a user. This endpoint never returns phone numbers. | `docs/api/routes/users-profile-get.md` |
| `GET /api/v1/users/me/profile` | Returns the authenticated user's own profile page data, including editable profile fields, social counts, activity stats, and admin hubs. | `docs/api/routes/users-me-profile-get.md` |
| `GET /api/v1/users/me/hubs` | Returns the current user's hubs screen, including active hubs, dark invited hubs, and pending admin-approval hubs. | `docs/api/routes/users-me-hubs-list.md` |
| `GET /api/v1/users/me/onboarding/status` | Returns public-profile, phone-confirmation, and contact-sync progress for the current backend session. | `docs/api/routes/users-me-onboarding-status.md` |
| `GET /api/v1/users/me/saved-discussions` | Returns still-visible saved Hub discussions; previews use the private active-author phone projection. | `docs/api/routes/users-me-saved-discussions-list.md` |
| `PATCH /api/v1/hubs/{hubId}` | Edits hub description and hub image. Allowed for admin and super admin. | `docs/api/routes/hubs-patch.md` |
| `PATCH /api/v1/hubs/{hubId}/link` | Changes hub custom link/slug. Allowed for admins and super admins. | `docs/api/routes/hubs-link-patch.md` |
| `PATCH /api/v1/hubs/{hubId}/notification-settings` | Updates the current user's content notification mute setting for one active hub membership. | `docs/api/routes/hubs-notification-settings-patch.md` |
| `PATCH /api/v1/notifications/read` | Marks notifications as read. | `docs/api/routes/notifications-read-patch.md` |
| `PATCH /api/v1/users/me/profile` | Updates editable profile fields: fullName, username, bio, and profile image. Replacing the profile image deletes the old image. | `docs/api/routes/users-profile-patch-me.md` |
| `POST /api/v1/auth/logout` | Logs out the current device session by revoking the submitted refresh token. | `docs/api/routes/auth-logout.md` |
| `POST /api/v1/auth/otp/request` | Starts phone sign-in by sending a 4-digit OTP code. Used on the "enter phone" step and for resend after 60 seconds. | `docs/api/routes/auth-otp-request.md` |
| `POST /api/v1/auth/otp/verify` | Verifies the 4-digit OTP entered by the user and creates an authenticated session if valid. | `docs/api/routes/auth-otp-verify.md` |
| `POST /api/v1/auth/anonymous/session` | Creates or restores the install-local anonymous backend identity used for public reads, approved anonymous actions, abuse controls, and later identity merge. | `docs/api/routes/auth-anonymous-session.md` |
| `POST /api/v1/auth/firebase/token` | Exchanges a Firebase phone-auth or anonymous ID token for a Duuble backend session. | `docs/api/routes/auth-firebase-token.md` |
| `POST /api/v1/auth/session/refresh` | Renews access token using refresh token so users stay signed in after app restart or token expiry. | `docs/api/routes/auth-session-refresh.md` |
| `POST /api/v1/users/handles/availability` | Canonicalizes a proposed public handle, checks current availability, and returns generic available alternatives when needed. | `docs/api/routes/users-handle-availability.md` |
| `POST /api/v1/hubs` | Creates a Hub for a phone-confirmed, contacts-synced user. Creator becomes backend super_admin, displayed in the app as manager. | `docs/api/routes/hubs-create.md` |
| `POST /api/v1/hubs/{hubId}/admins` | Super admin promotes a member to admin. | `docs/api/routes/hubs-admins-add.md` |
| `POST /api/v1/hubs/{hubId}/discussions/{discussionId}/save` | Saves a hub discussion/chat item for the current user. | `docs/api/routes/hubs-discussion-save-create.md` |
| `POST /api/v1/hubs/{hubId}/invitations` | Creates hub invitations for selected phone numbers only. Admin invites activate when accepted; member invites require admin approval after accept. | `docs/api/routes/hubs-invitations-create.md` |
| `POST /api/v1/hubs/{hubId}/invite-links` | Creates a limited-time hub invite link. Link joins always require admin approval. | `docs/api/routes/hubs-invite-links-create.md` |
| `POST /api/v1/hubs/{hubId}/join-requests/{requestId}/approve` | Approves a pending hub join request and creates active membership. | `docs/api/routes/hubs-join-requests-approve.md` |
| `POST /api/v1/hubs/{hubId}/join-requests/{requestId}/reject` | Rejects a pending hub join request. | `docs/api/routes/hubs-join-requests-reject.md` |
| `POST /api/v1/hubs/{hubId}/members/{userId}/remove` | Admin/super-admin removes a regular user from hub. | `docs/api/routes/hubs-members-remove.md` |
| `POST /api/v1/hub-invitations/{invitationId}/accept` | Accepts a hub invitation. Admin-created invitations activate membership immediately; member-created invitations become pending admin approval. | `docs/api/routes/hub-invitations-accept.md` |
| `POST /api/v1/hub-invitations/{invitationId}/decline` | Declines a hub invitation and removes the dark hub from the invited user's hubs screen. | `docs/api/routes/hub-invitations-decline.md` |
| `POST /api/v1/hub-invite-links/{token}/join-requests` | Creates a pending admin-approval request from an invite link. | `docs/api/routes/hub-invite-links-join-requests-create.md` |
| `POST /api/v1/posts` | Creates an original post with optional `article`, optional `thoughtText`, optional slider, and explicit visibility. | `docs/api/routes/posts-create.md` |
| `POST /api/v1/hubs/{hubId}/discussions/{discussionId}/messages` | Creates a message in a private hub discussion tied to a post, optionally as a one-level reply. | `docs/api/routes/hubs-discussion-messages-create.md` |
| `POST /api/v1/posts/{postId}/comments` | Creates a public-username comment, optionally as a one-level reply; rejects `private_locked_hub` posts. | `docs/api/routes/posts-comments-create.md` |
| `POST /api/v1/posts/{postId}/reposts` | Creates a repost with new thought and/or slider content and notifies the original post owner when reposter is not the owner. | `docs/api/routes/posts-repost-create.md` |
| `POST /api/v1/posts/{postId}/share/feed` | Shares an existing post or repost to the current user's feed without creating a new post frame. | `docs/api/routes/posts-share-feed-create.md` |
| `POST /api/v1/posts/{postId}/share/hubs` | Shares an existing post into one or more hubs internally without creating a new post frame. Private locked hub posts cannot be shared onward. | `docs/api/routes/posts-share-hubs-create.md` |
| `POST /api/v1/posts/{postId}/vote` | Casts a registered user's one-time slider vote and stores only vote receipts without the selected position. Phone confirmation is not required for a public vote. | `docs/api/routes/posts-vote-create.md` |
| `POST /api/v1/reports/hubs/{hubId}` | Reports a hub for moderation. | `docs/api/routes/reports-hub-create.md` |
| `POST /api/v1/reports/posts/{postId}` | Reports a post for moderation review. | `docs/api/routes/reports-post-create.md` |
| `POST /api/v1/reports/users/{userId}` | Reports a user profile for moderation review. | `docs/api/routes/reports-user-create.md` |
| `POST /api/v1/uploads/complete` | Finalizes a previously presigned upload after the client successfully PUTs the file to GCS. Validates object existence and returns a reusable file asset ID. | `docs/api/routes/uploads-complete.md` |
| `POST /api/v1/uploads/presign` | Generates a short-lived V4 signed URL so the mobile app uploads binary data directly to GCS (not through Cloud Run). Supports user profile images, hub images, and PDFs. | `docs/api/routes/uploads-presign.md` |
| `POST /api/v1/users/{userId}/block` | Blocks a user. Blocked users cannot interact with current user content or profile. | `docs/api/routes/users-block-create.md` |
| `POST /api/v1/users/{userId}/follow` | Creates a follow relationship and notifies the followed user. | `docs/api/routes/users-follow-create.md` |
| `PUT /api/v1/users/me/onboarding/media` | Optionally attaches an uploaded profile photo to the user account and completes onboarding. | `docs/api/routes/users-me-onboarding-media.md` |
| `PUT /api/v1/users/me/onboarding/profile-basics` | Saves required public-profile basics and terms approval, optionally before phone confirmation. | `docs/api/routes/users-me-onboarding-profile-basics.md` |
| `PUT /api/v1/users/me/onboarding/contacts` | Records the one-time successful on-device contact-access acknowledgement that advances a phone-confirmed user to Hub-ready. | `docs/api/routes/users-me-onboarding-contacts.md` |
