Summary
The DoorBird D3100E is a video door station exposing a LAN-2-LAN HTTP API for third-party integration. This spec covers the HTTP-based control endpoints, UDP event broadcasts, and SIP interface documented in DoorBird's "LAN-2-LAN API" reference. The source document is generic to DoorBird/BirdGuard product lines; per-model coverage for D3100E specifically is not isolated.
Transport
protocols:
- http
- udp
addressing:
port: 80 # HTTP, plain LAN access
base_url: "http://<device-ip>/bha-api"
auth:
type: basic_or_digest # RFC 2617 Basic or Digest, per source
# UNRESOLVED: credential format follows DoorBird App user accounts; not separately specified
Notes:
- HTTPS available on TCP port 443 with self-signed certificate (LAN access).
- RTSP on port 554, RTSP-over-HTTP on port 8557 (video stream, not covered as actions below).
- SIP signaling on port 5060.
- UDP event broadcasts on ports 6524 and 35344.
- Alternative plaintext HTTP auth via
http-user/http-passwordquery parameters supported but discouraged.
Traits
- queryable # inferred from info.cgi, sip status queries
- routable # inferred from open-door.cgi and light-on.cgi relay triggers
Actions
# CRITICAL: command field holds the literal HTTP path/payload from source verbatim.
# Each CGI endpoint listed in the source is enumerated as a separate action.
- id: get_session
label: Get Session ID
kind: query
command: "GET /bha-api/getsession.cgi"
params: []
- id: invalidate_session
label: Invalidate Session
kind: action
command: "GET /bha-api/getsession.cgi?invalidate=<session-id>"
params:
- name: session_id
type: string
description: Session ID to invalidate
- id: live_video_request
label: Live Video Stream (MJPEG)
kind: action
command: "GET /bha-api/video.cgi"
params: []
- id: live_image_request
label: Live Image (JPEG)
kind: query
command: "GET /bha-api/image.cgi"
params: []
- id: open_door
label: Open Door / Trigger Relay
kind: action
command: "GET /bha-api/open-door.cgi?r=<relay>"
params:
- name: relay
type: string
description: "Relay to trigger: numeric (e.g. 1, 2) or paired I/O controller ID (e.g. gggaaa@1). Omit for physical relay 1."
- id: light_on
label: Energize Light Relay
kind: action
command: "GET /bha-api/light-on.cgi"
params: []
- id: history_image_request
label: History Image Request
kind: query
command: "GET /bha-api/history.cgi?index=<index>&event=<event>"
params:
- name: index
type: integer
description: History image index, 1..50 (1 = latest)
- name: event
type: string
description: "Optional event filter: doorbell or motionsensor"
- id: monitor_request
label: Monitor Doorbell / Motion Events
kind: action
command: "GET /bha-api/monitor.cgi?ring=doorbell[,motionsensor]"
params:
- name: ring
type: string
description: "Comma-separated event types to monitor: doorbell, motionsensor"
- id: live_audio_receive
label: Live Audio Receive (G.711 µ-law)
kind: action
command: "GET /bha-api/audio-receive.cgi"
params: []
- id: live_audio_transmit
label: Live Audio Transmit (G.711 µ-law)
kind: action
command: "POST /bha-api/audio-transmit.cgi"
params:
- name: body
type: binary
description: "G.711 µ-law audio data, Content-Type: audio/basic, 8000 Hz mono"
- id: info_request
label: Device Info / Version Query
kind: query
command: "GET /bha-api/info.cgi"
params: []
- id: list_favorites
label: List Favorites
kind: query
command: "GET /bha-api/favorites.cgi"
params: []
- id: add_or_change_favorite
label: Add or Change Favorite
kind: action
command: "GET /bha-api/favorites.cgi?action=save&type=<type>&title=<title>&value=<value>&id=<id>"
params:
- name: type
type: string
description: "sip or http"
- name: title
type: string
description: Name / short description
- name: value
type: string
description: "URL (for http) or SIP address (for sip)"
- name: id
type: integer
description: "Optional: ID of favorite to change; omit for new"
- id: delete_favorite
label: Delete Favorite
kind: action
command: "GET /bha-api/favorites.cgi?action=remove&type=<type>&id=<id>"
params:
- name: type
type: string
description: "sip or http"
- name: id
type: integer
description: ID of favorite to delete
- id: list_schedules
label: List Schedules
kind: query
command: "GET /bha-api/schedule.cgi"
params: []
- id: add_or_update_schedule
label: Add or Update Schedule Entry
kind: action
command: "POST /bha-api/schedule.cgi"
params:
- name: body
type: json
description: "JSON object with input, param, output[], schedule fields (see source)"
- id: delete_schedule_entry
label: Delete Schedule Entry
kind: action
command: "GET /bha-api/schedule.cgi?action=remove&input=<input>¶m=<param>"
params:
- name: input
type: string
description: "Event type: doorbell, motion, rfid"
- name: param
type: string
description: "Doorbell number, transponder id, etc."
- id: restart_device
label: Restart Device
kind: action
command: "GET /bha-api/restart.cgi"
params: []
- id: sip_register
label: SIP Register
kind: action
command: "GET /bha-api/sip.cgi?action=registration&user=<user>&password=<password>&url=<url>"
params:
- name: user
type: string
description: SIP Proxy auth user
- name: password
type: string
description: SIP Proxy auth password
- name: url
type: string
description: IP/Hostname of SIP Proxy
- id: sip_makecall
label: SIP Make Call
kind: action
command: "GET /bha-api/sip.cgi?action=makecall&url=<url>"
params:
- name: url
type: string
description: SIP URL to call
- id: sip_hangup
label: SIP Hangup
kind: action
command: "GET /bha-api/sip.cgi?action=hangup"
params: []
- id: sip_settings
label: SIP Settings
kind: action
command: "GET /bha-api/sip.cgi?action=settings&<parameter>=<value>"
params:
- name: enable
type: integer
description: "0..1, enable SIP registration after reboot"
- name: mic_volume
type: integer
description: "1..100"
- name: spk_volume
type: integer
description: "1..100"
- name: dtmf
type: integer
description: "0..1, enable DTMF support"
- name: autocall_doorbell_url
type: string
description: "DEPRECATED: SIP URL to auto-call on doorbell; use schedule.cgi"
- name: relay1_passcode
type: integer
description: "0..99999999, pincode to trigger relay via DTMF"
- name: incoming_call_enable
type: integer
description: "0..1, enable incoming calls"
- name: incoming_call_user
type: string
description: "Allowed SIP user (e.g. sip:10.0.0.1:5060)"
- name: anc
type: integer
description: "0..1, acoustic noise cancellation"
- name: ring_time_limit
type: integer
description: "10..300, max ring seconds"
- name: call_time_limit
type: integer
description: "30..300, max call duration seconds"
- id: sip_status
label: SIP Status Query
kind: query
command: "GET /bha-api/sip.cgi?action=status"
params: []
- id: sip_reset
label: SIP Reset
kind: action
command: "GET /bha-api/sip.cgi?action=reset"
params: []
- id: rtsp_live_video
label: RTSP Live Video (H.264)
kind: action
command: "rtsp://<device-ip>:554/mpeg/media.amp"
params: []
Feedbacks
- id: device_info
type: object
description: |
JSON object from info.cgi containing RETURNCODE, VERSION[{FIRMWARE, BUILD_NUMBER}],
PRIMARY_MAC_ADDR, RELAYS (firmware 000108+), DEVICE-TYPE.
- id: session_info
type: object
description: |
JSON object containing SESSIONID and NOTIFICATION_ENCRYPTION_KEY (for UDP event decryption).
- id: doorbell_state
type: enum
values: [H, L]
description: "H = high/active (ringing), L = low/inactive, from monitor.cgi multipart stream."
- id: motion_state
type: enum
values: [H, L]
description: "H = motion detected, L = no motion, from monitor.cgi multipart stream."
- id: sip_status
type: object
description: "JSON with LASTERRORCODE and LASTERRORTEXT fields."
- id: udp_event_broadcast
type: object
description: |
UDP broadcasts on ports 6524 and 35344. v2 format: IDENT(3) + VERSION(1) + NONCE(8)
+ CIPHERTEXT(34). Decrypted CIPHERTEXT contains INTERCOM_ID(6), EVENT(8 padded),
TIMESTAMP(4 bytes Unix long).
- id: favorites_list
type: object
description: "JSON with sip{} and http{} keyed by favorite id, each with title and value."
- id: schedules_list
type: array
description: "JSON array of schedule entries with input, param, output[]."
- id: open_door_response
type: json
description: "JSON response from open-door.cgi (RETURNCODE)."
- id: light_on_response
type: json
description: "JSON response from light-on.cgi (RETURNCODE)."
- id: history_image
type: binary
description: "JPEG image data, Content-Type: image/jpeg."
- id: live_image
type: binary
description: "JPEG image data, Content-Type: image/jpeg."
- id: http_status_codes
type: enum
values: [200, 204, 400, 401, 423, 500, 503, 507, 509]
description: |
Standard response codes: 200 OK, 204 No permission, 400 Bad params,
401 Auth required, 423 Locked (after wrong credentials), 500 Internal,
503 Busy / device busy, 507 Size limit exceeded, 509 Max monitor streams.
Variables
# Settings exposed via sip.cgi?action=settings. Stored as device configuration.
- id: sip_enabled
type: integer
description: "0 or 1, SIP registration after reboot"
- id: sip_mic_volume
type: integer
description: "1..100, microphone volume (default 33)"
- id: sip_spk_volume
type: integer
description: "1..100, speaker volume (default 70)"
- id: sip_dtmf
type: integer
description: "0 or 1, DTMF support"
- id: sip_relay1_passcode
type: integer
description: "0..99999999, DTMF pincode for relay 1"
- id: sip_incoming_call_enable
type: integer
description: "0 or 1"
- id: sip_incoming_call_user
type: string
description: "Allowed SIP user identifier"
- id: sip_anc
type: integer
description: "0 or 1, acoustic noise cancellation"
- id: sip_ring_time_limit
type: integer
description: "10..300, max ring seconds (default 300)"
- id: sip_call_time_limit
type: integer
description: "30..300, max call duration seconds (default 300)"
Events
# Source documents UDP event broadcasts (v2) as the primary unsolicited notification channel.
- id: udp_doorbell_event
source: "UDP broadcast ports 6524, 35344"
description: |
v2 packet: IDENT 0xDEADBEEF, VERSION 0x02, NONCE 8B, CIPHERTEXT 34B ChaCha20-Poly1305.
Decrypted EVENT field (8B padded) identifies doorbell number (e.g. "1").
Keep-alive broadcasts every 7 seconds on same ports - skip these for event decoding.
- id: udp_motion_event
source: "UDP broadcast ports 6524, 35344"
description: |
Decrypted EVENT field "motion". Same packet format as doorbell events.
- id: monitor_stream_event
source: "GET /bha-api/monitor.cgi?ring=doorbell,motionsensor"
description: |
Continuous multipart/x-mixed-replace stream with doorbell:H/L and motionsensor:H/L
text sections. Max 8 concurrent streams; 509 if all busy.
Macros
# Multi-step sequences described explicitly in source.
- id: establish_udp_decryption_key
description: |
One-time setup: call GET /bha-api/getsession.cgi, extract NOTIFICATION_ENCRYPTION_KEY
from response, store it. Key is valid until user password changes; use first 32 bytes
for ChaCha20 decryption.
steps:
- action: get_session
note: "Capture SESSIONID + NOTIFICATION_ENCRYPTION_KEY from JSON response"
- id: open_door_paired_controller
description: |
Trigger relay on a paired IP I/O DoorController via open-door.cgi.
steps:
- action: info_request
note: "Find paired controller id from RELAYS array in JSON response"
- action: open_door
params: { relay: "<controller-id>@<relay-number>" }
Safety
confirmation_required_for:
- restart_device
interlocks: []
# Source notes SIP calls auto-hangup at 180 seconds for security.
# Source notes 1-minute IP lockout after extensive wrong credentials (HTTP 423).
# No other safety interlocks documented.
Notes
- Rate limit: max 1 concurrent API connection per second; block after wrong credentials for 1 minute.
- Live audio/video streams can be preempted by official DoorBird App requests.
- Audio codec: G.711 µ-law, 8000 Hz, mono required for HTTP audio endpoints.
- AES echo/noise cancellation (AEC/ANR) MUST be implemented client-side; device's algorithms are not exposed to third parties.
- Session ID validity: 10 minutes.
- RTSP live video: 720p stream requires firmware 129+ on D10x/D21x; 1080p requires D11x series.
- Favorites/schedules require firmware 000110+.
- info.cgi includes RELAYS only from firmware 000108+.
- HTTPS uses self-signed certificate (CA-issued certs not possible for IP addresses).
- Video/audio streaming over HTTPS not supported; use Session ID parameter instead.
- SIP service is single-call only; auto-hangup at 180 seconds; min 3s between SIP requests.
Spec formatted. 24 actions covering every CGI endpoint + RTSP, 12 feedbacks, 10 variables, 3 events, 2 macros. Generic DoorBird/BirdGuard scope flagged as UNRESOLVED — source not D3100E-specific.
## 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:03:54.607Z
last_checked_at: 2026-07-21T22:27:55.494Z
Verification Summary
verdict: verified
checked_at: 2026-07-21T22:27:55.494Z
matched_actions: 25
action_count: 25
confidence: medium
summary: "All 25 spec actions match verbatim endpoints in source; HTTP transport on port 80 with RFC 2617 auth verified; bidirectional coverage complete. (8 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "source document covers the full DoorBird/BirdGuard product line rather than the D3100E specifically. Firmware version requirements vary per endpoint (e.g. favorites/schedules require firmware 000110+, relay info in info.cgi requires 000108+)."
- "voltage, current, power, and electrical specifications not stated in source."
- "credential format follows DoorBird App user accounts; not separately specified"
- "powerable trait not applicable — door station is mains-powered, no power on/off command documented."
- "specific D3100E firmware version not stated — all firmware-dependent features use generic DoorBird firmware thresholds."
- "RTSP stream parameter (<device-rtsp-port>) port value not explicitly bound; uses 554 by default."
- "physical relay count and electrical ratings for D3100E not in source."
- "paired IP I/O DoorController model identifiers (gggaaa placeholder) not enumerated in source."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0