research/jabodetabek-cctv-live-data/index.md

47 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Jabodetabek CCTV live data — four public sources, hotlinked HLS"
description: "How the Jabodetabek public CCTV layer works: DKI Jakarta, BPJT toll-road, Bekasi, and Bogor camera catalogs, and the owner-hosted HLS streams that apps hotlink. Audited Oct 2026 via transit.oyenza.com/cctv."
status: concluded
category: technical
tags: [jabodetabek, cctv, video-streaming, hls, reverse-engineering, transit-data, jakarta-public-transport-data, balitower, bpjt]
draft: true
created: 2026-10-13
updated: 2026-10-13
---
# Jabodetabek CCTV live data — verified upstreams
**What this is:** a verified map of the public CCTV layer across Jabodetabek — which government portals publish camera catalogs, what stream servers actually serve the video, and how third-party apps assemble and play them.
**Origin:** reverse-engineering the `/cctv` page of `transit.oyenza.com` (the same tracker from [[transjakarta-live-data/index|TransJakarta Live Data]]) to determine where its camera list and live video come from.
## TL;DR
- **Four upstreams:** DKI Jakarta (`jakcctv.jakarta.go.id`), BPJT toll roads (`bpjt.pu.go.id/cctv`), Kota Bekasi, Kota Bogor (BSW). All four cross-matched to oyenza's list with ~100% URL/ID agreement — see [[jabodetabek-cctv-live-data/analysis|Analysis]].
- **No aggregator API:** oyenza ships a static catalog (214 cams / 310 views) inside its own bundle and hotlinks each camera's HLS URL directly from the owner's server (hls.js; CORS `*`; no proxy, no tokens at capture).
- **Toll layer = one page scrape:** BPJT's page embeds an inline JSON array of ~1,530 cameras (stream URL + operator + coordinates + status); the app's 154 toll cams are a curated, working Jabodetabek subset (all 190 of its toll view URLs appear verbatim).
- **Stream stacks fingerprinted:** Ant Media Server (`/LiveApp/streams/`), MediaMTX, datarhei Restreamer (`memfs/`), Bali Tower custom fMP4 HLS, and plain nginx/Apache HLS.
## Key verified numbers (Oct 13, 2026)
- oyenza catalog: 214 cameras / 310 views — DKI 14/46, toll 154/190, Bekasi 23/23, Bogor 23/51.
- Cross-match: DKI 46/46 views, toll 190/190 views, Bekasi 23/23 names, Bogor 51/51 detail IDs (the Bogor Alun-Alun detail page embeds the exact `restreamer2.kotabogor.go.id/memfs/…` URL oyenza lists).
- Stream hosts probed live: **12/12** answered with valid HLS playlists (2–8 s segments).
- Catalog `checkedAt`: `2026-10-12T22:07:39Z` (page footer: "Daftar diperiksa 13 Oktober 2026").
## Using it
- Per-source endpoints and stream hosts: [[jabodetabek-cctv-live-data/sources|Sources]]
- Evidence archive: `workspace/cctv-jabodetabek-captures/` (catalog JSON, portal dumps, probe logs)
## Files
- [[jabodetabek-cctv-live-data/sources|Sources]] — portals, stream hosts per operator, context
- [[jabodetabek-cctv-live-data/analysis|Analysis]] — the chain, overlap evidence, stack fingerprints
- [[jabodetabek-cctv-live-data/methodology|Methodology]] — how it was verified (repeatable)
- [[jabodetabek-cctv-live-data/next-steps|Next steps]] — risks, gaps, ideas
## Related Research
- [[jakarta-public-transport-data/index|Jakarta Public Transport Data]] — umbrella topic
- [[transjakarta-live-data/index|TransJakarta Live Data]] — same site, bus layer