API
API
Read-only status endpoints and debug payloads.
Status JSON/api/status
Camera registry/api/cameras
Enrollment inventory/api/enrollments
Events/api/events
KVS HLS helper/api/kvs-hls
KVS Debug
{
"console_url": "https://us-east-2.console.aws.amazon.com/kinesisvideo/home?region=us-east-2#/streams/streamName/mono-staging-source/mediaPlayback",
"hls": {
"error": "An error occurred (ResourceNotFoundException) when calling the GetDataEndpoint operation: The requested stream is not found or not active.",
"ok": false,
"stream_name": "mono-staging-source",
"url": null
},
"producer_status": {
"message": "source cleared by operator request",
"state": "cleared"
},
"region": "us-east-2",
"stream_name": "mono-staging-source"
}S3 / Recorder Debug
{
"bucket": "ptcapture",
"latest_status": {
"message": "source cleared by operator request",
"state": "cleared"
},
"prefix": "s3://ptcapture/mono/staging"
}Raw Command Center Status
{
"cameras": [
{
"active_pipeline": false,
"assigned_hostname": "ecdsa-selftest",
"bound_at": "2026-07-04T03:26:17.581522+00:00",
"build_id": "test-build",
"chunk_seconds": 10,
"device_id": "02:00:00:00:ec:02",
"display_name": "ecdsa-selftest",
"enrollment_card_id": "ptcard_ecdsa_selftest_py",
"health": "standby",
"image_id": "test-image",
"kvs": {
"hls_ok": false,
"service": "inactive",
"state": "standby",
"stream_name": "mono-staging-ecdsa-selftest"
},
"kvs_stream_name": "mono-staging-ecdsa-selftest",
"lan_ip": "192.0.2.10",
"last_configured_at": "2026-07-04T03:26:17.581522+00:00",
"last_online": "2026-07-04T03:26:17.581522+00:00",
"location": "selftest",
"mac": "02:00:00:00:ec:02",
"model": "test-model",
"registration_client_ip": "127.0.0.1",
"requested_hostname": "ecdsa-selftest",
"rtsp_latency_ms": "1000",
"rtsp_url_redacted": "rtsp://thingino:***@10.77.0.2:554/ch0",
"s3": {
"service": "inactive",
"state": "standby"
},
"source_id": "ecdsa-selftest",
"source_type": "thingino_wireguard",
"wireguard_address": "10.77.0.2/32",
"wireguard_public_key": "selftestwg="
}
],
"enrollments": [
{
"card_id": "ptcard_20260704_ANvVWBHPJs",
"customer": "Playtag lab",
"expires_at": "2026-08-03T03:22:47.017902+00:00",
"issued_at": "2026-07-04T03:22:47.017902+00:00",
"key_alg": "ecdsa-p256-sha256-der-base64",
"order": "dev-ecdsa-iteration",
"public_key_sha256": "faaa356a748f77da9505e89245d8cef3b49e9e6a306e95f2da609720a033dfc8",
"requested_hostname": "mono-dev-camera",
"rtsp_user": "thingino",
"site": "current-ecdsa-dev-card",
"status": "issued",
"used_nonces": []
},
{
"card_id": "ptcard_20260704_AnsbbaKKPM",
"customer": "Playtag lab",
"expires_at": "2026-08-03T02:58:59.700129+00:00",
"issued_at": "2026-07-04T02:58:59.700129+00:00",
"order": "dev-iteration",
"requested_hostname": "mono-dev-camera",
"rtsp_user": "thingino",
"site": "current-dev-card",
"status": "issued",
"used_nonces": []
},
{
"card_id": "ptcard_dev_20260704_015511",
"customer": "Playtag lab/dev",
"expires_at": "2026-07-18T01:55:11.664220+00:00",
"issued_at": "2026-07-04T01:55:11.664220+00:00",
"order": "dev-iteration",
"requested_hostname": "",
"rtsp_user": "thingino",
"site": "fresh-camera-dev-run",
"status": "issued",
"used_nonces": []
},
{
"card_id": "ptcard_ecdsa_selftest_222534",
"expires_at": "2026-07-04T04:25:34.339118+00:00",
"issued_at": "2026-07-04T03:25:34.339118+00:00",
"key_alg": "ecdsa-p256-sha256-der-base64",
"public_key_sha256": "c85403ac35e75a71368b95926a410d397e397addd995b0f4d62d283af3c5db97",
"requested_hostname": "ecdsa-selftest",
"rtsp_user": "thingino",
"status": "issued",
"used_nonces": []
},
{
"bound_device_id": "02:00:00:00:ec:02",
"bound_mac": "02:00:00:00:ec:02",
"bound_source_id": "ecdsa-selftest",
"bound_wireguard_address": "10.77.0.2/32",
"bound_wireguard_public_key": "selftestwg=",
"card_id": "ptcard_ecdsa_selftest_py",
"consumed_at": "2026-07-04T03:26:17.592816+00:00",
"expires_at": "2026-07-04T04:26:15.640130+00:00",
"issued_at": "2026-07-04T03:26:15.640130+00:00",
"key_alg": "ecdsa-p256-sha256-der-base64",
"last_registration_at": "2026-07-04T03:26:17.592816+00:00",
"last_registration_client_ip": "127.0.0.1",
"public_key_sha256": "46d9cb1795539e9a26b29e71b22dbd4d88c07d124e45d9cb0564b8ffc158435b",
"requested_hostname": "ecdsa-selftest",
"rtsp_user": "thingino",
"status": "consumed",
"used_nonces": [
"nonce-ptcard_ecdsa_selftest_py"
]
},
{
"card_id": "ptcard_https_selftest_023129",
"customer": "selftest",
"expires_at": "2026-07-04T03:31:29.719996+00:00",
"issued_at": "2026-07-04T02:31:29.719987+00:00",
"order": "selftest",
"rtsp_user": "thingino",
"site": "https",
"status": "issued",
"used_nonces": []
},
{
"bound_device_id": "02:00:00:00:99:01",
"bound_mac": "02:00:00:00:99:01",
"bound_source_id": "https-selftest",
"bound_wireguard_address": "10.77.0.2/32",
"bound_wireguard_public_key": "XCVrRo9XMztx4rTYOKl2j4e4W7OLnq+IkzKgEJfpbQw=",
"card_id": "ptcard_https_selftest_023214",
"consumed_at": "2026-07-04T02:32:14.754414+00:00",
"customer": "selftest",
"expires_at": "2026-07-04T03:32:14.700648+00:00",
"issued_at": "2026-07-04T02:32:14.700639+00:00",
"last_registration_at": "2026-07-04T02:32:14.754414+00:00",
"last_registration_client_ip": "127.0.0.1",
"order": "selftest",
"rtsp_user": "thingino",
"site": "https",
"status": "consumed",
"used_nonces": [
"a188e289d2632aac3acf60b2"
]
}
],
"events": [
{
"details": {
"image_id": "test-image",
"lan_ip": "192.0.2.10",
"mac": "02:00:00:00:ec:02",
"rtsp_url": "rtsp://thingino:***@10.77.0.2:554/ch0",
"wireguard_address": "10.77.0.2/32"
},
"message": "Camera ecdsa-selftest self-registered",
"source_id": "ecdsa-selftest",
"timestamp": "2026-07-04T03:26:17.593248+00:00",
"type": "camera_registered"
},
{
"details": {
"wireguard_address": "10.77.0.2/32"
},
"message": "Camera ecdsa-selftest bound",
"source_id": "ecdsa-selftest",
"timestamp": "2026-07-04T03:26:17.592339+00:00",
"type": "camera_bound"
},
{
"details": {
"card_id": "ptcard_ecdsa_selftest_222534",
"client_ip": "127.0.0.1",
"reason": "invalid enrollment signature"
},
"message": "Camera registration rejected",
"source_id": "ecdsa-selftest",
"timestamp": "2026-07-04T03:25:36.122975+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"card_id": "",
"client_ip": "127.0.0.1",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "unsigned-test",
"timestamp": "2026-07-04T03:02:35.423468+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"card_id": "",
"client_ip": "127.0.0.1",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "unsigned-test",
"timestamp": "2026-07-04T02:43:11.031415+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"card_id": "",
"client_ip": "127.0.0.1",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "legacy-test",
"timestamp": "2026-07-04T02:41:59.828436+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"card_id": "",
"client_ip": "127.0.0.1",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "unsigned-test",
"timestamp": "2026-07-04T02:41:58.529475+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"card_id": "",
"client_ip": "127.0.0.1",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "unsigned-test",
"timestamp": "2026-07-04T02:33:54.480250+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"image_id": "selftest",
"lan_ip": "192.0.2.10",
"mac": "02:00:00:00:99:01",
"rtsp_url": "rtsp://thingino:***@10.77.0.2:554/ch0",
"wireguard_address": "10.77.0.2/32"
},
"message": "Camera https-selftest self-registered",
"source_id": "https-selftest",
"timestamp": "2026-07-04T02:32:14.754697+00:00",
"type": "camera_registered"
},
{
"details": {
"wireguard_address": "10.77.0.2/32"
},
"message": "Camera https-selftest bound",
"source_id": "https-selftest",
"timestamp": "2026-07-04T02:32:14.753844+00:00",
"type": "camera_bound"
},
{
"details": {
"card_id": "",
"client_ip": "127.0.0.1",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "unknown",
"timestamp": "2026-07-04T02:31:45.104945+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"card_id": "",
"client_ip": "100.78.239.5",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "unsigned-test",
"timestamp": "2026-07-04T02:03:24.412852+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"card_id": "",
"client_ip": "100.78.239.5",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "unsigned-test",
"timestamp": "2026-07-04T02:02:14.590941+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"card_id": "",
"client_ip": "100.78.239.5",
"reason": "missing enrollment card id"
},
"message": "Camera registration rejected",
"source_id": "unsigned-test",
"timestamp": "2026-07-04T01:55:59.106833+00:00",
"type": "camera_registration_rejected"
},
{
"details": {
"image_id": "wyze_cam3_t31x_gc2053_atbm6031",
"lan_ip": "192.168.0.74",
"mac": "02:75:3d:6d:26:5c",
"rtsp_url": "rtsp://thingino:***@10.77.0.3:554/ch0",
"wireguard_address": "10.77.0.3/32"
},
"message": "Camera testing22 self-registered",
"source_id": "testing22",
"timestamp": "2026-07-02T00:32:34.304823+00:00",
"type": "camera_registered"
},
{
"details": {},
"message": "Started start all for testing22",
"source_id": "testing22",
"timestamp": "2026-07-02T00:12:54.200676+00:00",
"type": "camera_started"
},
{
"details": {},
"message": "Stopped stop all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-07-02T00:05:11.311852+00:00",
"type": "camera_stopped"
},
{
"details": {},
"message": "Stopped stop all for thingino-wyze-v3-lab",
"source_id": "thingino-wyze-v3-lab",
"timestamp": "2026-07-01T23:47:05.120935+00:00",
"type": "camera_stopped"
},
{
"details": {},
"message": "Stopped stop all for thingino-wyze-v3-e8",
"source_id": "thingino-wyze-v3-e8",
"timestamp": "2026-07-01T23:47:00.362765+00:00",
"type": "camera_stopped"
},
{
"details": {},
"message": "Stopped stop all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-07-01T23:46:57.258274+00:00",
"type": "camera_stopped"
},
{
"details": {},
"message": "Stopped stop all for testing22",
"source_id": "testing22",
"timestamp": "2026-07-01T23:46:53.107602+00:00",
"type": "camera_stopped"
},
{
"details": {},
"message": "Started start all for testing22",
"source_id": "testing22",
"timestamp": "2026-06-28T12:49:26.444962+00:00",
"type": "camera_started"
},
{
"details": {},
"message": "Stopped stop all for testing22",
"source_id": "testing22",
"timestamp": "2026-06-28T12:49:24.230804+00:00",
"type": "camera_stopped"
},
{
"details": {
"image_id": "wyze_cam3_t31x_gc2053_atbm6031",
"lan_ip": "10.0.0.215",
"mac": "02:75:3d:6d:26:5c",
"rtsp_url": "rtsp://thingino:***@10.77.0.3:554/ch0",
"wireguard_address": "10.77.0.3/32"
},
"message": "Camera testing22 self-registered",
"source_id": "testing22",
"timestamp": "2026-06-28T12:49:01.050294+00:00",
"type": "camera_registered"
},
{
"details": {
"image_id": "wyze_cam3_t31x_gc2053_atbm6031",
"lan_ip": "10.0.0.215",
"mac": "02:75:3d:6d:26:5c",
"rtsp_url": "rtsp://thingino:***@10.77.0.3:554/ch0",
"wireguard_address": "10.77.0.3/32"
},
"message": "Camera testing22 self-registered",
"source_id": "testing22",
"timestamp": "2026-06-28T12:48:27.841306+00:00",
"type": "camera_registered"
},
{
"details": {},
"message": "Started start all for testing22",
"source_id": "testing22",
"timestamp": "2026-06-28T02:50:06.497502+00:00",
"type": "camera_started"
},
{
"details": {},
"message": "Stopped stop all for testing22",
"source_id": "testing22",
"timestamp": "2026-06-28T02:50:02.527002+00:00",
"type": "camera_stopped"
},
{
"details": {
"image_id": "wyze_cam3_t31x_gc2053_atbm6031",
"lan_ip": "10.0.0.215",
"mac": "02:75:3d:6d:26:5c",
"rtsp_url": "rtsp://thingino:***@100.78.239.5:8554/ch0"
},
"message": "Camera testing22 self-registered",
"source_id": "testing22",
"timestamp": "2026-06-28T02:49:40.046938+00:00",
"type": "camera_registered"
},
{
"details": {},
"message": "Started start all for testing22",
"source_id": "testing22",
"timestamp": "2026-06-28T02:37:17.387657+00:00",
"type": "camera_started"
},
{
"details": {
"image_id": "wyze_cam3_t31x_gc2053_atbm6031",
"lan_ip": "10.0.0.215",
"mac": "02:75:3d:6d:26:5c",
"rtsp_url": "rtsp://thingino:***@10.0.0.215:554/ch0"
},
"message": "Camera testing22 self-registered",
"source_id": "testing22",
"timestamp": "2026-06-28T02:35:08.603685+00:00",
"type": "camera_registered"
},
{
"details": {
"wireguard_address": null
},
"message": "Camera testing22 bound",
"source_id": "testing22",
"timestamp": "2026-06-28T02:35:08.602535+00:00",
"type": "camera_bound"
},
{
"details": {
"image_id": "wyze_cam3_t31x_gc2053_atbm6031",
"lan_ip": "10.0.0.139",
"mac": "02:32:ab:08:e8:d0",
"rtsp_url": "rtsp://thingino:***@10.0.0.139:554/ch0"
},
"message": "Camera thingino-wyze-v3-e8 self-registered",
"source_id": "thingino-wyze-v3-e8",
"timestamp": "2026-06-26T02:12:51.784803+00:00",
"type": "camera_registered"
},
{
"details": {
"wireguard_address": null
},
"message": "Camera thingino-wyze-v3-e8 bound",
"source_id": "thingino-wyze-v3-e8",
"timestamp": "2026-06-26T02:12:51.784370+00:00",
"type": "camera_bound"
},
{
"details": {},
"message": "Started start all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-26T01:29:02.200365+00:00",
"type": "camera_started"
},
{
"details": {},
"message": "Stopped stop all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-25T11:06:19.133426+00:00",
"type": "camera_stopped"
},
{
"details": {},
"message": "Stopped stop all for thingino-wyze-v3-lab",
"source_id": "thingino-wyze-v3-lab",
"timestamp": "2026-06-25T11:06:15.810731+00:00",
"type": "camera_stopped"
},
{
"details": {
"kvs_stream_name": "mono-staging-thingino-wyze-v3-lab",
"source_type": "thingino",
"wireguard_address": "tailnet relay 100.78.239.5:8554 to 10.0.0.241:554"
},
"message": "Camera thingino-wyze-v3-lab saved from command center",
"source_id": "thingino-wyze-v3-lab",
"timestamp": "2026-06-25T01:51:51.301207+00:00",
"type": "camera_configured"
},
{
"details": {
"wireguard_address": "tailnet relay 100.78.239.5:8554 to 10.0.0.241:554"
},
"message": "Camera thingino-wyze-v3-lab bound",
"source_id": "thingino-wyze-v3-lab",
"timestamp": "2026-06-25T01:51:51.300813+00:00",
"type": "camera_bound"
},
{
"details": {},
"message": "Started start all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-25T00:02:31.418697+00:00",
"type": "camera_started"
},
{
"details": {},
"message": "Started start all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-24T23:58:05.828589+00:00",
"type": "camera_started"
},
{
"details": {},
"message": "Started start all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-24T23:55:41.054548+00:00",
"type": "camera_started"
},
{
"details": {},
"message": "Started start all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-24T23:15:23.998502+00:00",
"type": "camera_started"
},
{
"details": {},
"message": "Stopped stop all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-24T23:15:19.252005+00:00",
"type": "camera_stopped"
},
{
"details": {},
"message": "Started start all for lorcam1-vpn-resilient",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-24T23:14:38.278518+00:00",
"type": "camera_started"
},
{
"details": {
"kvs_stream_name": "mono-staging-lorcam1-vpn-resilient",
"wireguard_address": "10.77.0.2/32"
},
"message": "Seeded existing camera lorcam1-vpn-resilient into operations center",
"source_id": "lorcam1-vpn-resilient",
"timestamp": "2026-06-24T22:53:21.198572+00:00",
"type": "camera_bound"
}
],
"generated_at": "2026-07-04T04:59:31.809073+00:00",
"kvs": {
"console_url": "https://us-east-2.console.aws.amazon.com/kinesisvideo/home?region=us-east-2#/streams/streamName/mono-staging-source/mediaPlayback",
"hls": {
"error": "An error occurred (ResourceNotFoundException) when calling the GetDataEndpoint operation: The requested stream is not found or not active.",
"ok": false,
"stream_name": "mono-staging-source",
"url": null
},
"producer_status": {
"message": "source cleared by operator request",
"state": "cleared"
},
"region": "us-east-2",
"stream_name": "mono-staging-source"
},
"message": null,
"message_kind": "ok",
"routing": [
{
"label": "1. RTSP source",
"value": ": not configured"
},
{
"label": "2. Mono KVS producer",
"value": "RTSP -> GStreamer kvssink -> KVS stream mono-staging-source"
},
{
"label": "3. Mono S3 recorder",
"value": "RTSP -> ffmpeg MP4 chunks -> s3://ptcapture/mono/staging"
},
{
"label": "4. Demo app",
"value": "KVS HLS live preview + S3/KVS status/debug telemetry"
}
],
"s3": {
"bucket": "ptcapture",
"latest_status": {
"message": "source cleared by operator request",
"state": "cleared"
},
"prefix": "s3://ptcapture/mono/staging"
},
"services": {
"command_center": {
"active": "active",
"enabled": "enabled",
"name": "mono-link-demo.service"
},
"kvs_producer": {
"active": "inactive",
"enabled": "disabled",
"name": "mono-link-kvs.service"
},
"s3_chunk_worker": {
"active": "inactive",
"enabled": "disabled",
"name": "mono-link-ingest.service"
}
},
"source": {
"chunk_seconds": "600",
"kvs_stream_name": "",
"rtsp_latency_ms": "1000",
"rtsp_url": "",
"source_env_path": "/var/lib/mono-link/source.env",
"source_id": "",
"source_type": ""
}
}