Clear a sensor's learned Matter device type
Deletes the sticky Descriptor (29/0) device type learned for this device — one endpoint with ?endpoint=N, otherwise every endpoint it has. The device re-learns from its next shadow that carries 29/0. Use this when a sensor reports the opposite of reality (a contact sensor stuck reading "open", a leak detector that never alarms), which is what a stale or wrong row causes. Deleting nothing returns 200 with alreadyDeleted=true — the row being absent is the requested end state. Requires dual auth: X-Admin-API-Key + JWT.
curl -X DELETE "https://api.spkey.co/admin/sensor-device-type/John Doe?endpoint=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/sensor-device-type/John Doe?endpoint=null"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_TOKEN (JWT)",
"X-API-Key": "YOUR_API_KEY"
}
response = requests.delete(url, headers=headers)
print(response.json())
const response = await fetch("https://api.spkey.co/admin/sensor-device-type/John Doe?endpoint=null", {
method: "DELETE",
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("DELETE", "https://api.spkey.co/admin/sensor-device-type/John Doe?endpoint=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/sensor-device-type/John Doe?endpoint=null')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Delete.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
{
"success": true,
"thingName": "John Doe",
"endpoint": "null",
"deleted": 3.14,
"alreadyDeleted": true
}
{
"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/sensor-device-type/{thingName}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.
AWS IoT thing name — identical to the Matter device UUID / aggregate id.
Clear only this endpoint. Omit to clear every endpoint of the device — on a bridge that un-learns every other sensor on it too.
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.
Path Parameters
AWS IoT thing name — identical to the Matter device UUID / aggregate id.
Query Parameters
Clear only this endpoint. Omit to clear every endpoint of the device — on a bridge that un-learns every other sensor on it too.
Responses
trueRows removed.
True when nothing was there to remove — a successful end state, not a 404 (CLAUDE.md D1 rule 3).