LaserData Notification Channels API
Notification channels (email, slack, webhook)
Notification channels (email, slack, webhook)
openapi: 3.1.0
info:
title: LaserData Cloud Audit Account Notification Channels API
description: 'Tenant audit log and per-user activity feed.
Public REST API for the LaserData Cloud audit service.
## Authentication
Every endpoint accepts either of two auth methods:
- **API key** (machine / CI / SDK): send in the `ld-api-key` header. Cannot be used on `GET /audit/users/activity` which is session-only.
- **Session cookie** (browser / console): obtained from `POST /account/sign_in` on the control plane.
Audit endpoints are read-only and replay-safe by definition.
## Pagination
List endpoints return a `Paged<T>` body (`page`, `total_pages`, `total_results`, `items`) and a `link` header (RFC 8288) with `rel="first"`, `"prev"`, `"next"`, `"last"` when applicable.
## Errors
Error responses follow RFC 7807 `application/problem+json` with `type`, `title`, `code`, `reason`, `instance`, `status`, `retryable`, and optional `field` / `field_issues`. `retryable` is `true` for 408, 425, 429, 500, 502, 503, 504.
## Response headers
- `ld-request`: request ID. Include it when reporting issues.
- `link`: pagination relations.
- `retry-after`: wait hint on 429 / 503.'
termsOfService: https://laserdata.com/terms
contact:
name: LaserData Support
url: https://docs.laserdata.com
email: support@laserdata.com
license:
name: Proprietary
version: 0.0.66
x-logo:
url: https://assets.laserdata.com/laserdata_dark.png
altText: LaserData
href: https://laserdata.com
servers:
- url: https://api.laserdata.cloud
description: Production
security:
- ld_api_key: []
- session_cookie: []
tags:
- name: Notification Channels
description: Notification channels (email, slack, webhook)
paths:
/tenants/{tenant_id}/channels:
get:
tags:
- Notification Channels
summary: List tenant notification channels
description: Returns paged tenant-owned channels. Supports filtering by channel kind.
operationId: get_tenant_channels
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: page
in: query
required: false
schema:
type:
- integer
- 'null'
format: int64
minimum: 1
example: 1
- name: results
in: query
required: false
schema:
type:
- integer
- 'null'
format: int64
minimum: 1
example: 10
- name: channel
in: query
required: false
schema:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/NotificationChannelKind'
responses:
'200':
description: Paged channels
content:
application/json:
schema:
$ref: '#/components/schemas/Paged_NotificationChannelInfo'
'403':
description: Insufficient permissions
post:
tags:
- Notification Channels
summary: Create tenant notification channel
description: Creates a tenant-owned notification channel such as Slack, webhook, email, or SMS. Destination validation depends on the chosen channel kind.
operationId: create_tenant_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
requestBody:
description: Channel type, destination, name, optional settings and remarks
content:
application/json:
schema:
$ref: '#/components/schemas/CreateChannel'
required: true
responses:
'201':
description: Channel created
'400':
description: Invalid channel configuration
'403':
description: Insufficient permissions
'409':
description: Channel already exists or limit reached
/tenants/{tenant_id}/channels/{channel_id}:
get:
tags:
- Notification Channels
summary: Get tenant notification channel
description: Returns configuration and metadata for one tenant-owned notification channel.
operationId: get_tenant_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: channel_id
in: path
description: Channel identifier
required: true
schema:
$ref: '#/components/schemas/NotificationChannelId'
responses:
'200':
description: Channel details
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationChannelDetails'
'403':
description: Insufficient permissions
'404':
description: Channel not found
put:
tags:
- Notification Channels
summary: Update tenant notification channel
description: Partially updates a tenant-owned notification channel. Omitted fields are left unchanged.
operationId: update_tenant_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: channel_id
in: path
description: Channel identifier
required: true
schema:
$ref: '#/components/schemas/NotificationChannelId'
requestBody:
description: Partial channel update
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateChannel'
required: true
responses:
'204':
description: Channel updated
'400':
description: Invalid channel configuration
'403':
description: Insufficient permissions
'404':
description: Channel not found
delete:
tags:
- Notification Channels
summary: Delete tenant notification channel
description: Deletes a tenant-owned notification channel and all subscriptions attached to it.
operationId: delete_tenant_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: channel_id
in: path
description: Channel identifier
required: true
schema:
$ref: '#/components/schemas/NotificationChannelId'
responses:
'204':
description: Channel deleted
'403':
description: Insufficient permissions
'404':
description: Channel not found
/tenants/{tenant_id}/channels/{channel_id}/test:
post:
tags:
- Notification Channels
summary: Send test tenant notification
description: Sends a test message through a tenant-owned notification channel. Rate limited to prevent abuse.
operationId: test_tenant_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: channel_id
in: path
description: Channel identifier
required: true
schema:
$ref: '#/components/schemas/NotificationChannelId'
responses:
'204':
description: Test notification sent
'400':
description: Channel disabled or cannot send to private address
'403':
description: Insufficient permissions
'404':
description: Channel not found
'429':
description: Test channel rate limited
/tenants/{tenant_id}/divisions/{division_id}/channels:
get:
tags:
- Notification Channels
summary: List division notification channels
description: Returns paged division-owned channels. Supports filtering by channel kind.
operationId: get_division_channels
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: division_id
in: path
description: Division identifier
required: true
schema:
$ref: '#/components/schemas/DivisionId'
- name: page
in: query
required: false
schema:
type:
- integer
- 'null'
format: int64
minimum: 1
example: 1
- name: results
in: query
required: false
schema:
type:
- integer
- 'null'
format: int64
minimum: 1
example: 10
- name: channel
in: query
required: false
schema:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/NotificationChannelKind'
responses:
'200':
description: Paged channels
content:
application/json:
schema:
$ref: '#/components/schemas/Paged_NotificationChannelInfo'
'403':
description: Insufficient permissions
post:
tags:
- Notification Channels
summary: Create division notification channel
description: Creates a division-owned notification channel using the same payload contract as tenant channels.
operationId: create_division_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: division_id
in: path
description: Division identifier
required: true
schema:
$ref: '#/components/schemas/DivisionId'
requestBody:
description: Channel type, destination, name, optional settings and remarks
content:
application/json:
schema:
$ref: '#/components/schemas/CreateChannel'
required: true
responses:
'201':
description: Channel created
'400':
description: Invalid channel configuration
'403':
description: Insufficient permissions
'409':
description: Channel already exists or limit reached
/tenants/{tenant_id}/divisions/{division_id}/channels/{channel_id}:
get:
tags:
- Notification Channels
summary: Get division notification channel
description: Returns configuration and metadata for one division-owned notification channel.
operationId: get_division_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: division_id
in: path
description: Division identifier
required: true
schema:
$ref: '#/components/schemas/DivisionId'
- name: channel_id
in: path
description: Channel identifier
required: true
schema:
$ref: '#/components/schemas/NotificationChannelId'
responses:
'200':
description: Channel details
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationChannelDetails'
'403':
description: Insufficient permissions
'404':
description: Channel not found
put:
tags:
- Notification Channels
summary: Update division notification channel
description: Partially updates a division-owned notification channel. Omitted fields are left unchanged.
operationId: update_division_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: division_id
in: path
description: Division identifier
required: true
schema:
$ref: '#/components/schemas/DivisionId'
- name: channel_id
in: path
description: Channel identifier
required: true
schema:
$ref: '#/components/schemas/NotificationChannelId'
requestBody:
description: Partial channel update
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateChannel'
required: true
responses:
'204':
description: Channel updated
'400':
description: Invalid channel configuration
'403':
description: Insufficient permissions
'404':
description: Channel not found
delete:
tags:
- Notification Channels
summary: Delete division notification channel
description: Deletes a division-owned notification channel and all subscriptions attached to it.
operationId: delete_division_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: division_id
in: path
description: Division identifier
required: true
schema:
$ref: '#/components/schemas/DivisionId'
- name: channel_id
in: path
description: Channel identifier
required: true
schema:
$ref: '#/components/schemas/NotificationChannelId'
responses:
'204':
description: Channel deleted
'403':
description: Insufficient permissions
'404':
description: Channel not found
/tenants/{tenant_id}/divisions/{division_id}/channels/{channel_id}/test:
post:
tags:
- Notification Channels
summary: Send test division notification
description: Sends a test message through a division-owned notification channel. Rate limited to prevent abuse.
operationId: test_division_channel
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: division_id
in: path
description: Division identifier
required: true
schema:
$ref: '#/components/schemas/DivisionId'
- name: channel_id
in: path
description: Channel identifier
required: true
schema:
$ref: '#/components/schemas/NotificationChannelId'
responses:
'204':
description: Test notification sent
'400':
description: Channel disabled or cannot send to private address
'403':
description: Insufficient permissions
'404':
description: Channel not found
'429':
description: Test channel rate limited
components:
schemas:
Paged_NotificationChannelInfo:
type: object
required:
- total_pages
- total_results
- page
- items
properties:
items:
type: array
items:
type: object
required:
- id
- owner_kind
- owner_id
- channel
- name
- enabled
- created_at
- updated_at
properties:
channel:
$ref: '#/components/schemas/NotificationChannelKind'
created_at:
type: string
format: date-time
enabled:
type: boolean
id:
$ref: '#/components/schemas/NotificationChannelId'
name:
$ref: '#/components/schemas/NotificationChannelName'
owner_id:
type: integer
format: int64
example: 7261845022003200001
minimum: 0
owner_kind:
$ref: '#/components/schemas/OwnerKind'
updated_at:
type: string
format: date-time
example:
id: 7261845330120500000
owner_kind: tenant
owner_id: 7261845022003200001
channel: email
name: ops-team-email
enabled: true
created_at: '2026-05-20T10:00:00Z'
updated_at: '2026-05-20T10:00:00Z'
page:
type: integer
format: int64
example: 1
minimum: 1
total_pages:
type: integer
format: int64
example: 4
minimum: 0
total_results:
type: integer
format: int64
example: 137
minimum: 0
NotificationChannelName:
type: string
example: ops-webhook
NotificationChannelDestination:
type: string
example: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
DivisionId:
type: integer
format: int64
example: 7261844974723780000
minimum: 0
OwnerKind:
type: string
enum:
- user
- tenant
- division
- system
NotificationChannelId:
type: integer
format: int64
example: 7261845612345670000
minimum: 0
UpdateChannel:
type: object
properties:
destination:
type:
- string
- 'null'
example: https://hooks.example.com/laserdata/ops-v2
enabled:
type:
- boolean
- 'null'
name:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/NotificationChannelName'
remarks:
type:
- string
- 'null'
example: Migrated to rotated webhook URL
settings:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/ChannelSettings'
WebhookSettings:
type: object
properties:
headers:
type:
- object
- 'null'
additionalProperties:
type: string
propertyNames:
type: string
method:
type:
- string
- 'null'
example: POST
example:
headers:
Authorization: Bearer secret-token
method: POST
NotificationChannelInfo:
type: object
required:
- id
- owner_kind
- owner_id
- channel
- name
- enabled
- created_at
- updated_at
properties:
channel:
$ref: '#/components/schemas/NotificationChannelKind'
created_at:
type: string
format: date-time
enabled:
type: boolean
id:
$ref: '#/components/schemas/NotificationChannelId'
name:
$ref: '#/components/schemas/NotificationChannelName'
owner_id:
type: integer
format: int64
example: 7261845022003200001
minimum: 0
owner_kind:
$ref: '#/components/schemas/OwnerKind'
updated_at:
type: string
format: date-time
example:
id: 7261845330120500000
owner_kind: tenant
owner_id: 7261845022003200001
channel: email
name: ops-team-email
enabled: true
created_at: '2026-05-20T10:00:00Z'
updated_at: '2026-05-20T10:00:00Z'
ChannelSettings:
type: object
properties:
slack:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/SlackSettings'
sms:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/SmsSettings'
webhook:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/WebhookSettings'
NotificationChannelKind:
type: string
enum:
- slack
- webhook
- sms
- email
SlackSettings:
type: object
properties:
channel:
type:
- string
- 'null'
example: laser-alerts
icon_emoji:
type:
- string
- 'null'
example: ':rotating_light:'
username:
type:
- string
- 'null'
example: LaserData Cloud
TenantId:
type: integer
format: int64
example: 7261845022003200001
minimum: 0
SmsSettings:
type: object
properties:
sender_id:
type:
- string
- 'null'
example: LaserData
NotificationChannelDetails:
allOf:
- $ref: '#/components/schemas/NotificationChannelInfo'
- type: object
required:
- destination
properties:
destination:
$ref: '#/components/schemas/NotificationChannelDestination'
remarks:
type:
- string
- 'null'
settings:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/ChannelSettings'
CreateChannel:
type: object
required:
- channel
- name
- destination
properties:
channel:
$ref: '#/components/schemas/NotificationChannelKind'
destination:
type: string
example: https://hooks.example.com/laserdata/ops
name:
$ref: '#/components/schemas/NotificationChannelName'
remarks:
type:
- string
- 'null'
example: Primary production incident sink
settings:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/ChannelSettings'
securitySchemes:
ld_api_key:
type: apiKey
in: header
name: ld-api-key
description: Tenant API key sent in the ld-api-key request header. Scoped to tenant-level audit reads. Cannot be used on user-scope endpoints (`/audit/users/activity`).
session_cookie:
type: apiKey
in: cookie
name: session
description: Browser session cookie issued by POST /account/sign_in on core. Required for user-scope endpoints.
externalDocs:
url: https://docs.laserdata.com
description: LaserData Cloud documentation