openapi: 3.2.0 info: title: LDM v3 Legal 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: Legal paths: /api/legal/terms: get: operationId: LegalController_getTerms parameters: - name: locale 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 the current terms of service text (public). tags: - Legal put: operationId: LegalController_updateTerms 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: Update the terms of service text (SUPER only) tags: - Legal x-required-scope: - legal:write /api/legal/documents: get: operationId: LegalController_listDocuments 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 all legal documents (key/title/summary) — public tags: - Legal /api/legal/documents/{key}: get: operationId: LegalController_getDocument parameters: - name: key required: true in: path 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 one legal document by key (terms|aup|privacy|dpa|mode2|campaign_guarantee|se… tags: - Legal /api/legal/documents/{key}/publish: post: operationId: LegalController_publishVersion parameters: - name: key required: true in: path 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: '201': description: '' security: - jwt: [] summary: Publish a new version of a legal document (SUPER) tags: - Legal /api/legal/documents/{key}/versions: get: operationId: LegalController_listVersions parameters: - name: key required: true in: path schema: type: string - name: locale 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: List versions of a legal document (SUPER) tags: - Legal /api/legal/acceptances: post: operationId: LegalController_recordAcceptance 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: Record the current user's acceptance of a legal document tags: - Legal get: operationId: LegalController_listAcceptances parameters: - name: userId required: true in: query schema: type: string - name: docKey required: true in: query schema: type: string - name: tenantId required: true in: query schema: type: string - name: page required: true in: query schema: type: string - 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: Acceptance registry — who accepted which version when (SUPER) tags: - Legal x-required-scope: - legal:read /api/legal/acceptances/me: get: operationId: LegalController_myAcceptances 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: The current user's own acceptances tags: - Legal /api/legal: get: operationId: LegalController_listAll 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 all legal documents (SUPER only) tags: - Legal 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.