---
updatedAt: 2026-07-28T22:44:47.000Z
agentTools:
  projectIndex: https://docs.daloopa.com/llms.txt
---

# Webhook

# Overview

Daloopa webhooks provide real-time notifications when company data is updated. Instead of polling the API, your endpoint receives an HTTP POST the moment a relevant change happens — a new ClientView model, a batch of new datapoints, a data correction, or a newly indexed document.

## Setting Up Webhooks

You can create and manage webhooks yourself, without going through your account team. See the [Managing your Webhooks](https://docs.daloopa.com/docs/managing-your-webhooks) page for that option.

## Event Types

Daloopa currently supports the following events. **Fundamental events** carry a `series` field describing the affected metrics; the **document event** carries a `document` object describing a filing.

**Fundamental events**

* `clientview_updated` — Triggered when a new ClientView model is generated for the company.
* `incremental_update` — Triggered over any new group of datapoints published, either by analyst or autotagger.
* `series_updated` — Triggered when fundamental data errors/changes are detected in the last 5 minutes.
* `document_added` — Triggered when a new document is ingested new supported document is processed and indexed for company you have webhook coverage for.

**Document events**

* `document_added` — Triggered when a new supported document (filing, transcript, or presentation) is processed and indexed. (Beta, U.S.-only)

For all events, the payload includes the `event_type` and `company_id`, with the remaining structure varying by event type.

## Request Format

When a webhook event is triggered, Daloopa sends an HTTP POST request to your specified URL with the headers and JSON body described below.

### Headers

```
Content-Type: application/json
{header_name}: {prefix} {auth_secret}
```

**Example**

* url: `https://yoururl.com`
* header\_name: `Authorization`
* prefix: `X-API-KEY`
* auth\_secret: `secret_api_key`

The webhook triggers a POST request to `https://yoururl.com` with the following headers:

```
Content-Type: application/json
Authorization: X-API-KEY secret_api_key
```

## Event Payloads

### `clientview_updated`

```json
{
  "event_type": "clientview_updated",
  "company_id": 2,
  "series": {
    "SERIES_ID_1": {
      "periods": [
        "2025Q1"
      ]
    },
    "SERIES_ID_2": {
      "periods": [
        "2025Q1"
      ]
    }
  }
}
```

### `incremental_update`

```json
{
  "event_type": "incremental_update",
  "company_id": 2,
  "series": {
    "SERIES_ID_3": {
      "periods": [
        "2025Q1"
      ]
    },
    "SERIES_ID_4": {
      "periods": [
        "2025Q1"
      ]
    }
  }
}
```

### `series_updated`

The `series_updated` webhook is triggered every 5 minutes for companies with recently detected fundamental data errors or corrections. The payload contains an array of error objects, each describing what changed (the `fundamental_id`, `series_id`, the field that changed, and both old and new values).

```json
{
  "event_type": "series_updated",
  "company_id": 2,
  "series": [
    {
      "id": 2,
      "type": "MERGING_ERROR",
      "period": "2024Q1",
      "run_date": "2024-06-02T12:00:00Z",
      "details": {
        "fundamental_id": 13,
        "series_id": 102,
        "field_changed": "series_id",
        "new_value": 102,
        "old_value": 103
      }
    },
    {
      "id": 3,
      "type": "TAGGING_ERROR",
      "period": "2024Q1",
      "run_date": "2024-06-03T12:00:00Z",
      "details": {
        "fundamental_id": 13,
        "series_id": 202,
        "field_changed": "fundamental_id",
        "new_value": 13,
        "old_value": 12
      }
    },
    {
      "id": 4,
      "type": "VALUE_ERROR",
      "period": "2024Q2",
      "run_date": "2024-06-04T12:00:00Z",
      "details": {
        "fundamental_id": 15,
        "series_id": 105,
        "field_changed": "fundamental_value",
        "new_value": 1500,
        "old_value": 1200
      }
    }
  ]
}
```

#### Interpreting `series_updated` errors

Each object's `type` is one of `VALUE_ERROR`, `TAGGING_ERROR`, or `MERGING_ERROR`. The `details` object should be read differently depending on the type:

`VALUE_ERROR` — Fundamental with id `fundamental_id` changed value from `old_value` to `new_value`.
*Example: Fundamental 45672 changed value from 1,200,000 to 1,500,000.*

* `fundamental_id`: The ID of the fundamental datapoint that was corrected
* `series_id`: The series/row where this fundamental belongs
* `field_changed`: Always `fundamental_value` for value corrections
* `old_value`: The previous (incorrect) value
* `new_value`: The corrected value

`TAGGING_ERROR` — Series with id `series_id` removed Fundamental with id `old_value` and received a new Fundamental with id `new_value`.
*Example: Series 12346 removed Fundamental 45670 and received new Fundamental 45673.*

* `fundamental_id`: The current fundamental ID after the change
* `series_id`: The series/row that was affected by the retagging
* `field_changed`: Always `fundamental_id` for tagging changes
* `old_value`: The ID of the fundamental that was removed from this series
* `new_value`: The ID of the fundamental that was assigned to this series

`MERGING_ERROR` — Fundamental with id `fundamental_id` changed series/row from `old_value` to `new_value`.
*Example: Fundamental 45674 moved from series 12340 to series 12347.*

* `fundamental_id`: The ID of the fundamental that was moved
* `series_id`: The current series/row after the merge
* `field_changed`: Always `series_id` for merging operations
* `old_value`: The previous series ID before merging
* `new_value`: The new series ID after merging

### `document_added`

The `document_added` event fires when a new supported document is processed and indexed for company you have webhook coverage for. It lets you react to new filings, transcripts, and presentations the moment they are available, instead of polling `GET /api/v3/documents`.

```json
{
  "event_type": "document_added",
  "company_id": 12345,
  "document": {
    "document_id": 987654,
    "filing_type": "10-K",
    "document_type": "Annual Report * 10-K",
    "title": "Daloopa Sample 10-K (FY 2024)",
    "calendar_period": "2024Q4",
    "filing_date": "2025-02-21",
    "ingested_at": "2025-02-21T14:32:11Z"
  }
}
```

#### Field reference

| Field                      | Type    | Description                                                                                                                                                                             |
| -------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `event_type`               | string  | Always `document_added`.                                                                                                                                                                |
| `company_id`               | integer | The Daloopa company the document belongs to.                                                                                                                                            |
| `document.document_id`     | integer | Stable identifier for the document. Use this to fetch the document via `GET /api/v3/documents/{document_id}` and as the idempotency key.                                                |
| `document.filing_type`     | string  | The raw filing type exactly as returned by `GET /api/v3/documents` (for example `10-K`, `10-Q`, `8-K`, `Transcript`). Amendments are not normalized, so a `10-K/A` arrives as `10-K/A`. |
| `document.document_type`   | string  | The raw source document type exactly as returned by `GET /api/v3/documents`. Not restricted to a fixed set.                                                                             |
| `document.title`           | string  | The document title. May be empty when the source document has no title.                                                                                                                 |
| `document.calendar_period` | string  | The calendar period, using the same period logic as the documents API (for example `2024Q4`).                                                                                           |
| `document.filing_date`     | string  | The filing date in `YYYY-MM-DD` format.                                                                                                                                                 |
| `document.ingested_at`     | string  | UTC timestamp (ISO 8601) for when Daloopa finished processing the document.                                                                                                             |

The `filing_type` and `document_type` values are passed through verbatim from `GET /api/v3/documents`; there is no normalization onto a restricted enum. If your integration only cares about a subset of document types, filter on `filing_type` or `document_type` in your own handler.

#### Supported documents

In the current beta, `document_added` covers these document categories:

* Annual reports (`10-K`)
* Quarterly reports (`10-Q`)
* Current reports (`8-K`)
* Earnings call transcripts
* Company presentations (for example earnings and investor day presentations)

Amendments (for example `10-K/A`) are delivered with their raw `filing_type` value and are not collapsed onto the base type.

#### Scope and delivery semantics

* US-only: matches the current documents API beta scope. Non-U.S. documents do not trigger this event.
* Opt-in and scoped: you only receive `document_added` events for companies you are subscribed to and have webhook coverage for.
* One notification per document: events are not batched.
* Idempotency: dedupe on `document.document_id`. The same document may, in rare cases, be delivered more than once; treat `document_id` as the dedupe key.
* Delivery is at-most-once: `document_added` deliveries are not retried on failure today. If your endpoint is unreachable or returns a non-2xx response, the event is not redelivered automatically. Use `GET /api/v3/documents` to backfill anything you may have missed, and review delivery history via `GET /api/v3/webhooks/deliveries`.
* Timing: the event fires after the document is indexed, so a `GET /api/v3/documents/{document_id}` immediately on receipt succeeds without a race condition.

## Testing & Monitoring

### Testing Your Webhooks

Daloopa offers a way to test your webhook endpoint without relying on a production event, so you can confirm your endpoint receives and parses payloads correctly before going live. See the [Testing your Webhooks](https://docs.daloopa.com/docs/testing-your-webhooks) page for sample payloads and step-by-step instructions.

### Monitoring Webhook Delivery

After your first webhook arrives:

* Log all received events for debugging
* Monitor for HTTP 200 responses from your endpoint
* Check that authentication is working correctly

You can also review historical deliveries via `GET /api/v3/webhooks/deliveries`.

## Need Help?

If you encounter any issues with webhook configuration or delivery, please contact your Sales Representative.

## FAQ

### What is a Daloopa webhook?

A webhook is a real-time HTTP notification sent to your endpoint whenever data for a company you're subscribed to is updated in Daloopa.

### How do I set up a webhook?

You have two options:

1. Contact your Daloopa account/sales team and provide your endpoint URL, authentication header name, secret token, and (optionally) an auth prefix. Daloopa will configure it for you.
2. Create and manage webhooks yourself via the [Managing your Webhooks](https://docs.daloopa.com/docs/managing-your-webhooks) page.

### Does my webhook URL need to be HTTPS?

Yes. Daloopa requires all webhook endpoints to use HTTPS.

### How often is the `series_updated` event triggered?

Every 5 minutes, for any company where recent data errors or corrections have been detected.

### What error types can appear in a `series_updated` event?

* `VALUE_ERROR` – A fundamental datapoint's value changed (e.g., from 1,200,000 to 1,500,000)
* `TAGGING_ERROR` – A series had one fundamental replaced with another
* `MERGING_ERROR` – A fundamental was moved from one series/row to another

See [Interpreting `series_updated` errors](#interpreting-series_updated-errors) for the full field-by-field breakdown.

### What is the `document_added` event?

A `document_added` event fires when a new supported document (10-K, 10-Q, 8-K, earnings transcript, or company presentation) is processed and indexed for a company you have webhook coverage for. It is currently in beta and U.S.-only. Dedupe on `document.document_id`, and note that these events are delivered at-most-once (not retried) — use `GET /api/v3/documents` to backfill if needed.

### What does the webhook request look like?

Daloopa sends an HTTP POST request to your URL with:

* `Content-Type: application/json` header
* Your configured authentication header
* A JSON body containing the `event_type`, `company_id`, and event-specific details (a `series` field for fundamental events, or a `document` object for `document_added`)

### Can I test my webhook before relying on a live production event?

Yes. Daloopa provides a method to test webhook functionality without needing a real production event. See the [Testing your Webhooks](https://docs.daloopa.com/docs/testing-your-webhooks) page for details.

### Who do I contact if I have issues with my webhook?

Reach out to your Daloopa Sales Representative for help with configuration or delivery issues.