PRD
PRD
Last updated 5/3/2026
ZoomProp AI Platform — Progressive Product Requirements Document
PRD Metadata
| Field | Value |
|---|---|
| Product Name | ZoomProp AI Platform |
| Repository | zoomprop/zp-alpha |
| PRD Version | v1.0 (Growth) |
| Document Status | Active |
| Package Version | 0.1.0 |
| Last Commit | 08ce25f — Merge PR #460 (taha/fixes-2.0) |
| Primary Stack | Next.js 15 (Turbopack), TypeScript, Vercel AI SDK, LangChain/LangGraph, Elasticsearch, Clerk, Mapbox GL, Radix UI |
| Auth Provider | Clerk (@clerk/nextjs ^6.23.1) |
| AI Layer | OpenAI via @ai-sdk/openai ^2.0.30 + LangChain @langchain/langgraph ^0.3.5 |
| Notifications | Knock (@knocklabs/react ^0.7.25) |
| Maps | Mapbox GL Draw + Google Maps JS API Loader |
| Test Frameworks | Vitest (unit), Playwright (E2E), pytest (API integration) |
| CI/CD | GitHub Actions — pr-checks.yml, test.yml, test-coverage.yml, alert-testing.yml |
| Infrastructure Files | 19 (.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
| ID | Outcome | Measurement Signal |
|---|---|---|
| BR-001 | Reduce time-to-cap-rate from listing discovery to actionable number | Cap rate computed in < 30 seconds from property load |
| BR-002 | Enable AI-assisted offer and inspection analysis | /api/ai/offer-analysis and /api/ai/property-inspection-analysis called per deal |
| BR-003 | Surface market intelligence proactively via alerts | Alert trigger rate and click-through from /api/alerts/trigger |
| BR-004 | Support collaborative deal evaluation across investment teams | Org-level multi-user sessions via Clerk organizations |
| BR-005 | Reduce analyst workload through AI chat for portfolio queries | Chat session volume via /api/ai/conversations |
| BR-006 | Enable co-investment deal syndication workflows | Co-investment onboarding step captured at billing-setup-step.tsx |
| BR-007 | Provide geographic market discovery with visual map tooling | Mapbox GL Draw polygon search session completion rate |
Constraints
| ID | Constraint | Rationale |
|---|---|---|
| TECH-001 | TypeScript strict mode enabled; build errors suppressed in next.config.ts | ignoreBuildErrors: true is a known technical debt item — strict TS enforcement is deferred to v1.1 |
| TECH-002 | ESLint errors suppressed during production builds | ignoreDuringBuilds: true — requires remediation before enterprise sales |
| TECH-003 | LangChain packages must be declared as serverExternalPackages | langchain, @langchain/core, @langchain/community excluded from Next.js bundler to prevent edge-runtime incompatibilities |
| TECH-004 | Image domains are allowlisted; Zillow, Redfin, Realtor.com, Google Maps, Cloudinary all included | Dependency on third-party CDNs introduces availability risk |
| TECH-005 | Free-tier users receive a monthly query grant | PR #455 (3a74c26) implements monthly free queries grant — monetization gate is live |
| TECH-006 | Mobile responsiveness is in-progress | PR #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
| Segment | Description | Onboarding Signal | Primary Features Used |
|---|---|---|---|
| SEG-001: Independent Rental Investors | Individual operators with 1–20 residential units, self-managed | portfolio-count-step.tsx — selects 1–20 units | Cap rate calculator, property alerts, AI chat for deal screening |
| SEG-002: Boutique Syndicators | Small GP/LP structures raising capital for 1–5 deals per year | co-investment-step.tsx present in onboarding | Co-investment workflows, identity verification (identity-verification-step.tsx), offer analysis |
| SEG-003: Real Estate Investment Firms | Multi-member organizations with analyst teams, 20+ units AUM | Clerk organization creation (sign-up/organization/page.tsx) | Portfolio analytics, automation board config, commercial analysis, multi-persona AI |
| SEG-004: Commercial Operators | Office, retail, or mixed-use property managers evaluating NNN/gross lease assets | Geographic focus + commercial-analysis API usage | /api/ai/commercial-analysis, /api/ai/commercial-estimates, performance monitoring |
| SEG-005: Lenders & Underwriters | Capital providers evaluating loan requests against property data | Legacy lenderCriteria, loanRequests routes in archive | Market 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:
- 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. - Embedded Stripe checkout in onboarding —
billing-setup-step.tsxandembedded-checkout.tsxpresent insrc/app/(auth)/onboarding/_components/steps/. Legacy archive containscreate-subscription/route.ts,create-checkout-session/route.ts,create-portal-session/route.ts, andstripe/webhook/route.ts, confirming Stripe is the billing processor. - Subscription verification gate — Legacy
check-org-subscription/route.tsconfirms org-level subscription checks at request time. - 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)
| Tier | Target | Capabilities | Gate Mechanism |
|---|---|---|---|
| Free | Individual investors exploring the platform | Limited AI queries per month (monthly grant), single-user, read-only alerts | Monthly query counter; upgrade prompt on exhaustion |
| Pro | SEG-001 independent investors | Unlimited AI queries, full alert configuration, collections, watchlist, property investigation | Stripe subscription — individual plan |
| Team / Org | SEG-002 syndicators, SEG-003 firms | Multi-member Clerk org, shared portfolio, automation board, co-investment workflows, persona management | Stripe org-level subscription + Clerk organization creation |
| Enterprise | SEG-004 commercial operators, SEG-005 lenders | Commercial analysis APIs, identity verification, business verification (Middesk in archive), Plaid asset verification | Custom contract + Middesk + Plaid integration |
Moat Thesis
ZoomProp's defensibility rests on three compounding layers:
- 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. - 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. - 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
- User completes Clerk sign-up (email + password or OAuth).
- Redirected to
src/app/(auth)/onboarding/page.tsx— onboarding wizard initiates. onboarding-wizard.tsxsteps through:property-ownership-step→portfolio-count-step→platform-goals-step→investment-interests-step→geographic-focus-step→co-investment-step→portfolio-setup-step→identity-verification-step→billing-setup-step→onboarding-summary-step.billing-setup-step.tsxtriggers Stripe embedded checkout (embedded-checkout.tsx) for Pro/Org upgrade; free users pass through.- Progress tracked via
progress-indicator.tsxandtop-progress-indicator.tsx. - Completion lands on
src/app/(auth)/onboarding/complete/page.tsxthensuccess/page.tsx. - Auth redirect handled at
src/app/(auth)/auth/redirect/page.tsx.
Success Metric: Onboarding funnel completion rate to success/page.tsx.
UJ-002: Property Discovery via AI-Powered Search
Actor: Authenticated investor (any segment) Entry: Dashboard → Discover page
- User opens the Discover map view powered by Mapbox GL Draw (
@mapbox/mapbox-gl-draw). - User draws a polygon or selects a region; Elasticsearch address/region search (
archive/legacy-api-backup/elastic-search/) returns matching properties. - User applies sophisticated filters (price range, property type, min cap rate) — documented in
context/SOPHISTICATED_PROPERTY_FILTERS_USAGE.md. - AI intent detection fires via
/api/ai/intentto classify the user's search goal and pre-populate relevant filters. - AI suggestion prompts appear via
/api/ai/suggestions; user selects a saved AI search template via/api/ai-search-templates. - 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)
- User opens a new conversation; system loads portfolio context via
/api/ai/analysispre-populating the LangGraph context window. - User types or selects a quick-action prompt (e.g., "Analyze this property's cap rate against my portfolio average").
/api/ai/chatstreams a response using@ai-sdk/reactstreaming hooks with real-time token display.- Multi-persona support (
/api/ai/personas) allows switching between "Investment Analyst," "Market Scout," and "Due Diligence" personas depending on task. - Conversation title auto-generated via
/api/ai/generate-title; full history persisted to/api/ai/conversations. - User can trigger a property investigation from chat via
/api/actions/analyze-property-investigation. - 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
- User views a property; system pre-fills
constMonthlyRentfrom AI rent estimate (via/api/ai/commercial-estimates). CapRateBaseSchema(Zod) validates inputs:constVacancy(default 5%),constOperExpenses(default 30%),constResEstimate(default 5%),constClosingCosts(default 2%).- User adjusts assumptions; cap rate recalculates client-side in real time against
listPrice. - User requests AI-enhanced offer analysis via
/api/ai/offer-analysis, which factors in market comps and portfolio context. - Maintenance cost projection generated via
/api/ai/maintenance-analysis. - Property inspection analysis available via
/api/ai/property-inspection-analysisfor properties with uploaded inspection documents. - 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/)
- User opens
alert-center-dashboard.tsxshowing active alerts, history, and delivery settings. - User creates a new alert via
alert-config-form.tsx, selecting scope (alert-scope-selector.tsx) — property-level, collection-level, or market-level. - Filter criteria set via
alert-filters.tsx; criteria assigned to properties via/api/alert-filters/assignments. - Delivery preferences configured via
alert-delivery-settings.tsxand persisted to/api/alerts/preferences. - Alert triggers evaluated server-side via
/api/alerts/trigger; delivery routed through Knock (@knocklabs/node) for in-app, email, and push notification. - Alert history displayed in
alert-history-timeline.tsx; bulk actions (archive/unarchive) available via/api/alerts/messages/archiveand/api/alerts/messages/unarchive. - 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
- User views portfolio-level KPIs via
/api/analytics/portfolio. - Appreciation distribution chart rendered from
/api/analytics/appreciation-distribution. - Market comparison data loaded from
/api/analytics/markets. - Individual property performance tracked via
/api/analytics/propertiesand/api/analytics/performance. - AI performance monitoring report generated via
/api/ai/performance-monitoring. - Automation analytics reviewed via
/api/automation/analytics; deal pipeline board configured via/api/automation/board-config. - 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
- Principal creates a Clerk organization; subscription upgraded to Team/Org tier via
/api/auth/active-org. - Team members invited (legacy
clerk/organization/inviteroute in archive). - Business verification initiated via
business-verification-form.tsx(Middesk integration in legacy archive). - Shared portfolio, collections, and alert filters become visible across org members.
- AI persona assignments differentiated by role (analyst vs. principal) via
/api/ai/personas. - 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
| ID | Risk | Category | Likelihood | Impact | Mitigation |
|---|---|---|---|---|---|
| RISK-001 | ignoreBuildErrors: true and ignoreDuringBuilds: true in next.config.ts allow broken TypeScript and ESLint code to reach production | Technical Debt | High | High | Remove both flags in a dedicated cleanup sprint; enforce tsc --noEmit as a required CI step in .github/workflows/pr-checks.yml |
| RISK-002 | OpenAI 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 bundles | Security | Medium | Critical | Audit all OPENAI_API_KEY references; enforce server-only imports in LangChain call sites; add secret scanning to pr-checks.yml |
| RISK-003 | Monthly free query grant (PR #455) is client-context-integrated — a determined user could manipulate client state to bypass the query gate | Security / Monetization | Medium | High | Move query counter enforcement to server-side middleware; validate against Clerk session claims, not client-supplied context |
| RISK-004 | Elasticsearch dependency (@elastic/elasticsearch ^8.18.2) with no visible connection pooling or circuit-breaker configuration in the current API routes | Infrastructure | Medium | High | Add connection health check to startup; implement circuit breaker in zp-fetch-service; expose health endpoint |
| RISK-005 | Third-party image CDN allowlist includes 20+ domains (Zillow, Redfin, Realtor.com); any CDN URL structure change breaks property images platform-wide | External Dependency | Medium | Medium | Implement image proxy through zp-fetch-service with fallback placeholder; cache images via Cloudinary |
| RISK-006 | PR #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 mobile | UX | High | Medium | Establish a mobile-first breakpoint standard in context/DESIGN_SYSTEM.md; prioritize PR #396 merge |
| RISK-007 | LangGraph orchestration (@langchain/langgraph ^0.3.5) is early-stage; library breaking changes between minor versions could disrupt all AI analysis endpoints simultaneously | Dependency | Medium | High | Pin LangGraph at exact version in package.json; add integration test suite for all /api/ai/* routes against a fixed LangGraph version |
| RISK-008 | Clerk organizations and subscription state are managed across two systems (Clerk metadata + Stripe); desync between the two could grant or deny access incorrectly | Business Logic | Medium | High | Implement idempotent Stripe webhook handler with Clerk metadata sync; add reconciliation cron job |
| RISK-009 | archive/legacy-api-backup/ contains Plaid, Middesk, HelloSign, and financial transfer routes that may still be referenced by production code paths | Security / Compliance | Low | Critical | Audit all imports from archive paths; ensure archived routes are unreachable in the production build; add lint rule blocking archive imports |
| RISK-010 | Test 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 area | Quality | High | Medium | Define coverage thresholds in vitest.config.ts; require minimum 70% line coverage on src/lib/ and src/app/api/ before merge |
| RISK-011 | Theme persistence bug (PR #458 open) — use-theme not wired to custom ThemeProvider means user theme preference is lost on navigation | UX | High | Low | Merge PR #458; add theme-audit-runner.ts (already scripted as theme:audit) to CI gate |
| RISK-012 | Co-investment and crowdfunding features (archive contains crowdfunding/projects/ routes) imply potential securities law exposure if syndication tooling is activated without proper disclosures | Regulatory | Low | Critical | Legal 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
| ID | Component | Technology | Location |
|---|---|---|---|
| TECH-001 | Frontend Framework | Next.js 15 with Turbopack (next dev --turbopack) | package.json dev script |
| TECH-002 | Language | TypeScript (strict mode, ES2017 target) | tsconfig.json |
| TECH-003 | UI Component System | Radix UI primitives + Tailwind CSS; shadcn/ui via components.json | package.json @radix-ui/* |
| TECH-004 | Drag and Drop | @dnd-kit/core, @dnd-kit/sortable, @dnd-kit/modifiers | package.json |
| TECH-005 | Form Validation | React Hook Form + @hookform/resolvers + Zod schemas | src/...CapRateBaseSchema |
| TECH-006 | Testing (Unit) | Vitest with coverage; UI runner via vitest --ui | package.json test scripts |
| TECH-007 | Maps | Mapbox GL Draw (@mapbox/mapbox-gl-draw), Google Maps JS API Loader | next.config.ts env + package.json |
| TECH-008 | Search Index | Elasticsearch @elastic/elasticsearch ^8.18.2 | package.json; archive/legacy-api-backup/elastic-search/ |
| TECH-009 | AI Orchestration | LangChain (@langchain/core, @langchain/community, @langchain/openai, @langchain/langgraph) + Vercel AI SDK (@ai-sdk/openai, @ai-sdk/react) | package.json; next.config.ts serverExternalPackages |
| TECH-010 | LLM Provider | OpenAI (via OPENAI_API_KEY) | next.config.ts env |
| TECH-011 | Authentication & Orgs | Clerk (@clerk/nextjs ^6.23.1, @clerk/elements ^0.23.35) | package.json; src/app/(auth)/ |
| TECH-012 | Observability | OpenTelemetry (@opentelemetry/api, @opentelemetry/core, @opentelemetry/sdk-trace-base) | package.json |
| TECH-013 | Notifications | Knock (@knocklabs/client, @knocklabs/node, @knocklabs/react) | package.json; /api/alerts/ routes |
| TECH-014 | Backend API | ZoomProp proprietary REST API (NEXT_PUBLIC_ZOOMPROP_API_URL_V1, api.zoomprop.com) | next.config.ts image domains + env |
| TECH-015 | Billing | Stripe (embedded checkout, webhooks) | archive/legacy-api-backup/stripe/; onboarding/steps/embedded-checkout.tsx |
| TECH-016 | Data Fetching Service | zp-fetch-service containerized microservice | zp-fetch-service/Dockerfile |
| TECH-017 | Code Quality | Husky pre-commit, ESLint, Prettier, Codacy (.codacy.yml), DeepSource (.deepsource.toml), audit-ci (.auditcirc) | Root config files |
| TECH-018 | E2E Testing | Playwright | package.json test:e2e scripts |
| TECH-019 | Theme System | Custom ThemeProvider with use-theme hook; theme audit tooling via tsx tools/scripts/theme-audit-runner.ts | package.json theme:audit scripts |
API Surface Reference
| ID | Route | File | Purpose |
|---|---|---|---|
| API-001 | POST /api/actions/analyze-property-investigation | src/app/api/actions/analyze-property-investigation/route.ts | AI-driven deep investigation of a specific property |
| API-002 | GET/POST /api/ai-search-templates | src/app/api/ai-search-templates/route.ts | Manage saved AI search intent templates |
| API-003 | POST /api/ai/analysis | src/app/api/ai/analysis/route.ts | General investment analysis (portfolio context) |
| API-004 | POST /api/ai/chat | src/app/api/ai/chat/route.ts | Streaming AI chat with LangGraph orchestration |
| API-005 | POST /api/ai/commercial-analysis | src/app/api/ai/commercial-analysis/route.ts | Commercial property financial analysis |
| API-006 | POST /api/ai/commercial-estimates | src/app/api/ai/commercial-estimates/route.ts | AI-generated rent and NOI estimates for commercial assets |
| API-007 | GET/DELETE /api/ai/conversations/:id | src/app/api/ai/conversations/[id]/route.ts | Retrieve or delete a specific conversation |
| API-008 | GET/POST /api/ai/conversations | src/app/api/ai/conversations/route.ts | List and create AI chat conversations |
| API-009 | POST /api/ai/generate-title | src/app/api/ai/generate-title/route.ts | Auto-generate conversation title from first message |
| API-010 | POST /api/ai/intent | src/app/api/ai/intent/route.ts | Classify user search intent to pre-populate filters |
| API-011 | POST /api/ai/maintenance-analysis | src/app/api/ai/maintenance-analysis/route.ts | Predict maintenance costs from property data |
| API-012 | POST /api/ai/offer-analysis | src/app/api/ai/offer-analysis/route.ts | AI-assisted offer price recommendation with comp analysis |
| API-013 | POST /api/ai/performance-monitoring | src/app/api/ai/performance-monitoring/route.ts | Portfolio performance anomaly detection |
| API-014 | GET/POST /api/ai/personas | src/app/api/ai/personas/route.ts | Manage AI analyst personas per user/org |
| API-015 | POST /api/ai/property-analysis | src/app/api/ai/property-analysis/route.ts | Full investment analysis of a single property |
| API-016 | POST /api/ai/property-inspection-analysis | src/app/api/ai/property-inspection-analysis/route.ts | AI parsing of inspection reports |
| API-017 | POST /api/ai/suggest-tags | src/app/api/ai/suggest-tags/route.ts | AI-suggested tags for property classification |
| API-018 | GET /api/ai/suggestions | src/app/api/ai/suggestions/route.ts | Contextual quick-action prompt suggestions |
| API-019 | GET/POST /api/alert-filters/assignments | src/app/api/alert-filters/assignments/route.ts | Assign alert filter criteria to properties or collections |
| API-020 | GET/POST /api/alert-filters | src/app/api/alert-filters/route.ts | CRUD for alert filter rule definitions |
| API-021 | POST /api/alerts/configure | src/app/api/alerts/configure/route.ts | Configure alert scope, frequency, and conditions |
| API-022 | GET /api/alerts/history | src/app/api/alerts/history/route.ts | Retrieve alert trigger history |
| API-023 | POST /api/alerts/messages/archive | src/app/api/alerts/messages/archive/route.ts | Bulk archive alert notifications via Knock |
| API-024 | POST /api/alerts/messages/unarchive | src/app/api/alerts/messages/unarchive/route.ts | Restore archived alert notifications |
| API-025 | GET/PUT /api/alerts/preferences | src/app/api/alerts/preferences/route.ts | User/org notification delivery preferences |
| API-026 | POST /api/alerts/test | src/app/api/alerts/test/route.ts | Send a test alert to validate delivery configuration |
| API-027 | POST /api/alerts/trigger | src/app/api/alerts/trigger/route.ts | Evaluate and fire alert conditions |
| API-028 | GET/POST /api/alerts/users | src/app/api/alerts/users/route.ts | Manage org-level alert user subscriptions |
| API-029 | GET /api/analytics-dashboard | src/app/api/analytics-dashboard/route.ts | Aggregate dashboard KPI summary |
| API-030 | GET /api/analytics/appreciation-distribution | src/app/api/analytics/appreciation-distribution/route.ts | Appreciation percentile distribution for a market |
| API-031 | GET /api/analytics/markets | src/app/api/analytics/markets/route.ts | Market-level investment metrics |
| API-032 | GET /api/analytics/performance | src/app/api/analytics/performance/route.ts | Portfolio return performance over time |
| API-033 | GET /api/analytics/portfolio | `src/app/api/analytics/ |