openapi: 3.2.0 info: title: LDM v3 AI API description: 'Multi-tenant B2B outreach automation platform. Auth: JWT Bearer (15-min) or tenant API key (ldm_*) managed in CRM Settings → API Keys. All tenant-scoped endpoints require the X-Tenant-Id header.' version: 1.0.0 contact: {} servers: - url: https://api.live-direct-marketing.online description: Production - url: https://api.dev.live-direct-marketing.online description: Development - url: http://127.0.0.1:3000 description: Local tags: - name: AI paths: /api/ai/generate: post: operationId: AiController_generate parameters: - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints responses: '201': description: '' security: - jwt: [] summary: Generate AI completion via configured provider tags: - AI x-required-scope: - ai:generate /api/ai/balance: get: operationId: AiController_getBalance parameters: - name: provider required: true in: query schema: type: string - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints responses: '200': description: '' security: - jwt: [] summary: Get balance for current or specified AI provider tags: - AI x-required-scope: - ai:read /api/ai/balances: get: operationId: AiController_getAllBalances parameters: - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints responses: '200': description: '' security: - jwt: [] summary: Get balances for all configured AI providers tags: - AI x-required-scope: - ai:read /api/ai/usage: get: operationId: AiController_getUsage parameters: - name: days required: true in: query schema: type: string - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints responses: '200': description: '' security: - jwt: [] summary: Get AI usage statistics for the given window (days) tags: - AI x-required-scope: - ai:read /api/ai/logs: get: operationId: AiController_getLogs parameters: - name: limit required: true in: query schema: type: string - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints responses: '200': description: '' security: - jwt: [] summary: Get recent AI usage logs tags: - AI x-required-scope: - ai:read /api/ai/providers: get: operationId: AiController_getProviders parameters: - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints responses: '200': description: '' security: - jwt: [] summary: List available AI providers with status tags: - AI x-required-scope: - ai:read /api/ai/models: get: operationId: AiController_getModels parameters: - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints responses: '200': description: '' security: - jwt: [] summary: List available AI models per provider (dynamic) tags: - AI x-required-scope: - ai:read /api/ai/check-balance: post: operationId: AiController_checkBalance parameters: - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints responses: '201': description: '' security: - jwt: [] summary: Check AI balance against threshold (cron/monitoring hook) tags: - AI x-required-scope: - ai:write components: securitySchemes: jwt: scheme: bearer bearerFormat: JWT type: http description: JWT access token from /auth/login (Bearer ) tenant-api-key: scheme: bearer bearerFormat: JWT type: http description: Tenant API key (Bearer ldm_*) for MCP/A2A clients. Issued via CRM Settings → API Keys. rpa-service: scheme: bearer bearerFormat: JWT type: http description: Dedicated RPA service key. No tenant API-key or query-key authentication.