Webhook Events
Here, we present the current events that you may receive through your registered Webhook, as described in the previous section. These events include the following:
| Events | Description |
|---|---|
| TICKET | A ticket event refers to any updates related to a created ticket (money) within your Account. Naturally, it may also involve a subAccount. This event can have multiple statuses, such as TICKET-CREATED, DEPOSIT-PROCESSING, among others. |
| KYC | A KYC event refers to any updates related to a KYC attempt. This event can have multiple statuses, such as KYC-STARTED, KYC-PROCESSING, KYC-EXPIRED, and KYC-COMPLETED. |
| LIMIT-UPDATE | An event that notifies you when there are changes to your account's operational limits. This is typically triggered after a successful KYC verification or when an administrator modifies your account limits. |
| WALLET-QUALIFICATION | An event that notifies you when you receive a deposit from a deposit sender wallet that still needs to be qualified. |
| KYT-STATE | An event that notifies you when one of your users (or a user/counterparty pair) is held, placed under review, rejected or released by our compliance team. Its single status is KYT-STATE-CHANGED. |
Ticket
The Ticket Event always reflects an update related to any updates related to a created ticket within your account. In other words, for each type of transaction (as defined inside the quote field of a ticket), a ticket is generated.
Each ticket has a specific type, which determines the nature of the transaction, and during the lifecycle of that ticket, you’ll receive multiple status updates reflecting its current state.
These updates will be sent to your registered Webhook as the ticket progresses through its execution steps.
About the TICKET-ON-HOLD state (dotted path): This is an optional state entered when our risk engine flags a ticket for compliance review during deposit processing, before the deposit is settled. The ticket pauses while our compliance team reviews it. Approved tickets move to DEPOSIT-SUCCESS and proceed to DELIVERY-PROCESSING normally. Rejected tickets move to DEPOSIT-FAILED when the deposit can be refunded to the sender or the input is an Avenia balance (INTERNAL); otherwise the ticket ends in PARTIAL-FAILED and the full input amount is credited to your Avenia Wallet in the input currency. If the review window elapses without action, the ticket is auto-approved and proceeds to DEPOSIT-SUCCESS. When a ticket enters this state a TICKET-ON-HOLD webhook is dispatched.
Deposit check failures: Before crediting a BRL/PIX deposit, Avenia runs compliance and limit checks. A failed check follows the same failure path as any other rejected deposit: the ticket becomes FAILED, a DEPOSIT-FAILED webhook is sent, and the full input amount is returned asynchronously to the originating account.
The failureReason field may contain user does not have enough limit, third party deposit is not allowed for this user, or deposit could not be verified, funds returned. Compliance rejections include a reason in failureReason. The reason field may first report Refund in progress. and later include the refund E2E ID. Treat the refund as pending until the ticket reaches its final state or the TICKET-COMPLETE webhook is received.
Ticket Event's Status
| Status Name | Description |
|---|---|
| TICKET-CREATED | The ticket has been successfully created—this occurs when the transaction hits the endpoint. |
| DEPOSIT-PROCESSING | The deposit phase has started and is currently being processed. |
| TICKET-ON-HOLD | The ticket has been paused for compliance review during deposit processing, before the deposit is settled. |
| DEPOSIT-SUCCESS | The deposit was completed successfully. |
| DEPOSIT-FAILED | The deposit attempt has failed. For a failed deposit gate, no output asset is credited and the full input amount is returned asynchronously. |
| DELIVERY-PROCESSING | The delivery phase (e.g., transfer of tokens or funds) is now in progress. |
| DELIVERY-SUCCESS | The delivery was completed successfully. |
| DELIVERY-FAILED | The delivery attempt has failed. |
| TICKET-COMPLETE | The entire ticket lifecycle has been completed, regardless of the outcome. |
If a deposit is made to the Main Account without a previously created Ticket, a Ticket Event will still be triggered, starting with the status TICKET-CREATED
Any type of error will also return a REASON field, providing details about why the specific step could not be completed.
An additional note for when the Ticket represents a Pay Out—either via PIX or BrCode
When the Ticket represents a Pay Out via PIX or BrCode, the delivery status may fail. In such cases, a new status will be generated, followed by a refund of the original input amount.
Ticket Event's Status Pay Out Failure
| Status Name | Description |
|---|---|
| DELIVERY-PROCESSING | The delivery phase (e.g., transfer of tokens or funds) is now in progress. |
| DELIVERY-PARTIAL-FAILED | Failure to complete Pay Out delivery |
Understanding the Data Returned in a Webhook
Ticket Events follow a standardized structure, where:
{
"event": {
"id": "6df2ae75-670f-4619-a6b1-8a5018af56b0",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "TICKET",
"data": {
"ticket": {},
"type": "TICKET-CREATED"
}
"createdAt": "2025-09-16T12:32:12.338058Z"
}
Detailed ticket events
TICKET-CREATED
{
"event": {
"id": "6df2ae75-670f-4619-a6b1-8a5018af56b0",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "TICKET",
"data": {
"ticket": {
"id": "c4bd34dd-cbb2-4cda-b158-f104dd67d0c8",
"externalId": "",
"workspaceId": "33333333-3333-3333-3333-333333333333",
"userId": "44444444-4444-4444-4444-444444444444",
"status": "UNPAID",
"reason": "",
"failureReason": "",
"createdAt": "2025-09-16T12:32:12.208933037Z",
"updatedAt": "2025-09-16T12:32:12.208933037Z",
"expiresAt": "2025-09-17T12:32:12.208933037Z",
"quote": {
"inputCurrency": "BRL",
"inputPaymentMethod": "PIX",
"inputAmount": "10.2",
"outputCurrency": "BRLA",
"outputPaymentMethod": "INTERNAL",
"outputAmount": "10",
"markupCurrency": "",
"markupAmount": "0",
"sendMethod": "PERMIT",
"inputThirdParty": false,
"outputThirdParty": false,
"basePrice": "1",
"appliedFees": [
{
"type": "Markup Fee",
"description": "Total markup fees represented in the input currency.",
"amount": "0",
"currency": "BRL",
"rebatable": false
},
{
"type": "In Fee",
"description": "Fees due to input currency and input payment method.",
"amount": "0.2",
"currency": "BRL",
"rebatable": true
},
{
"type": "Conversion Fee",
"description": "Fees due to conversion from input currency to output currency.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Out Fee",
"description": "Fees due to output currency and output payment method.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Gas Fee",
"description": "Fees due to blockchain transaction costs.",
"amount": "0",
"currency": "BRL",
"rebatable": false
}
],
"pairName": "BRLBRLA",
"outputBrCode": "",
"createdAt": "2025-09-16T12:32:11Z"
},
"brazilianFiatSenderInfo": {
"referenceLabel": "uOUAP45Mg7PrhVg50DURHjX6f",
"additionalData": "BRLA Ticket Payment",
"name": "",
"taxId": "",
"bankCode": "",
"branchCode": "",
"accountNumber": "",
"accountType": "",
"endToEndId": ""
},
"blockchainReceiverInfo": {
"walletAddress": "0x0000000000000000000000000000000000000003",
"walletChain": "INTERNAL",
"walletMemo": "",
"txHash": ""
}
},
"type": "TICKET-CREATED"
},
"createdAt": "2025-09-16T12:32:12.338058Z",
"EventType": ""
}
}
DEPOSIT-PROCESSING
{
"event": {
"id": "7b1cc0ab-5e35-4cb0-a5be-720aba6f9146",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "TICKET",
"data": {
"ticket": {
"id": "c4bd34dd-cbb2-4cda-b158-f104dd67d0c8",
"externalId": "",
"workspaceId": "33333333-3333-3333-3333-333333333333",
"userId": "44444444-4444-4444-4444-444444444444",
"status": "PROCESSING",
"reason": "",
"failureReason": "",
"createdAt": "2025-09-16T12:32:12.219815Z",
"updatedAt": "2025-09-16T12:32:12.219815Z",
"expiresAt": "2025-09-17T12:32:12.208933Z",
"quote": {
"inputCurrency": "BRL",
"inputPaymentMethod": "PIX",
"inputAmount": "10.2",
"outputCurrency": "BRLA",
"outputPaymentMethod": "INTERNAL",
"outputAmount": "10",
"markupCurrency": "",
"markupAmount": "0",
"sendMethod": "PERMIT",
"inputThirdParty": false,
"outputThirdParty": false,
"basePrice": "1",
"appliedFees": [
{
"type": "Markup Fee",
"description": "Total markup fees represented in the input currency.",
"amount": "0",
"currency": "BRL",
"rebatable": false
},
{
"type": "In Fee",
"description": "Fees due to input currency and input payment method.",
"amount": "0.2",
"currency": "BRL",
"rebatable": true
},
{
"type": "Conversion Fee",
"description": "Fees due to conversion from input currency to output currency.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Out Fee",
"description": "Fees due to output currency and output payment method.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Gas Fee",
"description": "Fees due to blockchain transaction costs.",
"amount": "0",
"currency": "BRL",
"rebatable": false
}
],
"pairName": "BRLBRLA",
"outputBrCode": "",
"createdAt": "2025-09-16T12:32:11Z"
},
"brazilianFiatSenderInfo": {
"referenceLabel": "uOUAP45Mg7PrhVg50DURHjX6f",
"additionalData": "BRLA Ticket Payment",
"name": "",
"taxId": "",
"bankCode": "",
"branchCode": "",
"accountNumber": "",
"accountType": "",
"endToEndId": ""
},
"blockchainReceiverInfo": {
"walletAddress": "0x0000000000000000000000000000000000000003",
"walletChain": "INTERNAL",
"walletMemo": "",
"txHash": ""
}
},
"type": "DEPOSIT-PROCESSING"
},
"createdAt": "2025-09-16T12:32:26.669037Z",
"EventType": ""
}
}
DELIVERY-PROCESSING
{
"event": {
"id": "98db8c1b-b2f6-4ee1-92d9-cd7821ce29f8",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "TICKET",
"data": {
"ticket": {
"id": "c4bd34dd-cbb2-4cda-b158-f104dd67d0c8",
"externalId": "",
"workspaceId": "33333333-3333-3333-3333-333333333333",
"userId": "44444444-4444-4444-4444-444444444444",
"status": "PROCESSING",
"reason": "",
"failureReason": "",
"createdAt": "2025-09-16T12:32:12.219815Z",
"updatedAt": "2025-09-16T12:32:12.219815Z",
"expiresAt": "2025-09-17T12:32:12.208933Z",
"quote": {
"inputCurrency": "BRL",
"inputPaymentMethod": "PIX",
"inputAmount": "10.2",
"outputCurrency": "BRLA",
"outputPaymentMethod": "INTERNAL",
"outputAmount": "10",
"markupCurrency": "",
"markupAmount": "0",
"sendMethod": "PERMIT",
"inputThirdParty": false,
"outputThirdParty": false,
"basePrice": "1",
"appliedFees": [
{
"type": "Markup Fee",
"description": "Total markup fees represented in the input currency.",
"amount": "0",
"currency": "BRL",
"rebatable": false
},
{
"type": "In Fee",
"description": "Fees due to input currency and input payment method.",
"amount": "0.2",
"currency": "BRL",
"rebatable": true
},
{
"type": "Conversion Fee",
"description": "Fees due to conversion from input currency to output currency.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Out Fee",
"description": "Fees due to output currency and output payment method.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Gas Fee",
"description": "Fees due to blockchain transaction costs.",
"amount": "0",
"currency": "BRL",
"rebatable": false
}
],
"pairName": "BRLBRLA",
"outputBrCode": "",
"createdAt": "2025-09-16T12:32:11Z"
},
"brazilianFiatSenderInfo": {
"referenceLabel": "uOUAP45Mg7PrhVg50DURHjX6f",
"additionalData": "BRLA Ticket Payment",
"name": "Example Company Ltda",
"taxId": "00000000000100",
"bankCode": "00000000",
"branchCode": "0001",
"accountNumber": "0000000000000000",
"accountType": "payment",
"endToEndId": "e00000000202509161232XXXXXXXXXXX"
},
"blockchainReceiverInfo": {
"walletAddress": "0x0000000000000000000000000000000000000003",
"walletChain": "INTERNAL",
"walletMemo": "",
"txHash": ""
}
},
"type": "DELIVERY-PROCESSING"
},
"createdAt": "2025-09-16T12:32:26.829798Z",
"EventType": ""
}
}
DEPOSIT-SUCCESS
{
"event": {
"id": "b4d05f88-09a0-488c-8360-5c42c11d3a52",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "TICKET",
"data": {
"ticket": {
"id": "c4bd34dd-cbb2-4cda-b158-f104dd67d0c8",
"externalId": "",
"workspaceId": "33333333-3333-3333-3333-333333333333",
"userId": "44444444-4444-4444-4444-444444444444",
"status": "PROCESSING",
"reason": "",
"failureReason": "",
"createdAt": "2025-09-16T12:32:12.219815Z",
"updatedAt": "2025-09-16T12:32:12.219815Z",
"expiresAt": "2025-09-17T12:32:12.208933Z",
"quote": {
"inputCurrency": "BRL",
"inputPaymentMethod": "PIX",
"inputAmount": "10.2",
"outputCurrency": "BRLA",
"outputPaymentMethod": "INTERNAL",
"outputAmount": "10",
"markupCurrency": "",
"markupAmount": "0",
"sendMethod": "PERMIT",
"inputThirdParty": false,
"outputThirdParty": false,
"basePrice": "1",
"appliedFees": [
{
"type": "Markup Fee",
"description": "Total markup fees represented in the input currency.",
"amount": "0",
"currency": "BRL",
"rebatable": false
},
{
"type": "In Fee",
"description": "Fees due to input currency and input payment method.",
"amount": "0.2",
"currency": "BRL",
"rebatable": true
},
{
"type": "Conversion Fee",
"description": "Fees due to conversion from input currency to output currency.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Out Fee",
"description": "Fees due to output currency and output payment method.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Gas Fee",
"description": "Fees due to blockchain transaction costs.",
"amount": "0",
"currency": "BRL",
"rebatable": false
}
],
"pairName": "BRLBRLA",
"outputBrCode": "",
"createdAt": "2025-09-16T12:32:11Z"
},
"brazilianFiatSenderInfo": {
"referenceLabel": "uOUAP45Mg7PrhVg50DURHjX6f",
"additionalData": "BRLA Ticket Payment",
"name": "Example Company Ltda",
"taxId": "00000000000100",
"bankCode": "00000000",
"branchCode": "0001",
"accountNumber": "0000000000000000",
"accountType": "payment",
"endToEndId": "e00000000202509161232XXXXXXXXXXX"
},
"blockchainReceiverInfo": {
"walletAddress": "0x0000000000000000000000000000000000000003",
"walletChain": "INTERNAL",
"walletMemo": "",
"txHash": ""
}
},
"type": "DEPOSIT-SUCCESS"
},
"createdAt": "2025-09-16T12:32:26.857476Z",
"EventType": ""
}
}
TICKET-ON-HOLD
{
"event": {
"id": "a3f1c2d4-7e8b-49a0-bd12-3c4e5f6a7b8c",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "TICKET",
"data": {
"ticket": {
"id": "c4bd34dd-cbb2-4cda-b158-f104dd67d0c8",
"externalId": "",
"workspaceId": "33333333-3333-3333-3333-333333333333",
"userId": "44444444-4444-4444-4444-444444444444",
"status": "ON-HOLD",
"reason": "Asset delivery temporarily held for compliance review.",
"failureReason": "",
"createdAt": "2025-09-16T12:32:12.219815Z",
"updatedAt": "2025-09-16T12:32:27.012345Z",
"expiresAt": "2025-09-17T12:32:12.208933Z",
"quote": {
"inputCurrency": "BRL",
"inputPaymentMethod": "PIX",
"inputAmount": "10.2",
"outputCurrency": "BRLA",
"outputPaymentMethod": "INTERNAL",
"outputAmount": "10",
"markupCurrency": "",
"markupAmount": "0",
"sendMethod": "PERMIT",
"inputThirdParty": false,
"outputThirdParty": false,
"basePrice": "1",
"appliedFees": [
{
"type": "Markup Fee",
"description": "Total markup fees represented in the input currency.",
"amount": "0",
"currency": "BRL",
"rebatable": false
},
{
"type": "In Fee",
"description": "Fees due to input currency and input payment method.",
"amount": "0.2",
"currency": "BRL",
"rebatable": true
},
{
"type": "Conversion Fee",
"description": "Fees due to conversion from input currency to output currency.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Out Fee",
"description": "Fees due to output currency and output payment method.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Gas Fee",
"description": "Fees due to blockchain transaction costs.",
"amount": "0",
"currency": "BRL",
"rebatable": false
}
],
"pairName": "BRLBRLA",
"outputBrCode": "",
"createdAt": "2025-09-16T12:32:11Z"
},
"brazilianFiatSenderInfo": {
"referenceLabel": "uOUAP45Mg7PrhVg50DURHjX6f",
"additionalData": "BRLA Ticket Payment",
"name": "Example Company Ltda",
"taxId": "00000000000100",
"bankCode": "00000000",
"branchCode": "0001",
"accountNumber": "0000000000000000",
"accountType": "payment",
"endToEndId": "e00000000202509161232XXXXXXXXXXX"
},
"blockchainReceiverInfo": {
"walletAddress": "0x0000000000000000000000000000000000000003",
"walletChain": "INTERNAL",
"walletMemo": "",
"txHash": ""
}
},
"type": "TICKET-ON-HOLD"
},
"createdAt": "2025-09-16T12:32:27.012345Z",
"EventType": ""
}
}
DELIVERY-SUCCESS
{
"event": {
"id": "546dce9b-98ea-447b-9136-d1265cb36d81",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "TICKET",
"data": {
"ticket": {
"id": "c4bd34dd-cbb2-4cda-b158-f104dd67d0c8",
"externalId": "",
"workspaceId": "33333333-3333-3333-3333-333333333333",
"userId": "44444444-4444-4444-4444-444444444444",
"status": "PAID",
"reason": "",
"failureReason": "",
"createdAt": "2025-09-16T12:32:12.219815Z",
"updatedAt": "2025-09-16T12:32:12.219815Z",
"expiresAt": "2025-09-17T12:32:12.208933Z",
"quote": {
"inputCurrency": "BRL",
"inputPaymentMethod": "PIX",
"inputAmount": "10.2",
"outputCurrency": "BRLA",
"outputPaymentMethod": "INTERNAL",
"outputAmount": "10",
"markupCurrency": "",
"markupAmount": "0",
"sendMethod": "PERMIT",
"inputThirdParty": false,
"outputThirdParty": false,
"basePrice": "1",
"appliedFees": [
{
"type": "Markup Fee",
"description": "Total markup fees represented in the input currency.",
"amount": "0",
"currency": "BRL",
"rebatable": false
},
{
"type": "In Fee",
"description": "Fees due to input currency and input payment method.",
"amount": "0.2",
"currency": "BRL",
"rebatable": true
},
{
"type": "Conversion Fee",
"description": "Fees due to conversion from input currency to output currency.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Out Fee",
"description": "Fees due to output currency and output payment method.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Gas Fee",
"description": "Fees due to blockchain transaction costs.",
"amount": "0",
"currency": "BRL",
"rebatable": false
}
],
"pairName": "BRLBRLA",
"outputBrCode": "",
"createdAt": "2025-09-16T12:32:11Z"
},
"brazilianFiatSenderInfo": {
"referenceLabel": "uOUAP45Mg7PrhVg50DURHjX6f",
"additionalData": "BRLA Ticket Payment",
"name": "Example Company Ltda",
"taxId": "00000000000100",
"bankCode": "00000000",
"branchCode": "0001",
"accountNumber": "0000000000000000",
"accountType": "payment",
"endToEndId": "e00000000202509161232XXXXXXXXXXX"
},
"blockchainReceiverInfo": {
"walletAddress": "0x0000000000000000000000000000000000000003",
"walletChain": "INTERNAL",
"walletMemo": "",
"txHash": "0x0000000000000000000000000000000000000000000000000000000000000007"
}
},
"type": "DELIVERY-SUCCESS"
},
"createdAt": "2025-09-16T12:32:35.762643Z",
"EventType": ""
}
}
TICKET-COMPLETE
{
"event": {
"id": "ee9a907f-3fdc-4521-9d61-28f6c6a859b5",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "TICKET",
"data": {
"ticket": {
"id": "c4bd34dd-cbb2-4cda-b158-f104dd67d0c8",
"externalId": "",
"workspaceId": "33333333-3333-3333-3333-333333333333",
"userId": "44444444-4444-4444-4444-444444444444",
"status": "PAID",
"reason": "",
"failureReason": "",
"createdAt": "2025-09-16T12:32:12.219815Z",
"updatedAt": "2025-09-16T12:32:12.219815Z",
"expiresAt": "2025-09-17T12:32:12.208933Z",
"quote": {
"inputCurrency": "BRL",
"inputPaymentMethod": "PIX",
"inputAmount": "10.2",
"outputCurrency": "BRLA",
"outputPaymentMethod": "INTERNAL",
"outputAmount": "10",
"markupCurrency": "",
"markupAmount": "0",
"sendMethod": "PERMIT",
"inputThirdParty": false,
"outputThirdParty": false,
"basePrice": "1",
"appliedFees": [
{
"type": "Markup Fee",
"description": "Total markup fees represented in the input currency.",
"amount": "0",
"currency": "BRL",
"rebatable": false
},
{
"type": "In Fee",
"description": "Fees due to input currency and input payment method.",
"amount": "0.2",
"currency": "BRL",
"rebatable": true
},
{
"type": "Conversion Fee",
"description": "Fees due to conversion from input currency to output currency.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Out Fee",
"description": "Fees due to output currency and output payment method.",
"amount": "0",
"currency": "BRL",
"rebatable": true
},
{
"type": "Gas Fee",
"description": "Fees due to blockchain transaction costs.",
"amount": "0",
"currency": "BRL",
"rebatable": false
}
],
"pairName": "BRLBRLA",
"outputBrCode": "",
"createdAt": "2025-09-16T12:32:11Z"
},
"brazilianFiatSenderInfo": {
"referenceLabel": "uOUAP45Mg7PrhVg50DURHjX6f",
"additionalData": "BRLA Ticket Payment",
"name": "Example Company Ltda",
"taxId": "00000000000100",
"bankCode": "00000000",
"branchCode": "0001",
"accountNumber": "0000000000000000",
"accountType": "payment",
"endToEndId": "e00000000202509161232XXXXXXXXXXX"
},
"blockchainReceiverInfo": {
"walletAddress": "0x0000000000000000000000000000000000000003",
"walletChain": "INTERNAL",
"walletMemo": "",
"txHash": "0x0000000000000000000000000000000000000000000000000000000000000007"
}
},
"type": "TICKET-COMPLETE"
},
"createdAt": "2025-09-16T12:32:35.776372Z",
"EventType": ""
}
}
Check the detailed breakdown of the fields that make up a ticket
KYC
The KYC Event reflects updates related to a Know Your Customer verification attempt within your account. These events track the entire lifecycle of a KYC verification process, from submission to completion.
During the KYC verification process, you'll receive multiple status updates reflecting the current state of the verification attempt.
KYC Event Types
| Type Name | Description |
|---|---|
| KYC-STARTED | Indicates that the KYC process has been initiated. |
| KYC-PROCESSING | Indicates that the KYC information is being processed. |
| KYC-COMPLETED | Indicates that the KYC process has been completed. |
| KYC-EXPIRED | Indicates that the KYC process has been expired. |
KYC Status
| Status Name | Description |
|---|---|
| PENDING | The KYC verification is pending and awaiting processing. |
| PROCESSING | The KYC verification is currently being processed. |
| COMPLETED | The KYC verification has been completed (with either APPROVED or REJECTED result). |
| EXPIRED | The KYC verification has expired without being completed. |
KYC Result
| Result Name | Description |
|---|---|
| APPROVED | The KYC verification was successfully approved. |
| REJECTED | The KYC verification was rejected. A resultMessage field will provide details about the reason for rejection. |
Understanding the Data Returned in a KYC Webhook
KYC Events follow a standardized structure, where:
{
"event": {
"id": "unique-event-id",
"accountId": "account-identifier",
"subscription": "KYC",
"data": {
"attempt": {
"id": "kyc-attempt-id",
"userId": "user-identifier",
"levelName": "level-1",
"submissionData": {
// Personal information submitted for verification
},
"status": "COMPLETED",
"result": "APPROVED",
"resultMessage": "",
"rejectionLabels": [],
"retryable": false,
"createdAt": "timestamp",
"updatedAt": "timestamp"
},
"type": "KYC-COMPLETED"
},
"createdAt": "timestamp",
"EventType": ""
}
}
KYC Webhook Fields
| Field | Description |
|---|---|
id | Unique identifier for the webhook event. |
accountId | The identifier of the account associated with this KYC attempt. |
subscription | Always "KYC" for KYC events. |
data.attempt.id | Unique identifier for the specific KYC attempt. |
data.attempt.userId | The identifier of the user making the KYC attempt. |
data.attempt.levelName | The KYC level being attempted (e.g., "level-1"). |
data.attempt.submissionData | Contains all personal information submitted for verification. |
data.attempt.status | Current status of the KYC attempt (PENDING, PROCESSING, COMPLETED, EXPIRED). |
data.attempt.result | Result of the KYC verification (APPROVED or REJECTED) when completed. |
data.attempt.resultMessage | Provides details about rejection reasons if the result is REJECTED. |
data.attempt.rejectionLabels | Array of machine-readable labels categorizing rejection reasons. See Rejection Labels. |
data.attempt.retryable | Boolean indicating if another KYC attempt can be made. |
data.type | The type of KYC event (KYC-STARTED, KYC-PROCESSING, KYC-COMPLETED). |
When a KYC verification is rejected, the resultMessage field will contain information about why the verification failed, such as "birthdate does not match".
The retryable field indicates whether a new KYC attempt can be made. If true, the user can submit another KYC verification with corrected information.
LIMIT-UPDATE
The LIMIT-UPDATE Event notifies you when there are changes to your account's operational limits. These events are triggered whenever your account limits are updated, either due to KYC level changes, administrative actions, or other account-related events.
Understanding the Data Returned in a LIMIT-UPDATE Webhook
LIMIT-UPDATE Events follow a standardized structure, where:
{
"event": {
"id": "unique-event-id",
"accountId": "account-identifier",
"subscription": "LIMIT-UPDATE",
"data": {
"limitInfo": {
"blocked": false,
"createdAt": "timestamp",
"limits": [
{
"currency": "*",
"maxFiatIn": "100000",
"maxFiatOut": "100000",
"maxChainIn": "100000",
"maxChainOut": "100000",
"usedLimit": {
"year": 0,
"month": 0,
"usedFiatIn": "0",
"usedFiatOut": "0",
"usedChainIn": "0",
"usedChainOut": "0"
}
},
{
"currency": "BRL",
"maxFiatIn": "600000",
"maxFiatOut": "600000",
"maxChainIn": "600000",
"maxChainOut": "600000",
"usedLimit": {
"year": 0,
"month": 0,
"usedFiatIn": "0",
"usedFiatOut": "0",
"usedChainIn": "0",
"usedChainOut": "0"
}
}
// Additional currencies...
]
},
"type": "LIMIT-UPDATE"
},
"createdAt": "timestamp",
"EventType": ""
}
}
LIMIT-UPDATE Webhook Fields
| Field | Description |
|---|---|
id | Unique identifier for the webhook event. |
accountId | The identifier of the account whose limits were updated. |
subscription | Always "LIMIT-UPDATE" for limit update events. |
data.limitInfo.blocked | Boolean indicating if the account is blocked from operations. |
data.limitInfo.createdAt | Timestamp when the limit information was generated. |
data.limitInfo.limits | Array of objects containing limit details for different currencies. |
data.type | Always "LIMIT-UPDATE" for this event type. |
Each object in the limits array contains:
| Field | Description |
|---|---|
currency | The currency code. A value of "*" represents the global limit in USD. |
maxFiatIn | The maximum monthly limit for fiat deposits. |
maxFiatOut | The maximum monthly limit for fiat withdrawals. |
maxChainIn | The maximum monthly limit for on-chain deposits. |
maxChainOut | The maximum monthly limit for on-chain withdrawals. |
usedLimit | Object containing details about consumed limits for the current month. |
The LIMIT-UPDATE event is typically triggered after a successful KYC verification or when an administrator modifies your account limits.
WALLET-QUALIFICATION
The WALLET-QUALIFICATION-REQUIRED event notifies you that you received a crypto deposit from a deposit sender wallet that is still PENDING. It's sent for every deposit from that wallet until you qualify it with Qualify Deposit Sender Wallet. Wallets that are already QUALIFIED never trigger it.
Understanding the Data Returned in a WALLET-QUALIFICATION Webhook
{
"event": {
"id": "unique-event-id",
"accountId": "account-identifier",
"subscription": "WALLET-QUALIFICATION",
"data": {
"type": "WALLET-QUALIFICATION-REQUIRED",
"depositSenderWallet": {
"id": "00000000-0000-0000-0000-000000000000",
"userId": "00000000-0000-0000-0000-000000000000",
"walletAddress": "0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"chainFamily": "EVM",
"isSelfCustody": null,
"custodianName": "",
"beneficiaryName": "",
"beneficiaryCountry": "",
"purposeCode": "",
"qualificationStatus": "PENDING",
"acamGroup": null,
"lastDepositAt": "timestamp",
"createdAt": "timestamp"
},
"deposit": {
"ticketId": "00000000-0000-0000-0000-000000000000",
"txHash": "0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"chain": "POLYGON",
"asset": "BRLA",
"amount": "10"
}
},
"createdAt": "timestamp"
}
}
WALLET-QUALIFICATION Webhook Fields
| Field | Description |
|---|---|
id | Unique identifier for the webhook event. A retry of the same deposit keeps the same id, so you can use it to deduplicate. |
accountId | The account that received the deposit. |
subscription | Always "WALLET-QUALIFICATION" for these events. |
data.type | Always "WALLET-QUALIFICATION-REQUIRED". |
data.depositSenderWallet | The sending wallet, in the same format as Get all Deposit Sender Wallets. Use its id to qualify it. |
data.deposit.ticketId | The deposit's ticket. null when the deposit is an internal transfer from another Avenia account. |
data.deposit.txHash | Transaction hash of the deposit. |
data.deposit.chain | The chain the deposit arrived on, such as POLYGON, TRON or INTERNAL. |
data.deposit.asset | Token received. |
data.deposit.amount | Amount received, as a decimal string. |
KYT-STATE
The KYT-STATE Event notifies you when our compliance team changes the transaction status of one of your users. It is sent when a user is temporarily held, placed under review, permanently rejected, or released again. While a user is held, under review or rejected, that user's transactions are paused for compliance review or refunded to the sender; the webhook lets you inform your end user before they try.
For companies, a restriction may apply only to transactions between your user and one specific counterparty. In that case the event carries the counterpartyKey and the restriction does not affect the user's other transactions.
KYT-STATE Status
| Status | Description |
|---|---|
| TEMPORARY_HOLD | Transactions are held until expiresAt. The hold lifts by itself at that time; no release event is sent. |
| UNDER_REVIEW | Transactions are held until our compliance team decides. A release event follows the decision. |
| REJECTED | Transactions are refused permanently. A release event is only sent if compliance reverses the decision. |
| ACTIVE | The restriction was lifted by our compliance team. Transactions are allowed again. |
A state is announced when the user enters it. A TEMPORARY_HOLD is also announced again each time it is extended: you receive a new event with state and previousState both TEMPORARY_HOLD and a later expiresAt. Always keep the latest expiresAt you received.
Understanding the Data Returned in a KYT-STATE Webhook
{
"event": {
"id": "6d1f0b1e-3c2a-4a7e-9f0b-2a1c3d4e5f60",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "KYT-STATE",
"data": {
"type": "KYT-STATE-CHANGED",
"kytState": {
"userId": "44444444-4444-4444-4444-444444444444",
"state": "TEMPORARY_HOLD",
"previousState": "ACTIVE",
"expiresAt": "2026-10-04T12:00:00Z",
"message": "User temporarily held for compliance review until 2026-10-04T12:00:00Z. Transactions will be refused until then. Send an email to compliance@avenia.io and respond to the RFI (request for information).",
"updatedAt": "2026-10-02T12:00:00Z"
}
}
}
}
A release of a counterparty-scoped restriction looks like this:
{
"event": {
"id": "0b7c9e2a-5d41-4f8e-8a3b-9c1d2e3f4a5b",
"accountId": "44444444-4444-4444-4444-444444444444",
"subscription": "KYT-STATE",
"data": {
"type": "KYT-STATE-CHANGED",
"kytState": {
"userId": "44444444-4444-4444-4444-444444444444",
"counterpartyKey": "52998224725",
"state": "ACTIVE",
"previousState": "UNDER_REVIEW",
"message": "Transactions between this user and counterparty 52998224725 were released by compliance and are allowed again.",
"updatedAt": "2026-10-03T09:30:00Z"
}
}
}
}
KYT-STATE Webhook Fields
| Field | Description |
|---|---|
id | Unique identifier for the webhook event. |
accountId | The identifier of the user whose compliance status changed. |
subscription | Always "KYT-STATE" for this event. |
data.type | Always "KYT-STATE-CHANGED". |
data.kytState.userId | The user whose compliance status changed. |
data.kytState.counterpartyKey | Present only when the restriction applies to one counterparty: the counterparty's tax id, PIX key or wallet address, exactly as it appeared in the transaction. Absent when the restriction applies to the user as a whole. |
data.kytState.state | The new status: TEMPORARY_HOLD, UNDER_REVIEW, REJECTED or ACTIVE. |
data.kytState.previousState | The status before this change, in the same vocabulary. |
data.kytState.expiresAt | Present only for TEMPORARY_HOLD: when the hold lifts, in UTC (RFC 3339). |
data.kytState.message | A sentence you can show to your end user. For restrictions it ends with how to contact our compliance team. |
data.kytState.updatedAt | When the change happened, in UTC. |