Camera HTTP API
All endpoints are LAN-local to each camera. Default port: 8134.
Discovery
GET /v1/info
200 OK
{ "id":"cam-uuid","model":"Lava LXX504","soc":"D7050","codec":"h264",
"fps":60,"gop":1,"bitrate":7000000,"hasAudio":true,
"now_ms":1725169234123,"serving":"ok",
"thermals":{"state":"nominal","cpuC":41} }
Pairing
POST /v1/pair
Headers: Authorization: Pairing-Nonce <nonce>
Body: { "director_pubkey":"...", "display_name":"iPad 9", "pin":"123456" }
200 OK { "camera_pubkey":"...", "pair_token":"<base64url>" }
Enrollment
POST /v1/matches/enroll
Headers: Authorization: Bearer <pair_token>
Body: { "mid":"<uuid>", "match_token":"<hmac>", "ttl":7200, "role":"A" }
200 OK { "ok":true }
Init segments
GET /v1/init/video
GET /v1/init/audio (if audio enabled)
Headers: Authorization: Bearer <match_token>
Serving fragments
GET /v1/segments?mid=<MID>&from=<ms>&to=<ms>&tracks=video[,audio]
Headers: Authorization: Bearer <match_token>
Response: HTTP chunked stream of 1 s m4s (moof/mdat) in order
Export MARK clip
POST /v1/export?mid=<MID>&from=<ms>&to=<ms>&tracks=video[,audio]
Headers: Authorization: Bearer <match_token>
Response: application/mp4 (fast-start; no transcode)
WebRTC (optional)
Unordered RTCDataChannel for the same messages (INIT, SEGMENTS, PING/PONG) on host-only ICE; disabled by default.
mDNS TXT
id=<uuid>;model=LavaLXX504;soc=D7050;codec=h264;fps=60;gop=1;br=7000k;audio=1;pin=1;ver=4