{"openapi":"3.0.0","paths":{"/api/v1/auth/register":{"post":{"operationId":"AuthController_register","summary":"Register a new user","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":""}},"tags":["auth"]}},"/api/v1/auth/login":{"post":{"operationId":"AuthController_login","summary":"Login with email and password","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/refresh":{"post":{"operationId":"AuthController_refresh","summary":"Refresh access token","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenDto"}}}},"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/logout":{"post":{"operationId":"AuthController_logout","parameters":[],"responses":{"204":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/api/v1/auth/me":{"get":{"operationId":"AuthController_me","summary":"Get current authenticated user","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"],"security":[{"bearer":[]}]}},"/api/v1/auth/verify-email":{"get":{"operationId":"AuthController_verifyEmail","summary":"Verify email with token from link","parameters":[{"name":"token","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/forgot-password":{"post":{"operationId":"AuthController_forgotPassword","summary":"Request password reset email","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/reset-password":{"post":{"operationId":"AuthController_resetPassword","summary":"Reset password with token from email","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/reset-password-direct":{"post":{"operationId":"AuthController_resetPasswordDirect","summary":"TEMPORARY: set a new password with no verification (pre-launch testing only)","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/bootstrap-admin":{"post":{"operationId":"AuthController_bootstrapAdmin","summary":"One-time admin promotion (requires BOOTSTRAP_SECRET)","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/health":{"get":{"operationId":"AuthController_health","summary":"Auth module health check","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/google":{"get":{"operationId":"OAuthController_googleAuth","summary":"Initiate Google OAuth flow","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/google/callback":{"get":{"operationId":"OAuthController_googleCallback","parameters":[],"responses":{"200":{"description":""}},"tags":["auth"]}},"/api/v1/auth/2fa/setup":{"post":{"operationId":"TotpController_setup","summary":"Generate TOTP secret and QR code URI","parameters":[],"responses":{"201":{"description":""}},"tags":["2FA"],"security":[{"JWT":[]}]}},"/api/v1/auth/2fa/verify":{"post":{"operationId":"TotpController_verify","summary":"Verify TOTP code and activate 2FA","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyTotpDto"}}}},"responses":{"200":{"description":""}},"tags":["2FA"],"security":[{"JWT":[]}]}},"/api/v1/auth/2fa":{"delete":{"operationId":"TotpController_disable","summary":"Disable 2FA (requires current code)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisableTotpDto"}}}},"responses":{"200":{"description":""}},"tags":["2FA"],"security":[{"JWT":[]}]}},"/api/v1/users/me":{"get":{"operationId":"UsersController_me","summary":"Get current user profile","parameters":[],"responses":{"200":{"description":""}},"tags":["users"],"security":[{"bearer":[]}]},"put":{"operationId":"UsersController_update","summary":"Update profile","parameters":[],"responses":{"200":{"description":""}},"tags":["users"],"security":[{"bearer":[]}]},"delete":{"operationId":"UsersController_deleteAccount","summary":"Delete account (GDPR Article 17 — right to erasure)","parameters":[],"responses":{"200":{"description":""}},"tags":["users"],"security":[{"bearer":[]}]}},"/api/v1/users/me/birth-profile":{"post":{"operationId":"UsersController_saveBirthProfile","summary":"Save primary birth details","parameters":[],"responses":{"201":{"description":""}},"tags":["users"],"security":[{"bearer":[]}]}},"/api/v1/users/me/reports":{"get":{"operationId":"UsersController_reports","summary":"Get report history","parameters":[],"responses":{"200":{"description":""}},"tags":["users"],"security":[{"bearer":[]}]}},"/api/v1/users/me/data-export":{"get":{"operationId":"UsersController_exportData","summary":"Download all personal data (GDPR Article 15)","parameters":[],"responses":{"200":{"description":""}},"tags":["users"],"security":[{"bearer":[]}]}},"/api/v1/users/me/data-retention":{"get":{"operationId":"UsersController_getDataRetention","summary":"Get data retention policy information","parameters":[],"responses":{"200":{"description":""}},"tags":["users"],"security":[{"bearer":[]}]}},"/api/v1/kundali/health":{"get":{"operationId":"KundaliController_health","summary":"Kundali module health check","parameters":[],"responses":{"200":{"description":""}},"tags":["kundali"]}},"/api/v1/kundali/generate":{"post":{"operationId":"KundaliController_generate","summary":"Generate Kundali (Birth Chart)","description":"Computes planetary positions from Swiss Ephemeris and generates AI-powered interpretation. Calculation is deterministic; AI analysis is clearly labelled.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateKundaliDto"}}}},"responses":{"201":{"description":""}},"tags":["kundali"],"security":[{"bearer":[]}]}},"/api/v1/kundali/shared/{shareToken}":{"get":{"operationId":"KundaliController_getShared","summary":"Get a publicly shared report by token","parameters":[{"name":"shareToken","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["kundali"]}},"/api/v1/kundali":{"get":{"operationId":"KundaliController_list","summary":"List all Kundali reports for current user","parameters":[],"responses":{"200":{"description":""}},"tags":["kundali"],"security":[{"bearer":[]}]}},"/api/v1/kundali/{id}":{"get":{"operationId":"KundaliController_getById","summary":"Get Kundali report by ID","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["kundali"],"security":[{"bearer":[]}]},"delete":{"operationId":"KundaliController_delete","summary":"Delete a Kundali report","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["kundali"],"security":[{"bearer":[]}]}},"/api/v1/kundali/{id}/share":{"post":{"operationId":"KundaliController_createShareLink","summary":"Create a public share link for a report","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["kundali"],"security":[{"bearer":[]}]},"delete":{"operationId":"KundaliController_revokeShareLink","summary":"Revoke the public share link for a report","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["kundali"],"security":[{"bearer":[]}]}},"/api/v1/kundali/{id}/shodashvarga":{"post":{"operationId":"KundaliController_getShodashvarga","summary":"Compute Shodashvarga (16 Divisional Charts)","description":"Derives D1 through D60 Varga charts from the stored planetary longitudes. Returns sign, lord and degree within sign for each planet in every division.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["kundali"],"security":[{"bearer":[]}]}},"/api/v1/kundali/{id}/upcoming":{"get":{"operationId":"KundaliController_getUpcomingDashas","summary":"Upcoming dasha transitions for a report","description":"Deterministic detection of the current Mahadasha/Antardasha and the changes ahead within the horizon (default ~2 years). Free — reads the stored timeline.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"horizonDays","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["kundali"],"security":[{"bearer":[]}]}},"/api/v1/kundali/{id}/kp":{"post":{"operationId":"KundaliController_getKPAnalysis","summary":"Compute KP (Krishnamurti Paddhati) Analysis","description":"Calculates KP star lord, sub lord and sub-sub lord for each planet along with house significators according to the KP ruling-planet method.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["kundali"],"security":[{"bearer":[]}]}},"/api/v1/kundali/{id}/jaimini":{"post":{"operationId":"KundaliController_getJaiminiAnalysis","summary":"Compute Jaimini Astrology Analysis","description":"Calculates 7-planet Jaimini Karakas (Atmakaraka through Gnatikaraka) and the 12-sign Chara Dasha sequence starting from the Ascendant sign.","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["kundali"],"security":[{"bearer":[]}]}},"/api/v1/credits/balance":{"get":{"operationId":"CreditsController_balance","summary":"Get current credit balance","parameters":[],"responses":{"200":{"description":""}},"tags":["credits"],"security":[{"bearer":[]}]}},"/api/v1/credits/history":{"get":{"operationId":"CreditsController_history","summary":"Get credit transaction history","parameters":[],"responses":{"200":{"description":""}},"tags":["credits"],"security":[{"bearer":[]}]}},"/api/v1/horoscope/generate":{"post":{"operationId":"HoroscopeController_generate","summary":"Generate horoscope for a rashi","parameters":[],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["horoscope"],"security":[{"bearer":[]}]}},"/api/v1/horoscope/daily":{"get":{"operationId":"HoroscopeController_dailyAll","summary":"Get all 12 rashis daily horoscope","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["horoscope"],"security":[{"bearer":[]}]}},"/api/v1/compatibility/match":{"post":{"operationId":"CompatibilityController_matchCompatibility","summary":"Generate Ashtakoot Gun Milan compatibility report","parameters":[],"responses":{"200":{"description":"Compatibility report generated successfully"}},"tags":["compatibility"],"security":[{"bearer":[]}]}},"/api/v1/predictions/generate":{"post":{"operationId":"PredictionsController_generateFlat","summary":"Generate a prediction for a single life area","parameters":[],"responses":{"201":{"description":""}},"tags":["predictions"],"security":[{"bearer":[]}]}},"/api/v1/predictions/generate/{reportId}":{"post":{"operationId":"PredictionsController_generate","summary":"Generate life area predictions from a Kundali report","parameters":[{"name":"reportId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["predictions"],"security":[{"bearer":[]}]}},"/api/v1/predictions/{reportId}":{"get":{"operationId":"PredictionsController_get","summary":"Get saved predictions for a report","parameters":[{"name":"reportId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["predictions"],"security":[{"bearer":[]}]}},"/api/v1/doshas/{id}":{"get":{"operationId":"DoshasController_getForReport","summary":"Detailed dosha analysis for a saved Kundali report","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["doshas"],"security":[{"bearer":[]}]}},"/api/v1/remedies/general":{"get":{"operationId":"RemediesController_getGeneral","summary":"General Vedic remedies (chart-independent)","parameters":[],"responses":{"200":{"description":""}},"tags":["remedies"],"security":[{"bearer":[]}]}},"/api/v1/remedies/{reportId}":{"get":{"operationId":"RemediesController_getForReport","summary":"Personalized remedies for a Kundali report (afflicted planets)","parameters":[{"name":"reportId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["remedies"],"security":[{"bearer":[]}]}},"/api/v1/muhurat/panchang":{"post":{"operationId":"MuhuratController_getPanchang","summary":"Get Panchang and Muhurat slots for a date","parameters":[],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["muhurat"],"security":[{"bearer":[]}]}},"/api/v1/muhurat/best-dates":{"post":{"operationId":"MuhuratController_getBestDates","summary":"Find best Muhurat dates in a date range","parameters":[],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["muhurat"],"security":[{"bearer":[]}]}},"/api/v1/numerology/calculate":{"post":{"operationId":"NumerologyController_calculate","summary":"Calculate numerology profile (free)","parameters":[],"responses":{"201":{"description":""}},"tags":["numerology"],"security":[{"bearer":[]}]}},"/api/v1/numerology/suggest-names":{"post":{"operationId":"NumerologyController_suggestNames","summary":"Suggest business/baby names for a target number","parameters":[],"responses":{"201":{"description":""}},"tags":["numerology"],"security":[{"bearer":[]}]}},"/api/v1/ai-chat/stream":{"post":{"operationId":"AiChatController_streamChat","summary":"Stream AI chat response (SSE)","parameters":[],"responses":{"201":{"description":""}},"tags":["ai-chat"],"security":[{"bearer":[]}]}},"/api/v1/ai-chat/conversations":{"get":{"operationId":"AiChatController_getConversations","summary":"Get conversation history","parameters":[{"name":"reportId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["ai-chat"],"security":[{"bearer":[]}]}},"/api/v1/ai-chat/conversations/{id}/messages":{"get":{"operationId":"AiChatController_getMessages","summary":"Get messages in a conversation","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["ai-chat"],"security":[{"bearer":[]}]}},"/api/v1/ai-chat/health":{"get":{"operationId":"AiChatController_health","parameters":[],"responses":{"200":{"description":""}},"tags":["ai-chat"],"security":[{"bearer":[]}]}},"/api/v1/pdf/kundali/{reportId}":{"get":{"operationId":"PdfController_downloadKundaliPdf","summary":"Download Kundali report as PDF (costs 5 credits)","parameters":[{"name":"reportId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["pdf"],"security":[{"bearer":[]}]}},"/api/v1/pdf/health":{"get":{"operationId":"PdfController_health","parameters":[],"responses":{"200":{"description":""}},"tags":["pdf"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/plans":{"get":{"operationId":"SubscriptionsController_getPlans","summary":"Get all available subscription plans with pricing","parameters":[],"responses":{"200":{"description":""}},"tags":["subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/current":{"get":{"operationId":"SubscriptionsController_getCurrent","summary":"Get current subscription for authenticated user","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/subscribe":{"post":{"operationId":"SubscriptionsController_subscribe","summary":"Create or upgrade a subscription via Razorpay","parameters":[],"responses":{"201":{"description":""}},"tags":["subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/subscriptions/cancel":{"delete":{"operationId":"SubscriptionsController_cancel","summary":"Cancel subscription at end of billing period","parameters":[],"responses":{"200":{"description":""}},"tags":["subscriptions"],"security":[{"bearer":[]}]}},"/api/v1/payments/create-order":{"post":{"operationId":"PaymentsController_createOrder","summary":"Create Razorpay payment order","parameters":[],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["payments"],"security":[{"bearer":[]}]}},"/api/v1/payments/verify":{"post":{"operationId":"PaymentsController_verifyPayment","summary":"Verify Razorpay payment signature","parameters":[],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["payments"],"security":[{"bearer":[]}]}},"/api/v1/payments/webhook/razorpay":{"post":{"operationId":"PaymentsController_razorpayWebhook","summary":"Razorpay webhook endpoint","parameters":[{"name":"x-razorpay-signature","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["payments"]}},"/api/v1/payments/transactions":{"get":{"operationId":"PaymentsController_transactions","summary":"Get payment history","parameters":[],"responses":{"200":{"description":""}},"tags":["payments"],"security":[{"bearer":[]}]}},"/api/v1/payments/health":{"get":{"operationId":"PaymentsController_health","parameters":[],"responses":{"200":{"description":""}},"tags":["payments"]}},"/api/v1/api-keys/scopes":{"get":{"operationId":"ApiKeysController_getScopes","summary":"List all available API scopes","parameters":[],"responses":{"200":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]}},"/api/v1/api-keys":{"post":{"operationId":"ApiKeysController_create","summary":"Create a new API key","parameters":[],"responses":{"201":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]},"get":{"operationId":"ApiKeysController_list","summary":"List all API keys (keys are not shown, only prefixes)","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["api-keys"],"security":[{"bearer":[]}]}},"/api/v1/api-keys/{keyId}":{"delete":{"operationId":"ApiKeysController_revoke","summary":"Revoke an API key","parameters":[{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]}},"/api/v1/api-keys/{keyId}/rotate":{"patch":{"operationId":"ApiKeysController_rotate","summary":"Rotate (regenerate) an API key","parameters":[{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]}},"/api/v1/api-keys/{keyId}/stats":{"get":{"operationId":"ApiKeysController_stats","summary":"Get usage statistics for an API key","parameters":[{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["api-keys"],"security":[{"bearer":[]}]}},"/api/v1/coupons/validate":{"post":{"operationId":"CouponsController_validate","summary":"Validate a coupon code before checkout","parameters":[],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["coupons"],"security":[{"bearer":[]}]}},"/api/v1/coupons/referral":{"get":{"operationId":"CouponsController_getReferralCode","summary":"Get your referral code and stats","parameters":[],"responses":{"200":{"description":""}},"tags":["coupons"],"security":[{"bearer":[]}]}},"/api/v1/coupons/referral/apply":{"post":{"operationId":"CouponsController_applyReferral","summary":"Apply a referral code (called after signup)","parameters":[],"responses":{"201":{"description":""}},"tags":["coupons"],"security":[{"bearer":[]}]}},"/api/v1/referrals/stats":{"get":{"operationId":"ReferralsController_getStats","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/referrals":{"get":{"operationId":"ReferralsController_getReferrals","parameters":[],"responses":{"200":{"description":""}}}},"/api/v1/webhooks/events":{"get":{"operationId":"WebhooksController_getEvents","summary":"List all available webhook event types","parameters":[],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/api/v1/webhooks/endpoints":{"post":{"operationId":"WebhooksController_createEndpoint","summary":"Register a new webhook endpoint","parameters":[],"responses":{"201":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]},"get":{"operationId":"WebhooksController_listEndpoints","summary":"List all webhook endpoints","parameters":[],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/api/v1/webhooks/endpoints/{endpointId}":{"delete":{"operationId":"WebhooksController_deleteEndpoint","summary":"Delete a webhook endpoint","parameters":[{"name":"endpointId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/api/v1/webhooks/endpoints/{endpointId}/toggle":{"patch":{"operationId":"WebhooksController_toggleEndpoint","summary":"Enable or disable a webhook endpoint","parameters":[{"name":"endpointId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/api/v1/webhooks/endpoints/{endpointId}/deliveries":{"get":{"operationId":"WebhooksController_getDeliveries","summary":"Get delivery history for an endpoint","parameters":[{"name":"endpointId","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/api/v1/webhooks/deliveries/{deliveryId}/resend":{"post":{"operationId":"WebhooksController_resendDelivery","summary":"Retry a failed webhook delivery","parameters":[{"name":"deliveryId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["webhooks"],"security":[{"bearer":[]}]}},"/api/v1/crm/stats":{"get":{"operationId":"CrmController_getStats","summary":"Astrologer CRM dashboard stats","parameters":[],"responses":{"200":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]}},"/api/v1/crm/clients":{"get":{"operationId":"CrmController_listClients","summary":"List all CRM clients (paginated, searchable)","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]},"post":{"operationId":"CrmController_createClient","summary":"Add a new CRM client","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClientDto"}}}},"responses":{"201":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]}},"/api/v1/crm/clients/{id}":{"get":{"operationId":"CrmController_getClient","summary":"Get client details with history","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["crm"],"security":[{"JWT":[]}]},"put":{"operationId":"CrmController_updateClient","summary":"Update client details","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]},"delete":{"operationId":"CrmController_deleteClient","summary":"Delete client record","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]}},"/api/v1/crm/clients/{id}/notes":{"post":{"operationId":"CrmController_addNote","summary":"Add a consultation note to a client","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddNoteDto"}}}},"responses":{"201":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]}},"/api/v1/crm/clients/{id}/reports/{reportId}":{"post":{"operationId":"CrmController_linkReport","summary":"Link a Kundali report to a CRM client","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"reportId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]}},"/api/v1/crm/appointments/upcoming":{"get":{"operationId":"CrmController_getUpcomingAppointments","summary":"Get upcoming scheduled appointments","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["crm"],"security":[{"JWT":[]}]}},"/api/v1/crm/clients/{id}/appointments":{"post":{"operationId":"CrmController_addAppointment","summary":"Schedule an appointment with a client","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddAppointmentDto"}}}},"responses":{"201":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]}},"/api/v1/crm/appointments/{appointmentId}/status":{"patch":{"operationId":"CrmController_updateAppointmentStatus","summary":"Update appointment status (SCHEDULED/COMPLETED/CANCELLED)","parameters":[{"name":"appointmentId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["crm"],"security":[{"JWT":[]}]}},"/api/v1/white-label":{"get":{"operationId":"WhiteLabelController_getConfig","summary":"Get white label configuration","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["white-label"],"security":[{"JWT":[]}]},"put":{"operationId":"WhiteLabelController_updateConfig","summary":"Update white label branding","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhiteLabelConfigDto"}}}},"responses":{"200":{"description":""}},"tags":["white-label"],"security":[{"JWT":[]}]}},"/api/v1/white-label/logo":{"post":{"operationId":"WhiteLabelController_uploadLogo","summary":"Upload brand logo","parameters":[],"responses":{"201":{"description":""}},"tags":["white-label"],"security":[{"JWT":[]}]}},"/api/v1/white-label/theme.css":{"get":{"operationId":"WhiteLabelController_getThemeCss","summary":"Get CSS theme variables for white label","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}}}},"tags":["white-label"],"security":[{"JWT":[]}]}},"/api/v1/white-label/verify-domain":{"get":{"operationId":"WhiteLabelController_getDomainVerification","summary":"Get DNS TXT record for custom domain verification","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}}}},"tags":["white-label"],"security":[{"JWT":[]}]}},"/api/v1/admin/overview":{"get":{"operationId":"AdminController_getOverview","summary":"Admin dashboard overview metrics","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/charts/revenue":{"get":{"operationId":"AdminController_getRevenueChart","summary":"Revenue chart data","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/revenue-chart":{"get":{"operationId":"AdminController_getRevenueChartAlias","summary":"Revenue chart data (alias)","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/charts/users":{"get":{"operationId":"AdminController_getUserGrowthChart","summary":"User growth chart data","parameters":[{"name":"days","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/health":{"get":{"operationId":"AdminController_getSystemHealth","summary":"System health status","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/system":{"get":{"operationId":"AdminController_getSystemMetrics","summary":"System resource metrics (memory, uptime, etc.)","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/bi":{"get":{"operationId":"AdminController_getBIMetrics","summary":"Business intelligence metrics","parameters":[{"name":"period","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/users":{"get":{"operationId":"AdminController_getUsers","summary":"List all users with pagination and search","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"role","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/users/{userId}":{"get":{"operationId":"AdminController_getUserDetail","summary":"Get detailed user information","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/users/{userId}/role":{"patch":{"operationId":"AdminController_updateRole","summary":"Update user role","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/users/{userId}/credits":{"post":{"operationId":"AdminController_adjustCredits","summary":"Manually adjust user credits (positive or negative)","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/users/{userId}/suspend":{"post":{"operationId":"AdminController_suspendUser","summary":"Suspend a user account","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/users/{userId}/unsuspend":{"post":{"operationId":"AdminController_unsuspendUser","summary":"Unsuspend a user account","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/reports":{"get":{"operationId":"AdminController_getReports","summary":"List all generated reports","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"type","required":true,"in":"query","schema":{"type":"string"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/reports/breakdown":{"get":{"operationId":"AdminController_getReportBreakdown","summary":"Report type breakdown counts","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/transactions":{"get":{"operationId":"AdminController_getTransactions","summary":"List all payment transactions","parameters":[{"name":"page","required":true,"in":"query","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","schema":{"type":"number"}},{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/api-keys":{"get":{"operationId":"AdminController_getApiKeys","summary":"List all API keys across all users","parameters":[],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/admin/api-keys/{keyId}/revoke":{"patch":{"operationId":"AdminController_revokeApiKey","summary":"Revoke an API key","parameters":[{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["admin"],"security":[{"bearer":[]}]}},"/api/v1/face-reading/analyze":{"post":{"operationId":"FaceReadingController_analyze","summary":"Analyze face using Samudrika Shastra (AI vision)","parameters":[],"requestBody":{"required":true,"description":"Base64-encoded image (JPEG/PNG/WebP)","content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"tags":["face-reading"],"security":[{"JWT":[]}]}},"/api/v1/bots/telegram/webhook":{"post":{"operationId":"BotsController_telegramWebhook","summary":"Telegram bot webhook receiver","parameters":[],"responses":{"200":{"description":""}},"tags":["bots"]}},"/api/v1/bots/whatsapp/webhook":{"get":{"operationId":"BotsController_whatsappVerify","summary":"WhatsApp webhook verification","parameters":[{"name":"hub.mode","required":true,"in":"query","schema":{"type":"string"}},{"name":"hub.verify_token","required":true,"in":"query","schema":{"type":"string"}},{"name":"hub.challenge","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["bots"]},"post":{"operationId":"BotsController_whatsappWebhook","summary":"WhatsApp message webhook receiver","parameters":[],"responses":{"200":{"description":""}},"tags":["bots"]}}},"info":{"title":"AstroMitra API","description":"## World's most advanced AI-powered Vedic Astrology API\n\n**Architecture:** Deterministic astrological calculations + AI-powered interpretations.\nAI never invents planetary positions — all chart data comes from verified astronomical engines.\n\n**Authentication:** JWT Bearer token (user endpoints) or API Key header `x-api-key` (developer endpoints).\n\n**Credits:** Each operation costs credits. New users receive 50 free credits.\n| Operation | Cost |\n|-----------|------|\n| Kundali Generation | 10 credits |\n| Compatibility Report | 15 credits |\n| Horoscope | 5 credits |\n| Muhurat | 8 credits |\n| PDF Download | 5 credits |\n| AI Chat Message | 2 credits |\n      ","version":"1.0","contact":{"name":"AstroMitra Support","url":"https://astromitra.tech","email":"api@astromitra.tech"},"license":{"name":"Proprietary","url":"https://astromitra.tech/terms"}},"tags":[{"name":"auth","description":"Authentication & Authorization"},{"name":"kundali","description":"Birth Chart & Kundali Generation"},{"name":"horoscope","description":"Daily, Weekly, Monthly Horoscopes"},{"name":"compatibility","description":"Kundali Matching & Compatibility (Ashtakoot)"},{"name":"predictions","description":"Vedic Predictions (Career, Marriage, Finance, Health)"},{"name":"muhurat","description":"Auspicious Time Calculator with Panchang"},{"name":"numerology","description":"Chaldean & Pythagorean Numerology Engine"},{"name":"doshas","description":"Dosha Detection (Manglik, Kaal Sarp, Nadi, etc.)"},{"name":"remedies","description":"Gemstone, Mantra & Puja Recommendations"},{"name":"ai-chat","description":"AI Astrology Chat (chart-grounded, no hallucinations)"},{"name":"pdf","description":"Premium PDF Report Generation"},{"name":"credits","description":"Credits Management & Billing"},{"name":"subscriptions","description":"Subscription Plans & Management"},{"name":"payments","description":"Razorpay Payment Processing"},{"name":"webhooks","description":"Webhook Endpoint Management"},{"name":"api-keys","description":"API Key Management for Developers"},{"name":"coupons","description":"Coupon Codes & Referral Program"},{"name":"users","description":"User Profile Management"},{"name":"admin","description":"Admin Dashboard (ADMIN role required)"}],"servers":[{"url":"http://localhost:4000","description":"Local Development"},{"url":"https://api.astromitra.tech","description":"Production"}],"components":{"securitySchemes":{"JWT":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"API-Key":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"RegisterDto":{"type":"object","properties":{"firstName":{"type":"string","example":"Arjun"},"lastName":{"type":"string","example":"Sharma"},"email":{"type":"string","example":"arjun@example.com"},"password":{"type":"string","minLength":8,"example":"SecurePass123!"},"phone":{"type":"string","example":"+919876543210"}},"required":["firstName","lastName","email","password"]},"LoginDto":{"type":"object","properties":{"email":{"type":"string","example":"arjun@example.com"},"password":{"type":"string","example":"SecurePass123!"}},"required":["email","password"]},"RefreshTokenDto":{"type":"object","properties":{"refreshToken":{"type":"string"}},"required":["refreshToken"]},"VerifyTotpDto":{"type":"object","properties":{}},"DisableTotpDto":{"type":"object","properties":{}},"GenerateKundaliDto":{"type":"object","properties":{"firstName":{"type":"string","example":"Arjun"},"lastName":{"type":"string","example":"Sharma"},"gender":{"enum":["MALE","FEMALE","OTHER"],"type":"string"},"birthDate":{"type":"string","example":"1990-08-15","description":"Birth date in YYYY-MM-DD format"},"birthTime":{"type":"string","example":"10:30","description":"Birth time in HH:MM (24h) format"},"birthPlace":{"type":"string","example":"Mumbai, Maharashtra, India"},"latitude":{"type":"number","minimum":-90,"maximum":90,"example":19.076,"description":"Latitude (-90 to 90)"},"longitude":{"type":"number","minimum":-180,"maximum":180,"example":72.8777,"description":"Longitude (-180 to 180)"},"timezone":{"type":"string","example":"Asia/Kolkata"},"ayanamsa":{"enum":["LAHIRI","RAMAN","KRISHNAMURTI","TRUE_CHITRA"],"type":"string","default":"LAHIRI"},"purpose":{"type":"string","example":"career","description":"Purpose of the reading"},"language":{"type":"string","example":"en"}},"required":["firstName","lastName","gender","birthDate","birthTime","birthPlace","latitude","longitude","timezone"]},"CreateClientDto":{"type":"object","properties":{}},"AddNoteDto":{"type":"object","properties":{}},"AddAppointmentDto":{"type":"object","properties":{}},"WhiteLabelConfigDto":{"type":"object","properties":{}}}}}