Skip to content

Web panel and HTTP API

waybeam venc includes a built-in web panel and a full HTTP API for controlling all parameters in real time. The web panel is available at http://<camera-ip>/ (default port — 80).


Web panel

Settings tab

All 84 configuration parameters are grouped into 13 sections:

SectionNumber of fieldsDescription
System3Port, overclock, logging
Sensor7Sensor selection and unlock
ISP7Exposure, AWB, AE
Image3Mirror, flip, rotate
Video10Codec, bitrate, FPS, GOP
Outgoing7Streaming, address, mode
Audio6Codec, sample rate, volume
FPV5ROI encoding
IMU7BMI270 gyroscope
EIS11Image stabilization
Recording10Recording to the SD card
Adaptive Encoder2Scene detection
Debug1OSD

Interface elements:

  • 🟢 Live — the parameter changes instantly without a restart
  • 🟠 Restart — requires a pipeline reinit (automatic)
  • Apply Changes — apply all changed fields
  • Save & Restart — apply and restart the pipeline
  • Restore Defaults — restore the configuration from disk

API Reference tab

Documentation for all HTTP endpoints with example responses. Categories:

  • Configuration
  • Encoder Control
  • ISP & Image Quality
  • Recording
  • Dual-Stream

Image Quality tab (ISP)

Direct access to 62 SigmaStar ISP parameters:

  • Parameters — expandable sections with parameter chips
  • Multi-fields — a built-in editor for complex parameters (colortrans, OBC, demosaic, etc.)
  • Export / Import — saving and restoring ISP profiles in JSON

HTTP API — reference

All endpoints use HTTP GET (compatible with BusyBox wget). Responses are JSON in the format {"ok": true/false, ...}.


Core endpoints

GET /api/v1/version

Returns version information.

bash
curl http://&lt;ip&gt;:80/api/v1/version

Response:

json
{
  "ok": true,
  "data": {
    "app_version": "0.5.2",
    "backend": "star6e",
    "contract_version": "0.2.0",
    "config_schema_version": "0.2.0"
  }
}

GET /api/v1/config

Returns the full active configuration.

bash
curl http://&lt;ip&gt;:80/api/v1/config

GET /api/v1/capabilities

Shows the mutability of each field (live or restart_required) and backend support.

bash
curl http://&lt;ip&gt;:80/api/v1/capabilities

Checking support

Use this endpoint to find out which fields can be changed on the fly and which require a pipeline restart.


Reading and writing fields

GET /api/v1/get?field_name

Read a single field:

bash
curl "http://&lt;ip&gt;:80/api/v1/get?video0.bitrate"

Response:

json
{"ok": true, "data": {"field": "video0.bitrate", "value": 8192}}

GET /api/v1/set?field_name=value

Write a field. Live fields are applied instantly. Restart fields trigger a reinit.

bash
# Instant bitrate change (live)
curl "http://&lt;ip&gt;:80/api/v1/set?video0.bitrate=4096"

# Multi-change (live fields only)
curl "http://&lt;ip&gt;:80/api/v1/set?video0.bitrate=4096&system.verbose=true"

# Resolution change (restart — pipeline reinit)
curl "http://&lt;ip&gt;:80/api/v1/set?video0.size=1280x720"

Responses:

json
// Single field
{"ok": true, "data": {"field": "video0.bitrate", "value": 4096}}

// Multi-change
{"ok": true, "data": {"applied": [
  {"field": "video0.bitrate", "value": 4096},
  {"field": "system.verbose", "value": true}
]}}

// Restart field
{"ok": true, "data": {"field": "video0.size", "value": "1280x720", "reinit_pending": true}}

Multi-set limitation

Multi-set is supported only for live fields. If at least one restart field is present, the entire request is rejected. Send restart changes one at a time.

HTTP 409 — validation error

If a value is invalid (for example, a non-existent AWB mode, or if the field doesn't exist), the API returns HTTP 409 Conflict instead of the usual 200.


GET /api/v1/restart

A full pipeline reinit. Reloads /etc/venc.json and restarts the camera without terminating the process.

bash
curl http://&lt;ip&gt;:80/api/v1/restart

Encoder control

GET /request/idr

Request an IDR keyframe from the encoder:

bash
curl http://&lt;ip&gt;:80/request/idr

When to request an IDR

  • After a new viewer connects
  • After packet loss on the radio link
  • When video artifacts appear

GET /api/v1/awb

The auto white balance state from the ISP:

bash
curl http://&lt;ip&gt;:80/api/v1/awb

Recording to the SD card

GET /api/v1/record/start

Start recording. Uses the configured record.dir, or you can specify a directory as a parameter:

bash
# Record to the default directory
curl "http://&lt;ip&gt;:80/api/v1/record/start"

# Record to a specific directory
curl "http://&lt;ip&gt;:80/api/v1/record/start?dir=/mnt/mmcblk0p1"

GET /api/v1/record/stop

Stop recording:

bash
curl "http://&lt;ip&gt;:80/api/v1/record/stop"

GET /api/v1/record/status

Recording status:

bash
curl "http://&lt;ip&gt;:80/api/v1/record/status"

Response:

json
{
  "ok": true,
  "data": {
    "active": true,
    "format": "ts",
    "path": "/mnt/mmcblk0p1/rec_01h23m45s_abcd.ts",
    "frames": 1500,
    "bytes": 12345678,
    "segments": 1,
    "stop_reason": "none"
  }
}

Dual-Stream (Gemini mode)

GET /api/v1/dual/status

Status of the second VENC channel:

bash
curl "http://&lt;ip&gt;:80/api/v1/dual/status"

Response:

json
{"ok": true, "data": {"active": true, "channel": 1, "bitrate": 20000, "fps": 120, "gop": 240}}

Dual VENC not active

If the recording mode is not "dual" or "dual-stream", this endpoint returns HTTP 404.

GET /api/v1/dual/set?param=value

Change the second channel's parameters in real time:

bash
# Change the recording bitrate
curl "http://&lt;ip&gt;:80/api/v1/dual/set?bitrate=10000"

# Change the GOP (in seconds)
curl "http://&lt;ip&gt;:80/api/v1/dual/set?gop=1.0"

GET /api/v1/dual/idr

IDR keyframe for the second channel:

bash
curl "http://&lt;ip&gt;:80/api/v1/dual/idr"

ISP Image Quality

GET /api/v1/iq

Export all ISP parameters:

bash
# Save as a file
curl http://&lt;ip&gt;:80/api/v1/iq > my_tuning.json

POST /api/v1/iq/import

Import ISP parameters (full or partial):

bash
# Full import
curl -X POST -H "Content-Type: application/json" \
  -d @my_tuning.json http://&lt;ip&gt;:80/api/v1/iq/import

# Partial import — only specific parameters
echo '{"lightness":{"value":75},"demosaic":{"fields":{"dir_thrd":30}}}' | \
  curl -X POST -H "Content-Type: application/json" -d @- http://&lt;ip&gt;:80/api/v1/iq/import

GET /api/v1/iq/set?param=value

Change a single ISP parameter (dot-notation):

bash
# Set a single field
curl "http://&lt;ip&gt;:80/api/v1/iq/set?colortrans.y_ofst=200"

# Set an array (comma-separated)
curl "http://&lt;ip&gt;:80/api/v1/iq/set?colortrans.matrix=23,45,9,1005,987,56,56,977,1015"

Common scenario examples

Quick switch to 720p 90fps

bash
curl "http://&lt;ip&gt;/api/v1/set?video0.size=1280x720"
# Wait for reinit...
curl "http://&lt;ip&gt;/api/v1/set?video0.fps=90"
curl "http://&lt;ip&gt;/api/v1/set?video0.bitrate=4096"

Manual white balance (6500K)

bash
curl "http://&lt;ip&gt;/api/v1/set?isp.awbMode=ct_manual"
curl "http://&lt;ip&gt;/api/v1/set?isp.awbCt=6500"

Enabling ROI encoding for FPV

bash
curl "http://&lt;ip&gt;/api/v1/set?fpv.roiEnabled=true"
curl "http://&lt;ip&gt;/api/v1/set?fpv.roiQp=-18"
curl "http://&lt;ip&gt;/api/v1/set?fpv.roiSteps=2"

Enabling EIS (Star6E only)

bash
# First in /etc/venc.json:
# "imu": {"enabled": true}, "eis": {"enabled": true, "mode": "gyroglide"}
# Then restart:
curl http://&lt;ip&gt;/api/v1/restart

IMU calibration

After a restart, hold the camera still for 2 seconds for automatic gyroscope calibration.


FPV racing (minimum latency)

json
{
  "video0": {"codec":"h265", "rcMode":"cbr", "fps":90, "size":"1280x720", "bitrate":6144, "gopSize":0.5},
  "fpv": {"roiEnabled":true, "roiQp":-12, "roiSteps":2, "roiCenter":0.35},
  "outgoing": {"streamMode":"rtp", "server":"unix://wfb_tx"}
}

FPV freestyle (quality + recording)

json
{
  "video0": {"codec":"h265", "rcMode":"cbr", "fps":60, "size":"1920x1080", "bitrate":8192, "gopSize":1.0},
  "fpv": {"roiEnabled":true, "roiQp":-18, "roiSteps":3, "roiCenter":0.4},
  "record": {"enabled":true, "mode":"dual", "bitrate":20000, "fps":120},
  "outgoing": {"streamMode":"rtp", "server":"unix://wfb_tx"}
}

Long range

json
{
  "video0": {"codec":"h265", "rcMode":"cbr", "fps":30, "size":"1280x720", "bitrate":3072, "gopSize":2.0},
  "fpv": {"roiEnabled":false},
  "outgoing": {"streamMode":"rtp", "server":"unix://wfb_tx"}
}

Next steps

Community project. Not an official OpenIPC resource.