> ## Documentation Index
> Fetch the complete documentation index at: https://dronebundle.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Receive real-time notifications when events happen in your workspace.

<Info>
  Webhooks are available on the Enterprise plan. See [pricing](https://dronebundle.com/pricing) for details.
</Info>

Webhooks let you receive HTTP callbacks when resources in your workspace change. Instead of polling the API, you can subscribe to events like project creation or job updates and get notified automatically.

## Setting up a webhook

1. Log in to your [DroneBundle dashboard](https://app.dronebundle.com/webhooks)
2. Click **Create Webhook**
3. Give it a name (e.g., "n8n Sync", "HubSpot Integration")
4. Enter your HTTPS endpoint URL
5. Select the events you want to subscribe to
6. Copy the signing secret and store it somewhere safe

<Warning>
  The signing secret is only shown once when you create the webhook. If you lose it, you will need to delete the webhook and create a new one.
</Warning>

## Events

Subscribe to any combination of the following events:

| Event              | Triggered when            |
| ------------------ | ------------------------- |
| `project.created`  | A new project is created  |
| `project.updated`  | A project is modified     |
| `project.deleted`  | A project is deleted      |
| `job.created`      | A new job is created      |
| `job.updated`      | A job is modified         |
| `job.deleted`      | A job is deleted          |
| `job_type.created` | A new job type is created |
| `job_type.updated` | A job type is modified    |
| `job_type.deleted` | A job type is deleted     |

## Payload format

Every webhook delivery sends a `POST` request to your endpoint with a JSON body:

```json theme={null}
{
  "delivery_id": "019d4d2e-9104-774b-a0aa-fd2f8bd2e16d",
  "event": "project.created",
  "timestamp": 1775116390660,
  "workspace_id": "01986573-8d04-72fc-85b3-573c77a18511",
  "data": {
    "id": "019d4d2e-8af7-7609-8844-012c89671da9",
    "name": "Solar Farm Aerial Survey",
    "description": "Thermal and RGB drone inspection of the 40-acre Greenfield solar farm.",
    "status": "not_started",
    "start_date": "2026-05-01T00:00:00.000Z",
    "end_date": "2026-05-15T00:00:00.000Z",
    "external_id": "SF-2026-041",
    "laanc_number": null,
    "other_status_reason": null,
    "archived": false,
    "archived_at": null,
    "created": 1775116389112,
    "updated": 1775116389112,
    "created_by": {
      "type": "user",
      "id": "03144892-6021-705a-08f2-8e147cff3f28"
    }
  }
}
```

For delete events, `data` contains only the resource ID:

```json theme={null}
{
  "delivery_id": "019d4d36-1bc1-7315-b010-924ed0afbe87",
  "event": "project.deleted",
  "timestamp": 1775116884929,
  "workspace_id": "01986573-8d04-72fc-85b3-573c77a18511",
  "data": {
    "id": "019d4d2e-8af7-7609-8844-012c89671da9"
  }
}
```

## Headers

Each delivery includes the following headers:

| Header                    | Description                                                                 |
| ------------------------- | --------------------------------------------------------------------------- |
| `X-DroneBundle-Signature` | HMAC-SHA256 signature for verifying authenticity (e.g., `sha256=abc123...`) |
| `X-DroneBundle-Event`     | The event type (e.g., `project.created`)                                    |
| `X-DroneBundle-Delivery`  | Unique delivery ID for idempotency tracking                                 |
| `User-Agent`              | `DroneBundle-Webhook/1.0`                                                   |
| `Content-Type`            | `application/json`                                                          |

## Verifying signatures

Every delivery is signed with your webhook's secret using HMAC-SHA256. Always verify the signature before processing the payload. See [Verify Signatures](/api-reference/webhooks/verify-signatures) for code examples in Node.js, Python, Java, C#, PHP, Go, and Rust.

## Delivery behavior

* Your endpoint must respond with a `2xx` status code within **10 seconds**
* Non-`2xx` responses or timeouts are treated as failures
* After **10 consecutive failures**, the webhook is automatically paused
* Reactivating a paused webhook from the dashboard resets the failure counter
* Delivery logs are available in the dashboard for 30 days

## Retry policy

If a delivery fails, it is retried up to **2 more times** (3 total attempts) with a **\~4 minute interval** between each attempt. If all attempts fail, the event is dropped and the failure counter is incremented.

<Note>
  Deliveries may arrive more than once. Use the `delivery_id` field to deduplicate events on your end.
</Note>
