# 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;

![](https://4180636600-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MA_jTOmurfKZHfZ6_jK%2F-MBDtMmyy55N6Wn7YUIp%2F-MBG_Z1gULSH8YW3IBEZ%2FScreenshot%202020-07-02%20at%2023.07.44.png?alt=media\&token=506c7640-d7fd-4c59-af38-1ed56433778f)

### 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 %}
