Docs·2ac88ac·Updated Apr 9, 2026·48 ADRs

API Reference

164 endpoints across 9 services.

Auth Service:300116 endpoints
POST
/register

Register a new user account.

POST
/login

Authenticate user and receive JWT token.

GET
/verify

Verify JWT token and return user info.

GET
/users/:id

Get user profile by ID.

PUT
/users/:id

Update user profile.

GET
/preferences/request-types

Get user's request type subscriptions (v9.0).

POST
/preferences/request-types

Update a single request type subscription.

PUT
/preferences/request-types/bulk

Bulk update request type subscriptions.

GET
/preferences/interests

Get user's interest categories (service_category, item_category, event_type).

POST
/preferences/interests

Add a new interest.

DELETE
/preferences/interests/:id

Remove an interest.

GET
/preferences/feed (ADR-022)

Get user's feed visibility preferences for multi-tier feed.

PUT
/preferences/feed (ADR-022)

Update user's feed visibility preferences.

POST
/auth/push-tokens

Register an Expo push token for the authenticated user (Sprint 41).

DELETE
/auth/push-tokens

Remove an Expo push token for the authenticated user (Sprint 41).

GET
/health

Service health check.

Community Service:300236 endpoints
GET
/communities

Get all communities with optional filters.

GET
/communities/tags

Return all distinct tags in use across active communities (Sprint 36).

PUT
/communities/:id/tags

Update community interest tags (admin only, Sprint 36). Tags are normalized to lowercase and deduplicated.

PUT
/communities/:id/location

Update community geographic coordinates (admin only, Sprint 36). Enables geography-mode discovery and distance sorting.

GET
/communities/my/communities

Get communities the user is a member of.

GET
/communities/:id

Get specific community with all members.

POST
/communities

Create new community.

PUT
/communities/:id

Update community details (admin only).

DELETE
/communities/:id

Archive community (admin only, soft delete).

GET
/communities/:communityId/members

Get all members of a community.

POST
/communities/:communityId/join

Join a community (public: immediate, private: pending approval).

POST
/communities/:communityId/members

Add member to community (invite).

PUT
/communities/:communityId/members/:userId

Update member role or status.

DELETE
/communities/:communityId/members/:userId

Remove member from community (self-leave or admin kick).

GET
/communities/:communityId/norms

Get all norms for a community.

GET
/communities/:communityId/norms/:normId

Get specific norm with all approvals.

POST
/communities/:communityId/norms

Propose a new community norm.

POST
/communities/:communityId/norms/:normId/approve

Approve a proposed norm (requires simple majority >50% of members).

DELETE
/communities/:communityId/norms/:normId

Archive a norm (admin or creator only).

GET
/communities/:id/config

Get community configuration.

PUT
/communities/:id/config

Update community configuration (founder only for Phase 1).

GET
/communities/config-templates

Browse available configuration templates.

POST
/communities/:id/config/copy-from/:source_community_id

Copy configuration from another community.

GET
/communities/configs/public

Browse configurations from thriving communities.

GET
/health

Service health check.

POST
/communities/:communityId/links

Propose a link from this community to another (admin-only). Creates a `pending` link awaiting approval by the other community's admin.

PUT
/communities/:communityId/links/:linkId

Approve a pending link (other community's admin), or update `trust_carry_factor`/`show_in_sister_feeds`. Use `action: "approve"` or `action: "deactivate"` in the body.

GET
/communities/:communityId/links

List all links involving this community. Optional `?status=pending|active|inactive` filter. Returns `partner_community_id` and `partner_community_name` for convenience.

DELETE
/communities/:communityId/links/:linkId

Remove a link (sets status to `inactive`). Either community's admin can do this.

GET
/communities/trust-questions

Returns active trust questionnaire questions with choices, ordered by `display_order`. Public endpoint — no auth required.

POST
/communities/trust-questions

Create a trust question. Platform admin only.

PUT
/communities/trust-questions/:id

Update question text, subtext, display_order, or active status. Platform admin only.

DELETE
/communities/trust-questions/:id

Deactivate a trust question (sets active=false). Platform admin only.

POST
/communities/trust-questions/:id/choices

Add a choice to a question. Platform admin only.

PUT
/communities/trust-questions/:id/choices/:choiceId

Update a choice's label, description, config_delta, or display_order. Platform admin only.

DELETE
/communities/trust-questions/:id/choices/:choiceId

Remove a choice permanently. Platform admin only.

Request Service:300358 endpoints
GET
/requests

Get all help requests with optional filters.

GET
/requests/matched/for-user

Get requests matching user's skills from their communities (skill-based matching algorithm).

GET
/requests/curated (v9.18 + ADR-048 Feed Ranking v2)

Get curated feed scored on 7 signals: skill match, trust distance, community relevance, urgency, requester trust, prior interaction, and recency. Response includes `priorInteractionScore` and `recenc

GET
/requests/:id

Get specific request details.

POST
/requests (v9.0 Polymorphic + ADR-022 Visibility)

Create new polymorphic help request (supports 5 types) with visibility scope.

PUT
/requests/:id

Update help request (requester only).

DELETE
/requests/:id

Cancel help request (requester only).

PUT
/requests/:id/privacy

Update privacy settings for a request (Social Karma v2.0).

PATCH
/requests/:id/admin-triage

Override request urgency and/or add a community-scoped admin note (Sprint 25).

POST
/requests/:id/boost

Boost a request for 48 hours, adding a +0.3 feed score bonus via the feed-service boost scoring rule (Sprint 36). Admin only.

DELETE
/requests/:id/boost

Remove an active boost from a request (Sprint 36). Admin only.

POST
/requests/:id/propose-match

Admin proposes a specific community member as a helper (Sprint 36). Creates a real `requests.matches` row with `status='proposed'`.

PATCH
/requests/:id/urgent

Toggle request urgency between `urgent` and `medium` (Sprint 36). Admin only.

GET
/offers

Get all help offers with optional filters.

GET
/offers/:id

Get specific offer details.

POST
/offers

Create new help offer.

PUT
/offers/:id/privacy

Update privacy settings for an offer (Social Karma v2.0).

GET
/matches

Get all matches with optional filters.

GET
/matches/:id

Get specific match details.

POST
/matches

Create a match between request and responder.

PUT
/matches/:id/complete

Two-phase match completion. Each party calls this independently; the match

GET
/requests/:id/offers

List pending provider offers on a specific help request. Requester only.

PUT
/requests/offers/:id/accept

Accept a pending provider offer. Creates a match between the requester and the provider.

PUT
/requests/offers/:id/decline

Decline a pending provider offer.

POST
/providers/offers

Submit a provider offer on an open help request.

GET
/providers/offers

List offers submitted by the authenticated provider.

PUT
/providers/offers/:id/withdraw

Withdraw a pending provider offer.

GET
/requests/:id/dibs-candidate

Returns the top-scored dibs candidate for a scheduled request. Returns `null` if no eligible candidate exists.

POST
/requests/:id/dibs

Send dibs to a specific provider. Only valid for scheduled requests.

PUT
/requests/dibs/:id/accept

Provider accepts dibs. Creates a `requests.matches` record directly and sets request status to `matched`.

PUT
/requests/dibs/:id/decline

Provider declines dibs. Reverts request status to `open` for public broadcast.

GET
/requests/dibs/pending-for-provider

Returns the authenticated provider's pending dibs records (status = `pending`).

POST
/requests/dibs/:id/expire

TEST-ONLY: Force-expire a dibs record regardless of `expires_at`. Sets status to `expired` and reverts request to `open`.

POST
/matches/:id/feedback

Submit interaction feedback for a completed match.

GET
/matches/:id/feedback

Get feedback for a match.

GET
/providers

List all provider profiles. Optional query param: service_type.

GET
/providers/my

Get the authenticated user's own provider profiles. Auth required.

GET
/providers/:id

Get a single provider profile by ID, including ride details if applicable.

POST
/providers

Create a provider profile for the authenticated user.

PUT
/providers/:id

Update a provider profile. Owner only.

DELETE
/providers/:id

Delete a provider profile. Owner only.

GET
/collectives

List all provider collectives. Optional query param: service_type.

GET
/collectives/my

Get collectives the authenticated user belongs to (via their provider profiles). Auth required.

GET
/collectives/:id

Get a collective with members and communities served.

POST
/collectives

Create a new provider collective.

PUT
/collectives/:id

Update a collective. Collective admin only.

DELETE
/collectives/:id

Delete a collective. Collective admin only.

POST
/collectives/:id/members

Join a collective as a member.

DELETE
/collectives/:id/members/:providerId

Remove a member from a collective. Collective admin only.

POST
/collectives/:id/communities

Link a collective to a community.

DELETE
/collectives/:id/communities/:communityId

Unlink a collective from a community. Auth: collective admin OR community admin (Sprint 26).

GET
/collectives/:id/stats

Returns aggregate performance stats for a collective: `total_requests_matched`, `fulfillment_rate`, `avg_completion_hours` (null if no completed matches), `communities_served_count`, `available_membe

PATCH
/providers/:providerId/availability

Toggle a provider's availability status. Body: `{ is_available: boolean }`. Auth: owner only (provider_profiles.user_id must match JWT userId). Returns `{ id, is_available }`. (Sprint 26)

GET
/requests/providers/:providerId/rate-cards

List active rate cards for a provider (public). Owner can pass `?include_inactive=true` to include deactivated cards.

POST
/requests/providers/:providerId/rate-cards

Create a new rate card for a provider. Auth: owner only. Body: `{ label, pricing_model, rate_amount?, rate_unit?, currency?, notes? }`.

PUT
/requests/providers/:providerId/rate-cards/:cardId

Update an existing rate card. Auth: owner only.

DELETE
/requests/providers/:providerId/rate-cards/:cardId

Soft-delete a rate card — sets `is_active = false`. Auth: owner only. Card remains in database for historical reference.

GET
/health

Service health check.

Reputation Service:300424 endpoints
GET
/reputation/karma/:userId

Get user's total karma across all communities.

GET
/reputation/trust/:userId

Get user's overall trust score — weighted average across all communities, weighted by recent interaction count.

GET
/reputation/trust/:userId/:communityId

Get user's trust score in a specific community.

GET
/reputation/leaderboard/:communityId

Get top karma earners in a community.

GET
/reputation/history/:userId

Get karma transaction history for a user.

GET
/reputation/users/:userId/badges

Get all prestige badges earned by a user (public). Phase 1 badge types: `first_helper`, `milestone_10`, `milestone_50`, `milestone_100`, `connector`.

GET
/reputation/community-health/:communityId

Get community health metrics and trends.

GET
/reputation/milestones/:communityId

Get community milestone achievements.

GET
/reputation/trust/:userId/:communityId

Enhanced trust score with interaction quality (UPDATED).

GET
/reputation/network-metrics/:communityId

Get the network cohesion score for a community (ADR-045). Four graph topology metrics — reciprocity, density, clustering coefficient, and path score — over a rolling 90-day window.

GET
/reputation/community-trust/:communityId

Get the community trust score (ADR-040). Computed daily; recalculates on demand if no score exists yet.

POST
/reputation/feedback (Authenticated)

Submit a private quality rating after a completed interaction. Ratings are internal trust signals — never exposed to users (ADR-036).

GET
/health

Service health check.

GET
/reputation/trust-config/:userId/:communityId

Get user trust config and effective parameters (merged community defaults + per-user overrides).

PUT
/reputation/trust-config/:userId/:communityId

Toggle `evolution_enabled` for a user in a community (user or admin).

GET
/reputation/trust-config/:userId/:communityId/history

Return the immutable evolution log for a user — every parameter adjustment with trigger signal and event ID.

GET
/reputation/communities/:communityId/trust-evolution

Get community-level evolution status (admin only). Returns whether evolution is enabled and the community cross_community_prior.

PUT
/reputation/communities/:communityId/trust-evolution

Toggle community evolution on/off (admin only).

GET
/reputation/community/:communityId/evolution/history

Admin — paginated community evolution log showing parameter changes over time.

GET
/reputation/community/:communityId/evolution/summary

Admin — drift summary: first evolution date, evolved parameter count, last contributing member count.

PUT
/reputation/community/:communityId/evolution/toggle

Admin — enable/disable community evolution engine. Body: `{ "enabled": boolean }`.

GET
/reputation/users/:userId/effective-params?communityId=

Returns blended trust params from Redis cache (4h TTL), falls back to DB on cache miss. Auth: self only.

GET
/reputation/users/:userId/evolution-global

Returns the user's global evolution opt-in preference. Missing row = true (default opt-in). Auth: self only.

PUT
/reputation/users/:userId/evolution-global

Set global evolution enabled/disabled for the user. Body: `{ "global_evolution_enabled": boolean }`. Auth: self only.

Notification Service:300510 endpoints
GET
/notifications/stream/:userId

Server-Sent Events (SSE) endpoint for real-time notifications.

GET
/notifications/:userId

Get user's notifications (paginated).

GET
/notifications/:userId/unread-count

Get count of unread notifications.

PUT
/notifications/:notificationId/read

Mark specific notification as read.

PUT
/notifications/:userId/read-all

Mark all notifications as read for a user.

DELETE
/notifications/:notificationId

Delete a notification.

GET
/notifications/:userId/preferences

Get user's notification preferences.

PUT
/notifications/:userId/preferences

Update user's global notification preferences.

POST
/notifications/push/send (internal)

Send Expo push notifications to a list of users. Internal use only (called by event handlers within the notification service itself, not exposed publicly).

GET
/health

Service health check.

Messaging Service:30064 endpoints
GET
/messages/conversations/:userId

Get all conversations for a user.

GET
/messages/:conversationId

Get all messages in a conversation (paginated).

POST
/messages

Create new conversation (usually auto-created when match occurs).

POST
/messages/:conversationId/mark-read

Mark all messages in conversation as read.

Feed Service:30074 endpoints
GET
/feed

Get personalized feed for user.

POST
/feed/dismiss

Dismiss item from feed.

GET
/feed/preferences

Get user's feed preferences.

PUT
/feed/preferences

Update feed preferences.

Geocoding Service:30095 endpoints
GET
/health

Health check endpoint.

GET
/search?q={query}

Search for geocoded addresses. Returns cached results if available, otherwise calls Nominatim API and caches the result.

POST
/cache

Manually cache a geocoding result (used by frontend for fire-and-forget caching).

GET
/stats

Get cache statistics and analytics.

POST
/cleanup

Remove expired cache entries (older than 30 days).

Social Graph Service:30107 endpoints
POST
/invitations/generate

Generate a new invitation code for current user.

POST
/invitations/accept

Accept an invitation code during user signup.

GET
/invitations

Get invitation history for current user.

GET
/invitations/stats

Get inviter statistics for current user (gamification metrics).

GET
/paths/:targetUserId

Get shortest path between current user and target user.

POST
/paths/batch

Get paths for multiple target users (optimized for feed ranking).

GET
/network

Get the current user's local network graph from the materialized connections table.