openapi: 3.2.0 info: title: LDM v3 Project Templates 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: Project Templates paths: /api/project-templates/runs/{runId}: get: operationId: ProjectTemplatesController_findRun parameters: - name: runId 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 a project run with steps and totals tags: - Project Templates patch: operationId: ProjectTemplatesController_updateRun parameters: - name: runId 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 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateRunDto' responses: '200': description: '' security: - jwt: [] summary: Update a project run (name, status, isTest, notes) tags: - Project Templates delete: operationId: ProjectTemplatesController_removeRun parameters: - name: runId 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: Delete a project run tags: - Project Templates /api/project-templates/runs/{runId}/steps/{stepId}: patch: operationId: ProjectTemplatesController_updateRunStep parameters: - name: runId required: true in: path schema: type: string - name: stepId 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 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateRunStepDto' responses: '200': description: '' security: - jwt: [] summary: Update a run step (fact, status, issues/questions/ideas) tags: - Project Templates /api/project-templates: get: operationId: ProjectTemplatesController_findAll parameters: - name: includeArchived 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 project templates tags: - Project Templates post: operationId: ProjectTemplatesController_create parameters: - name: X-Tenant-Id in: header required: false schema: type: string format: uuid description: Tenant UUID — required for all tenant-scoped endpoints requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateTemplateDto' responses: '201': description: '' security: - jwt: [] summary: Create a project template tags: - Project Templates /api/project-templates/{id}: get: operationId: ProjectTemplatesController_findOne parameters: - name: id 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 a template with steps and runs tags: - Project Templates patch: operationId: ProjectTemplatesController_update parameters: - name: id 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 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateTemplateDto' responses: '200': description: '' security: - jwt: [] summary: Update a template (name, description, isArchived) tags: - Project Templates delete: operationId: ProjectTemplatesController_remove parameters: - name: id 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: Delete a template (409 if it has runs — archive instead) tags: - Project Templates /api/project-templates/{id}/steps: post: operationId: ProjectTemplatesController_addStep parameters: - name: id 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 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/StepDto' responses: '201': description: '' security: - jwt: [] summary: Add a step to a template tags: - Project Templates /api/project-templates/{id}/steps/{stepId}: patch: operationId: ProjectTemplatesController_updateStep parameters: - name: id required: true in: path schema: type: string - name: stepId 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 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateStepDto' responses: '200': description: '' security: - jwt: [] summary: Update a template step tags: - Project Templates delete: operationId: ProjectTemplatesController_removeStep parameters: - name: id required: true in: path schema: type: string - name: stepId 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: Delete a template step tags: - Project Templates /api/project-templates/{id}/steps/reorder: post: operationId: ProjectTemplatesController_reorder parameters: - name: id 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 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ReorderDto' responses: '201': description: '' security: - jwt: [] summary: Reorder template steps (full ordered id list) tags: - Project Templates /api/project-templates/{id}/brief-questions: get: operationId: ProjectTemplatesController_briefQuestions parameters: - name: id 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: All brief questions of a template as one list tags: - Project Templates /api/project-templates/{id}/summary: get: operationId: ProjectTemplatesController_summary parameters: - name: id required: true in: path schema: type: string - name: scope 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: 'Plan vs avg fact per step over DONE runs (scope: all|test|real)' tags: - Project Templates /api/project-templates/{id}/runs: post: operationId: ProjectTemplatesController_createRun parameters: - name: id 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 requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateRunDto' responses: '201': description: '' security: - jwt: [] summary: Create a run from a template (steps are snapshotted) tags: - Project Templates components: schemas: ReorderDto: type: object properties: {} StepDto: type: object properties: {} CreateTemplateDto: type: object properties: {} UpdateTemplateDto: type: object properties: {} UpdateStepDto: type: object properties: {} UpdateRunStepDto: type: object properties: {} CreateRunDto: type: object properties: {} UpdateRunDto: type: object properties: {} 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.