API Reference — Video Management
Endpoint untuk mengelola video yang diunggah ke Media Server — upload chunked, kontrol streaming, operasi CRUD, dan ekstraksi timestamp berbasis AI.
← Kembali ke Video Management
Panduan operator: unggah video, kelola streaming, restart device.
Otentikasi
API key untuk integrasi, Bearer token untuk sesi pengguna, dan otentikasi WebSocket.
Semua endpoint memerlukan otentikasi. Untuk integrasi, kirim header X-Api-Key: <key> di setiap request tanpa header Authorization. Bearer token (Authorization: Bearer <access_token>, berlaku 30 menit) hanya untuk aplikasi yang menampilkan login Lenz ke penggunanya sendiri dan wajib menyertakan X-Integration-Signature. Basis URL mengikuti variabel lingkungan VITE_API_URL yang dikonfigurasi pada instalasi Lenz. Lihat Otentikasi untuk memilih jalur yang tepat. Endpoint video diarahkan melalui backend API ke Media Server target menggunakan path prefix {nvrServerId}.
Video — CRUD
Endpoint utama untuk membaca, memperbarui, dan menghapus video yang telah diunggah.
Daftar Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
Query Parameters
Pencarian parsial case-insensitive pada ID dan nama file video.
Kolom pengurutan.
"created_at""original_filename" | "file_size" | "duration" | "started_at" | "created_at"Arah pengurutan.
"desc""asc" | "desc"Nomor halaman (1-indexed).
11 <= valueJumlah item per halaman. Nilai 0 mengembalikan semua item.
100 <= valueResponse Body
application/json
curl -X GET "https://lenz.example.com/api/visionaire-media/0/videos"{ "success": true, "data": { "videos": [ { "id": "abc123def456", "original_filename": "rekaman-2026-01.mp4", "file_path": "/storage/videos/rekaman-2026-01.mp4", "file_size": 104857600, "created_at": "2026-01-15T08:00:00Z", "status": "streaming", "duration": 3600, "started_at": "2026-01-15T00:00:00Z", "started_at_src": "metadata", "ended_at": "2026-01-15T01:00:00Z", "instance": null } ], "count": 1, "pagination": { "current_page": 1, "per_page": 10, "total_items": 1, "total_pages": 1 } }}Detail Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
ID unik video.
Response Body
application/json
application/json
curl -X GET "https://lenz.example.com/api/visionaire-media/0/videos/string"{ "success": true, "data": { "video": { "id": "abc123def456", "original_filename": "rekaman-2026-01.mp4", "file_path": "/storage/videos/rekaman-2026-01.mp4", "file_size": 104857600, "created_at": "2026-01-15T08:00:00Z", "status": "streaming", "duration": 3600, "started_at": "2026-01-15T00:00:00Z", "started_at_src": "metadata", "ended_at": "2026-01-15T01:00:00Z", "device": { "name": "rekaman-2026-01", "url": "file:///storage/videos/rekaman-2026-01.mp4", "scheme": "file", "channel": "live", "silent_audio": false, "status": "running", "publish_url": "rtsp://192.168.1.10:1935/live/rekaman-2026-01", "created_at": "2026-01-15T08:00:00Z", "updated_at": "2026-01-15T08:01:00Z", "error_count": 0, "restart_count": 0, "uptime": 3600000 }, "instance": null } }}{ "success": false, "message": "video not found"}Perbarui Metadata Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
ID unik video.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
curl -X PATCH "https://lenz.example.com/api/visionaire-media/0/videos/string" \ -H "Content-Type: application/json" \ -d '{ "started_at": "2026-01-15T00:00:00Z", "started_at_src": "manual" }'{ "success": true, "data": { "video": { "id": "abc123def456", "original_filename": "rekaman-2026-01.mp4", "file_size": 104857600, "created_at": "2026-01-15T08:00:00Z", "status": "streaming", "duration": 3600, "started_at": "2026-01-15T00:00:00Z", "started_at_src": "manual" } }}Hapus Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
ID unik video.
Response Body
application/json
curl -X DELETE "https://lenz.example.com/api/visionaire-media/0/videos/string"{ "success": true, "message": "Video deleted successfully", "video_id": "abc123def456"}Upload Chunked
Mekanisme upload video dalam potongan (chunk) dengan dukungan resume. Upload yang terputus dapat dilanjutkan tanpa mengirim ulang chunk yang sudah diterima.
Unggah Chunk Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
Query Parameters
Jika true, video otomatis diputar sebagai stream RTSP setelah upload selesai.
trueRequest Body
multipart/form-data
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
curl -X POST "https://lenz.example.com/api/visionaire-media/0/videos/upload" \ -F file="string" \ -F filename="rekaman-2026-01.mp4" \ -F chunk_index="0" \ -F total_chunks="10" \ -F total_size="104857600"{ "success": true, "data": { "message": "Chunk received", "session_id": "sess-abc123", "video_id": "abc123def456", "chunk_index": 0, "chunks_received": 1, "total_chunks": 10, "bytes_written": 10485760, "total_size": 104857600, "progress": 10, "status": "uploading", "seq": 1, "instance": null }}Status Upload
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
ID sesi upload yang dikembalikan saat chunk pertama diterima.
Response Body
application/json
curl -X GET "https://lenz.example.com/api/visionaire-media/0/videos/upload/status/string"{ "success": true, "data": { "session_id": "sess-abc123", "video_id": "abc123def456", "original_filename": "rekaman-2026-01.mp4", "status": "uploading", "bytes_written": 52428800, "total_size": 104857600, "chunks_received": 5, "total_chunks": 10, "progress": 50, "created_at": "2026-01-15T08:00:00Z", "updated_at": "2026-01-15T08:02:30Z" }}Cek Resume Upload
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
ID sesi upload yang ingin dilanjutkan.
Query Parameters
Nama file asli (opsional, untuk verifikasi).
ID video yang terkait (opsional, untuk verifikasi).
Response Body
application/json
curl -X GET "https://lenz.example.com/api/visionaire-media/0/videos/upload/resume/string"{ "success": true, "data": { "message": "Session found, can resume", "session_id": "sess-abc123", "video_id": "abc123def456", "original_filename": "rekaman-2026-01.mp4", "status": "paused", "chunks_received": 5, "total_chunks": 10, "bytes_written": 52428800, "total_size": 104857600, "progress": 50, "missing_chunks": [ 5, 6, 7, 8, 9 ], "can_reuse_session": true }}Batalkan Upload
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
ID sesi upload yang akan dibatalkan.
Response Body
application/json
curl -X POST "https://lenz.example.com/api/visionaire-media/0/videos/upload/cancel/string"{ "success": true, "message": "Upload cancelled successfully", "session_id": "sess-abc123"}Kontrol Streaming
Jeda dan lanjutkan streaming RTSP per video tanpa menghentikan proses FFmpeg secara penuh.
Jeda Streaming Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
ID unik video.
Response Body
application/json
curl -X POST "https://lenz.example.com/api/visionaire-media/0/videos/string/pause"{ "message": "Video paused", "video_id": "abc123def456", "status": "paused"}Lanjutkan Streaming Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
ID unik video.
Response Body
application/json
curl -X POST "https://lenz.example.com/api/visionaire-media/0/videos/string/resume"{ "message": "Video resumed", "video_id": "abc123def456", "status": "streaming"}Device Pipeline
Setiap video yang diunggah direpresentasikan sebagai device dengan skema file di Media Server. Gunakan endpoint ini untuk restart atau stop proses FFmpeg yang menayangkan stream RTSP video tersebut.
Restart Device Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
Skema device. Untuk video yang diunggah, gunakan file.
"rtsp" | "rtmp" | "file"Path device dalam format channel/nama (contoh: live/rekaman-2026-01).
Query Parameters
Identifier instance pada mode Federation (opsional).
Response Body
application/json
curl -X POST "https://lenz.example.com/api/visionaire-media/0/devices/rtsp/string/restart"{ "success": true, "message": "Device restarted successfully"}Stop Device Video
Authorization
bearerAuth In: header
Path Parameters
ID numerik Media Server (NVR).
Skema device.
"rtsp" | "rtmp" | "file"Path device dalam format channel/nama.
Query Parameters
Identifier instance pada mode Federation (opsional).
Response Body
application/json
curl -X POST "https://lenz.example.com/api/visionaire-media/0/devices/rtsp/string/stop"{ "success": true, "message": "Device stopped successfully"}Ekstraksi Timestamp AI
Endpoint opsional untuk mendeteksi overlay timestamp pada frame video menggunakan model AI (Gemini). Digunakan saat ekstraksi otomatis dari metadata file tidak berhasil.
Ekstraksi Timestamp dari Frame (AI)
Authorization
bearerAuth In: header
Request Body
multipart/form-data
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
curl -X POST "https://lenz.example.com/api/llm/frame-timestamp-extraction" \ -F image_url="https://storage.example.com/frames/frame-001.jpg" \ -F model_api_key_id="apikey-gemini-001" \ -F timestamp_format="DD-MM-YYYYTHH:mm:ss"{ "ok": true, "message": "Timestamp extracted", "data": { "timestamp": "15-01-2026T08:00:00", "found": true, "confidence": 0.97 }}{ "ok": false, "message": "No timestamp found in frame", "data": { "timestamp": "", "found": false, "confidence": 0 }}