# Alchemy Notify

Alchemy Notify works by using webhooks, a way for you to subscribe to events that occur on your application. This page will walk through what webhooks are and how you can use them in order to integrate Alchemy Notify with your application.

## What are Webhooks? <a href="#what-are-webhooks" id="what-are-webhooks"></a>

Webhooks are a way for users to receive notifications when an event occurs on your application. Rather than continuously polling the server to check if the state has changed, webhooks provide information to you as it becomes available, which is a lot more efficient and beneficial for developers. Webhooks work by registering a URL to send notifications to once certain events occur.

Webhooks are typically used to connect two different applications. One application is the "sender," which subscribes to events and sends them off to the the second "receiver" application, which takes actions based upon that received data. When an event occurs on the sender application it sends that data to the webhook URL of the receiver application. The receiver application can then send a callback message, with an HTTP status code to let the sender know the data was received successfully or not.&#x20;

You can think of webhook notifications just like SMS notifications. The entity sending the message has your registered phone number and they send a specific message payload to that phone number. You then have the ability to respond confirming you have received it, creating a two-way communication stream.

## Types of Notifications <a href="#types-of-wehooks" id="types-of-wehooks"></a>

Alchemy offers four different types of webhooks each described below.

### 1. Mined Transactions <a href="#mined-transactions" id="mined-transactions"></a>

The Mined Transaction Webhook is used to notify you anytime a transaction that was sent through your application gets successfully mined. This is extremely useful if you want to notify customers the moment their transactions goes through.

### **2.** Dropped Transactions <a href="#dropped-transactions" id="dropped-transactions"></a>

The Dropped Transactions Webhook is used to notify you anytime a transaction that was sent through your application gets dropped.

## Creating Webhooks

Setting up a webhook is as simple as adding a new URL to your application.&#x20;

Navigate to the Notify tab in your [Alchemy Dashboard](https://cro-dashboard.alchemyapi.io/notify)

1. Click the "Create Webhook" button in the top right
2. Add the URL that you wish to receive webhook payloads at
3. Specify which network you want notifications for
4. Specify which applications and which webhook type you want notifications for
5. Click "Create webhook"
6. Check your endpoint to see responses rolling through!

## Webhook Response Payload

### Mined Transactions

```http
{
  "webhookId": "wh_wl0zpn9og58pjk0ld",
  "id": "whevt_9545dsnoiypdahsk",
  "type": "MINED_TRANSACTION",
  "createdAt": "2021-04-15T05:01:25.946Z",
  "event": {
    "appId": "ap_fzodwl6rgbj8m",
    "transaction": {
      "tx": "Cp4BCooBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEmoKK3Rjcm8xODRsdGEybHN5dTQ3dnd5cDJlOHptdGNhM2s1eXE4NXA2YzR2cDMSK3Rjcm8xNjV0emNyaDJ5bDgzZzhxZXF4dWVnMmc1Z3pndTU3eTNmZTNrYzMaDgoIYmFzZXRjcm8SAjEwEg9IZWxsbyBUZXN0IE1lbW8SawpRCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohA8PSgaKFkq3Ogb7jCU8A6uJpMsvGgvuiObkPR9rJ/nA2EgQKAggBGKcBEhYKEAoIYmFzZXRjcm8SBDcwMDEQwIsRGkBHlfQCVJZLfXQ9p71sunqxiZMv2lLqBw9slVRR6tf/CiVXxsaRh2MNO92VKaRmD/C0qvgDWssm5LzEb1VArd62",
      "tx_result": {
        "code": 0,
        "codespace": "",
        "data": "CgYKBHNlbmQ=",
        "log": "[{\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"send\"},{\"key\":\"sender\",\"value\":\"tcro184lta2lsyu47vwyp2e8zmtca3k5yq85p6c4vp3\"},{\"key\":\"module\",\"value\":\"bank\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"tcro165tzcrh2yl83g8qeqxueg2g5gzgu57y3fe3kc3\"},{\"key\":\"sender\",\"value\":\"tcro184lta2lsyu47vwyp2e8zmtca3k5yq85p6c4vp3\"},{\"key\":\"amount\",\"value\":\"10basetcro\"}]}]}]",
        "gas_used": "62795",
        "gas_wanted": "280000",
        "events": [
          {
            "attributes": [
              {
                "index": true,
                "value": "dGNybzE3eHBmdmFrbTJhbWc5NjJ5bHM2Zjg0ejNrZWxsOGM1bHhoemFoYQ==",
                "key": "cmVjaXBpZW50"
              },
              {
                "index": true,
                "value": "dGNybzE4NGx0YTJsc3l1NDd2d3lwMmU4em10Y2EzazV5cTg1cDZjNHZwMw==",
                "key": "c2VuZGVy"
              },
              {
                "index": true,
                "value": "NzAwMWJhc2V0Y3Jv",
                "key": "YW1vdW50"
              }
            ],
            "type": "transfer"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "dGNybzE4NGx0YTJsc3l1NDd2d3lwMmU4em10Y2EzazV5cTg1cDZjNHZwMw==",
                "key": "c2VuZGVy"
              }
            ],
            "type": "message"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "c2VuZA==",
                "key": "YWN0aW9u"
              }
            ],
            "type": "message"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "dGNybzE2NXR6Y3JoMnlsODNnOHFlcXh1ZWcyZzVnemd1NTd5M2ZlM2tjMw==",
                "key": "cmVjaXBpZW50"
              },
              {
                "index": true,
                "value": "dGNybzE4NGx0YTJsc3l1NDd2d3lwMmU4em10Y2EzazV5cTg1cDZjNHZwMw==",
                "key": "c2VuZGVy"
              },
              {
                "index": true,
                "value": "MTBiYXNldGNybw==",
                "key": "YW1vdW50"
              }
            ],
            "type": "transfer"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "dGNybzE4NGx0YTJsc3l1NDd2d3lwMmU4em10Y2EzazV5cTg1cDZjNHZwMw==",
                "key": "c2VuZGVy"
              }
            ],
            "type": "message"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "YmFuaw==",
                "key": "bW9kdWxl"
              }
            ],
            "type": "message"
          }
        ],
        "info": ""
      },
      "index": 1,
      "hash": "6D631C91A3EC1389957847C3FAF2AA3D54DBA2BDE9E0A5009F553D89534D3965",
      "height": "1551476"
    }
  }
}
```

### Dropped Transactions

```http
{
  "webhookId": "wh_wl0zpn9og58pjk0ld",
  "id": "whevt_9545dsnoiypdahsk",
  "type": "DROPPED_TRANSACTION",
  "createdAt": "2021-04-15T05:01:25.946Z",
  "event": {
    "appId": "ap_fzodwl6rgbj8m",
    "transaction": {
      "tx": "Cp4BCooBChwvY29zbW9zLmJhbmsudjFiZXRhMS5Nc2dTZW5kEmoKK3Rjcm8xODRsdGEybHN5dTQ3dnd5cDJlOHptdGNhM2s1eXE4NXA2YzR2cDMSK3Rjcm8xNjV0emNyaDJ5bDgzZzhxZXF4dWVnMmc1Z3pndTU3eTNmZTNrYzMaDgoIYmFzZXRjcm8SAjEwEg9IZWxsbyBUZXN0IE1lbW8SawpRCkYKHy9jb3Ntb3MuY3J5cHRvLnNlY3AyNTZrMS5QdWJLZXkSIwohA8PSgaKFkq3Ogb7jCU8A6uJpMsvGgvuiObkPR9rJ/nA2EgQKAggBGKcBEhYKEAoIYmFzZXRjcm8SBDcwMDEQwIsRGkBHlfQCVJZLfXQ9p71sunqxiZMv2lLqBw9slVRR6tf/CiVXxsaRh2MNO92VKaRmD/C0qvgDWssm5LzEb1VArd62",
      "tx_result": {
        "code": 0,
        "codespace": "",
        "data": "CgYKBHNlbmQ=",
        "log": "[{\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"send\"},{\"key\":\"sender\",\"value\":\"tcro184lta2lsyu47vwyp2e8zmtca3k5yq85p6c4vp3\"},{\"key\":\"module\",\"value\":\"bank\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"tcro165tzcrh2yl83g8qeqxueg2g5gzgu57y3fe3kc3\"},{\"key\":\"sender\",\"value\":\"tcro184lta2lsyu47vwyp2e8zmtca3k5yq85p6c4vp3\"},{\"key\":\"amount\",\"value\":\"10basetcro\"}]}]}]",
        "gas_used": "62795",
        "gas_wanted": "280000",
        "events": [
          {
            "attributes": [
              {
                "index": true,
                "value": "dGNybzE3eHBmdmFrbTJhbWc5NjJ5bHM2Zjg0ejNrZWxsOGM1bHhoemFoYQ==",
                "key": "cmVjaXBpZW50"
              },
              {
                "index": true,
                "value": "dGNybzE4NGx0YTJsc3l1NDd2d3lwMmU4em10Y2EzazV5cTg1cDZjNHZwMw==",
                "key": "c2VuZGVy"
              },
              {
                "index": true,
                "value": "NzAwMWJhc2V0Y3Jv",
                "key": "YW1vdW50"
              }
            ],
            "type": "transfer"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "dGNybzE4NGx0YTJsc3l1NDd2d3lwMmU4em10Y2EzazV5cTg1cDZjNHZwMw==",
                "key": "c2VuZGVy"
              }
            ],
            "type": "message"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "c2VuZA==",
                "key": "YWN0aW9u"
              }
            ],
            "type": "message"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "dGNybzE2NXR6Y3JoMnlsODNnOHFlcXh1ZWcyZzVnemd1NTd5M2ZlM2tjMw==",
                "key": "cmVjaXBpZW50"
              },
              {
                "index": true,
                "value": "dGNybzE4NGx0YTJsc3l1NDd2d3lwMmU4em10Y2EzazV5cTg1cDZjNHZwMw==",
                "key": "c2VuZGVy"
              },
              {
                "index": true,
                "value": "MTBiYXNldGNybw==",
                "key": "YW1vdW50"
              }
            ],
            "type": "transfer"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "dGNybzE4NGx0YTJsc3l1NDd2d3lwMmU4em10Y2EzazV5cTg1cDZjNHZwMw==",
                "key": "c2VuZGVy"
              }
            ],
            "type": "message"
          },
          {
            "attributes": [
              {
                "index": true,
                "value": "YmFuaw==",
                "key": "bW9kdWxl"
              }
            ],
            "type": "message"
          }
        ],
        "info": ""
      },
      "index": 1,
      "hash": "6D631C91A3EC1389957847C3FAF2AA3D54DBA2BDE9E0A5009F553D89534D3965",
      "height": "1551476"
    }
  }
}
```

## Webhook Signature and Security&#x20;

If you want to make your webhooks extra secure, you can verify that they originated from Alchemy by generating a HMAC SHA-256 hash code using your Authentication Token and request body.&#x20;

#### 1. Find your Authentication Token

Navigate to the top right corner of your [Notify page](https://dashboard.alchemyapi.io/notify) to copy your "Auth Token".

![](/files/-MYhJU0y_88cb04D-6F2)

#### 2. Validate the signature received&#x20;

Every outbound request will contain a hashed authentication signature in the header which is computed by concatenating your auth token and request body then generating a hash using the HMAC SHA256 hash algorithm.&#x20;

In order to verify this signature came from Alchemy, you simply have to generate the HMAC SHA256 hash and compare it with the signature received.

#### Example Request Header

```http
POST /yourWebhookServer/push HTTP/1.1
Content-Type: application/json;
X-Alchemy-Signature: your-hashed-signature
```

#### Example Signature Validation Function&#x20;

{% tabs %}
{% tab title="JavaScript" %}

```javascript
function isValidSignature(request) {    
    const token = 'Auth token provided by Alchemy on the Webhook setup page';
    const headers = request.headers;
    const signature = headers['x-alchemy-signature']; // Lowercase for NodeJS
    const body = request.body;    
    const hmac = crypto.createHmac('sha256', token) // Create a HMAC SHA256 hash using the auth token
    hmac.update(body, 'utf8') // Update the token hash with the request body using utf8
    const digest = hmac.digest('hex');     
    return (signature === digest); // If signature equals your computed hash, return true
}
```

{% endtab %}

{% tab title="Python" %}

```python
import hmac
import hashlib
import json
def isValidSignature(request):
    token = '<your token goes here>';
    headers = request['headers'];
    signature = headers['x-alchemy-signature']; 
    body = request['body'];
    string_body = json.dumps(body, separators=(',', ':'))
    
    digest = hmac.new(
		    bytes(token, 'utf-8'),
		    msg=bytes(string_body, 'utf-8'), 
		    digestmod=hashlib.sha256
    ).hexdigest()
    
return (signature == digest);
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cro-docs.alchemy.com/guides/alchemy-notify.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
