Skip to content

Endpoint Reference

The full HTTP surface, grouped by domain. Paths omit the /api/v1 prefix unless noted. This mirrors the router assembled in backend/internal/wiring/router.go and each domain's routes.go under backend/internal/services/<domain>/; those files are authoritative.

For request/response bodies use Swagger / OpenAPI. For the error shape, status codes, and pagination see Conventions.

Auth column legend

Value Meaning
Public No token. Rate-limited per IP; some verify a provider signature.
Optional OptionalJWTAuth: works signed-out, adds viewer-relative fields when a token is present.
JWT JWTAuth: valid bearer token required.
Admin JWT + access.Require(access.TomodaAdmin) (account_type=tomoda, role=admin).
Member / Partner admin / Partner owner JWT + per-partner membership gate (backend/internal/access/partner.go).

Auth

/auth, plus provider webhooks on the API root. Detail: Auth service.

Method Path Auth Behavior
POST /auth/register Public Email/password signup
POST /auth/login Public Email/password login
POST /auth/google-login Public Google OAuth exchange
POST /auth/line-login Public LINE OAuth exchange
POST /auth/apple-login Public Apple OAuth exchange
POST /auth/refresh Public Rotate access token from a refresh token
POST /auth/logout Public Revoke the current session
POST /auth/webauthn/login/begin Public Passkey login challenge
POST /auth/webauthn/login/finish Public Passkey login assertion
POST /auth/reset-password Public Finish an OTP-verified password reset
POST /auth/otp/send Public Send a one-time code
POST /auth/otp/verify Public Verify a one-time code
POST /auth/apple/notifications Public (Apple-signed) Subscription/state webhook
GET /.well-known/webauthn Public (root path) WebAuthn related-origin manifest
GET /auth/profile JWT Current user
PATCH /auth/profile JWT Edit profile fields
DELETE /auth/profile JWT Delete account
POST /auth/phone JWT Set/verify phone
POST /auth/email/change JWT Start OTP email change
POST /auth/email/change/confirm JWT Confirm email change
GET /auth/sessions JWT List active sessions
DELETE /auth/sessions/all JWT Sign out everywhere
DELETE /auth/sessions/:id JWT Revoke one session
GET /auth/login-history JWT Recent logins
PUT /auth/profile/password JWT Change password
PUT /auth/profile/name JWT Change display name
PUT /auth/profile/username JWT Change handle
POST /auth/user/webhook/test JWT Fire a test webhook delivery
POST /auth/webauthn/register/begin JWT Enroll a passkey (challenge)
POST /auth/webauthn/register/finish JWT Enroll a passkey (attestation)
POST /auth/api-keys JWT Mint an API key
GET /auth/api-keys JWT List API keys
DELETE /auth/api-keys/:id JWT Revoke an API key
PUT /users/me/avatar JWT Set avatar from an uploaded storage key
DELETE /users/me/avatar JWT Clear avatar

User

Lean identity card only; the full aggregated profile lives under Discovery. Detail: User service.

Method Path Auth Behavior
GET /users/:userId JWT Lean user card (id, name, username, avatar_url, bio, is_friend)

Discovery

The query/read-aggregation surface: spatial reads, search, taxonomy, the saved-area pin, and the full profile card. Detail: Discovery service.

Method Path Auth Behavior
GET /discovery/profiles/:id Optional Full aggregated user profile card
GET /discovery/map JWT Viewport markers
GET /discovery/radar JWT Nearby-people radar
GET /discovery/locations/:id JWT Location map-card detail
GET /discovery/search JWT Unified NL intent, resolves to events + locations
GET /discovery/search/events JWT Event search near the pin
GET /discovery/search/locations JWT Place search near the pin
GET /discovery/search/users JWT User search
GET /discovery/pin JWT Read the saved area/location pin
PUT /discovery/pin JWT Set the saved area/location pin
GET /discovery/taxonomy JWT Taxonomy vocabulary
GET /discovery/taxonomy/resolve JWT Resolve free text to taxonomy terms

Location

Place search and geocoding. Detail: Locations service.

Method Path Auth Behavior
GET /locations/nearby JWT Places near a point
GET /locations/nearby/autocomplete JWT Typeahead place search (kinds allowlist)
GET /locations/reverse JWT Coordinates to city
GET /locations/countries JWT Country reference list
GET /locations/countries/:code JWT One country by ISO code
POST /locations/resolve JWT Resolve a picked place to a Location
POST /locations/:id/report-outdated JWT Flag stale place data

Maps

Map cards plus per-user personalization. Detail: Discovery service.

Method Path Auth Behavior
GET /map/location/:id Optional Location map card
GET /map/event/:id Optional Event map card
POST /map/location/:id/dismiss JWT Hide a place from my map
POST /map/location/:id/save JWT Bookmark a place
DELETE /map/location/:id/save JWT Remove a bookmark

Event

/events plus shareable public pages. Detail: Events service.

Method Path Auth Behavior
GET /events/:id Optional Shareable detail (privileged fields for host/participants)
GET /events/:id/public Public Sanitized public payload
GET /share/events/:id Public OG/share landing page
GET /events/timezone JWT Resolve a venue's timezone
GET /events/search JWT Taxonomy-aware event search
POST /events JWT Create an event
GET /events JWT List (ranked feed)
GET /events/:id/detail JWT Viewer-projected detail
GET /events/:id/items JWT Read-only board snapshot (taken at plan promotion)
PATCH /events/:id JWT Edit an event
DELETE /events/:id JWT Delete an event
POST /events/:id/join JWT Join
GET /events/:id/participants JWT Roster
POST /events/:id/participants/:userId/approve JWT Host approves a participant
DELETE /events/:id/participants/:userId JWT Remove a participant
POST /events/:id/start JWT Start early
POST /events/:id/cancel JWT Cancel
POST /events/:id/transfer-ownership JWT Hand off ownership
POST /events/:id/messages JWT Send an event-chat message
GET /events/:id/messages JWT Event-chat history
GET /events/active/nearby JWT Proximity poll for the dock check-in button
POST /events/:id/checkin JWT Explicit arrival check-in
GET /users/:userId/events JWT A user's visible events

Plan

Plan canvas and item board. Detail: Plans service.

Method Path Auth Behavior
POST /plans JWT Create a plan
GET /plans JWT List the caller's plans
GET /plans/:id JWT Plan detail
PATCH /plans/:id JWT Edit plan fields
DELETE /plans/:id JWT Delete (owner)
POST /plans/:id/leave JWT Leave a shared plan
POST /plans/:id/archive JWT Archive
POST /plans/:id/restore JWT Unarchive
GET /plans/:id/place-cards JWT Grouped place cards
PUT /plans/:id/place-cards/:plid/vote JWT Vote for the leading place
PUT /plans/:id/rsvp JWT Set attendance intent
POST /plans/:id/promote JWT Promote the plan to an event
GET /plans/:id/poll JWT Read the when-poll
POST /plans/:id/poll/options JWT Propose a day/time option
PUT /plans/:id/poll/:axis JWT Vote on the day or time axis
GET /plans/:id/members JWT Roster
POST /plans/:id/members JWT Add a collaborator
DELETE /plans/:id/members/:userId JWT Remove a collaborator
POST /plans/:id/share-link JWT Mint a join link
POST /plans/join/:token JWT Join via a link token
POST /items JWT Capture an item
POST /items/save-location JWT Save a found place to stash/plan
GET /items JWT List stash/plan items
GET /items/badge JWT Needs-triage badge count
GET /items/locations JWT Distinct locations for the picker
GET /items/:id JWT Item detail
PATCH /items/:id JWT Edit an item
DELETE /items/:id JWT Delete an item
POST /items/:id/triage JWT Resolve the "is this X?" prompt
POST /items/:id/copy JWT Duplicate into another plan/stash
POST /items/:id/create-plan JWT Spin a plan off an item
POST /items/:id/dismiss JWT Hide from the stash
POST /items/:id/restore JWT Un-dismiss
DELETE /items/:id/links/:linkId JWT Remove a link child
DELETE /items/:id/typed-links JWT Clear a resolved typed link
POST /items/:id/reparse JWT Re-run the parse pipeline
POST /items/:id/photos JWT Attach a photo
DELETE /items/:id/photos/:photoId JWT Remove a photo
GET /items/:id/notes JWT List notes
POST /items/:id/notes JWT Add a note
DELETE /items/:id/notes/:noteId JWT Delete a note
GET /users/:userId/plans JWT A user's visible plans

Friend

Friendship graph, close friends, and friend location sharing. Detail: Friends service.

Method Path Auth Behavior
POST /friends/request JWT Send a friend request
POST /friends/accept JWT Accept a request
POST /friends/reject JWT Reject/cancel a request
DELETE /friends/:id JWT Unfriend
GET /friends JWT List friends
GET /friends/requests JWT Incoming pending
GET /friends/sent JWT Outgoing pending
GET /friends/close JWT List close friends
POST /friends/:id/close JWT Add a close friend
DELETE /friends/:id/close JWT Remove a close friend
POST /location/update JWT Publish my coordinates to friends
GET /location/friends JWT Read where my friends are

Presence

App-wide presence and check-ins. Detail: Presence service.

Method Path Auth Behavior
POST /presence/heartbeat JWT Keep-alive ping
POST /presence/active/start JWT Begin sharing live location
POST /presence/active/stop JWT Stop sharing
GET /presence/active/status JWT Current sharing state
POST /checkins JWT Create a check-in (companion tagging friend-gated, 6h throttle per place)
GET /checkins/me JWT My check-ins
GET /checkins/recent JWT Recent check-ins
GET /checkins/:id JWT Check-in detail
DELETE /checkins/:id/companions/:userID JWT Untag a companion

Chat

REST resources; real-time transport is the /ws group below. Detail: Chat service.

Method Path Auth Behavior
GET /chats JWT List chats
GET /chats/unread_total JWT Total unread count
GET /chats/search JWT Search chats
GET /chats/:id JWT Chat by id
GET /chats/dm/:userId JWT Open-or-create a 1:1 chat
POST /chats/group JWT Create a group chat
GET /chats/:id/settings JWT Chat settings
PATCH /chats/:id JWT Rename/update chat
POST /chats/:id/members JWT Add a member
DELETE /chats/:id/members/:userId JWT Remove a member
PATCH /chats/:id/nickname JWT Set my per-chat nickname
PATCH /chats/:id/mute JWT Mute/unmute
PUT /chats/:id/avatar JWT Set the group avatar
GET /chats/:id/messages JWT Message history (cursor)
GET /chats/:id/messages/search JWT Search messages
POST /chats/:id/messages JWT Send a message
POST /chats/:id/read JWT Mark read
POST /chats/:id/messages/:messageId/react JWT React to a message

Moment

Ephemeral shares. Detail: Moments service.

Method Path Auth Behavior
POST /moments JWT Create (with the pre-uploaded AssetKey)
GET /moments/:id JWT Detail
POST /moments/:id/like JWT Like/unlike
DELETE /moments/:id/tags/:userID JWT Remove a tagged companion
DELETE /moments/:id JWT Delete (creator only)
PATCH /moments/:id/visibility JWT Change audience
PATCH /moments/:id/my-tag-visibility JWT Hide my tag from my own feed

Notification

Inbox and push tokens. Detail: Notifications service.

Method Path Auth Behavior
GET /notifications JWT Inbox (cursor)
GET /notifications/unread JWT Unread count
POST /notifications/seen JWT Mark seen up to a cursor
POST /push-tokens JWT Register a device push token
DELETE /push-tokens JWT Drop a device push token

Media

Presigned upload starters, the link-preview proxy, and the GIF/sticker proxy. Detail: Media and Link capture.

Method Path Auth Behavior
POST /uploads/avatar JWT Presigned avatar upload
POST /uploads/group-avatar JWT Presigned group-avatar upload
POST /uploads/chat-image JWT Presigned chat-image upload
POST /uploads/chat-image/batch JWT Presigned batch chat-image upload
POST /uploads/moment JWT Presigned moment upload
POST /uploads/item-image JWT Presigned item-image upload
POST /uploads/event-cover JWT Presigned event-cover upload
POST /uploads/plan-cover JWT Presigned plan-cover upload
GET /link-preview JWT SSRF-protected, cached link preview
GET /klipy/:type/search JWT GIF/sticker search proxy
GET /klipy/:type/trending JWT Trending GIF/sticker proxy
POST /klipy/:type/share/:slug JWT Share-tracking proxy

Payment

Stripe billing plus the webhook. Detail: Payments service.

Method Path Auth Behavior
POST /payment/webhook Public (Stripe-signed) Stripe webhook
POST /auth/payment/create-checkout-session JWT Start a Stripe Checkout session
POST /auth/payment/create-portal-session JWT Open the billing portal

Admin

Console and async operations. Detail: Admin service.

Method Path Auth Behavior
GET /admin/stats/system Admin System-wide counters
GET /admin/stats/users Admin User growth stats
GET /admin/stats/daily Admin Daily activity series
GET /admin/users Admin Paginated user directory
PATCH /admin/users/:id/status Admin Ban/suspend/activate
PATCH /admin/users/:id/subscription Admin Override plan
POST /admin/locations/merge Admin Merge duplicate places
GET /admin/async/queues Admin Asynq queue overview
GET /admin/async/queues/:queue/archived Admin Dead/archived tasks
POST /admin/async/queues/:queue/archived/:id/run Admin Requeue one task
DELETE /admin/async/queues/:queue/archived/:id Admin Drop one task
POST /admin/async/queues/:queue/archived/run-all Admin Requeue all archived
POST /admin/async/s3-orphan-sweep Admin Sweep orphaned object-storage keys
POST /admin/async/replay/challenge/:id Admin Re-evaluate a challenge
POST /admin/async/replay/stamp/:id Admin Re-evaluate a stamp

Partner

Multi-tenant partner scoping. Detail: Partner service.

Method Path Auth Behavior
POST /partners JWT Create a partner (caller becomes owner)
GET /me/partners JWT Partners I belong to
GET /partner/:partner_id Member Partner detail
GET /partner/:partner_id/members Member Roster
PATCH /partner/:partner_id Partner admin Edit partner
POST /partner/:partner_id/members Partner admin Invite a member
PATCH /partner/:partner_id/members/:user_id Partner admin Change a member's role
DELETE /partner/:partner_id/members/:user_id Partner admin Remove a member
DELETE /partner/:partner_id Partner owner Delete the partner

WebSocket and ops (not under /api/v1)

Method Path Auth Behavior
GET /ws/chats/:id JWT Per-chat SessionHub socket
GET /ws/client JWT Per-user ClientHub socket (notifications, presence, profile sync)
GET /health Public Liveness probe
GET /metrics Public Prometheus metrics (when observability.metrics is on)
GET /swagger/*any Public (non-prod) Swagger UI

Domains without an HTTP surface

content, gameengine, and passport expose no routes. They are read/written by other domains (the game engine reads content and writes passport state), so they never appear in this table.