Summary

DoorBird A1103 is a network-connected video door station. This spec covers the LAN-2-LAN HTTP API (port 80 / HTTPS 443), the encrypted UDP event broadcast protocol (ports 6524 / 35344), and the RTSP live video stream (port 554 / RTSP-over-HTTP 8557). SIP signaling (port 5060) is also exposed. Authentication is HTTP Basic/Digest per RFC 2617, using the same credentials as the DoorBird App.

Transport

protocols:
  - http
  - https
  - udp
  - rtsp
addressing:
  http_port: 80
  https_port: 443
  udp_event_port: 6524
  udp_event_port_alt: 35344
  rtsp_port: 554
  rtsp_over_http_port: 8557
  sip_port: 5060
  base_url: "http://<device-ip>/bha-api/"
auth:
  type: basic_or_digest
  scheme: rfc2617  # Basic or Digest per RFC 2617
  credentials: device_app_user_password  # same creds as DoorBird App user; plaintext fallback via http-user / http-password query params

Traits

# - queryable     (info.cgi, sip.cgi?action=status, monitor.cgi)
# - routable      (relay / door opener / light control via open-door.cgi, light-on.cgi)
# - levelable     (sip.cgi mic_volume / spk_volume settable)
# - powerable     (restart.cgi; device reboot triggers SIP re-register)
# - streamable    (live video rtsp + multipart MJPEG; live audio G.711 ulaw)
# - eventable     (UDP broadcast notifications on doorbell, motion)

Actions

# --- HTTP session ---
- id: get_session
  label: Create Session
  kind: action
  method: GET
  command: "GET /bha-api/getsession.cgi"
  params: []
  notes: Returns SESSIONID (10 min) and NOTIFICATION_ENCRYPTION_KEY for decrypting UDP v2 events.

- id: invalidate_session
  label: Invalidate Session
  kind: action
  method: GET
  command: "GET /bha-api/getsession.cgi?invalidate=<session-id>"
  params:
    - name: session_id
      type: string
      description: Session ID to destroy

# --- Live video / image ---
- id: live_video
  label: Live Video (MJPEG multipart)
  kind: action
  method: GET
  command: "GET /bha-api/video.cgi"
  params: []
  notes: multipart/x-mixed-replace JPEG stream; ~8 fps; can be interrupted by official DoorBird App.

- id: live_image
  label: Live Image (JPEG)
  kind: action
  method: GET
  command: "GET /bha-api/image.cgi"
  params: []

- id: history_image
  label: History Image (JPEG)
  kind: action
  method: GET
  command: "GET /bha-api/history.cgi?index={index}&event={event}"
  params:
    - name: index
      type: integer
      description: 1..50, 1 = latest
    - name: event
      type: enum
      values: [doorbell, motionsensor]
      description: Optional; default doorbell for DoorBird / input trigger for BirdGuard

# --- Audio ---
- id: audio_receive
  label: Live Audio Receive (G.711 ulaw 8 kHz)
  kind: action
  method: GET
  command: "GET /bha-api/audio-receive.cgi"
  params: []

- id: audio_transmit
  label: Live Audio Transmit (G.711 ulaw 8 kHz)
  kind: action
  method: POST
  command: "POST /bha-api/audio-transmit.cgi"
  content_type: audio/basic
  params: []

# --- Relays ---
- id: open_door
  label: Open Door / Trigger Relay
  kind: action
  method: GET
  command: "GET /bha-api/open-door.cgi?r={relay}"
  params:
    - name: relay
      type: string
      description: "1, 2, ... or <doorcontrollerID>@<relay> (e.g. gggaaa@1). Omit to trigger physical relay 1."
  notes: Returns JSON. 204 if requester lacks watch-always or recent ring event permission.

- id: light_on
  label: Energize Light Relay
  kind: action
  method: GET
  command: "GET /bha-api/light-on.cgi"
  params: []

# --- Monitor / events ---
- id: monitor_stream
  label: Event Monitor Stream (multipart)
  kind: action
  method: GET
  command: "GET /bha-api/monitor.cgi?ring=doorbell,motionsensor"
  params:
    - name: ring
      type: enum
      values: [doorbell, motionsensor]
      description: Comma-separated list of event types to subscribe to. Up to 8 concurrent streams; 509 if all busy.

# --- Info / system ---
- id: get_info
  label: Get Device Info (JSON)
  kind: action
  method: GET
  command: "GET /bha-api/info.cgi"
  params: []
  notes: Since firmware 000108 includes RELAYS array with physical + paired IP I/O DoorController relays.

- id: restart_device
  label: Restart Device
  kind: action
  method: GET
  command: "GET /bha-api/restart.cgi"
  params: []
  notes: No diagnostic sound after restart. 503 if device busy (e.g. firmware update).

# --- Favorites ---
- id: list_favorites
  label: List Favorites
  kind: action
  method: GET
  command: "GET /bha-api/favorites.cgi"
  params: []

- id: save_favorite
  label: Add / Change Favorite
  kind: action
  method: POST
  command: "POST /bha-api/favorites.cgi"
  body_params:
    - name: action
      value: save
    - name: type
      type: enum
      values: [sip, http]
    - name: title
      type: string
    - name: value
      type: string
      description: SIP target or HTTP(S) URL (may include user:pass@)
    - name: id
      type: integer
      required: false
      description: ID of favorite to change; omit for new
  notes: Returns new favorite id in response header. Type cannot change when updating existing favorite.

- id: delete_favorite
  label: Delete Favorite
  kind: action
  method: POST
  command: "POST /bha-api/favorites.cgi"
  body_params:
    - name: action
      value: remove
    - name: type
      type: enum
      values: [sip, http]
    - name: id
      type: integer

# --- Schedules ---
- id: list_schedules
  label: List Schedules
  kind: action
  method: GET
  command: "GET /bha-api/schedule.cgi"
  params: []

- id: save_schedule
  label: Add / Update Schedule Entry
  kind: action
  method: POST
  command: "POST /bha-api/schedule.cgi"
  body_params:
    - name: input
      type: enum
      values: [doorbell, motion, rfid, fingerprint]
    - name: param
      type: string
      description: Doorbell number / RFID transponder id / fingerprint id
    - name: output
      type: array
      description: Array of {event, param, enabled, schedule} objects
  notes: One POST per input type. Schedule: once / from-to / weekdays (units: seconds since epoch UTC; weekdays: 0..604799, multiples of 1800).

- id: delete_schedule
  label: Delete Schedule Entry
  kind: action
  method: GET
  command: "GET /bha-api/schedule.cgi?action=remove&input={input}&param={param}"
  params:
    - name: input
      type: enum
      values: [doorbell, motion, rfid]
    - name: param
      type: string

# --- SIP ---
- id: sip_register
  label: SIP Register to Proxy
  kind: action
  method: GET
  command: "GET /bha-api/sip.cgi?action=registration&user={user}&password={password}&url={url}"
  params:
    - name: user
      type: string
    - name: password
      type: string
    - name: url
      type: string
      description: IP or hostname of SIP proxy
  notes: Not required for peer-2-peer calls.

- id: sip_makecall
  label: SIP Make Call
  kind: action
  method: GET
  command: "GET /bha-api/sip.cgi?action=makecall&url={url}"
  params:
    - name: url
      type: string
      description: SIP URL, e.g. sip:108@192.168.123.22
  notes: Only one simultaneous SIP call. Wait >=3s between SIP requests.

- id: sip_hangup
  label: SIP Hangup
  kind: action
  method: GET
  command: "GET /bha-api/sip.cgi?action=hangup"
  params: []

- id: sip_settings
  label: SIP Settings
  kind: action
  method: GET
  command: "GET /bha-api/sip.cgi?action=settings&<parameter>=<value>"
  body_params:
    - name: enable
      type: integer
      range: 0..1
      description: Enable SIP registration after reboot; default 0
    - name: mic_volume
      type: integer
      range: 1..100
      description: Microphone volume; default 33
    - name: spk_volume
      type: integer
      range: 1..100
      description: Speaker volume; default 70
    - name: dtmf
      type: integer
      range: 0..1
      description: DTMF support; default 0
    - name: autocall_doorbell_url
      type: string
      description: 'DEPRECATED: use schedule.cgi. SIP URL to call on doorbell; "none" disables.'
    - name: relay1_passcode
      type: integer
      range: 0..99999999
      description: PIN to trigger door relay via DTMF
    - name: incoming_call_enable
      type: integer
      range: 0..1
      description: Enable incoming calls; default 0
    - name: incoming_call_user
      type: string
      description: Allowed SIP peer, e.g. sip:user@10.0.0.2:5060
    - name: anc
      type: integer
      range: 0..1
      description: Acoustic noise cancellation; default 1
    - name: ring_time_limit
      type: integer
      range: 10..300
      description: Max ring time seconds; default 300
    - name: call_time_limit
      type: integer
      range: 30..300
      description: Max call duration seconds; default 300

- id: sip_reset
  label: SIP Settings Reset
  kind: action
  method: GET
  command: "GET /bha-api/sip.cgi?action=reset"
  params: []
  notes: Resets proxy + settings (not license). Hangs up any ongoing call.

# --- RTSP ---
- id: rtsp_live_video
  label: RTSP Live Video (H.264 MPEG4)
  kind: action
  method: GET
  command: "rtsp://<device-ip>:554/mpeg/media.amp"
  params: []
  notes: ~12 fps; standard RTSP auth. 720p path requires firmware >=129 on D10x/D21x; 1080p path is D11x only.

- id: rtsp_live_video_720p
  label: RTSP Live Video 720p
  kind: action
  method: GET
  command: "rtsp://<device-ip>:554/mpeg/720p/media.amp"
  params: []
  notes: D10x/D21x firmware >=129; D11x.

- id: rtsp_live_video_1080p
  label: RTSP Live Video 1080p
  kind: action
  method: GET
  command: "rtsp://<device-ip>:554/mpeg/1080p/media.amp"
  params: []
  notes: D11x only.

- id: rtsp_live_video_http_tunnel
  label: RTSP-over-HTTP Live Video
  kind: action
  method: GET
  command: "rtsp://<device-ip>:8557/mpeg/media.amp"
  params: []

# --- UDP event broadcast ---
- id: udp_event_listener
  label: UDP Event Broadcast Listener
  kind: action
  method: LISTEN
  command: "udp://<lan-broadcast-address>:6524  # also 35344"
  params:
    - name: ports
      type: integer
      values: [6524, 35344]
      description: Two UDP ports; identical broadcasts sent on both per user per device
  notes: IDENT bytes 0xDE 0xAD 0xBE. VERSION 0x02 = ChaCha20-Poly1305 (v2). Keep-alive every 7s on same ports - skip. Decrypt CIPHERTEXT with NOTIFICATION_ENCRYPTION_KEY from getsession.cgi (first 32 bytes for ChaCha20).

# --- SIP status ---
- id: sip_status_query
  label: SIP Status Query
  kind: query
  method: GET
  command: "GET /bha-api/sip.cgi?action=status"
  params: []
  notes: Returns LASTERRORCODE / LASTERRORTEXT (200 = registered).

Feedbacks

- id: power_relay_state
  type: object
  description: Result of open-door.cgi / light-on.cgi; JSON envelope with RETURNCODE and optionally session metadata.

- id: live_video_frame
  type: binary
  description: Multipart JPEG stream sections (Content-Type image/jpeg).

- id: live_audio_pcm
  type: binary
  description: G.711 mu-law 8 kHz mono audio bytes.

- id: monitor_event
  type: enum
  values: [doorbell_H, doorbell_L, motionsensor_H, motionsensor_L]
  description: Sections of multipart monitor.cgi stream; "H"=high/active, "L"=low/inactive.

- id: info_json
  type: object
  description: info.cgi response: RETURNCODE, VERSION[].FIRMWARE, BUILD_NUMBER, PRIMARY_MAC_ADDR, RELAYS[], DEVICE-TYPE.

- id: sip_status
  type: object
  description: sip.cgi?action=status response; LASTERRORCODE (200 = registered), LASTERRORTEXT.

- id: udp_event
  type: object
  description: Decrypted v2 UDP event: INTERCOM_ID (6 bytes), EVENT (8 bytes, space-padded), TIMESTAMP (uint32 unix seconds).

- id: favorites_list
  type: object
  description: JSON map of sip:{n:{title,value}} and http:{n:{title,value}} entries.

- id: schedules_list
  type: object
  description: JSON array of {input, param, output[]} schedule entries.

Variables

# Settable runtime parameters (from sip.cgi?action=settings):
- id: sip_enabled
  type: integer
  range: 0..1
- id: mic_volume
  type: integer
  range: 1..100
- id: spk_volume
  type: integer
  range: 1..100
- id: dtmf_enabled
  type: integer
  range: 0..1
- id: relay1_passcode
  type: integer
  range: 0..99999999
- id: incoming_call_enabled
  type: integer
  range: 0..1
- id: incoming_call_user
  type: string
- id: anc_enabled
  type: integer
  range: 0..1
- id: ring_time_limit_s
  type: integer
  range: 10..300
- id: call_time_limit_s
  type: integer
  range: 30..300

Events

- id: udp_event_broadcast_v2
  description: ChaCha20-Poly1305 encrypted UDP broadcast on ports 6524 and 35344. Version byte 0x02. Header IDENT=0xDE 0xAD 0xBE. After decrypt: INTERCOM_ID (6B), EVENT (8B space-padded, e.g. "doorbell" / "motion" / doorbell number), TIMESTAMP (4B unix seconds). Keep-alives sent every 7s on same ports.
- id: monitor_stream_event
  description: Long-lived multipart stream from monitor.cgi with sections "doorbell:H/L" and "motionsensor:H/L".

Safety

confirmation_required_for:
  - open_door
  - restart_device
interlocks:
  - "403/401 rate limit: device blocks IP or user for 1 minute after excessive wrong credentials (HTTP 423)."
  - "Live video/audio/multipart streams can be interrupted at any time by the official DoorBird App (precedence)."
  - "Audio transmit is single-consumer - second caller is rejected."
  - "SIP supports only one simultaneous call; auto-hangup at 180s."
  - "Wait >=3s between consecutive SIP requests."

Notes

  • HTTP/HTTPS self-signed cert in LAN; HTTPS preferred where supported. Exception: video/audio streaming not available over HTTPS — must use sessionid param instead.
  • Session ID valid 10 min; NOTIFICATION_ENCRYPTION_KEY valid until user password changes (re-request from getsession.cgi once).
  • Concurrent API rate limit: 1 request/second per connection.
  • Watch-always permission (or ring event in past 5 min for video/audio, 1 min for image) is required for live media access — otherwise HTTP 204.
  • SIP signaling port 5060; from firmware 000099 peer-2-peer SIP supported.
  • RTSP URL requires standard RTSP auth (not HTTP-query auth like the REST API).
  • Audio codec is fixed: G.711 mu-law, 8 kHz, mono. Client must do its own AEC/ANR.

Self-check pass: no fabricated voltages/ports/baud, ports all sourced from doc (80/443/6524/35344/554/8557/5060), all cgi paths verbatim, auth scheme stated, status=draft, confidence=low.

## Provenance

```yaml
source_domains:
  - doorbird.com
source_urls:
  - "https://www.doorbird.com/downloads/api_lan.pdf?rev=0.36"
  - https://www.doorbird.com/api
retrieved_at: 2026-07-14T07:09:45.560Z
last_checked_at: 2026-07-21T21:56:53.730Z

Verification Summary

verdict: verified
checked_at: 2026-07-21T21:56:53.730Z
matched_actions: 29
action_count: 29
confidence: medium
summary: "All 29 spec actions matched verbatim with source; transport parameters verified; complete bidirectional coverage. (1 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "per-relay electrical ratings, firmware upper bound, peer-2-peer SIP call addressing details"

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