Summary

CamStreamer App turns Axis network cameras into live streaming encoders. Control via local HTTP REST API on the camera, plus WebSocket for real-time stream events. No authentication required for local API endpoints; external services require license key.

Transport

protocols:
  - http
addressing:
  base_url: "http://IPADDR[:PORT]/local/camstreamer/"  # pattern stated; port omitted in source
auth:
  type: none  # inferred: no auth required for local cgi endpoints; external APIs use license key

Traits

- queryable       # param/get.cgi, stream/get.cgi, get_streamstat.cgi return values
- routable        # stream input source selection (inputType: CRS/CSw/RTSP_URL)

Actions

- id: set_param
  label: Set Global Parameter
  kind: action
  params:
    - name: PARAMNAME
      type: string
      description: Parameter name (e.g. LiveLED, signature)
    - name: PARAMVALUE
      type: string
      description: URL-encoded parameter value

- id: get_param
  label: Get Global Parameters
  kind: action
  params:
    - name: list
      type: string
      description: Comma-separated list of parameter names

- id: list_streams
  label: List All Streams
  kind: action
  params: []

- id: set_all_streams
  label: Set All Streams JSON Configuration
  kind: action
  params:
    - name: StreamList
      type: string
      description: JSON array of stream configurations

- id: set_stream
  label: Add or Update Stream
  kind: action
  params:
    - name: stream_id
      type: string
      description: Stream identifier; created if does not exist
    - name: PARAMNAME
      type: string
      description: Stream parameter name (e.g. enabled, mediaServerUrl, audioSource)
    - name: PARAMVALUE
      type: string
      description: URL-encoded parameter value

- id: get_stream
  label: Get Stream Parameters
  kind: action
  params:
    - name: stream_id
      type: string
      description: Stream identifier

- id: remove_stream
  label: Remove Stream
  kind: action
  params:
    - name: stream_id
      type: string
      description: Stream identifier

- id: get_stream_status
  label: Get Stream Status
  kind: action
  params:
    - name: stream_id
      type: string
      description: Stream ID

Feedbacks

- id: stream_status
  label: Stream Status Response
  type: object
  fields:
    - name: status
      type: integer
      description: HTTP status code (200 = OK)
    - name: message
      type: string
      description: Response message
    - name: data
      type: object
      description: Stream statistics (net_stats, stream_bytes, is_streaming, start_count)

- id: youtube_broadcast_id
  label: YouTube Broadcast ID
  type: object
  fields:
    - name: broadcast_id
      type: string
      description: YouTube broadcast identifier

- id: youtube_status
  label: YouTube Stream Status
  type: enum
  values:
    - 200  # Stream ok
    - 400  # Stream not checked yet / interrupted
    - 404  # Stream not found or bad token

- id: param_get_response
  label: Parameter Get Response
  type: object
  description: Returns parameter values as key-value pairs

- id: stream_list_response
  label: Stream List Response
  type: object
  description: JSON object mapping stream IDs to their configurations

Variables

# Global parameters (set via param/set.cgi?PARAMNAME=PARAMVALUE)

- id: LiveLED
  label: Live LED
  type: enum
  values: [0, 1]
  description: Enable LED light indication on camera (available till version 3.8.2)
  note: "light ON if stream established, OFF if CamStreamer cannot broadcast"

- id: signature
  label: HLS Signature
  type: string
  description: Signature for HLS playlist access

Stream Parameters (Variables)

# Per-stream parameters set via stream/set.cgi?stream_id=ID&PARAMNAME=VALUE

- id: enabled
  label: Stream Enabled
  type: enum
  values: [0, 1]
  description: Stop or start the stream

- id: mediaServerUrl
  label: Media Server URL
  type: string
  description: |
    RTMP: rtmp://[user:pass@]server:port[/app][/stream_name]
    MPEG-TS TCP: tcp://server:port
    MPEG-TS UDP: udp://server:port[?pkt_size=XXX&ttl=XXX]
    HLS PULL: hls:// (available at /local/camstreamer/SIGNATURE/live.m3u8)
    HLS PUSH: ftp://your_ftp_server/live.m3u8
    SRT Caller: srt://:port
    SRT Listener: srt://server:port

- id: inputType
  label: Input Type
  type: enum
  values: [CRS, CSw, RTSP_URL]
  description: "CRS=RTSP camera, CSw=CamSwitcher App, RTSP_URL=external RTSP stream"

- id: inputUrl
  label: External RTSP URL
  type: string
  description: Used when inputType is RTSP_URL

- id: userVapixParameters
  label: Vapix Parameters Override
  type: string
  description: Overwrite default video parameters (resolution, camera, overlaypos)

- id: audioSource
  label: Audio Source
  type: string
  description: |
    none = disabled
    default = camera mic/line or CamSwitcher App or external URL
    file:FILEPATH = audio file on camera filesystem
    url:URL = external network audio source (AAC/MP3)

- id: avSyncMsec
  label: Audio/Video Sync Offset
  type: integer
  description: Offset in milliseconds

- id: active
  label: Stream Active
  type: enum
  values: [0, 1]
  description: Pause stream (won't run but processes active); for API server calls

- id: trigger
  label: Automation Trigger
  type: enum
  values: [none, inputX, time, recurrent]
  description: |
    none = automation off
    inputX = stream on when camera input X active
    time = stream on based on startTime/stopTime
    recurrent = stream on based on schedule

- id: schedule
  label: Recurrent Schedule
  type: string
  description: JSON array of day/time intervals (day 0-6, format HH:MM:SS)

- id: prepareAhead
  label: Prepare Ahead Seconds
  type: integer
  description: Seconds before startTime to prepare stream (trigger=time only)

- id: startTime
  label: Start Unix Timestamp
  type: integer
  description: Stream beginning (trigger=time only)

- id: stopTime
  label: Stop Unix Timestamp
  type: integer
  description: Stream end (trigger=time only)

- id: statusLed
  label: Status LED
  type: enum
  values: [0, 1]
  description: Camera LED blinking during broadcast prep/streaming

- id: statusPort
  label: Status Port
  type: integer
  description: Camera output port number for status LED

- id: forceStereo
  label: Force Stereo
  type: enum
  values: [0, 1]

- id: streamDelay
  label: Stream Delay
  type: string

- id: callApi
  label: Call API Mode
  type: enum
  values: [0, 1]
  description: Application calls server APIs (YouTube creation/ending)

Events

# WebSocket events on wss://IPADDR[:PORT]/local/camstreamer/events

- id: StreamState
  label: Stream State Change
  type: event
  fields:
    - name: streamID
      type: string
    - name: enabled
      type: integer
    - name: active
      type: integer
    - name: automationState
      type: integer
    - name: isStreaming
      type: integer

- id: CS_API_SUCCESS
  label: API Call Success
  type: event
  fields:
    - name: streamID
      type: string
    - name: apiCall
      type: string
      description: Command name (e.g. startBroadcast)
    - name: message
      type: string

- id: PortChanged
  label: Port Changed
  type: event
  fields:
    - name: port
      type: integer
    - name: value
      type: integer

Macros

# Creation of nonstop RTMP stream:
# 1. POST /local/camstreamer/stream/set.cgi?stream_id=api_01&enabled=1&audioSource=default&mediaServerUrl=rtmp://...
# Requires: enabled=1, active=1, trigger=none

# Stop RTMP stream:
# POST /local/camstreamer/stream/set.cgi?stream_id=X&enabled=0

# Button-triggered stream (input0):
# POST with trigger=input0

# Timed stream:
# POST with trigger=time, startTime, stopTime (Unix timestamps)

Safety

confirmation_required_for: []
interlocks:
  - "App/stream restart occurs on any parameter change"
  - "Time gap between planned YouTube events must be at least 15 minutes"
  - "Audio sample rate 44.1KHz and bitrate 128Kbps required for external audio"
  - "HLS playlist requires resolution and videomaxbitrate parameters"

Notes

Local HTTP API base: http://IPADDR[:PORT]/local/camstreamer/

WebSocket authorization token valid 30 seconds or until first connection; token obtained from http://USER:PASS@IPADDR[:PORT]/local/camstreamer/api/ws_authorization.cgi

External GraphQL API (stream list) at https://camstreamer.com/api/Stream/graphql requires cameraLicenseKey in Authorization header.

YouTube integration requires initial UI authorization; SECTOKEN changes when switching YouTube channels.

CamStreamer App license required; see https://support.camstreamer.com/hc/en-us/articles/4411897837201-License-API

Provenance

source_domains:
  - support.camstreamer.com
source_urls:
  - https://support.camstreamer.com/hc/en-us/articles/15735021586076-CamStreamer-App-4-x-API-documentation
retrieved_at: 2026-04-30T04:40:58.722Z
last_checked_at: 2026-06-03T06:28:07.179Z

Verification Summary

verdict: verified
checked_at: 2026-06-03T06:28:07.179Z
matched_actions: 8
action_count: 8
confidence: medium
summary: "All 8 spec actions verified (4 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "video encoding specs (codec, bitrate ranges) not explicitly stated in source"
- "port number not stated in source (IPADDR[:PORT] used as placeholder)"
- "serial/RS-232 not mentioned in source"
- "TCP socket control not mentioned; HTTP REST only"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0