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

# Webhooks

> Gebruik webhooks om AppSignal te integreren met andere derde partijen of uw eigen systeem.

AppSignal kan meldingen over nieuwe incidenten naar verschillende services sturen, zie onze volledige lijst op de pagina [integraties](/application/integrations). We bieden ook webhooks voor deze meldingen aan, zodat u nieuwe incidenten in uw eigen systeem kunt afhandelen.

Om een webhook te ontvangen, gaat u naar het tabblad "Notifications" in de zijbalk van de site, klikt u op "Add integration" en vult u de URL in waar u uw webhookdata wilt ontvangen.

<img src="https://mintcdn.com/appsignal-715f5a51/nF8c1Rwq1cS7b5hg/assets/images/screenshots/app_webhook.png?fit=max&auto=format&n=nF8c1Rwq1cS7b5hg&q=85&s=7d0bfa4afbbcf93a4e3241b53fdc06c3" alt="Webhook" width="1400" height="934" data-path="assets/images/screenshots/app_webhook.png" />

Er zijn meerdere webhooks beschikbaar. Welke payloads de webhook ontvangt, kan worden geconfigureerd in het configuratieformulier voor de webhook, zoals te zien is in de bovenstaande schermafbeelding.

## AppSignal-webhookverzoeken verifiëren

Om de veiligheid van uw applicatie te waarborgen, kunt u controleren of binnenkomende webhookverzoeken daadwerkelijk afkomstig zijn van AppSignal. Verificatie gebeurt met behulp van een Webhook verification token om de handtekening van het verzoek te valideren.

### Uw Webhook Verification Token vinden

1. Navigeer in uw AppSignal-dashboard naar **App settings > Integrations**.
2. Configureer de webhook-integratie die u wilt verifiëren.
3. Hier vindt u het **Webhook verification token** van de integratie.

Deze token wordt gebruikt om te valideren dat het webhookverzoek van AppSignal afkomstig is.

### Een verzoek verifiëren

Wanneer AppSignal een webhookverzoek verstuurt, wordt een handtekening opgenomen in de header `X-Appsignal-Signature`. U kunt het verzoek als volgt valideren:

1. Voeg de AppSignal Webhook verification token samen met de ruwe body van het verzoek.
2. Genereer een SHA256-hash van de samengevoegde tekenreeks.
3. Vergelijk de gegenereerde hash met de waarde in de header `X-Appsignal-Signature`.

Als de hashes overeenkomen, kan worden bevestigd dat het verzoek van AppSignal afkomstig is.

### Voorbeeldimplementaties

Hieronder staan enkele voorbeelden van hoe u kunt verifiëren dat een verzoek afkomstig is van AppSignal in Ruby, Elixir, Node.js en Python.

**Let op:** De onderstaande voorbeelden zijn illustratief; u moet ze mogelijk aanpassen, afhankelijk van de frameworks, integraties en dependencies die uw app gebruikt.

<CodeGroup>
  ```ruby Ruby theme={null}
      token = Rails.application.credentials.appsignal_webhook_token
      request_signature = request.headers["X-Appsignal-Signature"]

      message = request.raw_post
      signature = OpenSSL::Digest::SHA256.hexdigest(token + message.to_s)

      if signature == request_signature
        # logic here
      end
  ```

  ```elixir Elixir theme={null}
    token = Application.get_env(:my_app, :appsignal_webhook_token)
    request_signature = List.first(get_req_header(conn, "x-appsignal-signature"))

    {:ok, raw_body} = read_body(conn)

    message = token <> raw_body
    signature = Base.encode16(:crypto.hash(:sha256, message), case: :lower)

    if signature == request_signature do
      # logic here
    end
  ```

  ```js JavaScript theme={null}
  const crypto = require("crypto");

  const token = process.env.APPSIGNAL_WEBHOOK_TOKEN;
  const requestSignature = req.headers["x-appsignal-signature"];

  let rawBody = req.rawBody;

  const message = token + rawBody;

  const signature = crypto.createHash("sha256").update(message).digest("hex");

  if (signature === requestSignature) {
    // logic here
  }
  ```

  ```python Python theme={null}
    import hashlib
    import os

    token = os.getenv('APPSIGNAL_WEBHOOK_TOKEN')
    request_signature = request.headers['X-Appsignal-Signature']

    raw_body = request.get_data(as_text=True)

    message = token + raw_body

    signature = hashlib.sha256(message.encode()).hexdigest()

    if signature == request_signature:
      # logic here
  ```
</CodeGroup>

## Deploy markers

<CodeGroup>
  ```json JSON theme={null}
  {
    "marker": {
      "time": "2019-01-10 10:45:41 +0100",
      "marker_id": "5c3714455ac13f7df09437f0",
      "site": "My test app",
      "environment": "development",
      "revision": "abc123",
      "user": "tom",
      "repository": "https://github.com/my_org/my_repo",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/dashboard"
    }
  }
  ```
</CodeGroup>

### Velden

| Veld     | Type                | Beschrijving                                    |
| -------- | ------------------- | ----------------------------------------------- |
| `marker` | `Hash<String, Any>` | De webhook-payload betreft een marker-incident. |

#### Subvelden van deploy marker

| Veld          | Type     | Beschrijving                                                                                                        |
| ------------- | -------- | ------------------------------------------------------------------------------------------------------------------- |
| `time`        | `String` | Tijdstempel waarop de deploy marker is aangemaakt.                                                                  |
| `marker_id`   | `String` | Interne AppSignal-marker-id voor de deploy marker.                                                                  |
| `site`        | `String` | App-naam zoals te zien op AppSignal.com. Het veld `site` wordt om historische redenen gebruikt in plaats van `app`. |
| `environment` | `String` | App-omgeving van de app zoals te zien op AppSignal.com.                                                             |
| `revision`    | `String` | De revisienaam van de [deploy marker](/application/markers/deploy-markers){" "}.                                    |
| `user`        | `String` | De gebruiker die de marker heeft aangemaakt.                                                                        |
| `repository`  | `String` | URL naar de repository zoals geconfigureerd voor de app op AppSignal.com.                                           |
| `url`         | `String` | URL naar de app op AppSignal.com die de webhook heeft geactiveerd.                                                  |

## Exception incidents

<CodeGroup>
  ```json JSON theme={null}
  {
    "exception": {
      "time": "2019-01-09 09:03:57 UTC",
      "number": 3,
      "site": "My test app",
      "environment": "development",
      "app_url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/incidents/3?timestamp=2019-01-09T09%3A03%3A57Z",
      "revision": "abc123",
      "user": "tom",
      "namespace": "web",
      "exception": "Appsignal::Demo::TestError",
      "message": "Hello world! This is an error used for demonstration purposes.",
      "app_backtrace": [
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:49:in `create_example_error_request'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:35:in `transmit'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/cli/demo.rb:53:in `run'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/cli.rb:31:in `run'",
        "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/bin/appsignal:7:in `<top (required)>'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/appsignal:23:in `load'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/appsignal:23:in `<top (required)>'",
        "/Users/tombruijn/.gem/ruby/2.5.3/bin/bundle:23:in `<main>'"
      ],
      "first_backtrace_line": "/Users/tombruijn/.gem/ruby/2.5.3/gems/appsignal-2.8.1/lib/appsignal/demo.rb:49:in `create_example_error_request'",
      "action": "DemoController#hello",
      "path": "/hello",
      "hostname": "Toms-MacBook-Pro.local",
      "action_label": "request",
      "metadata": {
        "demo_sample": "true",
        "method": "GET",
        "path": "/hello"
      }
    }
  }
  ```
</CodeGroup>

### Velden

| Veld        | Type                | Beschrijving                                       |
| ----------- | ------------------- | -------------------------------------------------- |
| `exception` | `Hash<String, Any>` | De webhook-payload betreft een exception-incident. |

#### Subvelden van exception

| Veld                   | Type                   | Beschrijving                                                                                                                                                                                                                     |
| ---------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `time`                 | `String`               | Tijdstempel waarop de exception zich voordeed.                                                                                                                                                                                   |
| `number`               | `Integer`              | Incident-id zoals weergegeven op AppSignal.com.                                                                                                                                                                                  |
| `site`                 | `String`               | App-naam zoals te zien op AppSignal.com. Het veld `site` wordt om historische redenen gebruikt in plaats van `app`.                                                                                                              |
| `environment`          | `String`               | App-omgeving van de app zoals te zien op AppSignal.com.                                                                                                                                                                          |
| `app_url`              | `String`               | URL naar de app op AppSignal.com die de webhook heeft geactiveerd.                                                                                                                                                               |
| `url`                  | `String`               | URL naar de specifieke sample voor het incident op AppSignal.com dat deze webhook heeft geactiveerd.                                                                                                                             |
| `revision`             | `String`               | De revisienaam van de [deploy marker](/application/markers/deploy-markers).                                                                                                                                                      |
| `user`                 | `String`               | De gebruiker die de marker heeft aangemaakt. De waarde van user kan ook{" "} `null` zijn als deze niet is ingesteld voor een deploy marker-revisie.                                                                              |
| `namespace`            | `String`               | De namespace waarin deze exception zich heeft voorgedaan.                                                                                                                                                                        |
| `exception`            | `String`               | Het exception-type dat door AppSignal is geregistreerd.                                                                                                                                                                          |
| `message`              | `String`               | Het exception-bericht met meer details over de exception.                                                                                                                                                                        |
| `app_backtrace`        | `Array<String>`        | De regels van de backtrace die betrekking hebben op de app waaruit ze afkomstig zijn. Hierin zijn backtrace-regels van libraries die in de app zijn opgenomen, uitgesloten.                                                      |
| `first_backtrace_line` | `String`               | De eerste backtrace-regel uit het veld `app_backtrace`.                                                                                                                                                                          |
| `action`               | `String`               | De actie waarin deze exception zich heeft voorgedaan. Ofwel een controller-actie, een background worker of een handmatig ingestelde actie.                                                                                       |
| `path`                 | `String`               | Het request-pad waarop de exception zich heeft voorgedaan. Dit wordt alleen ingesteld voor webrequests. Dit is metadata die standaard door de AppSignal-integratie wordt ingesteld en is ook opgenomen in het veld `metadata`.   |
| `hostname`             | `String`               | De hostnaam van de host waarop deze exception zich heeft voorgedaan.                                                                                                                                                             |
| `action_label`         | `String`               | Een gebruiksvriendelijke aanduiding voor het type actie waarin deze exception is opgetreden. Gebruikt `request` voor de namespace `web` en{" "} `job` voor de namespace `background`. Alle andere namespaces gebruiken `action`. |
| `metadata`             | `Hash<String, String>` | Dit bevat door de gebruiker ingestelde metadata (zie [Tagging-functie](/guides/tagging)).                                                                                                                                        |

#### Metadata-velden {/* id: exception-metadata-fields */}

U kunt eigen metadata toevoegen door [samples te taggen](/guides/tagging).

| Veld          | Type     | Beschrijving                                                                                                                                                                                                                       |
| ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `demo_sample` | `String` | Ingesteld door de AppSignal-integratie voor demo-samples die zijn verzonden via onze demo-commandoregeltool ([Ruby](/ruby/command-line/demo) /{" "} [Elixir](/elixir/command-line/demo)). Niet ingesteld voor alle andere samples. |
| `method`      | `String` | De request-methode die is gebruikt om een request uit te voeren. Alleen beschikbaar voor (web)requests.                                                                                                                            |
| `path`        | `String` | Het request-pad waarop de exception zich heeft voorgedaan. Dit wordt alleen ingesteld voor webrequests. Bevat dezelfde waarde als het veld `path`.                                                                                 |

## Performance incidents

<CodeGroup>
  ```json JSON theme={null}
  {
    "performance": {
      "time": "2019-01-10 09:38:08 UTC",
      "number": 1,
      "site": "My test app",
      "environment": "development",
      "app_url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b",
      "url": "https://appsignal.com/test/sites/5bd867fa2213937f3666ae7b/incidents/1?timestamp=2019-01-10T09%3A38%3A08Z",
      "revision": "abc123",
      "user": "tom",
      "namespace": "web",
      "duration": 2004.904052734375,
      "action": "DemoController#hello",
      "path": "/hello",
      "hostname": "Toms-MacBook-Pro.local",
      "action_label": "request",
      "metadata": {
        "demo_sample": "true",
        "method": "GET",
        "path": "/hello"
      }
    }
  }
  ```
</CodeGroup>

### Velden

| Veld          | Type                | Beschrijving                                         |
| ------------- | ------------------- | ---------------------------------------------------- |
| `performance` | `Hash<String, Any>` | De webhook-payload betreft een performance-incident. |

#### Subvelden van performance

| Veld           | Type                   | Beschrijving                                                                                                                                                                                                                                    |
| -------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `time`         | `String`               | Tijdstempel waarop het performance-incident zich heeft voorgedaan.                                                                                                                                                                              |
| `number`       | `Integer`              | Incident-id zoals weergegeven op AppSignal.com.                                                                                                                                                                                                 |
| `site`         | `String`               | App-naam zoals te zien op AppSignal.com. Het veld `site` wordt om historische redenen gebruikt in plaats van `app`.                                                                                                                             |
| `environment`  | `String`               | App-omgeving van de app zoals te zien op AppSignal.com.                                                                                                                                                                                         |
| `app_url`      | `String`               | URL naar de app op AppSignal.com die de webhook heeft geactiveerd.                                                                                                                                                                              |
| `url`          | `String`               | URL naar de specifieke sample voor het incident op AppSignal.com dat deze webhook heeft geactiveerd.                                                                                                                                            |
| `revision`     | `String`               | De revisienaam van de [deploy marker](/application/markers/deploy-markers).                                                                                                                                                                     |
| `user`         | `String`               | De gebruiker die de marker heeft aangemaakt. De waarde van user kan ook{" "} `null` zijn als deze niet is ingesteld voor een deploy marker-revisie.                                                                                             |
| `namespace`    | `String`               | De namespace waarin dit performance-incident zich heeft voorgedaan.                                                                                                                                                                             |
| `duration`     | `Float`                | De gemeten tijd in milliseconden die de request/job/actie nodig had om te voltooien.                                                                                                                                                            |
| `action`       | `String`               | De actie waarin dit performance-incident zich heeft voorgedaan. Ofwel een controller-actie, een background worker of een handmatig ingestelde actie.                                                                                            |
| `path`         | `String`               | Het request-pad waarop het performance-incident zich heeft voorgedaan. Dit wordt alleen ingesteld voor webrequests. Dit is metadata die standaard door de AppSignal-integratie wordt ingesteld en is ook opgenomen in het veld `metadata`{" "}. |
| `hostname`     | `String`               | De hostnaam van de host waarop dit performance-incident zich heeft voorgedaan.                                                                                                                                                                  |
| `action_label` | `String`               | Een gebruiksvriendelijke aanduiding voor het type actie waarin dit performance-incident is opgetreden. Gebruikt `request` voor de namespace `web`{" "} en `job` voor de namespace `background`{" "}. Alle andere namespaces gebruiken `action`. |
| `metadata`     | `Hash<String, String>` | Dit bevat door de gebruiker ingestelde metadata, zie{" "} [metadata](/guides/tagging).                                                                                                                                                          |

#### Metadata-velden {/* id: performance-metadata-fields */}

U kunt eigen metadata toevoegen door [samples te taggen](/guides/tagging).

| Veld          | Type     | Beschrijving                                                                                                                                                                                                                       |
| ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `demo_sample` | `String` | Ingesteld door de AppSignal-integratie voor demo-samples die zijn verzonden via onze demo-commandoregeltool ([Ruby](/ruby/command-line/demo) /{" "} [Elixir](/elixir/command-line/demo)). Niet ingesteld voor alle andere samples. |
| `method`      | `String` | De request-methode die is gebruikt om een request uit te voeren. Alleen beschikbaar voor (web)requests.                                                                                                                            |
| `path`        | `String` | Het request-pad waarop het performance-incident zich heeft voorgedaan. Dit wordt alleen ingesteld voor webrequests. Bevat dezelfde waarde als het veld{" "} `path`.                                                                |

## Anomaly detection

<CodeGroup>
  ```json JSON theme={null}
  {
    "alert_id": "5bdb1fb301925b0c4b6c7017",
    "state": "closed",
    "site": "google",
    "environment": "production",
    "tags": {
      "namespace": "web"
    },
    "human_tags": ["namespace: web"],
    "metric_name": "transaction_exception_rate",
    "field": "gauge",
    "trigger_label": "Exception rate",
    "trigger_description": "This is a description",
    "last_value": 12.0,
    "peak_value": 20.0,
    "mean_value": 11.0,
    "comparison_operator": "<",
    "comparison_value": 21.0,
    "human_last_value": "12 %",
    "human_peak_value": "20 %",
    "human_mean_value": "11 %",
    "human_comparison_value": "21 %",
    "created_at": "2017-08-01T10:00:00Z",
    "opened_at": "2017-08-01T10:05:00Z",
    "resolved_at": "2017-08-01T12:00:00Z",
    "closed_at": "2017-08-01T13:43:00Z",
    "warmup_duration": 10,
    "cooldown_duration": 20,
    "alert_url": "http://example.com/#{site.account.slug}/sites/#{site.id}/alerts/#{alert.id}",
    "edit_trigger_url": "http://example.com/#{site.account.slug}/sites/#{site.id}/triggers?overlay=triggerForm&triggerId=#{alert.trigger.id}"
  }
  ```
</CodeGroup>

| Veld                     | Type     | Beschrijving                                                                                                                       |
| ------------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `alert_id`               | `String` | Interne AppSignal-alert-id voor de alert.                                                                                          |
| `state`                  | `String` | [Status](/anomaly-detection/#alert-states) van de alert.                                                                           |
| `site`                   | `String` | De applicatienaam waartoe de alert behoort.                                                                                        |
| `environment`            | `String` | De naam van de applicatieomgeving waartoe de alert behoort.                                                                        |
| `tags`                   | `Array`  | Namespace die aan de alert is gekoppeld.                                                                                           |
| `human_tags`             | `Array`  | Aangepaste namespace die aan de alert is gekoppeld.                                                                                |
| `metric_name`            | `String` | Naam van de metric waarvoor de alert is aangemaakt.                                                                                |
| `field`                  | `String` | Veldnaam van de alert.                                                                                                             |
| `trigger_label`          | `String` | Naam van de trigger.                                                                                                               |
| `trigger_description`    | `String` | Beschrijving van de trigger.                                                                                                       |
| `last_value`             | `String` | Laatste waarde die voor de alert is geregistreerd.                                                                                 |
| `peak_value`             | `String` | Hoogste waarde die voor de alert is geregistreerd.                                                                                 |
| `mean_value`             | `String` | Gemiddelde van alle waarden voor de alert.                                                                                         |
| `comparison_operator`    | `String` | Vergelijkingsoperator ingesteld door de gebruiker, waarop de alert wordt geactiveerd.                                              |
| `comparison_value`       | `String` | Vergelijkingswaarde van de metric ingesteld door de gebruiker, waarop de alert wordt geactiveerd.                                  |
| `human_last_value`       | `String` | Laatste metric-waarde die voor de alert is geregistreerd sinds deze geopend werd, in een leesbaarder formaat.                      |
| `human_peak_value`       | `String` | Hoogste metric-waarde die voor de alert werd geregistreerd terwijl deze open was.                                                  |
| `human_mean_value`       | `String` | Gemiddelde metric-waarde voor de alert terwijl deze open was, in een leesbaarder formaat.                                          |
| `human_comparison_value` | `String` | Vergelijkingswaarde voor de alert-metric, ingesteld door de gebruiker, waarop de alert wordt geactiveerd, in een leesbaar formaat. |
| `created_at`             | `String` | Tijdstempel waarop de alert is aangemaakt.                                                                                         |
| `opened_at`              | `String` | Tijdstempel (ISO8601) waarop de alert is geopend.                                                                                  |
| `resolved_at`            | `String` | Tijdstempel (ISO8601) waarop de alert is opgelost.                                                                                 |
| `closed_at`              | `String` | Tijdstempel (ISO8601) waarop de alert is gesloten.                                                                                 |
| `warmup_duration`        | `String` | Tijd in minuten dat AppSignal wacht voordat een alert wordt geopend.                                                               |
| `cooldown_duration`      | `String` | Tijd in minuten dat AppSignal wacht voordat een alert wordt gesloten.                                                              |
| `alert_url`              | `String` | URL van de alert zodat de gebruiker deze in AppSignal kan bekijken.                                                                |
| `edit_trigger_url`       | `String` | URL van de alert zodat de gebruiker deze in AppSignal kan bewerken.                                                                |

<hr />

### Lijst met integraties

* [Asana](/application/integrations/asana)
* [Discord](/application/integrations/discord)
* [Geckoboard](/application/integrations/geckoboard)
* [GitLab](/application/integrations/gitlab)
* [Google Hangouts Chat](/application/integrations/hangouts)
* [Jira](/application/integrations/jira)
* [Linear](/application/integrations/linear)
* [Microsoft Teams](/application/integrations/teams)
* [OpsGenie](/application/integrations/opsgenie)
* [PagerDuty](/application/integrations/pagerduty)
* [Shortcut](/application/integrations/shortcut)
* [Slack](/application/integrations/slack)
* [Squadcast](/application/integrations/squadcast)
* [Trello](/application/integrations/trello)
* [Webhooks](/application/integrations/webhooks)
