Read the alarm push-notification delivery log
One row per recipient per alarm transition, newest first, recording what happened to that notification: sent, failed (with the error), skipped_unconfigured (no PUSH_NOTIFICATION_URL/_API_KEY in this environment), or suppressed (the transition has no copy — motion clearing — or nobody has access to the device; the reason is in error). Each row also carries the matter path, endpoint, device type and where that device type came from, so a mislabelled sensor is distinguishable from a genuine delivery miss. Filter by device, user, time range, alarm type and outcome. Requires dual auth: X-Admin-API-Key + JWT.
curl -X GET "https://api.spkey.co/admin/notification-log?deviceId=example_string&userId=example_string&from=example_string&to=example_string&alarmType=example_string&outcome=sent&limit=42&offset=null" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_TOKEN (JWT)" \
-H "X-API-Key: YOUR_API_KEY"
import requests
import json
url = "https://api.spkey.co/admin/notification-log?deviceId=example_string&userId=example_string&from=example_string&to=example_string&alarmType=example_string&outcome=sent&limit=42&offset=null"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN (JWT)",
"X-API-Key": "YOUR_API_KEY"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://api.spkey.co/admin/notification-log?deviceId=example_string&userId=example_string&from=example_string&to=example_string&alarmType=example_string&outcome=sent&limit=42&offset=null", {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN (JWT)",
"X-API-Key": "YOUR_API_KEY"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.spkey.co/admin/notification-log?deviceId=example_string&userId=example_string&from=example_string&to=example_string&alarmType=example_string&outcome=sent&limit=42&offset=null", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN (JWT)")
req.Header.Set("X-API-Key", "YOUR_API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.spkey.co/admin/notification-log?deviceId=example_string&userId=example_string&from=example_string&to=example_string&alarmType=example_string&outcome=sent&limit=42&offset=null')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['Authorization'] = 'Bearer YOUR_API_TOKEN (JWT)'
request['X-API-Key'] = 'YOUR_API_KEY'
response = http.request(request)
puts response.body
{
"total": 3.14,
"limit": 3.14,
"offset": 3.14,
"hasMore": true,
"records": [
{
"eventId": "example_string",
"userId": "example_string",
"deviceId": "example_string",
"alarmType": "null",
"severity": "null",
"channel": "null",
"matterPath": "null",
"endpoint": "null",
"deviceTypeId": "null",
"deviceTypeSource": "null",
"rawValue": "null",
"title": "null",
"body": "null",
"outcome": "sent",
"error": "null",
"createdAt": "example_string"
}
]
}
{
"error": "Unauthorized",
"message": "Authentication required. Please provide a valid API token",
"code": 401
}
{
"error": "Forbidden",
"message": "You don't have permission to access this resource",
"code": 403
}
{
"error": "Internal Server Error",
"message": "An unexpected error occurred on the server",
"code": 500,
"requestId": "req_1234567890"
}
/admin/notification-log
Target server for requests. Edit to use your own host.
JWT token from SmartphoneKey authentication. Identifies the B2C user or B2B service.
API key for B2B organization access. Provided during organization onboarding.
MatterDevice UUID whose sensor tripped.
Recipient UUID. Device-level records (nothing sent to anybody) carry "".
Inclusive ISO-8601 lower bound on the delivery timestamp.
Inclusive ISO-8601 upper bound on the delivery timestamp.
contact | motion | water_leak | water_freeze | rain | smoke | co | device_fault
Filter to one delivery outcome — failed and suppressed are the interesting ones.
Page size, newest first (default 50, max 200).
Rows to skip (default 0).
Request Preview
Response
Response will appear here after sending the request
Authentication
Bearer token (JWT). JWT token from SmartphoneKey authentication. Identifies the B2C user or B2B service.
API Key for authentication. API key for B2B organization access. Provided during organization onboarding.
Query Parameters
MatterDevice UUID whose sensor tripped.
Recipient UUID. Device-level records (nothing sent to anybody) carry "".
Inclusive ISO-8601 lower bound on the delivery timestamp.
Inclusive ISO-8601 upper bound on the delivery timestamp.
contact | motion | water_leak | water_freeze | rain | smoke | co | device_fault
Filter to one delivery outcome — failed and suppressed are the interesting ones.
sentfailedskipped_unconfiguredsuppressedundeliverablemutedPage size, newest first (default 50, max 200).
Rows to skip (default 0).