# Webhooks

## Authentication

#### How to make sure the webhook request is originated from Align:

* Make sure `x-hmac-signature` is present in the header
* Generate the keyed hash of the payload using HMAC-SHA256 function and the API auth key
* Hex encode the hash
* Compare the hex encoded hash with the `x-hmac-signature` header sent by Align

## Events

We publish webhooks events for Customer, Onramp Transfer, Offramp Transfer, Cross Chain Transfer related activities. Here is event Payload structure:

```typescript
type WebhookEventPayload = {
    event_type: 
        'customer.kycs.updated' |
        'onramp_transfer.status.updated' |
        'cross_chain_transfer.status.updated' |
        'offramp_transfer.status.updated' |
        'virtual_account.created';
    entity_id: string;
    entity_type: 
        'customer' |
        'onramp_transfer' |
        'cross_chain_transfer' |
        'offramp_transfer' |
        'virtual_account';
    created_at: string;
}
```

## Onramp Transfer Event

In the event of a Onramp Transfer initiated via a **virtual account deposit**, the webhook event structure can include additional details about the virtual account. This is provided within the `event_payload` field under the `virtual_account` object.&#x20;

Event structure:

```typescript
type OnrampTransferWebhookEventPayload = {
    event_type: 'onramp_transfer.status.updated';
    entity_id: string;
    entity_type: 'onramp_transfer';
    event_payload?: {
        virtual_account?: {
            id: string
        }
    }
    created_at: string;
}
```

## Cross Chain Transfer Event

In the event of a Cross Chain Transfer initiated via a permanent route address deposit, the webhook event structure can include additional details about the permanent route address. This is provided within the `event_payload` field under the `permanent_route_address` object.&#x20;

Event structure:

```typescript
type CrossChainTransferWebhookEventPayload = {
    event_type: 'cross_chain_transfer.status.updated';
    entity_id: string;
    entity_type: 'cross_chain_transfer';
    event_payload?: {
        permanent_route_address?: {
            id: string
        }
    }
    created_at: string;
}
```

## Virtual Account Event

Event structure for Virtual Account Transfer:

```typescript
type VirtualAccountWebhookEventPayload = {
    event_type: 'virtual_account.created';
    entity_id: string;
    entity_type: 'virtual_account';
    created_at: string;
}
```
