---
title: "Grant lifecycle-related events"
description: "Learn which webhooks are sent for each event."
url: "https://docs.adyen.com/capital/webhook-types/capital-webhooks"
source_url: "https://docs.adyen.com/capital/webhook-types/capital-webhooks.md"
canonical: "https://docs.adyen.com/capital/webhook-types/capital-webhooks"
last_modified: "2026-06-01T15:33:15+02:00"
language: "en"
---

# Grant lifecycle-related events

Learn which webhooks are sent for each event.

[View source](/capital/webhook-types/capital-webhooks.md)

Adyen sends webhooks for the following [grant lifecycle-related events](/capital/grant-lifecycle-and-status):

* [Dynamic offer created](#dynamic-offer-created)
* [Static offer created](#static-offer-created)
* [Grant requested](#grant-requested)
* Grant assessed
* [Grant reviewing](#grant-reviewing)

* [Grant approved](#grant-approved)

* Grant rejected

* Grant canceled

* [Grant pending](#grant-pending)

* Grant failed

* [Grant active](#grant-active)

* [Grant repaid](#grant-repaid)

* Grant revoked

* Grant written off

The next sections show code samples for some of these events.

## Dynamic offer created

When a new dynamic offer is created for an account holder, Adyen sends a [balancePlatform.capital.dynamicOffer.created](https://docs.adyen.com/api-explorer/capital-webhooks/latest/post/balancePlatform.capital.dynamicOffer.created) webhook to notify your server. The webhook includes information about the offer, such as:

* `accountHolderId`: The unique identifier of the account holder that the dynamic offer is for.
* `id`: The unique identifier of the dynamic offer.
* `contractType`: **loan**.
* `maximumAmount`: An object containing currency and value of the maximum offer amount, in [minor units](/development-resources/currency-codes).
* `minimumAmount`: An object containing currency and value of the minimum offer amount, in [minor units](/development-resources/currency-codes).
* `repayment.term.estimatedDays`: The estimated period for repaying the grant, in days.
* `repayment.term.maximumDays`: The maximum period for repaying the grant, in days.
* `financingType`: **businessFinancing**.
* `startsAt` and `expiresAt`: The dates when the financing offer begins and ends. The offer must be accepted before the expiration date.

**Offer created**

```json
{
    "data": {
        "balancePlatform": "BalancePlatform",
        "id": "0000000000000001",
        "dynamicOffer": {
            "accountHolderId": "AH00000000000000000000001",
            "contractType": "loan",
            "expiresAt": "2026-02-19T20:22:39.489+01:00",
            "financingType": "businessFinancing",
            "id": "0000000000000001",
            "maximumAmount": {
                "currency": "EUR",
                "value": 4567
            },
            "minimumAmount": {
                "currency": "EUR",
                "value": 1234
            },
            "repayment": {
                "term": {
                    "estimatedDays": 180,
                    "maximumDays": 270
                }
            },
            "startsAt": "2026-02-12T20:22:39.489+01:00"
        }
    },
    "environment": "test",
    "timestamp": "2026-02-12T19:22:39.699Z",
    "type": "balancePlatform.capital.dynamicOffer.created"
}
```

## Static offer created

When a new static offer is created for an account holder, Adyen sends a [balancePlatform.balanceAccountHolder.capitalOffer.created](https://docs.adyen.com/api-explorer/capital-webhooks/latest/post/balancePlatform.balanceAccountHolder.capitalOffer.created) webhook to notify your server. The webhook includes information about the offer, such as:

* `accountHolderId`: The unique identifier of the account holder that the static offer is for.
* `id`: The unique identifier of the static offer.
* `contractType`: **loan**.
* `amount`: An object containing currency and value of the offer, in [minor units](/development-resources/currency-codes).
* `repayment.term.estimatedDays`: The estimated period for repaying the grant, in days.
* `repayment.term.maximumDays`: The maximum period for repaying the grant, in days.
* `repayment.basisPoints`: The repayment amount, in [basis points](https://www.investopedia.com/terms/b/basispoint.asp), that is deducted daily from your user's incoming net volume.
* `repayment.threshold`: An object containing the details of the minimum threshold amount that your user must repay every 30-day period.
* `fee`: An object containing the fee currency and value, in [minor units](/development-resources/currency-codes).
* `startsAt` and `expiresAt`: The dates when the financing offer begins and ends. The offer must be accepted before the expiration date.

**Offer created**

```json
{
    "data": {
        "balancePlatform": "TestBalancePlatform",
        "creationDate": "2026-01-19T17:17:35+01:00",
        "id": "0000000000000001",
        "offer": {
            "accountHolderId": "AH00000000000000000000001",
            "amount": {
                "currency": "EUR",
                "value": 629375
            },
            "contractType": "loan",
            "expiresAt": "2026-01-26T17:17:34.328+01:00",
            "fee": {
                "amount": {
                    "currency": "EUR",
                    "value": 94406
                }
            },
            "id": "0000000000000001",
            "repayment": {
                "basisPoints": 800,
                "term": {
                    "estimatedDays": 180,
                    "maximumDays": 270
                },
                "threshold": {
                    "amount": {
                        "currency": "EUR",
                        "value": 80420
                    }
                }
            },
            "startsAt": "2026-01-19T17:17:34.328+01:00"
        }
    },
    "environment": "test",
    "timestamp": "2026-01-19T16:17:35.558Z",
    "type": "balancePlatform.balanceAccountHolder.capitalOffer.created"
}
```

## Grant requested

When a user selects an offer using either the [capital components](/capital/capital-components) or your [custom interface built with our APIs](/capital/make-grant-request), Adyen sends a [balancePlatform.grants.created](https://docs.adyen.com/api-explorer/capital-webhooks/latest/post/balancePlatform.grants.created) webhook to your server. This webhook includes information about the grant, such as:

* `id`: The unique identifier of the grant.
* `counterparty.accountHolderId`: The unique identifier of the account holder for which a grant has been requested.
* `grantOfferId`: The unique identifier for the related grant offer, which determines the grant conditions.
* `status.code`: **Requested**

**Grant requested**

```json
{
    "data": {
        "balancePlatform": "TestBalancePlatform",
        "id": "GR00000000000000000000001",
        "grant": {
            "counterparty": {
                "accountHolderId": "AH00000000000000000000001"
            },
            "grantAccountId": "CG00000000000000000000001",
            "grantOfferId": "GO00000000000001",
            "balances": {
                "currency": "EUR",
                "fee": 0,
                "principal": 0,
                "total": 0
            },
            "id": "GR00000000000000000000001",
            "status": {
                "code": "Requested"
            }
        }
    },
    "environment": "test",
    "timestamp": "2026-01-21T19:56:42.107Z",
    "type": "balancePlatform.grants.created"
}
```

## Grant reviewing

In specific situations, Adyen may require your users to provide additional information about their businesses, such as when the total user's exposure meets or exceeds the threshold, typically EUR 25,000 or the equivalent amount in another supported currency. You then need to [collect additional data from your user](/capital/collect-user-data) and submit it to Adyen.

Adyen sends a [balancePlatform.grants.updated](https://docs.adyen.com/api-explorer/capital-webhooks/latest/post/balancePlatform.grants.updated) webhook to notify your server about this event, including the following information:

* `id`: The unique identifier of the grant.
* `counterparty.accountHolderId`: The unique identifier of the account holder for which a grant has been requested.
* `grantOfferId`: The unique identifier for the related grant offer, which determines the grant conditions.
* `status.code`: **Reviewing**
* `actions.code`: **AnaCreditCapabilityRule**
* `actions.resolved`: **false**

**Grant reviewing - additional KYC data required**

```json
{
    "data": {
        "balancePlatform": "TestBalancePlatform",
        "id": "GR00000000000000000000001",
        "grant": {
            "counterparty": {
                "accountHolderId": "AH00000000000000000000001"
            },
            "grantAccountId": "CG00000000000000000000001",
            "grantOfferId": "GO00000000000001",
            "balances": {
                "currency": "EUR",
                "fee": 0,
                "principal": 0,
                "total": 0
            },
            "id": "GR00000000000000000000001",
            "status": {
                "code": "Reviewing",
                "actions": [
                    {
                        "actionCode": "AnaCreditCapabilityRule",
                        "resolved": false
                    }
                ]
            }
        }
    },
    "environment": "test",
    "timestamp": "2026-01-21T19:56:47.889Z",
    "type": "balancePlatform.grants.updated"
}
```

## Grant approved

After a thorough secondary review confirms the grant request meets all criteria, Adyen sends a [balancePlatform.grants.updated](https://docs.adyen.com/api-explorer/capital-webhooks/latest/post/balancePlatform.grants.updated) webhook to notify your server of final approval. The webhook includes information about the grant, such as:

* `id`: The unique identifier of the grant.
* `counterparty.accountHolderId`: The unique identifier of the account holder for which a grant has been approved.
* `grantOfferId`: The unique identifier for the related grant offer, which determines the grant conditions.
* `status.code`: **Approved**

**Grant approved**

```json
{
    "data": {
        "balancePlatform": "TestBalancePlatform",
        "id": "GR00000000000000000000001",
        "grant": {
            "counterparty": {
                "accountHolderId": "AH00000000000000000000001"
            },
            "grantAccountId": "CG00000000000000000000001",
            "grantOfferId": "GO00000000000001",
            "balances": {
                "currency": "EUR",
                "fee": 0,
                "principal": 0,
                "total": 0
            },
            "id": "GR00000000000000000000001",
            "status": {
                "code": "Approved"
            }
        }
    },
    "environment": "test",
    "timestamp": "2026-01-21T19:57:07.977Z",
    "type": "balancePlatform.grants.updated"
}
```

## Grant pending

After Adyen approves the grant, the user must complete required actions, such as [signing the Terms of Service](/capital/terms-of-service).\
The grant remains pending until:

* All required actions are completed on the user's side.
* The grant transaction is booked to the user's balance account.
* The security cooldown period ends. For example, if a user updates their bank account details (transfer instrument), Adyen waits 72 hours before processing transactions to the new account.

Adyen notifies you of this stage by sending a [balancePlatform.grants.updated](https://docs.adyen.com/api-explorer/capital-webhooks/latest/post/balancePlatform.grants.updated) webhook, which includes information about the grant, such as:

* `id`: The unique identifier of the grant.
* `counterparty.accountHolderId`: The unique identifier of the account holder for which a grant has been approved.
* `counterparty.balanceAccountId`: The balance account details where the grant amount should be disbursed.
* `grantOfferId`: The unique identifier for the related grant offer, which determines the grant conditions.
* `status.code`: **Pending**

**Grant pending**

```json
{
    "data": {
        "balancePlatform": "TestBalancePlatform",
        "id": "GR00000000000000000000001",
        "grant": {
            "counterparty": {
                "accountHolderId": "AH00000000000000000000001",
                "balanceAccountId": "BA00000000000000000000001"
            },
            "grantAccountId": "CG00000000000000000000001",
            "grantOfferId": "GO00000000000001",
            "balances": {
                "currency": "EUR",
                "fee": 0,
                "principal": 0,
                "total": 0
            },
            "id": "GR00000000000000000000001",
            "status": {
                "code": "Pending"
            }
        }
    },
    "environment": "test",
    "timestamp": "2026-01-21T19:57:10.153Z",
    "type": "balancePlatform.grants.updated"
}
```

After the user completes the required actions, Adyen disburses the grant amount to the specified balance account. At this point, Adyen also sends [webhooks about the corresponding fund transfer](/capital/webhook-types/fund-transfers-webhooks).

## Grant active

After the grant is disbursed, Adyen sends a [balancePlatform.grants.updated](https://docs.adyen.com/api-explorer/capital-webhooks/latest/post/balancePlatform.grants.updated) webhook, including the following information about the grant:

* `id`: The unique identifier of the grant.
* `accountHolderId`: The unique identifier of the account holder for which a grant has been approved.
* `balanceAccountId`: The balance account details where the grant amount has been disbursed.
* `grantOfferId`: The unique identifier for the related grant offer, which determines the grant conditions.
* `balances.currency`: The currency of the grant amount.
* `balances.fee`: The one-time fee for business financing.
* `balances.principal`: The amount that has been disbursed to the user.
* `balances.total`: The total amount that the user must repay. It is the sum of the fee amount and the principal amount.
* `status.code`: **Active**

**Grant active**

```json
{
    "data": {
        "balancePlatform": "TestBalancePlatform",
        "id": "GR00000000000000000000001",
        "grant": {
            "counterparty": {
                "accountHolderId": "AH00000000000000000000001",
                "balanceAccountId": "BA00000000000000000000001"
            },
            "grantAccountId": "CG00000000000000000000001",
            "grantOfferId": "GO00000000000001",
            "balances": {
                "currency": "EUR",
                "fee": 94406,
                "principal": 629375,
                "total": 723781
            },
            "id": "GR00000000000000000000001",
            "status": {
                "code": "Active"
            }
        }
    },
    "environment": "test",
    "timestamp": "2026-01-21T19:57:25.856Z",
    "type": "balancePlatform.grants.updated"
}
```

## Grant repaid

After the user has made their last repayment towards the grant and the [corresponding transfer has been booked](/capital/webhook-types/fund-transfers-webhooks), Adyen sends a [balancePlatform.grants.updated](https://docs.adyen.com/api-explorer/capital-webhooks/latest/post/balancePlatform.grants.updated) webhook which includes the following information:

* `id`: The unique identifier of the grant.
* `accountHolderId`: The unique identifier of the account holder for which a grant has been approved.
* `balanceAccountId`: The balance account details where the grant amount has been disbursed.
* `grantOfferId`: The unique identifier for the related grant offer, which determines the grant conditions.
* `balances.currency`: The currency of the grant amount.
* `balances.fee`: **0**
* `balances.principal`: **0**
* `balances.total`: **0**
* `status.code`: **Repaid**

**Grant repaid**

```json
{
    "data": {
        "balancePlatform": "TestBalancePlatform",
        "id": "GR00000000000000000000001",
        "grant": {
            "counterparty": {
                "accountHolderId": "AH00000000000000000000001",
                "balanceAccountId": "BA00000000000000000000001"
            },
            "grantAccountId": "CG00000000000000000000001",
            "grantOfferId": "GO00000000000001",
            "balances": {
                "currency": "EUR",
                "fee": 0,
                "principal": 0,
                "total": 0
            },
            "id": "GR00000000000000000000001",
            "status": {
                "code": "Repaid"
            }
        }
    },
    "environment": "test",
    "timestamp": "2026-01-21T19:59:10.153Z",
    "type": "balancePlatform.grants.updated"
}
```

## See also

* [Webhook structures and types for Capital](/capital/webhook-types)
* [Grant lifecycle and status](/capital/grant-lifecycle-and-status)
