Skip to main content

Overview

Enterprise Eventing provides a scalable, account-level event delivery system for enterprise applications. Service accounts can configure webhook receivers for all devices and locations across an entire enterprise account, enabling real-time monitoring and integration at scale.

What is Enterprise Eventing?​

Enterprise Eventing consists of three main components:

  1. Sinks - Webhook endpoints that receive events
  2. Subscriptions - Filter configurations that determine which events are delivered
  3. Events - Real-time notifications about device state changes, lifecycle events, and more

Key Features:

  • Account-wide scope - Receive events for all devices and locations in your enterprise account
  • Service account authorization - Use service account tokens for programmatic access
  • Automatic device inclusion - All devices in the account are automatically included
  • Flexible filtering - Filter events by capability, event type, or location group
  • Enterprise scale - Designed for fleet management and multi-property monitoring

Use Cases​

Enterprise Eventing is designed for:

✅ Real-time Monitoring - Track device status across multiple properties

✅ Fleet Management - Monitor large deployments of devices

✅ External System Integration - Send device data to analytics platforms, databases, or business intelligence tools

✅ Audit Trails - Log all device lifecycle events for compliance

✅ Predictive Maintenance - Analyze device health events across your fleet

Sinks​

API Reference

A sink is a webhook endpoint that receives events. Sinks are registered at the account level and can be reused across multiple subscriptions.

Creating a Sink​

To create a sink, make a POST request to /accounts/{accountId}/sinks:

{
"name": "My-Webhook-Endpoint",
"type": "HTTPS_SINK",
"httpsSink": {
"endpoint": "https://example.com/webhook"
}
}

Required fields:

  • name - A descriptive name for the sink (cannot contain spaces).
  • type - Must be HTTPS_SINK
  • httpsSink.endpoint - HTTPS URL for your webhook (HTTP not supported)

Response:

{
"sinkId": "7de9a66a-8be6-4b69-9543-92ab3058bd6d",
"name": "My-Webhook-Endpoint",
"type": "HTTPS_SINK",
"httpsSink": {
"endpoint": "https://example.com/webhook"
},
"status": "REGISTERED",
"createdDate": "2025-01-15T10:30:00Z",
"lastUpdatedDate": "2025-01-15T10:30:00Z"
}

Sink Verification​

When you create a sink, SmartThings sends a verification challenge to your webhook endpoint:

{
"accountId": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"notificationType": "SINK_CONFIRMATION",
"version": "2",
"sinkConfirmationNotification": {
"sinkId": "7de9a66a-8be6-4b69-9543-92ab3058bd6d",
"challenge": "550e8400-e29b-41d4-a716-446655440000"
}
}

Your endpoint must respond with 200 OK and return the challenge:

{
"challenge": "550e8400-e29b-41d4-a716-446655440000"
}
warning

You cannot delete a sink that has active subscriptions. You must first delete all subscriptions associated with the sink before the sink can be deleted. Note that due to eventual consistency, there may be a brief delay between deleting a subscription and being able to delete its sink.

Subscriptions​

API Reference

A subscription links a sink to specific events using filters. Subscriptions determine which events are delivered to your webhook.

Creating a Subscription​

To create a subscription, make a POST request to /accounts/{accountId}/subscriptions:

{
"name": "Device-Lifecycle-Events",
"sinkId": "7de9a66a-8be6-4b69-9543-92ab3058bd6d",
"scope": "ACCOUNT",
"filters": [
{
"type": "EVENT",
"eventFilter": {
"eventTypes": ["DEVICE_LIFECYCLE_EVENT", "LOCATION_LIFECYCLE_EVENT"]
}
}
]
}

Required fields:

  • name - A descriptive name for the subscription (cannot contain spaces).
  • sinkId - The ID of the sink to deliver events to
  • filters - Array of filter configurations (at least one required)

Optional fields:

  • scope - Either ACCOUNT (default) or LOCATION_GROUP
  • scopeId - Required if scope is LOCATION_GROUP, must be a valid location group ID
  • description - Optional description

Filters​

Filters determine which events are delivered to your sink. You can use two types of filters:

EVENT Filter​

Subscribe to specific event types:

{
"type": "EVENT",
"eventFilter": {
"eventTypes": ["DEVICE_LIFECYCLE_EVENT", "DEVICE_HEALTH_EVENT", "LOCATION_LIFECYCLE_EVENT"]
}
}

Available event types:

  • APPLIANCE_DIAGNOSTIC_EVENT - Samsung appliance diagnostic events
  • DEVICE_EVENT - Device capability/attribute changes
  • DEVICE_HEALTH_EVENT - Device online/offline status
  • DEVICE_LIFECYCLE_EVENT - Device created, updated, deleted, moved
  • HUB_HEALTH_EVENT - Hub health status
  • HUB_LIFECYCLE_EVENT - Hub lifecycle changes
  • INSTALLED_APP_LIFECYCLE_EVENT - Installed app lifecycle
  • LOCATION_LIFECYCLE_EVENT - Location created, updated, deleted
  • MODE_EVENT - Mode changes
  • SCENE_LIFECYCLE_EVENT - Scene lifecycle changes

CAPABILITY Filter​

Subscribe to device events for specific capabilities:

{
"type": "CAPABILITY",
"capabilityFilter": {
"capabilities": [
{
"capability": "switch",
"attribute": "switch",
"component": "main"
},
{
"capability": "temperatureMeasurement",
"attribute": "*",
"component": "*"
}
],
"exclude": false
}
}

Capability filter fields:

  • capability - The capability name (required)
  • attribute - Specific attribute or * for all (optional, defaults to *)
  • component - Specific component or * for all (optional, defaults to *)
  • exclude - If true, delivers all device events EXCEPT those matching the specified capabilities. If false, delivers only events matching the specified capabilities (default: false)

Multiple capability items: Multiple items in the capabilities array use OR logic:

  • When exclude: false - Events matching ANY capability item will be delivered
  • When exclude: true - Events matching ANY capability item will be excluded (only events that don't match any item will be delivered)

Combining Filters​

You can include multiple filters in a subscription. Each filter type can only appear once:

{
"filters": [
{
"type": "EVENT",
"eventFilter": {
"eventTypes": ["LOCATION_LIFECYCLE_EVENT"]
}
},
{
"type": "CAPABILITY",
"capabilityFilter": {
"capabilities": [
{
"capability": "switch"
}
]
}
}
]
}
warning

You cannot combine a CAPABILITY filter with an EVENT filter containing ALL or DEVICE_EVENT event types, as this would create ambiguous filtering logic.

Receiving Events​

When subscribed events occur, SmartThings sends a POST request to your sink's webhook endpoint with a batch of events.

Event Payload Structure​

Webhook deliveries use a consistent structure with batched events:

{
"accountId": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"notificationType": "EVENT",
"version": "2",
"eventNotification": {
"locationGroupId": "43e807f6-f668-46d4-a97f-06998dcf748d",
"events": [
{
"eventTime": "2025-04-28T12:39:37Z",
"eventType": "DEVICE_EVENT",
"deviceEvent": {
"eventId": "736e3903-001c-4d40-b408-ff40d162a06b",
"locationId": "499e28ba-b33b-49c9-a5a1-cce40e41f8a6",
"ownerType": "LOCATION",
"ownerId": "499e28ba-b33b-49c9-a5a1-cce40e41f8a6",
"deviceId": "6f5ea629-4c05-4a90-a244-cc129b0a80c3",
"componentId": "main",
"capability": "motionSensor",
"attribute": "motion",
"value": "active",
"valueType": "string",
"stateChange": true,
"data": {},
"commandId": "cmd-123",
"sensitive": false
}
},
{
"eventTime": "2025-04-28T12:39:38Z",
"eventType": "DEVICE_HEALTH_EVENT",
"deviceHealthEvent": {
"eventId": "f28cdef9-675a-4a10-85cd-33d512fbdccf",
"locationId": "499e28ba-b33b-49c9-a5a1-cce40e41f8a6",
"ownerType": "LOCATION",
"ownerId": "499e28ba-b33b-49c9-a5a1-cce40e41f8a6",
"deviceId": "6f5ea629-4c05-4a90-a244-cc129b0a80c3",
"hubId": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"status": "OFFLINE",
"reason": "HUB_OFFLINE",
"eventSource": "OCFDEVICE"
}
},
{
"eventTime": "2025-04-28T12:39:39Z",
"eventType": "HUB_HEALTH_EVENT",
"hubHealthEvent": {
"eventId": "a1aef8ee-9b11-4d5a-b44c-3e51d583c518",
"locationId": "499e28ba-b33b-49c9-a5a1-cce40e41f8a6",
"hubId": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
"status": "OFFLINE",
"reason": "SERVICE_UNAVAILABLE"
}
}
]
}
}

Top-level fields:

  • accountId - The account ID the events belong to
  • notificationType - Always "EVENT" for platform event deliveries (or "SINK_CONFIRMATION" for webhook verification)
  • version - Event schema version (currently "2")
  • eventNotification - Container for the event batch

Event notification fields:

  • locationGroupId - The location group where the events originated
  • events - Array of events (typically batched together by proximity in time)

Individual event fields:

Each event in the events array contains:

  • eventTime - ISO 8601 timestamp when the event occurred
  • eventType - Type of event (e.g., DEVICE_EVENT, DEVICE_LIFECYCLE_EVENT, HUB_HEALTH_EVENT)
  • [eventType] - Field matching the event type with event-specific data (e.g., deviceEvent, deviceHealthEvent)

Batch Delivery Behavior​

SmartThings batches events that occur close together in time to reduce webhook traffic. This means:

  • A single POST request may contain 1 to many events in the events array
  • All events in a batch must share the same locationGroupId (single field at the notification level)
  • Events in a batch may have different eventType values (e.g., DEVICE_EVENT, DEVICE_HEALTH_EVENT, HUB_HEALTH_EVENT)
  • Each event has its own eventTime and eventType
  • Your webhook must process all events in the array
tip

See the Event Types page for detailed payload structures for each event type within the events array.

Webhook Requirements​

Your webhook endpoint must:

  • Accept POST requests
  • Use HTTPS (HTTP not supported)
  • Respond with 2xx status code within the timeout period
  • Be idempotent (in rare cases, the same event may be delivered more than once)
tip

See the Authorization page for details on webhook authentication and security.

API Reference​

For complete API documentation, see:

Account Sinks API

Account Subscriptions API