ZoomProp

PRD

PRD

Last updated 5/3/2026

ZoomProp AI Platform — Progressive Product Requirements Document


PRD Metadata

FieldValue
Product NameZoomProp AI Platform
Repositoryzoomprop/zp-alpha
PRD Versionv1.0 (Growth)
Document StatusActive
Package Version0.1.0
Last Commit08ce25f — Merge PR #460 (taha/fixes-2.0)
Primary StackNext.js 15 (Turbopack), TypeScript, Vercel AI SDK, LangChain/LangGraph, Elasticsearch, Clerk, Mapbox GL, Radix UI
Auth ProviderClerk (@clerk/nextjs ^6.23.1)
AI LayerOpenAI via @ai-sdk/openai ^2.0.30 + LangChain @langchain/langgraph ^0.3.5
NotificationsKnock (@knocklabs/react ^0.7.25)
MapsMapbox GL Draw + Google Maps JS API Loader
Test FrameworksVitest (unit), Playwright (E2E), pytest (API integration)
CI/CDGitHub Actions — pr-checks.yml, test.yml, test-coverage.yml, alert-testing.yml
Infrastructure Files19 (.github/ workflows + zp-fetch-service/Dockerfile)

v0.1 Spark — Problem & Outcomes

Problem Statement

Real estate investors and operators are drowning in fragmented data. Property listings, market analytics, portfolio financials, cap rate calculations, inspection reports, and offer negotiations live in separate, disconnected tools. A professional investor managing ten or more properties simultaneously must context-switch between Zillow for comps, spreadsheets for cap rates, email for offer negotiations, and generic CRMs for deal pipelines. None of these tools understand real estate investment intent, and none surface AI-driven insight at the moment of decision.

ZoomProp solves the vertical integration problem: it unifies property discovery, AI-powered financial analysis, portfolio management, deal pipeline automation, and intelligent alerting into a single collaborative workspace built specifically for real estate investment professionals.

Desired Outcomes

IDOutcomeMeasurement Signal
BR-001Reduce time-to-cap-rate from listing discovery to actionable numberCap rate computed in < 30 seconds from property load
BR-002Enable AI-assisted offer and inspection analysis/api/ai/offer-analysis and /api/ai/property-inspection-analysis called per deal
BR-003Surface market intelligence proactively via alertsAlert trigger rate and click-through from /api/alerts/trigger
BR-004Support collaborative deal evaluation across investment teamsOrg-level multi-user sessions via Clerk organizations
BR-005Reduce analyst workload through AI chat for portfolio queriesChat session volume via /api/ai/conversations
BR-006Enable co-investment deal syndication workflowsCo-investment onboarding step captured at billing-setup-step.tsx
BR-007Provide geographic market discovery with visual map toolingMapbox GL Draw polygon search session completion rate

Constraints

IDConstraintRationale
TECH-001TypeScript strict mode enabled; build errors suppressed in next.config.tsignoreBuildErrors: true is a known technical debt item — strict TS enforcement is deferred to v1.1
TECH-002ESLint errors suppressed during production buildsignoreDuringBuilds: true — requires remediation before enterprise sales
TECH-003LangChain packages must be declared as serverExternalPackageslangchain, @langchain/core, @langchain/community excluded from Next.js bundler to prevent edge-runtime incompatibilities
TECH-004Image domains are allowlisted; Zillow, Redfin, Realtor.com, Google Maps, Cloudinary all includedDependency on third-party CDNs introduces availability risk
TECH-005Free-tier users receive a monthly query grantPR #455 (3a74c26) implements monthly free queries grant — monetization gate is live
TECH-006Mobile responsiveness is in-progressPR #396 (Taha/mobile fixes) remains open

v0.2 Market Definition — ICP & Segments

Ideal Customer Profile

ZoomProp targets investment-oriented real estate professionals who evaluate multiple deals per month, manage active portfolios, and operate within structured investment entities (LLCs, funds, syndicates). The platform is not a consumer home-search tool.

Segment Table

SegmentDescriptionOnboarding SignalPrimary Features Used
SEG-001: Independent Rental InvestorsIndividual operators with 1–20 residential units, self-managedportfolio-count-step.tsx — selects 1–20 unitsCap rate calculator, property alerts, AI chat for deal screening
SEG-002: Boutique SyndicatorsSmall GP/LP structures raising capital for 1–5 deals per yearco-investment-step.tsx present in onboardingCo-investment workflows, identity verification (identity-verification-step.tsx), offer analysis
SEG-003: Real Estate Investment FirmsMulti-member organizations with analyst teams, 20+ units AUMClerk organization creation (sign-up/organization/page.tsx)Portfolio analytics, automation board config, commercial analysis, multi-persona AI
SEG-004: Commercial OperatorsOffice, retail, or mixed-use property managers evaluating NNN/gross lease assetsGeographic focus + commercial-analysis API usage/api/ai/commercial-analysis, /api/ai/commercial-estimates, performance monitoring
SEG-005: Lenders & UnderwritersCapital providers evaluating loan requests against property dataLegacy lenderCriteria, loanRequests routes in archiveMarket analytics, property investigation analysis, AI-driven risk scoring

"Not For" (Explicit Exclusions)

  • First-time homebuyers seeking a primary residence — no mortgage rate comparison, school district lookup, or buyer-agent matching.
  • Retail consumers expecting a Zillow-like browse experience without investment intent.
  • Property managers focused purely on tenant relations, rent collection, or maintenance ticketing (no tenant portal, no payment processing).
  • Wholesale flippers requiring rapid MLS pull-and-push without financial modeling depth.
  • International markets — image CDN allowlist, address search, and demographic data are US-centric.

v0.3 Commercial Model — Pricing & Positioning

Monetization Architecture

ZoomProp operates a SaaS subscription model with a freemium entry tier, evidenced by:

  1. Free monthly query grant — PR #455 (3a74c26) adds a monthly free queries grant API and context integration for unpaid users, establishing a hard consumption gate before upgrade prompts.
  2. Embedded Stripe checkout in onboardingbilling-setup-step.tsx and embedded-checkout.tsx present in src/app/(auth)/onboarding/_components/steps/. Legacy archive contains create-subscription/route.ts, create-checkout-session/route.ts, create-portal-session/route.ts, and stripe/webhook/route.ts, confirming Stripe is the billing processor.
  3. Subscription verification gate — Legacy check-org-subscription/route.ts confirms org-level subscription checks at request time.
  4. Organization-tier upsell — Clerk organizations (sign-up/organization/page.tsx) are gated behind a paid plan enabling multi-member collaboration and shared portfolio visibility.

Pricing Tiers (Inferred)

TierTargetCapabilitiesGate Mechanism
FreeIndividual investors exploring the platformLimited AI queries per month (monthly grant), single-user, read-only alertsMonthly query counter; upgrade prompt on exhaustion
ProSEG-001 independent investorsUnlimited AI queries, full alert configuration, collections, watchlist, property investigationStripe subscription — individual plan
Team / OrgSEG-002 syndicators, SEG-003 firmsMulti-member Clerk org, shared portfolio, automation board, co-investment workflows, persona managementStripe org-level subscription + Clerk organization creation
EnterpriseSEG-004 commercial operators, SEG-005 lendersCommercial analysis APIs, identity verification, business verification (Middesk in archive), Plaid asset verificationCustom contract + Middesk + Plaid integration

Moat Thesis

ZoomProp's defensibility rests on three compounding layers:

  1. Proprietary AI context — The LangGraph-orchestrated multi-agent system (@langchain/langgraph) builds an investment-context graph per user (portfolio, watchlist, search history, geographic focus). This context is captured at onboarding (platform-goals-step.tsx, investment-interests-step.tsx, geographic-focus-step.tsx) and persisted, making AI responses more accurate the longer a user is on the platform.
  2. Elasticsearch property index@elastic/elasticsearch ^8.18.2 powers sub-second property search with investment-intent query parsing, a capability consumer portals don't optimize for.
  3. Network effects within organizations — Shared deal pipelines, alert assignments (/api/alert-filters/assignments), and collaborative AI conversations create switching costs for investment teams as institutional knowledge accumulates on the platform.

v0.4 User Journeys

UJ-001: New Investor Onboarding

Actor: First-time registrant (SEG-001 or SEG-002) Entry: src/app/(auth)/sign-up/[[...sign-up]]/page.tsx

  1. User completes Clerk sign-up (email + password or OAuth).
  2. Redirected to src/app/(auth)/onboarding/page.tsx — onboarding wizard initiates.
  3. onboarding-wizard.tsx steps through: property-ownership-stepportfolio-count-stepplatform-goals-stepinvestment-interests-stepgeographic-focus-stepco-investment-stepportfolio-setup-stepidentity-verification-stepbilling-setup-steponboarding-summary-step.
  4. billing-setup-step.tsx triggers Stripe embedded checkout (embedded-checkout.tsx) for Pro/Org upgrade; free users pass through.
  5. Progress tracked via progress-indicator.tsx and top-progress-indicator.tsx.
  6. Completion lands on src/app/(auth)/onboarding/complete/page.tsx then success/page.tsx.
  7. Auth redirect handled at src/app/(auth)/auth/redirect/page.tsx.

Success Metric: Onboarding funnel completion rate to success/page.tsx.


Actor: Authenticated investor (any segment) Entry: Dashboard → Discover page

  1. User opens the Discover map view powered by Mapbox GL Draw (@mapbox/mapbox-gl-draw).
  2. User draws a polygon or selects a region; Elasticsearch address/region search (archive/legacy-api-backup/elastic-search/) returns matching properties.
  3. User applies sophisticated filters (price range, property type, min cap rate) — documented in context/SOPHISTICATED_PROPERTY_FILTERS_USAGE.md.
  4. AI intent detection fires via /api/ai/intent to classify the user's search goal and pre-populate relevant filters.
  5. AI suggestion prompts appear via /api/ai/suggestions; user selects a saved AI search template via /api/ai-search-templates.
  6. Properties render on map with cap rate overlays; user pins a property to collections or watchlist.

Success Metric: Search-to-property-detail click-through rate.


UJ-003: AI Chat — Deal Analysis Session

Actor: Pro or Org subscriber (SEG-001 through SEG-004) Entry: Chat interface (AI chat sidebar or full-screen shell)

  1. User opens a new conversation; system loads portfolio context via /api/ai/analysis pre-populating the LangGraph context window.
  2. User types or selects a quick-action prompt (e.g., "Analyze this property's cap rate against my portfolio average").
  3. /api/ai/chat streams a response using @ai-sdk/react streaming hooks with real-time token display.
  4. Multi-persona support (/api/ai/personas) allows switching between "Investment Analyst," "Market Scout," and "Due Diligence" personas depending on task.
  5. Conversation title auto-generated via /api/ai/generate-title; full history persisted to /api/ai/conversations.
  6. User can trigger a property investigation from chat via /api/actions/analyze-property-investigation.
  7. Free-tier users hitting monthly query limit receive an inline upgrade prompt (PR #455).

Success Metric: Messages per session, conversation-to-action conversion (watchlist add, alert create).


UJ-004: Cap Rate Calculation & Financial Analysis

Actor: Any authenticated investor Entry: Property detail page → Financial Analysis tab

  1. User views a property; system pre-fills constMonthlyRent from AI rent estimate (via /api/ai/commercial-estimates).
  2. CapRateBaseSchema (Zod) validates inputs: constVacancy (default 5%), constOperExpenses (default 30%), constResEstimate (default 5%), constClosingCosts (default 2%).
  3. User adjusts assumptions; cap rate recalculates client-side in real time against listPrice.
  4. User requests AI-enhanced offer analysis via /api/ai/offer-analysis, which factors in market comps and portfolio context.
  5. Maintenance cost projection generated via /api/ai/maintenance-analysis.
  6. Property inspection analysis available via /api/ai/property-inspection-analysis for properties with uploaded inspection documents.
  7. User saves analysis to a collection; alert can be set for price-drop events.

Success Metric: Cap rate calculation completion rate; downstream offer analysis API call rate.


UJ-005: Alert Configuration & Market Monitoring

Actor: Pro or Org subscriber Entry: Dashboard → Alerts section (src/app/(dashboard)/alerts/)

  1. User opens alert-center-dashboard.tsx showing active alerts, history, and delivery settings.
  2. User creates a new alert via alert-config-form.tsx, selecting scope (alert-scope-selector.tsx) — property-level, collection-level, or market-level.
  3. Filter criteria set via alert-filters.tsx; criteria assigned to properties via /api/alert-filters/assignments.
  4. Delivery preferences configured via alert-delivery-settings.tsx and persisted to /api/alerts/preferences.
  5. Alert triggers evaluated server-side via /api/alerts/trigger; delivery routed through Knock (@knocklabs/node) for in-app, email, and push notification.
  6. Alert history displayed in alert-history-timeline.tsx; bulk actions (archive/unarchive) available via /api/alerts/messages/archive and /api/alerts/messages/unarchive.
  7. Org-level alert user management via /api/alerts/users.

Success Metric: Alerts configured per active user; alert click-through rate to property action.


UJ-006: Portfolio Analytics & Performance Monitoring

Actor: SEG-002 syndicators, SEG-003 firms Entry: Dashboard → Analytics

  1. User views portfolio-level KPIs via /api/analytics/portfolio.
  2. Appreciation distribution chart rendered from /api/analytics/appreciation-distribution.
  3. Market comparison data loaded from /api/analytics/markets.
  4. Individual property performance tracked via /api/analytics/properties and /api/analytics/performance.
  5. AI performance monitoring report generated via /api/ai/performance-monitoring.
  6. Automation analytics reviewed via /api/automation/analytics; deal pipeline board configured via /api/automation/board-config.
  7. Dashboard summary aggregated via /api/analytics-dashboard.

Success Metric: Dashboard weekly active users; analytics API call volume per org.


UJ-007: Organization Setup & Team Collaboration

Actor: Deal principal (SEG-002, SEG-003) Entry: src/app/(auth)/sign-up/organization/page.tsx

  1. Principal creates a Clerk organization; subscription upgraded to Team/Org tier via /api/auth/active-org.
  2. Team members invited (legacy clerk/organization/invite route in archive).
  3. Business verification initiated via business-verification-form.tsx (Middesk integration in legacy archive).
  4. Shared portfolio, collections, and alert filters become visible across org members.
  5. AI persona assignments differentiated by role (analyst vs. principal) via /api/ai/personas.
  6. Active org session managed via /api/auth/active-org; session state via /api/auth/session.

Success Metric: Org-level multi-user activation rate; shared resource (alert, collection, portfolio) usage per org.


v0.5 Red Team Review

Risk Register

IDRiskCategoryLikelihoodImpactMitigation
RISK-001ignoreBuildErrors: true and ignoreDuringBuilds: true in next.config.ts allow broken TypeScript and ESLint code to reach productionTechnical DebtHighHighRemove both flags in a dedicated cleanup sprint; enforce tsc --noEmit as a required CI step in .github/workflows/pr-checks.yml
RISK-002OpenAI API key exposed as a server-side env var without explicit edge-runtime exclusion; LangChain server packages declared but ad-hoc key handling could leak in client bundlesSecurityMediumCriticalAudit all OPENAI_API_KEY references; enforce server-only imports in LangChain call sites; add secret scanning to pr-checks.yml
RISK-003Monthly free query grant (PR #455) is client-context-integrated — a determined user could manipulate client state to bypass the query gateSecurity / MonetizationMediumHighMove query counter enforcement to server-side middleware; validate against Clerk session claims, not client-supplied context
RISK-004Elasticsearch dependency (@elastic/elasticsearch ^8.18.2) with no visible connection pooling or circuit-breaker configuration in the current API routesInfrastructureMediumHighAdd connection health check to startup; implement circuit breaker in zp-fetch-service; expose health endpoint
RISK-005Third-party image CDN allowlist includes 20+ domains (Zillow, Redfin, Realtor.com); any CDN URL structure change breaks property images platform-wideExternal DependencyMediumMediumImplement image proxy through zp-fetch-service with fallback placeholder; cache images via Cloudinary
RISK-006PR #396 (mobile fixes) has been open with no merge signal; current UI is not mobile-responsive for a user base that increasingly does deal screening on mobileUXHighMediumEstablish a mobile-first breakpoint standard in context/DESIGN_SYSTEM.md; prioritize PR #396 merge
RISK-007LangGraph orchestration (@langchain/langgraph ^0.3.5) is early-stage; library breaking changes between minor versions could disrupt all AI analysis endpoints simultaneouslyDependencyMediumHighPin LangGraph at exact version in package.json; add integration test suite for all /api/ai/* routes against a fixed LangGraph version
RISK-008Clerk organizations and subscription state are managed across two systems (Clerk metadata + Stripe); desync between the two could grant or deny access incorrectlyBusiness LogicMediumHighImplement idempotent Stripe webhook handler with Clerk metadata sync; add reconciliation cron job
RISK-009archive/legacy-api-backup/ contains Plaid, Middesk, HelloSign, and financial transfer routes that may still be referenced by production code pathsSecurity / ComplianceLowCriticalAudit all imports from archive paths; ensure archived routes are unreachable in the production build; add lint rule blocking archive imports
RISK-010Test coverage CI (test-coverage.yml) exists but coverage thresholds are not visible in config; 86 test files against 500 total files implies significant untested surface areaQualityHighMediumDefine coverage thresholds in vitest.config.ts; require minimum 70% line coverage on src/lib/ and src/app/api/ before merge
RISK-011Theme persistence bug (PR #458 open) — use-theme not wired to custom ThemeProvider means user theme preference is lost on navigationUXHighLowMerge PR #458; add theme-audit-runner.ts (already scripted as theme:audit) to CI gate
RISK-012Co-investment and crowdfunding features (archive contains crowdfunding/projects/ routes) imply potential securities law exposure if syndication tooling is activated without proper disclosuresRegulatoryLowCriticalLegal review of co-investment onboarding step; add disclaimer flow before co-investment feature activation; consult securities counsel

v0.6 Architecture

System Architecture Overview

ZoomProp is a Next.js 15 full-stack application using the App Router, with AI capabilities delivered through a multi-layer LLM stack and property data served from a zp-fetch-service microservice.

Browser (Next.js App Router)
    │
    ├── Clerk Auth (TECH-011)
    ├── Radix UI + Tailwind CSS components
    ├── Mapbox GL Draw / Google Maps (TECH-007)
    ├── @ai-sdk/react streaming chat (TECH-009)
    └── Knock in-app notifications (TECH-013)
         │
         ▼
Next.js API Routes (src/app/api/)
    │
    ├── /api/ai/* ──────────────► LangChain / LangGraph (TECH-009)
    │                               └─► OpenAI GPT-4o (TECH-010)
    ├── /api/alerts/* ──────────► Knock Node SDK (TECH-013)
    ├── /api/analytics/* ───────► ZoomProp Backend API (TECH-014)
    ├── /api/auth/* ────────────► Clerk Backend (TECH-011)
    └── /api/automation/* ──────► ZoomProp Backend API (TECH-014)
         │
         ▼
External Services
    ├── Elasticsearch (TECH-008) — property search index
    ├── Stripe (TECH-015) — billing and subscriptions
    ├── Clerk (TECH-011) — identity, organizations, sessions
    ├── ZoomProp Backend API (NEXT_PUBLIC_ZOOMPROP_API_URL_V1)
    └── zp-fetch-service (Dockerfile) — data fetching microservice

Technical Reference

IDComponentTechnologyLocation
TECH-001Frontend FrameworkNext.js 15 with Turbopack (next dev --turbopack)package.json dev script
TECH-002LanguageTypeScript (strict mode, ES2017 target)tsconfig.json
TECH-003UI Component SystemRadix UI primitives + Tailwind CSS; shadcn/ui via components.jsonpackage.json @radix-ui/*
TECH-004Drag and Drop@dnd-kit/core, @dnd-kit/sortable, @dnd-kit/modifierspackage.json
TECH-005Form ValidationReact Hook Form + @hookform/resolvers + Zod schemassrc/...CapRateBaseSchema
TECH-006Testing (Unit)Vitest with coverage; UI runner via vitest --uipackage.json test scripts
TECH-007MapsMapbox GL Draw (@mapbox/mapbox-gl-draw), Google Maps JS API Loadernext.config.ts env + package.json
TECH-008Search IndexElasticsearch @elastic/elasticsearch ^8.18.2package.json; archive/legacy-api-backup/elastic-search/
TECH-009AI OrchestrationLangChain (@langchain/core, @langchain/community, @langchain/openai, @langchain/langgraph) + Vercel AI SDK (@ai-sdk/openai, @ai-sdk/react)package.json; next.config.ts serverExternalPackages
TECH-010LLM ProviderOpenAI (via OPENAI_API_KEY)next.config.ts env
TECH-011Authentication & OrgsClerk (@clerk/nextjs ^6.23.1, @clerk/elements ^0.23.35)package.json; src/app/(auth)/
TECH-012ObservabilityOpenTelemetry (@opentelemetry/api, @opentelemetry/core, @opentelemetry/sdk-trace-base)package.json
TECH-013NotificationsKnock (@knocklabs/client, @knocklabs/node, @knocklabs/react)package.json; /api/alerts/ routes
TECH-014Backend APIZoomProp proprietary REST API (NEXT_PUBLIC_ZOOMPROP_API_URL_V1, api.zoomprop.com)next.config.ts image domains + env
TECH-015BillingStripe (embedded checkout, webhooks)archive/legacy-api-backup/stripe/; onboarding/steps/embedded-checkout.tsx
TECH-016Data Fetching Servicezp-fetch-service containerized microservicezp-fetch-service/Dockerfile
TECH-017Code QualityHusky pre-commit, ESLint, Prettier, Codacy (.codacy.yml), DeepSource (.deepsource.toml), audit-ci (.auditcirc)Root config files
TECH-018E2E TestingPlaywrightpackage.json test:e2e scripts
TECH-019Theme SystemCustom ThemeProvider with use-theme hook; theme audit tooling via tsx tools/scripts/theme-audit-runner.tspackage.json theme:audit scripts

API Surface Reference

IDRouteFilePurpose
API-001POST /api/actions/analyze-property-investigationsrc/app/api/actions/analyze-property-investigation/route.tsAI-driven deep investigation of a specific property
API-002GET/POST /api/ai-search-templatessrc/app/api/ai-search-templates/route.tsManage saved AI search intent templates
API-003POST /api/ai/analysissrc/app/api/ai/analysis/route.tsGeneral investment analysis (portfolio context)
API-004POST /api/ai/chatsrc/app/api/ai/chat/route.tsStreaming AI chat with LangGraph orchestration
API-005POST /api/ai/commercial-analysissrc/app/api/ai/commercial-analysis/route.tsCommercial property financial analysis
API-006POST /api/ai/commercial-estimatessrc/app/api/ai/commercial-estimates/route.tsAI-generated rent and NOI estimates for commercial assets
API-007GET/DELETE /api/ai/conversations/:idsrc/app/api/ai/conversations/[id]/route.tsRetrieve or delete a specific conversation
API-008GET/POST /api/ai/conversationssrc/app/api/ai/conversations/route.tsList and create AI chat conversations
API-009POST /api/ai/generate-titlesrc/app/api/ai/generate-title/route.tsAuto-generate conversation title from first message
API-010POST /api/ai/intentsrc/app/api/ai/intent/route.tsClassify user search intent to pre-populate filters
API-011POST /api/ai/maintenance-analysissrc/app/api/ai/maintenance-analysis/route.tsPredict maintenance costs from property data
API-012POST /api/ai/offer-analysissrc/app/api/ai/offer-analysis/route.tsAI-assisted offer price recommendation with comp analysis
API-013POST /api/ai/performance-monitoringsrc/app/api/ai/performance-monitoring/route.tsPortfolio performance anomaly detection
API-014GET/POST /api/ai/personassrc/app/api/ai/personas/route.tsManage AI analyst personas per user/org
API-015POST /api/ai/property-analysissrc/app/api/ai/property-analysis/route.tsFull investment analysis of a single property
API-016POST /api/ai/property-inspection-analysissrc/app/api/ai/property-inspection-analysis/route.tsAI parsing of inspection reports
API-017POST /api/ai/suggest-tagssrc/app/api/ai/suggest-tags/route.tsAI-suggested tags for property classification
API-018GET /api/ai/suggestionssrc/app/api/ai/suggestions/route.tsContextual quick-action prompt suggestions
API-019GET/POST /api/alert-filters/assignmentssrc/app/api/alert-filters/assignments/route.tsAssign alert filter criteria to properties or collections
API-020GET/POST /api/alert-filterssrc/app/api/alert-filters/route.tsCRUD for alert filter rule definitions
API-021POST /api/alerts/configuresrc/app/api/alerts/configure/route.tsConfigure alert scope, frequency, and conditions
API-022GET /api/alerts/historysrc/app/api/alerts/history/route.tsRetrieve alert trigger history
API-023POST /api/alerts/messages/archivesrc/app/api/alerts/messages/archive/route.tsBulk archive alert notifications via Knock
API-024POST /api/alerts/messages/unarchivesrc/app/api/alerts/messages/unarchive/route.tsRestore archived alert notifications
API-025GET/PUT /api/alerts/preferencessrc/app/api/alerts/preferences/route.tsUser/org notification delivery preferences
API-026POST /api/alerts/testsrc/app/api/alerts/test/route.tsSend a test alert to validate delivery configuration
API-027POST /api/alerts/triggersrc/app/api/alerts/trigger/route.tsEvaluate and fire alert conditions
API-028GET/POST /api/alerts/userssrc/app/api/alerts/users/route.tsManage org-level alert user subscriptions
API-029GET /api/analytics-dashboardsrc/app/api/analytics-dashboard/route.tsAggregate dashboard KPI summary
API-030GET /api/analytics/appreciation-distributionsrc/app/api/analytics/appreciation-distribution/route.tsAppreciation percentile distribution for a market
API-031GET /api/analytics/marketssrc/app/api/analytics/markets/route.tsMarket-level investment metrics
API-032GET /api/analytics/performancesrc/app/api/analytics/performance/route.tsPortfolio return performance over time
API-033GET /api/analytics/portfolio`src/app/api/analytics/