# About Webhooks

### What are they?

Webhooks are events we send to your pre-set endpoints via HTTP POST requests. They serve as a means of notification for when verification(s) has been completed.

### Which Verifications require webhooks?

At the moment the following verifications require webhooks to be set:

* Address Verification
* Guarantor Verification

### **How do I add my webhook?**

Webhooks can be added from your [VerifyMe account dashboard](https://verifyme.ng/auth/login?to=%2Fapp%2Fdevelopers%2Fsettings)&#x20;

![](/files/-MBG_Z1gULSH8YW3IBEZ)

### Webhook Signature

Webhook signatures are a means for you to verify if a webhook originated from our servers. All webhooks events have the `x-verifyme-signature` HTTP header which is a hash of the body of the request and your secret key.&#x20;

#### Sample Code

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

```javascript
const crypto = require('crypto')

// your api secretkey ( testSecretKey or liveSecretKey)
const secretKey= process.env.SECRET_KEY

const WebhookHandler = (req , res ) =>{
    const signature = crypto.createHmac('sha512', secretKey).update(JSON.stringify(res.body)).digest('hex');
    if(signature === req.headers['x-verifyme-signatue']){
        // Source of the webhook is verified , Add logic here
    }
}
```

{% endtab %}

{% tab title="Go" %}

```go
import (
	"crypto/hmac"
	"crypto/sha512"
	"encoding/hex"
	"io/ioutil"
	"net/http"
	"os"
)

// your api secretkey ( testSecretKey or liveSecretKey)
var secret = os.Getenv("SECRET_KEY")

func WebhookHandler(w http.ResponseWriter, r *http.Request) {
	hash := hmac.New(sha512.New, []byte(secret))
	
	requestBody, _ := ioutil.ReadAll(r.Body)
	hash.Write(requestBody)
	sha := hex.EncodeToString(hash.Sum(nil))
	
	if sha == r.Header.Get("x-verifyme-signature") {
		// Source of the webhook is verified , Add logic here
	}
}
```

{% endtab %}

{% tab title="C#" %}

```csharp
using System;
using System.Security.Cryptography;
using System.Text;
using Newtonsoft.Json.Linq;
namespace HMacExample
{
  class Program {
    static void Main(string[] args) {
      String key = "YOUR_SECRET_KEY"; //replace with your live or test secret key
      String jsonInput = "YOUR_WEBHOOK_PAYLOAD"; //JSON webhook payload gotten from your request handler
      String inputString = Convert.ToString(new JValue(jsonInput));
      String result = "";
      byte[] secretkeyBytes = Encoding.UTF8.GetBytes(key);
      byte[] inputBytes = Encoding.UTF8.GetBytes(inputString);
      using (var hmac = new HMACSHA512(secretkeyBytes))
      {
          byte[] hashValue = hmac.ComputeHash(inputBytes);
          result = BitConverter.ToString(hashValue).Replace("-", string.Empty);;
      }
      Console.WriteLine(result);
      String verifyMeSignature = ""; //put in the request's value for x-verifyme-signature
  
      if(result.ToLower().Equals(verifyMeSignature)) {
          // valid request from our servers
          
          // insert logic here
      } else {
          // if it gets to this block it it didnt come from verifyme servers
      }
    }
  }
}

```

{% 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://docs.verifyme.ng/webhooks/about-webhooks.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.
