{"service":"Video Synopsis Service","endpoints":{"POST /synopsis/run":"Submit and wait — returns MP4 directly (simplest)","POST /synopsis":"Submit async job (returns job_id)","GET /synopsis/{job_id}/status":"SSE progress stream (heartbeat)","GET /synopsis/{job_id}/download":"Download completed MP4","GET /jobs":"List all jobs","DELETE /synopsis/{job_id}":"Cancel or delete a job","GET /health":"Health check","GET /admin/queue":"Live queue + per-worker assignments","GET /admin/metrics":"Aggregate service metrics","GET /admin/job/{job_id}/full":"Full event ledger for a job","GET /admin/explore-sessions":"Active explore sessions + memory","POST /admin/jobs/cancel-all?status=queued|running|all":"Mass cancel","POST /admin/jobs/cleanup?older_than_hours=24":"Drop old job records","POST /admin/explore-sessions/cleanup?older_than_min=30":"Evict idle sessions","POST /admin/restart-soft?force=0|1":"Drain then exit (PM2 respawns)","Verbose mode":"Add ?maintenance=1 OR header 'X-Synopsis-Verbose: 1' to SSE for live metrics","Range cap":"SYNOPSIS_MAX_RANGE_MINUTES=15 active — requests over this range get silently clipped"},"example":{"one_shot":"curl -o synopsis.mp4 -X POST http://10.5.255.108:7890/synopsis/run -H \"Content-Type: application/json\" -d '{\"camera\": \"10_128_0_188\", \"start_timestamp\": \"2026-02-23T10:00:00Z\", \"end_timestamp\": \"2026-02-23T12:00:00Z\", \"vms_url\": \"http://10.5.1.81:5885\"}'","async_submit":"curl -X POST http://10.5.255.108:7890/synopsis -H \"Content-Type: application/json\" -d '{\"camera\": \"10_128_0_188\", \"start_timestamp\": \"2026-02-23T08:00:00Z\", \"end_timestamp\": \"2026-02-23T18:00:00Z\", \"vms_url\": \"http://10.5.1.81:5885\"}'","watch":"curl -N http://10.5.255.108:7890/synopsis/{job_id}/status","download":"curl -o synopsis.mp4 http://10.5.255.108:7890/synopsis/{job_id}/download"}}