Summary

Doorbird D2100E Series (DoorBird Video Door Station D21x) IP video door station with HTTP REST API for local LAN integration. Supports TCP on ports 80 (HTTP) and 443 (HTTPS), RTSP video streaming on ports 554 and 8557, SIP voice interop on port 5060, plus UDP event broadcasts on ports 6524 and 35344. Authentication via Basic/Digest (RFC 2617) or plaintext HTTP params. API status: beta per vendor doc (rev 0.36, Nov 2023).

Transport

# Source states HTTP on TCP port 80, HTTPS on TCP port 443. RTSP on 554 + 8557,
# SIP on 5060, UDP events on 6524 + 35344 are documented and captured under
# Events / Notes; primary control transport is HTTP.
protocols:
  - http
addressing:
  base_url: http://<device-ip>/bha-api/
  port: 80  # HTTP; HTTPS also on 443 (self-signed cert, CA does not issue for IPs)
auth:
  type: digest  # Basic or Digest auth per RFC 2617; plaintext http-user/http-password params also supported

Traits

- powerable       # restart.cgi present
- routable        # door open, light, relay control present
- queryable       # info.cgi, sip.cgi?action=status, getsession.cgi, favorites.cgi, schedule.cgi present
- levelable       # sip.cgi mic_volume / spk_volume settings present

Actions

# All payloads verbatim from source. Paths under http://<device-ip>/bha-api/.

# --- Session ---
- id: create_session
  label: Create Session ID
  kind: action
  command: "GET http://<device-ip>/bha-api/getsession.cgi"
  params: []
  notes: Returns SESSIONID (valid 10 min) and NOTIFICATION_ENCRYPTION_KEY (valid until password change).

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

# --- Door / Light / Restart ---
- id: open_door
  label: Open Door
  kind: action
  command: "GET http://<device-ip>/bha-api/open-door.cgi?r={r}"
  params:
    - name: r
      type: string
      description: 'Door controller ID and relay, e.g. "1", "2", or "gggaaa@1". Omit for relay1.'

- id: light_on
  label: Light On
  kind: action
  command: "GET http://<device-ip>/bha-api/light-on.cgi"
  params: []

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

# --- Video / Image / Audio (HTTP) ---
- id: live_video_stream
  label: Live Video Stream (MJPEG)
  kind: action
  command: "GET http://<device-ip>/bha-api/video.cgi"
  params: []
  notes: multipart/x-mixed-replace JPEG stream, up to 8 fps. 204 if no watch-always perm and no ring in 5 min.

- id: live_image
  label: Live Image (JPEG)
  kind: action
  command: "GET http://<device-ip>/bha-api/image.cgi"
  params: []
  notes: Single JPEG. 204 if no watch-always perm and no ring in 1 min.

- id: history_image
  label: History Image Request
  kind: action
  command: "GET http://<device-ip>/bha-api/history.cgi?index={index}&event={event}"
  params:
    - name: index
      type: integer
      description: "1..50, where 1 is the latest history image."
    - name: event
      type: string
      description: 'doorbell | motionsensor (optional). Default = ring history for DoorBird, input trigger history for BirdGuard.'
  notes: History images stored in cloud. 204 if user lacks history/motion permission.

- id: monitor_state
  label: Monitor State Stream
  kind: action
  command: "GET http://<device-ip>/bha-api/monitor.cgi?ring={ring}"
  params:
    - name: ring
      type: string
      description: 'Comma-separated event types: doorbell, motionsensor. RFID/keypad coming soon.'
  notes: Continuous multipart stream of doorbell/motionsensor H/L state. Max 8 concurrent streams; 509 if all busy.

- id: audio_receive
  label: Live Audio Receive
  kind: action
  command: "GET http://<device-ip>/bha-api/audio-receive.cgi"
  params: []
  notes: G.711 μ-law, 8000 Hz. 204 if no watch-always perm and no ring in 5 min.

- id: audio_transmit
  label: Live Audio Transmit
  kind: action
  command: "POST http://<device-ip>/bha-api/audio-transmit.cgi"
  params: []
  notes: 'POST G.711 μ-law (audio/basic), Content-Length 9999999, HTTP/1.0. Only one consumer may transmit at a time. AEC/ANC must be client-side.'

# --- RTSP Video ---
- id: rtsp_live_video
  label: RTSP Live Video (H.264)
  kind: action
  command: "rtsp://<device-ip>:554/mpeg/media.amp"
  params: []
  notes: Standard RTSP auth. Up to 12 fps.

- id: rtsp_live_video_720p
  label: RTSP Live Video 720p
  kind: action
  command: "rtsp://<device-ip>:554/mpeg/720p/media.amp"
  params: []
  notes: D10x/D21x, firmware 000129+.

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

# --- Info / Query ---
- id: info_query
  label: Device Info Query
  kind: query
  command: "GET http://<device-ip>/bha-api/info.cgi"
  params: []
  notes: Returns FIRMWARE, BUILD_NUMBER, PRIMARY_MAC_ADDR, RELAYS, DEVICE-TYPE. RELAYS array from firmware 000108+.

# --- Favorites (API-Operator perm; firmware 000110+) ---
- id: favorites_list
  label: List Favorites
  kind: query
  command: "GET http://<device-ip>/bha-api/favorites.cgi"
  params: []

- id: favorite_save
  label: Add or Change Favorite
  kind: action
  command: "GET http://<device-ip>/bha-api/favorites.cgi?action=save&type={type}&title={title}&value={value}&id={id}"
  params:
    - name: type
      type: string
      description: 'sip | http. Cannot switch type on existing favorite.'
    - name: title
      type: string
      description: Name / short description.
    - name: value
      type: string
      description: URL/address including protocol and credentials if needed.
    - name: id
      type: integer
      description: Optional. ID of existing favorite to change; omit for new.

- id: favorite_remove
  label: Delete Favorite
  kind: action
  command: "GET http://<device-ip>/bha-api/favorites.cgi?action=remove&type={type}&id={id}"
  params:
    - name: type
      type: string
      description: 'sip | http.'
    - name: id
      type: integer
      description: ID of favorite to delete.
  notes: Active schedule entries referencing this favorite are also removed.

# --- Schedules (API-Operator perm; firmware 000110+) ---
- id: schedule_list
  label: List Schedules
  kind: query
  command: "GET http://<device-ip>/bha-api/schedule.cgi"
  params: []

- id: schedule_save
  label: Add or Update Schedule Entry
  kind: action
  command: "POST http://<device-ip>/bha-api/schedule.cgi"
  params:
    - name: body
      type: json
      description: 'JSON object with input (doorbell|motion|rfid|fingerprint), param, and output[] array (event notify|sip|relay|http with schedule once|from-to|weekdays).'
  notes: One request per input type. Weekday time slices are multiples of 1800 sec; max 604799.

- id: schedule_remove
  label: Delete Schedule Entry
  kind: action
  command: "GET http://<device-ip>/bha-api/schedule.cgi?action=remove&input={input}&param={param}"
  params:
    - name: input
      type: string
      description: 'doorbell | motion | rfid.'
    - name: param
      type: string
      description: Doorbell number / transponder id.

# --- SIP ---
- id: sip_registration
  label: SIP Register
  kind: action
  command: "GET http://<device-ip>/bha-api/sip.cgi?action=registration&user={user}&password={password}&url={url}"
  params:
    - name: user
      type: string
      description: Auth user for SIP proxy.
    - name: password
      type: string
      description: Auth password for SIP proxy.
    - name: url
      type: string
      description: IP/hostname of SIP proxy (append :port if non-default 5060).

- id: sip_makecall
  label: SIP Make Call
  kind: action
  command: "GET http://<device-ip>/bha-api/sip.cgi?action=makecall&url={url}"
  params:
    - name: url
      type: string
      description: SIP URL to call (e.g. sip:108@192.168.123.22).
  notes: Wait min 3 sec between SIP requests. 503 if line busy.

- id: sip_hangup
  label: SIP Hangup
  kind: action
  command: "GET http://<device-ip>/bha-api/sip.cgi?action=hangup"
  params: []
  notes: Returns 200 even if no ongoing call.

- id: sip_settings
  label: SIP Settings
  kind: action
  command: "GET http://<device-ip>/bha-api/sip.cgi?action=settings&enable={enable}&mic_volume={mic_volume}&spk_volume={spk_volume}&dtmf={dtmf}&relay1_passcode={relay1_passcode}&incoming_call_enable={incoming_call_enable}&incoming_call_user={incoming_call_user}&anc={anc}&ring_time_limit={ring_time_limit}&call_time_limit={call_time_limit}"
  params:
    - name: enable
      type: integer
      description: '0..1, default 0. Enable SIP registration after reboot.'
    - name: mic_volume
      type: integer
      description: '1..100, default 33.'
    - name: spk_volume
      type: integer
      description: '1..100, default 70.'
    - name: dtmf
      type: integer
      description: '0..1, default 0. DTMF support.'
    - name: relay1_passcode
      type: integer
      description: '0..99999999. Pincode to trigger door open relay during SIP call.'
    - name: incoming_call_enable
      type: integer
      description: '0..1, default 0.'
    - name: incoming_call_user
      type: string
      description: Allowed SIP user authenticated for DoorBird (e.g. sip:10.0.0.1:5060).
    - name: anc
      type: integer
      description: '0..1, default 1. Acoustic noise cancellation.'
    - name: ring_time_limit
      type: integer
      description: '10..300 sec, default 300.'
    - name: call_time_limit
      type: integer
      description: '30..300 sec, default 300.'
  notes: 'autocall_doorbell_url is DEPRECATED - use schedule.cgi. Currently migrated internally.'

- id: sip_status_query
  label: SIP Status Query
  kind: query
  command: "GET http://<device-ip>/bha-api/sip.cgi?action=status"
  params: []
  notes: JSON; LASTERRORCODE 200 = registered.

- id: sip_reset
  label: SIP Reset
  kind: action
  command: "GET http://<device-ip>/bha-api/sip.cgi?action=reset"
  params: []
  notes: Resets all SIP settings except license; hangs up any ongoing call.

Feedbacks

- id: open_door_response
  label: Door Open / Light / Generic BHA Response
  type: json
  fields:
    - RETURNCODE
    - SESSIONID

- id: sip_status
  label: SIP Status
  type: json
  fields:
    - LASTERRORCODE
    - LASTERRORTEXT

- id: monitor_state
  label: Monitor State
  type: enum
  values:
    - doorbell:H
    - doorbell:L
    - motionsensor:H
    - motionsensor:L

- id: http_status_code
  label: HTTP Status Code
  type: enum
  values:
    - 200    # OK
    - 204    # No permission / no data
    - 400    # Parameter missing or invalid
    - 401    # Authentication required
    - 423    # Locked (wrong auth, blocked 1 min)
    - 500    # Internal error
    - 503    # Busy
    - 507    # Size limit exceeded
    - 509    # All monitor streams busy

Variables

- id: device_info
  label: Device Info
  type: json
  fields:
    - FIRMWARE
    - BUILD_NUMBER
    - PRIMARY_MAC_ADDR
    - RELAYS
    - DEVICE-TYPE

- id: sip_settings
  label: SIP Settings
  type: json
  # Write-only via sip.cgi?action=settings; readable via sip.cgi?action=status

- id: session_info
  label: Session Info
  type: json
  fields:
    - RETURNCODE
    - SESSIONID
    - NOTIFICATION_ENCRYPTION_KEY

- id: favorites
  label: Favorites
  type: json
  # Readable via favorites.cgi; structure: { sip: {id: {title,value}}, http: {id: {title,value}} }

- id: schedules
  label: Schedules
  type: json
  # Readable via schedule.cgi; array of {input, param, output[]} entries

Events

# UDP broadcast events. v2 (Nov 2023+): ChaCha20-Poly1305. v1 (Argon2i) deprecated.
- id: doorbell_ring
  label: Doorbell Ring
  type: notification
  protocol: udp
  ports: [6524, 35344]
  fields:
    - INTERCOM_ID    # first 6 chars of username
    - EVENT          # doorbell number, space-padded to 8
    - TIMESTAMP      # Unix long
  encryption: ChaCha20-Poly1305
  packet_ident: "0xDE 0xAD 0xBE"
  packet_version: "0x02"

- id: motion_detected
  label: Motion Detected
  type: notification
  protocol: udp
  ports: [6524, 35344]
  fields:
    - INTERCOM_ID
    - EVENT          # "motion", space-padded to 8
    - TIMESTAMP
  encryption: ChaCha20-Poly1305
  packet_ident: "0xDE 0xAD 0xBE"
  packet_version: "0x02"

# UNRESOLVED: RFID and keypad events mentioned as "coming soon" - not implemented

Macros

# favorites.cgi + schedule.cgi together provide event-driven automation (input event
# -> output action under a time window) but the source documents no explicit named
# multi-step macro sequences.
# UNRESOLVED: no explicit macro definitions in source

Safety

confirmation_required_for:
  - restart              # restart.cgi
  - open_door            # door relay
  - sip_reset            # resets settings + hangs up call
interlocks:
  - Door open / light relay requires "watch always" permission OR a ring event in the past 5 minutes for the requesting user (else HTTP 204).
  - History image requires history permission (motion images additionally require motion permission).
  - Favorites + schedules require "API-Operator" permission (should NOT be granted to end-user App users).
  - SIP makecall / registration / settings / status / reset require "API-Operator" permission.
  - SIP call auto-terminates 180 seconds after initiation (auto-hangup).
  - Only one simultaneous SIP call supported.
  - Only one audio-transmit consumer at a time; second rejected.
  - Audio AEC/ANC must be implemented client-side (device requires both-side cancellation).
  - Official DoorBird App takes precedence over LAN API for video/audio/SIP - connections can be interrupted at any time.
  - Wrong-auth lockout: IP/user blocked for 1 minute after extensive bad credentials (HTTP 423).
  - Max 1 concurrent API connection per second.
  - Max 8 concurrent monitor.cgi streams.
# UNRESOLVED: no explicit power-on sequencing procedure stated in source

Notes

  • API revision 0.36 (Nov 13 2023); beta status, subject to change without notice.
  • Rate limit: max 1 concurrent API connection/sec; wrong auth blocks IP/user for 1 min (HTTP 423).
  • Video/audio streaming: official DoorBird App takes precedence over LAN API.
  • HTTPS uses pre-installed self-signed certificate (CA does not issue for IP addresses).
  • Session ID via getsession.cgi valid 10 min; NOTIFICATION_ENCRYPTION_KEY for UDP event decryption obtained once per password change (only first 32 bytes used by ChaCha20).
  • RTSP on port 554; RTSP-over-HTTP on port 8557; 720p stream on D10x/D21x from firmware 000129.
  • SIP on port 5060; wait min 3 sec between SIP requests.
  • UDP event broadcasts on ports 6524 and 35344 (keep-alive every 7 sec — skippable for decryption).
  • Event UDP v2 (Nov 2023): ChaCha20-Poly1305, IDENT 0xDE 0xAD 0xBE, VERSION 0x02. v1 (Argon2i) deprecated.
  • Audio codec: G.711 μ-law, 8000 Hz, mandatory for HTTP audio API.
  • Favorites/schedules require firmware 000110+ and API-Operator permission.
  • D21x compatible devices: hardware 1.00+, firmware 000108+.

Provenance

source_domains:
  - doorbird.com
source_urls:
  - https://www.doorbird.com/downloads/api_lan.pdf
retrieved_at: 2026-07-12T20:41:44.746Z
last_checked_at: 2026-07-21T22:24:49.139Z

Verification Summary

verdict: verified
checked_at: 2026-07-21T22:24:49.139Z
matched_actions: 27
action_count: 27
confidence: medium
summary: "All 27 spec actions matched verbatim; transport (HTTP/HTTPS, port 80/443, digest auth) confirmed; 100% bidirectional coverage. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "serial/RS-232 not supported on this model"
- "RFID and keypad events mentioned as \"coming soon\" - not implemented"
- "no explicit macro definitions in source"
- "no explicit power-on sequencing procedure stated in source"
- "voltage/current/power specs not in source"
- "D2100E model name not explicitly in compat table; mapped via D21x family"

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