Skip to content

Webhooks

BirdNET-NG can send HTTP notifications to external services when events occur.

Setup

Create webhooks in the web UI under Tenant Settings > Webhooks, or via the API:

bash
curl -X POST https://birdnet.example.com/api/webhooks \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "<uuid>",
    "name": "Slack Notifications",
    "url": "https://hooks.slack.com/services/...",
    "secret": "my-webhook-secret",
    "eventTypes": ["detection.rare", "satellite.offline"]
  }'

Event Types

EventTrigger
detection.newAny new bird detection
detection.rareRare species detected (watchlist or frequency-based)
satellite.offlineSatellite goes offline

Payload

json
{
  "event": "detection.rare",
  "timestamp": "2026-03-22T10:30:00Z",
  "tenantId": "uuid",
  "data": {
    "detectionId": "uuid",
    "species": "Loxia curvirostra",
    "commonName": "Red Crossbill",
    "confidence": 0.82,
    "satelliteName": "Garden Pi",
    "satelliteId": "uuid",
    "isRare": true,
    "rareReason": "First detection at this location"
  }
}

HMAC Verification

If a secret is configured, the payload is signed with HMAC-SHA256. The signature is sent in the X-Webhook-Signature header:

X-Webhook-Signature: sha256=<hex-encoded-hmac>

To verify in your receiver:

python
import hmac, hashlib

expected = hmac.new(
    secret.encode(),
    request.body,
    hashlib.sha256
).hexdigest()

assert hmac.compare_digest(f"sha256={expected}", request.headers["X-Webhook-Signature"])

Management

ActionAPIUI
List webhooksGET /api/webhooks?tenantId=<id>Tenant Settings page
CreatePOST /api/webhooksTenant Settings page
DeleteDELETE /api/webhooks/:idTenant Settings page
TestPOST /api/webhooks/:id/testTenant Settings page

Testing sends a sample payload to verify the URL is reachable and returns the HTTP status code.

Distributed bird sound identification