openapi: 3.2.0 info: title: LDM v3 Custom Objects 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: Custom Objects paths: /api/custom-objects/defs: get: operationId: CustomObjectsController_listDefs parameters: - name: search required: true in: query schema: type: string - name: isActive required: true in: query schema: type: string - name: page required: true in: query schema: type: string - name: pageSize 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 custom object definitions tags: - Custom Objects x-required-scope: - crm:read post: operationId: CustomObjectsController_createDef 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: Create a custom object definition tags: - Custom Objects x-required-scope: - crm:write /api/custom-objects/defs/{slug}: get: operationId: CustomObjectsController_getDef parameters: - name: slug 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 custom object definition by slug tags: - Custom Objects patch: operationId: CustomObjectsController_updateDef parameters: - name: slug 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: Update a custom object definition tags: - Custom Objects delete: operationId: CustomObjectsController_deleteDef parameters: - name: slug 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 custom object definition tags: - Custom Objects /api/custom-objects/{slug}/records: get: operationId: CustomObjectsController_listRecords parameters: - name: slug required: true in: path schema: type: string - name: page required: true in: query schema: type: string - name: pageSize 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 records of a custom object tags: - Custom Objects post: operationId: CustomObjectsController_createRecord parameters: - name: slug 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: Create a record of a custom object tags: - Custom Objects /api/custom-objects/{slug}/records/{id}: get: operationId: CustomObjectsController_getRecord parameters: - name: slug required: true in: path schema: type: string - 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 custom object record by id or externalId tags: - Custom Objects patch: operationId: CustomObjectsController_updateRecord parameters: - name: slug required: true in: path schema: type: string - 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: Update a custom object record tags: - Custom Objects delete: operationId: CustomObjectsController_deleteRecord parameters: - name: slug required: true in: path schema: type: string - 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 custom object record tags: - Custom Objects 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.