---
title: "Event types"
description: "Available webhook events, when they fire, and example payloads"
---

> For the complete documentation index, see [llms.txt](/llms.txt).

Subscribe only to the events you need.
See the [list webhook event types](/api-reference/webhook-management/get-webhooks-event-types) endpoint for the full API reference.

## Available events

<AccordionGroup>
  <Accordion title="application_status_changed">
    Fired on every status transition.
    The most commonly used event.

    **Payload fields:** `customer_id`, `application_id`, `external_customer_id`, `is_closed`, `status`

    ```json
    {
      "event_type": "application_status_changed",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": {
        "customer_id": "c9f4f988-a98e-446e-a121-ff3d631e3246",
        "application_id": "f200bd36-5257-41d6-a11e-51a1d3a23336",
        "external_customer_id": "your-reference-123",
        "is_closed": false,
        "status": "offered"
      }
    }
    ```

    **Possible statuses:**

    | Status | Description |
    |---|---|
    | `open` | The application has not reached the decision stage, usually because more information is needed. |
    | `action_required` | The documents uploaded or information shared does not meet iwoca's minimum requirements. You can generate offers to view the updated document requirements. |
    | `awaiting_underwriter` | The uploaded documents have met iwoca's requirements and the application is now awaiting a manual review by an underwriter. |
    | `in_underwriting` | The application is under review by a credit analyst. |
    | `conditional_offer` | iwoca has made an offer subject to special conditions, such as uploading VAT returns. |
    | `conditional_offer_criteria_met` | Reserved. Not currently sent. |
    | `customer_to_link_open_banking` | The customer needs to link open banking to proceed. |
    | `offered` | The customer has at least one confirmed offer. |
    | `talking_to_customer` | Customer has a confirmed offer and iwoca is in contact with them. |
    | `funded` | The customer has drawn down on the funds. |
    | `expired` | A formal offer was made but it has now expired. Offers are valid for 30 days. |
    | `declined` | iwoca has credit assessed the customer and they have been declined. No offers will be available. |
    | `deferred` | The application has been closed before the decision stage. All applications automatically defer after 30 days of inactivity. This is likely if the customer does not share the necessary information, they decide they no longer want to go ahead, or there is a block on iwoca's side (for example, they already have a facility). |
    | `offer_revoked` | iwoca had to revoke the offer, most likely due to failing compliance checks. |

    <Note>
    A customer rejecting their offer does not produce a distinct status.
    The application continues to report `offered` until the offer expires or is revoked.
    If you need to know whether a customer went ahead, use funding events rather than inferring it from status.
    </Note>

  </Accordion>

  <Accordion title="application_offered">
    Fired when a confirmed offer is generated.
    If multiple confirmed offers are generated, you receive multiple webhooks.

    **Payload fields:** `customer_id`, `application_id`, `external_customer_id`, `offer_id`, `max_amount`, `duration`, `interest_rates`, `interest_only_repayments`, `fee_percentage`, `approximate_apr`, `product_type`, `payment_interval`, `personal_guarantee_proportion`, `expiry_date`, `promotions`, `revoked_at`, `is_closed`

    ```json
    {
      "event_type": "application_offered",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": {
        "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c",
        "approximate_apr": 0.565306,
        "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
        "duration": {
          "amount": 365.0,
          "unit": "days"
        },
        "expiry_date": "2026-02-14",
        "external_customer_id": "your-reference-123",
        "fee_percentage": 5.0,
        "interest_only_repayments": 0,
        "interest_rates": [
          {
            "as_of": 0,
            "rate": 0.0375
          }
        ],
        "is_closed": false,
        "max_amount": 100000,
        "offer_id": "d5a7a5b7-a4a3-49e7-9c69-b44d2cbe15cf",
        "payment_interval": "1m",
        "personal_guarantee_proportion": 100.0,
        "product_type": "flexi_loan",
        "promotions": [],
        "revoked_at": null
      }
    }
    ```

  </Accordion>

  <Accordion title="application_declined">
    Fired when an application is declined.
    The customer has been credit assessed and no offers will be available for this application.

    **Payload fields:** `customer_id`, `application_id`, `is_closed`

    ```json
    {
      "event_type": "application_declined",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": {
        "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c",
        "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
        "is_closed": true
      }
    }
    ```

  </Accordion>

  <Accordion title="application_deferred">
    Fired when an application is closed without making an approve or decline decision.

    **Payload fields:** `customer_id`, `application_id`, `is_closed`, `reason`

    ```json
    {
      "event_type": "application_deferred",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": {
        "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c",
        "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
        "is_closed": true,
        "reason": "timeout"
      }
    }
    ```

    **Possible reasons:**

    | Reason | Description |
    |---|---|
    | `iwoca` | Closed by iwoca (for example, after speaking to the customer). |
    | `timeout` | Closed automatically due to inactivity. |
    | `partner` | Unused. |

  </Accordion>

  <Accordion title="application_attributed">
    Fired when an application is attributed to an introducer.
    `application_attributed` is an event only, not an application status, so you will not see it in the `status` field.
    This happens when:
    - A customer or staff creates an application and it's attributed to you (previous IDs will be `null`).
    - An application is moved from one customer to another (for example, customer already has an iwoca account) – previous IDs show the old references.

    **Payload fields:** `current_customer_id`, `previous_customer_id`, `current_application_id`, `previous_application_id`

    ```json
    {
      "event_type": "application_attributed",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": {
        "current_customer_id": "c9f4f988-a98e-446e-a121-ff3d631e3246",
        "previous_customer_id": null,
        "current_application_id": "f200bd36-5257-41d6-a11e-51a1d3a23336",
        "previous_application_id": null
      }
    }
    ```

    When previous IDs are populated, update your records to use the new `current_` IDs and stop tracking the previous ones.

  </Accordion>

  <Accordion title="indicative_offer_created">
    Fired when an indicative offer is available.

    **Payload fields:** `customer_id`, `application_id`, `external_customer_id`, `offer_id`, `max_amount`, `interest_rate`, `duration`, `probability_of_offer`, `data_requirements`, `is_suggested`, `product_type`, `timeout`

    ```json
    {
      "event_type": "indicative_offer_created",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": {
        "application_id": "48ac72d0-a829-4896-a067-dcb1c2b0f30c",
        "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e",
        "data_requirements": [],
        "duration": {
          "amount": 365,
          "unit": "days"
        },
        "external_customer_id": "your-reference-123",
        "interest_rate": 0.0265,
        "is_suggested": true,
        "max_amount": 50000,
        "offer_id": "d5a7a5b7-a4a3-49e7-9c69-b44d2cbe15cf",
        "probability_of_offer": "low_probability_of_offer",
        "product_type": "flexi_loan",
        "timeout": "2026-02-15T10:30:00Z"
      }
    }
    ```

  </Accordion>

  <Accordion title="customer_funded">
    Fired when the customer draws down their loan.

    **Payload fields:** `customer_id`

    ```json
    {
      "event_type": "customer_funded",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": {
        "customer_id": "160c0c4b-9966-4dc1-a916-8407eb10d74e"
      }
    }
    ```

  </Accordion>

  <Accordion title="prequalification_202505">
    Fired when a prequalification data file has been processed.
    Contains a quote for each unique `external_customer_id` in the uploaded file.

    **Payload fields:** Array of `quote_id`, `external_customer_id`, `is_prequalified`, `prequalified_amount`, `marketing_type`

    ```json
    {
      "event_type": "prequalification_202505",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": [
        {
          "quote_id": "1c6e2a6f-41ed-490e-8d05-87e34e756f7a",
          "external_customer_id": "16aa735d-9890-479d-8cce-89d5c1c1df3d",
          "is_prequalified": true,
          "prequalified_amount": 10000,
          "marketing_type": "prequalified_marketing"
        },
        {
          "quote_id": "97976169-e0ff-4b60-afd0-869133a49828",
          "external_customer_id": "c21a167f-7aef-47f1-aeb6-c4d2c3d7799d",
          "is_prequalified": false,
          "prequalified_amount": null,
          "marketing_type": "generic_marketing"
        },
        {
          "quote_id": "8cccd62c-1a50-4ae1-854b-a6a021a2ac32",
          "external_customer_id": "1af8db98-bfff-4e5d-ad88-66dae61882ed",
          "is_prequalified": false,
          "prequalified_amount": null,
          "marketing_type": "no_marketing"
        }
      ]
    }
    ```

    **Marketing types:**

    | Type | Description |
    |---|---|
    | `prequalified_marketing` | Eligible with a predicted offer amount – show amount in marketing. |
    | `generic_marketing` | Could be eligible but no amount available – use generic marketing. |
    | `no_marketing` | Not eligible due to failing eligibility criteria – do not market. |

  </Accordion>

  <Accordion title="prequalification_data_file_processed_202510">
    Lighter version of `prequalification_202505`. Fired when a prequalification data file has been processed, but only contains the file identifier.
    Use this ID with `GET /prequalification_data` to retrieve the quotes.

    **Payload fields:** `prequalification_data_id`

    ```json
    {
      "event_type": "prequalification_data_file_processed_202510",
      "timestamp": "2026-01-15T10:30:00Z",
      "data": {
        "prequalification_data_id": "file-uploaded-for-prequalification.csv"
      }
    }
    ```

  </Accordion>
</AccordionGroup>

---

## Payload structure

Every webhook shares the same envelope:

```json
{
  "event_type": "application_status_changed",
  "timestamp": "2026-01-15T10:30:00Z",
  "data": {
    "customer_id": "894ff74b-b8fb-46ab-97d6-f9ff3428b779",
    ...
  }
}
```

## Event headers

Each webhook includes these headers:

| Header | Purpose |
|---|---|
| `X-IW-Event-ID` | Unique identifier for the webhook |
| `X-IW-Event-Type` | The event type that triggered the webhook |
| `X-IW-Signature` | Hash-based Message Authentication Code (HMAC) signature for verification – see [Security](/guides/webhooks/security) |
| `X-IW-Timestamp` | Unix timestamp when the webhook was sent |
