Summary
DoorBird D2101KV-V4A Series is part of the D21x video door station family. This spec covers its HTTP/HTTPS LAN API, UDP event broadcasts, RTSP streams, and SIP controls.
Transport
protocols:
- tcp
- http
- udp
addressing:
base_url: "http://<device-ip>/bha-api/"
ports:
http: 80
https: 443
udp_events:
- 6524
- 35344
rtsp: 554
rtsp_over_http: 8557
sip: 5060
auth:
type:
- basic
- digest
standard: RFC 2617
credentials: "Same credentials used to add device to DoorBird App"
alternate_http_parameters:
user: "http-user"
password: "http-password"
tls:
supported: true
certificate: self-signed
limitations:
- "Video and audio streaming requests are not available over HTTPS."
Traits
- queryable
- levelable
Actions
- id: create_session
label: Create Temporary Session
kind: query
command: "GET http://<device-ip>/bha-api/getsession.cgi"
params: []
- id: invalidate_session
label: Invalidate Temporary Session
kind: action
command: "GET http://<device-ip>/bha-api/getsession.cgi?invalidate=<old_session_id>"
params:
- name: old_session_id
type: string
description: Session ID to invalidate
- id: live_video
label: Request Live MJPEG Video
kind: query
command: "GET http://<device-ip>/bha-api/video.cgi"
params:
- name: sessionid
type: string
required: false
description: Temporary session ID used to avoid plaintext credentials
- id: live_image
label: Request Live Image
kind: query
command: "GET http://<device-ip>/bha-api/image.cgi"
params: []
- id: open_door
label: Energize Door Opener or Alarm Relay
kind: action
command: "GET http://<device-ip>/bha-api/open-door.cgi?<parameter>=<value>"
params:
- name: r
type: string
required: false
values:
- "1"
- "2"
- "<doorcontrollerID>@<relay>"
description: Relay to trigger; physical relay 1 is used when omitted
- id: light_on
label: Energize Light Relay
kind: action
command: "GET http://<device-ip>/bha-api/light-on.cgi"
params: []
- id: history_image
label: Request History Image
kind: query
command: "GET http://<device-ip>/bha-api/history.cgi?<parameter>=<value>"
params:
- name: index
type: integer
range: "1..50"
description: History image index; 1 is latest
- name: event
type: string
required: false
values:
- doorbell
- motionsensor
- id: monitor_events
label: Monitor Doorbell and Motion Events
kind: query
command: "GET http://<device-ip>/bha-api/monitor.cgi?ring=doorbell[,motionsensor]"
params:
- name: ring
type: string
values:
- doorbell
- motionsensor
- "doorbell,motionsensor"
- id: receive_audio
label: Receive Live Audio
kind: query
command: "GET http://<device-ip>/bha-api/audio-receive.cgi"
params:
- name: sessionid
type: string
required: false
description: Temporary session ID used to avoid plaintext credentials
- id: transmit_audio
label: Transmit Live Audio
kind: action
command: "POST http://<device-ip>/bha-api/audio-transmit.cgi"
params:
- name: body
type: binary
description: G.711 mu-law audio at 8000 Hz
- name: content_type
type: string
fixed: "audio/basic"
- id: device_info
label: Get Device Information
kind: query
command: "GET http://<device-ip>/bha-api/info.cgi"
params: []
- id: list_favorites
label: List Favorites
kind: query
command: "GET http://<device-ip>/bha-api/favorites.cgi"
params: []
- id: save_favorite
label: Add or Change Favorite
kind: action
command: "action=save&<parameter>=<value>"
params:
- name: action
type: string
fixed: save
- name: type
type: string
values:
- sip
- http
- name: title
type: string
- name: value
type: string
description: HTTP(S) URL or SIP target
- name: id
type: integer
required: false
description: Existing favorite ID; omit when creating a favorite
- id: remove_favorite
label: Delete Favorite
kind: action
command: "action=remove&<parameter>=<value>"
params:
- name: action
type: string
fixed: remove
- name: type
type: string
values:
- sip
- http
- name: id
type: integer
description: Favorite ID
- id: list_schedules
label: List Schedules
kind: query
command: "GET http://<device-ip>/bha-api/schedule.cgi"
params: []
- id: save_schedule
label: Add or Update Schedule Entry
kind: action
command: "POST http://<device-ip>/bha-api/schedule.cgi"
params:
- name: body
type: object
description: Schedule JSON object for one input type
- id: remove_schedule
label: Delete Schedule Entry
kind: action
command: "GET http://<device-ip>/bha-api/schedule.cgi?action=remove&<parameter>=<value>"
params:
- name: action
type: string
fixed: remove
- name: input
type: string
values:
- doorbell
- motion
- rfid
- name: param
type: string
description: Doorbell number, empty value, or transponder ID
- id: restart
label: Restart Device
kind: action
command: "GET http://<device-ip>/bha-api/restart.cgi"
params: []
- id: rtsp_live_video_default
label: Request Default RTSP Live Video
kind: query
command: "rtsp://<device-ip>:<device-rtsp-port>/mpeg/media.amp"
params:
- name: device_rtsp_port
type: integer
values:
- 554
- 8557
- id: rtsp_live_video_720p
label: Request 720p RTSP Live Video
kind: query
command: "rtsp://<device-ip>:<device-rtsp-port>/mpeg/720p/media.amp"
params:
- name: device_rtsp_port
type: integer
values:
- 554
- 8557
- id: sip_registration
label: Register with SIP Proxy
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: SIP proxy authentication user
- name: password
type: string
description: SIP proxy authentication password
- name: url
type: string
description: SIP proxy IP address or hostname
- id: sip_make_call
label: Make SIP 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
- id: sip_hangup
label: Hang Up SIP Call
kind: action
command: "GET http://<device-ip>/bha-api/sip.cgi?action=hangup"
params: []
- id: sip_settings
label: Configure SIP Settings
kind: action
command: "GET http://<device-ip>/bha-api/sip.cgi?action=settings&<parameter>=<value>"
params:
- name: enable
type: integer
range: "0..1"
- name: mic_volume
type: integer
range: "1..100"
- name: spk_volume
type: integer
range: "1..100"
- name: dtmf
type: integer
range: "0..1"
- name: autocall_doorbell_url
type: string
deprecated: true
- name: relay1_passcode
type: integer
range: "0..99999999"
- name: incoming_call_enable
type: integer
range: "0..1"
- name: incoming_call_user
type: string
- name: anc
type: integer
range: "0..1"
- name: ring_time_limit
type: integer
range: "10..300"
- name: call_time_limit
type: integer
range: "30..300"
- id: sip_status
label: Query SIP Status
kind: query
command: "GET http://<device-ip>/bha-api/sip.cgi?action=status"
params: []
- id: sip_reset
label: Reset SIP Settings
kind: action
command: "GET http://<device-ip>/bha-api/sip.cgi?action=reset"
params: []
Feedbacks
- id: session
type: object
fields:
return_code:
source_field: RETURNCODE
type: string
session_id:
source_field: SESSIONID
type: string
validity: "10 minutes"
notification_encryption_key:
source_field: NOTIFICATION_ENCRYPTION_KEY
type: string
- id: monitor_state
type: enum
values:
- "doorbell:H"
- "doorbell:L"
- "motionsensor:H"
- "motionsensor:L"
- id: device_info
type: object
fields:
firmware:
source_field: FIRMWARE
type: string
build_number:
source_field: BUILD_NUMBER
type: string
primary_mac_address:
source_field: PRIMARY_MAC_ADDR
type: string
relays:
source_field: RELAYS
type: array
device_type:
source_field: DEVICE-TYPE
type: string
- id: sip_status
type: object
fields:
last_error_code:
source_field: LASTERRORCODE
type: string
last_error_text:
source_field: LASTERRORTEXT
type: string
- id: http_status
type: enum
values:
- 200
- 204
- 400
- 401
- 423
- 500
- 503
- 507
- 509
Variables
- id: sip_enable
type: integer
range: "0..1"
default: 0
- id: sip_microphone_volume
type: integer
range: "1..100"
default: 33
- id: sip_speaker_volume
type: integer
range: "1..100"
default: 70
- id: sip_dtmf
type: integer
range: "0..1"
default: 0
- id: sip_autocall_doorbell_url
type: string
default: none
deprecated: true
- id: sip_relay1_passcode
type: integer
range: "0..99999999"
- id: sip_incoming_call_enable
type: integer
range: "0..1"
default: 0
- id: sip_incoming_call_user
type: string
- id: sip_acoustic_noise_cancellation
type: integer
range: "0..1"
default: 1
- id: sip_ring_time_limit
type: integer
range: "10..300"
default: 300
unit: seconds
- id: sip_call_time_limit
type: integer
range: "30..300"
default: 300
unit: seconds
Events
- id: doorbell
transport: udp
ports:
- 6524
- 35344
payload:
ident: "0xDE 0xAD 0xBE"
version: "0x02"
encryption: ChaCha20-Poly1305
nonce_length_bytes: 8
ciphertext_length_bytes: 34
plaintext_fields:
- name: INTERCOM_ID
length_bytes: 6
type: string
- name: EVENT
length_bytes: 8
type: string
- name: TIMESTAMP
length_bytes: 4
type: long
- id: motion
transport: udp
ports:
- 6524
- 35344
payload:
ident: "0xDE 0xAD 0xBE"
version: "0x02"
encryption: ChaCha20-Poly1305
nonce_length_bytes: 8
ciphertext_length_bytes: 34
plaintext_fields:
- name: INTERCOM_ID
length_bytes: 6
type: string
- name: EVENT
length_bytes: 8
type: string
- name: TIMESTAMP
length_bytes: 4
type: long
- id: udp_keep_alive
transport: udp
ports:
- 6524
- 35344
interval_seconds: 7
description: Keep-alive broadcast; not an event notification
Macros
- id: secure_media_session
label: Obtain Session Before Unencrypted Media Request
steps:
- "Authenticate and GET http://<device-ip>/bha-api/getsession.cgi."
- "Read SESSIONID from JSON response."
- "Append sessionid=<session-id> to video.cgi or audio-receive.cgi request."
session_validity: "10 minutes"
- id: decrypt_udp_event_v2
label: Decrypt UDP Event Version 2
steps:
- "Obtain NOTIFICATION_ENCRYPTION_KEY from getsession.cgi after authenticating."
- "Verify packet IDENT is 0xDE 0xAD 0xBE and VERSION is 0x02."
- "Split packet into 8-byte NONCE and 34-byte CIPHERTEXT."
- "Decrypt CIPHERTEXT using ChaCha20-Poly1305 and first 32 bytes of NOTIFICATION_ENCRYPTION_KEY."
- "Parse 6-byte INTERCOM_ID, 8-byte EVENT, and 4-byte TIMESTAMP."
Safety
confirmation_required_for:
- open_door
- restart
- sip_reset
interlocks:
- action: open_door
requirement: "Valid user with watch-always permission or ring event in past 5 minutes"
- action: light_on
requirement: "Valid user with watch-always permission or ring event in past 5 minutes"
- action: sip_settings
requirement: "API-Operator permission"
- action: sip_registration
requirement: "API-Operator permission"
- action: sip_make_call
requirement: "Wait at least 3 seconds between SIP requests"
Notes
LAN API allows at most one third-party API connection per second. Extensive invalid authentication attempts block the IP address or user for one minute and return HTTP 423. Live audio/video may be interrupted when official DoorBird App requests stream; App has precedence. Only one simultaneous live audio/video call and one simultaneous SIP call are supported. SIP calls terminate 180 seconds after initiation. UDP event version 1 is deprecated; version 2 uses ChaCha20-Poly1305.
Provenance
source_domains:
- doorbird.com
source_urls:
- https://www.doorbird.com/downloads/api_lan.pdf
retrieved_at: 2026-07-21T23:59:31.672Z
last_checked_at: 2026-07-22T00:56:41.515Z
Verification Summary
verdict: verified
checked_at: 2026-07-22T00:56:41.515Z
matched_actions: 26
action_count: 26
confidence: medium
summary: "All 26 spec actions matched; transport verified; the 1080p RTSP endpoint is D11x-only and correctly omitted for this D21x model. (2 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "rtsp://<device-ip>/mpeg/1080p/media.amp"
- "exact hardware-version compatibility for the D2101KV-V4A Series is not stated separately from the broader D21x family."
- "device-specific behavior outside documented D21x family behavior was not stated."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0