Complete API Reference
Overview
Comprehensive API documentation for HCMC Traffic Management System covering REST API, WebSocket API, NGSI-LD Context Broker API, SPARQL Endpoint, and GraphQL API.
Base URLs:
- REST API:
https://api.traffic.hcmc.gov.vn/v1 - WebSocket:
wss://api.traffic.hcmc.gov.vn/ws - NGSI-LD:
https://context.traffic.hcmc.gov.vn/ngsi-ld/v1 - SPARQL:
https://rdf.traffic.hcmc.gov.vn/sparql - GraphQL:
https://api.traffic.hcmc.gov.vn/graphql
Table of Contents
REST API
WebSocket API
NGSI-LD API
SPARQL API
GraphQL API
REST API
Authentication
Overview
Token-based authentication using JWT (JSON Web Tokens).
Login
Endpoint: POST /auth/login
Request:
{
"username": "user@example.com",
"password": "securePassword123"
}
Response:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 3600,
"token_type": "Bearer"
}
cURL:
curl -X POST https://api.traffic.hcmc.gov.vn/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"user@example.com","password":"securePassword123"}'
Refresh Token
Endpoint: POST /auth/refresh
Request:
{
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Python:
import requests
def refresh_access_token(refresh_token: str) -> str:
response = requests.post(
'https://api.traffic.hcmc.gov.vn/v1/auth/refresh',
json={'refresh_token': refresh_token}
)
return response.json()['access_token']
Using Authentication
Include the access token in the Authorization header:
curl -X GET https://api.traffic.hcmc.gov.vn/v1/cameras \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json'
}
response = requests.get('https://api.traffic.hcmc.gov.vn/v1/cameras', headers=headers)
Cameras API
List Cameras
Endpoint: GET /cameras
Query Parameters:
district(optional): Filter by district (e.g., "District 1")status(optional): Filter by status ("active", "inactive", "error")limit(optional): Number of results (default: 50, max: 100)offset(optional): Pagination offset (default: 0)
Response:
{
"total": 150,
"limit": 50,
"offset": 0,
"cameras": [
{
"id": "CAM_001",
"name": "District 1 - Nguyen Hue",
"location": {
"lat": 10.7769,
"lon": 106.7009,
"address": "Nguyen Hue St, District 1"
},
"status": "active",
"last_update": "2025-11-29T10:30:00Z",
"stream_url": "rtsp://stream.traffic.hcmc.gov.vn/CAM_001",
"capabilities": ["accident_detection", "vehicle_count", "speed_detection"]
}
]
}
cURL:
curl -X GET "https://api.traffic.hcmc.gov.vn/v1/cameras?district=District%201&status=active&limit=10" \
-H "Authorization: Bearer YOUR_TOKEN"
Python:
import requests
def get_cameras(district=None, status=None, limit=50):
params = {'limit': limit}
if district:
params['district'] = district
if status:
params['status'] = status
response = requests.get(
'https://api.traffic.hcmc.gov.vn/v1/cameras',
headers={'Authorization': f'Bearer {access_token}'},
params=params
)
return response.json()
Get Camera Details
Endpoint: GET /cameras/{camera_id}
Response:
{
"id": "CAM_001",
"name": "District 1 - Nguyen Hue",
"location": {
"lat": 10.7769,
"lon": 106.7009,
"address": "Nguyen Hue St, District 1"
},
"status": "active",
"last_update": "2025-11-29T10:30:00Z",
"stream_url": "rtsp://stream.traffic.hcmc.gov.vn/CAM_001",
"capabilities": ["accident_detection", "vehicle_count", "speed_detection"],
"statistics": {
"uptime_24h": 99.5,
"detections_today": 15234,
"avg_vehicle_count": 145
}
}
Get Camera Latest Image
Endpoint: GET /cameras/{camera_id}/latest-image
Response: Binary image data (JPEG)
cURL:
curl -X GET "https://api.traffic.hcmc.gov.vn/v1/cameras/CAM_001/latest-image" \
-H "Authorization: Bearer YOUR_TOKEN" \
-o latest_image.jpg
Get Camera Statistics
Endpoint: GET /cameras/{camera_id}/statistics
Query Parameters:
start_date(required): Start date (ISO 8601)end_date(required): End date (ISO 8601)interval(optional): Data interval ("hour", "day", "week") default: "hour"
Response:
{
"camera_id": "CAM_001",
"start_date": "2025-11-20T00:00:00Z",
"end_date": "2025-12-05T23:59:59Z",
"interval": "day",
"data": [
{
"timestamp": "2025-11-20T00:00:00Z",
"vehicle_count": 12345,
"avg_speed": 35.5,
"accidents_detected": 2
}
]
}
Accidents API
List Accidents
Endpoint: GET /accidents
Query Parameters:
start_date(optional): Filter from dateend_date(optional): Filter to dateseverity(optional): Filter by severity ("minor", "moderate", "severe", "critical")district(optional): Filter by districtlimit(optional): Results limit (default: 50)offset(optional): Pagination offset
Response:
{
"total": 234,
"limit": 50,
"offset": 0,
"accidents": [
{
"id": "ACC_20251125_001",
"timestamp": "2025-11-29T10:30:00Z",
"location": {
"lat": 10.7769,
"lon": 106.7009,
"address": "Nguyen Hue St, District 1"
},
"severity": "moderate",
"vehicles_involved": 2,
"injuries": 1,
"fatalities": 0,
"status": "resolved",
"camera_id": "CAM_001",
"detection_method": "yolox_x",
"confidence": 0.95,
"images": [
"https://storage.traffic.hcmc.gov.vn/accidents/ACC_20251125_001_1.jpg"
]
}
]
}
Python:
from datetime import datetime, timedelta
def get_accidents_today(severity=None):
today = datetime.now().date()
params = {
'start_date': today.isoformat(),
'end_date': (today + timedelta(days=1)).isoformat()
}
if severity:
params['severity'] = severity
response = requests.get(
'https://api.traffic.hcmc.gov.vn/v1/accidents',
headers={'Authorization': f'Bearer {access_token}'},
params=params
)
return response.json()
Get Accident Details
Endpoint: GET /accidents/{accident_id}
Response:
{
"id": "ACC_20251125_001",
"timestamp": "2025-11-29T10:30:00Z",
"location": {
"lat": 10.7769,
"lon": 106.7009,
"address": "Nguyen Hue St, District 1"
},
"severity": "moderate",
"vehicles_involved": 2,
"injuries": 1,
"fatalities": 0,
"status": "resolved",
"camera_id": "CAM_001",
"detection_method": "yolox_x",
"confidence": 0.95,
"images": [
"https://storage.traffic.hcmc.gov.vn/accidents/ACC_20251125_001_1.jpg"
],
"timeline": [
{
"timestamp": "2025-11-29T10:30:00Z",
"event": "detected",
"description": "Accident detected by camera CAM_001"
},
{
"timestamp": "2025-11-29T10:35:00Z",
"event": "alert_sent",
"description": "Emergency services notified"
},
{
"timestamp": "2025-11-29T11:15:00Z",
"event": "resolved",
"description": "Scene cleared, traffic resumed"
}
]
}
Create Accident Report (Citizen)
Endpoint: POST /accidents/report
Request:
{
"location": {
"lat": 10.7769,
"lon": 106.7009
},
"severity": "moderate",
"description": "Two-vehicle collision at intersection",
"vehicles_involved": 2,
"injuries": 1,
"reporter": {
"name": "Nguyen Van A",
"phone": "+84901234567",
"email": "nguyenvana@example.com"
},
"images": [
"base64_encoded_image_data_1",
"base64_encoded_image_data_2"
]
}
Response:
{
"id": "ACC_20251125_CR_001",
"status": "submitted",
"verification_status": "pending",
"message": "Report submitted successfully. Thank you for your contribution."
}
Traffic API
Get Real-Time Traffic
Endpoint: GET /traffic/realtime
Query Parameters:
zone_id(optional): Filter by zonedistrict(optional): Filter by district
Response:
{
"timestamp": "2025-11-29T10:30:00Z",
"zones": [
{
"id": "ZONE_001",
"name": "District 1 Central",
"congestion_level": "moderate",
"avg_speed": 25.5,
"vehicle_count": 345,
"incident_count": 1
}
]
}
Get Traffic Forecast
Endpoint: GET /traffic/forecast
Query Parameters:
zone_id(required): Zone IDhours(optional): Forecast hours ahead (default: 24, max: 72)
Response:
{
"zone_id": "ZONE_001",
"forecast": [
{
"timestamp": "2025-11-29T11:00:00Z",
"predicted_congestion": "moderate",
"predicted_speed": 28.3,
"confidence": 0.85
}
]
}
Get Congestion Zones
Endpoint: GET /traffic/congestion-zones
Response:
{
"timestamp": "2025-11-29T10:30:00Z",
"zones": [
{
"id": "ZONE_001",
"name": "District 1 Central",
"polygon": [
[10.7769, 106.7009],
[10.7799, 106.7039],
[10.7749, 106.7059]
],
"level": "moderate",
"avg_speed": 25.5
}
]
}