# Slack Outbound Webhooks

The steps below describe how to create an outgoing webhook in Apono that will allow to automatically send messages in Slack from Apono access requests.

***

### Prerequisites

1. Create a [Slack app](https://api.slack.com/messaging/webhooks) or use an existing one
2. Enable incoming webhooks From your Slack [app's management dashboard](https://api.slack.com/apps). Select **Incoming Webhooks**, and toggle **Activate Incoming Webhooks** to on.
3. Create an incoming webhook - Now that incoming webhooks are enabled, the settings page should refresh and a button called *Add New Webhook to Workspace* will appear.
   1. Pick a channel that the app will post to, then select Authorize. If you need to add the incoming webhook to a private channel, you must be a member of that channel.
   2. You'll be sent back to your app settings, where you should see a new entry under the Webhook URLs for Your Workspace section. Your webhook URL will look something like this: `https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX`

***

### Create a webhook

Follow these steps to configure a webhook:

1. On the [**Webhooks**](https://app.apono.io/webhooks) page, click **Add Webhook**. The **Add Webhook** page appears.
2. Click **Request Webhook**.
3. Enter a unique, alphanumeric, user-friendly **Request Webhook Name** for identifying this webhook.
4. Click the **Status** toggle to **Active**.
5. From the **Method** dropdown menu, select **POST**.
6. In the **URL** field, enter *https//:hooks.slack.com/services/\<T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX>*.\
   \
   Be sure to replace `<T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX>` with the incoming webhook URL values.

{% hint style="warning" %}
The webhook URL **must adhere** to the following requirements:

* Uses the HTTPS protocol
* Does **not** specify any custom ports
  {% endhint %}

7. In the **Body Template** field, construct a JSON body for the webhook payload.

{% code overflow="wrap" %}

```json
{
"text": "New {{ event_type }} from {{ data.requester.name }}",
   "blocks": [
      {
         "type": "header",
         "text": {
            "type": "plain_text",
            "text": "New {{ event_type }} ",
            "emoji": true
         }
      },
      {
         "type": "section",
         "fields": [
            {
               "type": "mrkdwn",
               "text": "*Type:*\nPaid Time Off"
            },
            {
               "type": "mrkdwn",
               "text": "*Created by:*\n<{{ data.requester.email }}|{{ event_type }}>"
            }
         ]
      },
      {
         "type": "section",
         "fields": [
            {
               "type": "mrkdwn",
               "text": "*When:*\n{{ event_time }}"
            }
         ]
      }
   ]
}  
```

{% endcode %}

{% hint style="success" %}
Click **View event's payload schema** to reveal the payload schema and available data fields. You can also refer to the [Webhook Payload Schema Reference](https://docs.apono.io/docs/webhook-integrations/webhook-payload-references/webhook-payload-schema-reference) to read the descriptions of each data field.
{% endhint %}

8. From the **Triggers** dropdown menu, select one or more of the following event triggers, which correspond to Apono access request statuses:
   * **RequestCreated**
   * **RequestApproved**
   * **RequestExpired**
   * **RequestFailed**
   * **RequestGranted**
   * **RequestRejected**
9. Under **Filters**, define one or several filter from the listed dropdown menus.

{% hint style="info" %}
Filters empower admins to control the data transmitted via webhooks, minimizing the amount of data third-party tools receive and reducing unnecessary clutter.

**Examples**:

* Send only production requests to your admins' Slack channel.
* Trigger Okta workflows for events from specific integrations or resource types.
* Open a ticket in Jira or ServiceNow for manually approved requests.
  {% endhint %}

10. (Optional) In the **Timeout in seconds** field, enter the duration in seconds to wait before marking the request as failed.
11. (Optional) Define **Response Validators** to verify that the response from the webhook meets specified criteria:
    1. Click **+ Add**. A row of settings appears.
    2. Starting with *$.data.*, enter the **Json Path** of the JSON parameter.
    3. In the **Expected Values** field, enter a value and press the Enter key on your keyboard.
    4. Repeat step **c** to add several expected values.
    5. Repeat steps **a-d** to add multiple response validators.
12. Click **Test** to generate a test event to trigger your webhook. A **Test successful** or **Test failed** response status will appear at the bottom of the page. A successful test will send mock data to the target system.

{% hint style="success" %}
For more information about the test, click **View Invocation Data**. A panel opens revealing the request, response, and other relevant details.

Should your test fail, view these tips to [troubleshoot your webhook](https://docs.apono.io/docs/webhook-integrations/troubleshoot-a-webhook).
{% endhint %}

13. Click **Save Webhook**.

The new webhook appears in the **Webhooks** table. Active webhooks are preceded by a green dot. Inactive webhooks are preceded by a white dot.

Apono access request logs will be sent to Slack based on the triggers you have selected.

***

## Results

Your webhook should now start sending messages in the webhook Slack channel once triggered:

![](https://files.readme.io/1b0ac4a-image.png)

![](https://files.readme.io/48dc22a-image.png)
