> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.awardspring.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.awardspring.com/_mcp/server.

# Event types

Subscribe an endpoint to any combination of the six event types below. Everything shown here is the `data` object — the surrounding [envelope](/webhooks#the-envelope) is identical for every event.

| Event type                                                     | Fires when                                                               |
| -------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [`application.submitted`](#applicationsubmitted)               | A student submits an application, or it is auto-submitted at a deadline. |
| [`application.status_changed`](#applicationstatus_changed)     | An application's **review** status changes.                              |
| [`award.created`](#awardcreated)                               | An application is awarded.                                               |
| [`award.disbursed`](#awarddisbursed)                           | A disbursement on an award is marked disbursed.                          |
| [`scholarship.created`](#scholarshipcreated)                   | A scholarship is created.                                                |
| [`scholarship.deadline_changed`](#scholarshipdeadline_changed) | A scholarship's application deadline changes.                            |

## Identifiers

Every record identifier in a payload is the record's **stored ID**: a 9-character string such as `"S6H4B9VQE"`, the same value the REST API returns as that record's `id` and accepts wherever it takes one, so an ID from a webhook can be passed straight to the matching endpoint. The envelope's `tenant_id` is your institution's stored ID in the same format.

| Field                                       | Identifies                                    |
| ------------------------------------------- | --------------------------------------------- |
| `scholarship_id`, `opportunity_id`          | A scholarship.                                |
| `award_cycle_id`                            | An award cycle.                               |
| `department_id`                             | A department.                                 |
| `user_id`, `applicant.user_id`              | A student.                                    |
| `award_id`                                  | An award.                                     |
| `application_id` on `application.submitted` | The student's general application.            |
| `application_id` on every other event       | The student's application to one scholarship. |
| `disbursement_id`                           | One payment of an award.                      |

> **Note**
>
> Scholarships are identified as `scholarship_id` on the scholarship events and as `opportunity_id` on the application and award events. Both are the same identifier — the one you pass to the REST API's scholarship endpoints. The two names are historical, and both are kept because renaming either would break existing integrations.

> **Note**
>
> An award is a scholarship application that was awarded, so an award's `award_id` is the same stored ID as its `application_id`. The award's existing 8-character award code is sent, unchanged, as `award_code`.

> **Warning**
>
> Identifiers used to be raw integers. A **replay** of an event recorded before the switch to stored IDs is rebuilt with stored IDs when AwardSpring still holds the event's trigger. An event recorded before replays could be rebuilt has no stored trigger, and its replay resends the payload exactly as it was first sent, with integer IDs, including an integer `tenant_id`.

## application.submitted

Sent when an application reaches submitted state, whether the student pressed submit or AwardSpring auto-submitted it. `is_auto_submit` tells you which.

This is the only event that carries applicant contact details inline, so a downstream system can act without a follow-up API call.

```json
{
  "application_id": "A7K2M9QXR",
  "award_cycle_id": "C4T8N2WHP",
  "status": "Submitted",
  "is_auto_submit": false,
  "submitted_at": "2026-04-03T14:22:30.0000000Z",
  "applicant": {
    "user_id": "U9F3K7PZM",
    "first_name": "Ada",
    "last_name": "Nunez",
    "email": "ada.nunez@example.edu",
    "student_id": "STU-44120",
    "external_id": "EXT-44120"
  }
}
```

| Field                   | Type             | Notes                                                                         |
| ----------------------- | ---------------- | ----------------------------------------------------------------------------- |
| `application_id`        | string           | The student's general application for the cycle.                              |
| `award_cycle_id`        | string           | The cycle the application belongs to.                                         |
| `status`                | string           |                                                                               |
| `is_auto_submit`        | boolean          | `true` when AwardSpring submitted it at the deadline rather than the student. |
| `submitted_at`          | string           | ISO-8601 UTC.                                                                 |
| `applicant.user_id`     | string           | The applicant.                                                                |
| `applicant.first_name`  | string, nullable |                                                                               |
| `applicant.last_name`   | string, nullable |                                                                               |
| `applicant.email`       | string, nullable |                                                                               |
| `applicant.student_id`  | string, nullable | The institution's student identifier.                                         |
| `applicant.external_id` | string, nullable | Your own identifier, if one was set.                                          |

## application.status_changed

Sent when an application's **review** status moves — the workflow status a reviewer or administrator advances, such as `In Progress` to `Complete`.

> **Warning**
>
> This is not the award decision. An application being awarded produces [`award.created`](#awardcreated), not a status change. Subscribing to this event expecting award outcomes will miss them.

```json
{
  "application_id": "R2X8D5MKT",
  "opportunity_id": "S6H4B9VQE",
  "user_id": "U9F3K7PZM",
  "old_status": "In Progress",
  "new_status": "Complete"
}
```

| Field            | Type             | Notes                                |
| ---------------- | ---------------- | ------------------------------------ |
| `application_id` | string           | The application to this scholarship. |
| `opportunity_id` | string           | The scholarship.                     |
| `user_id`        | string           | The applicant.                       |
| `old_status`     | string, nullable | Review status before the change.     |
| `new_status`     | string, nullable | Review status after the change.      |

Status names are the labels used in the AwardSpring interface. Match on them defensively — an institution's workflow can introduce values you have not seen.

## award.created

Sent when an application's status becomes awarded.

```json
{
  "award_id": "R2X8D5MKT",
  "award_code": "K7Q2M4XA",
  "application_id": "R2X8D5MKT",
  "opportunity_id": "S6H4B9VQE",
  "user_id": "U9F3K7PZM",
  "amount": 1000.00,
  "awarded_at": "2026-04-11T16:05:12.0000000Z"
}
```

| Field            | Type             | Notes                                                              |
| ---------------- | ---------------- | ------------------------------------------------------------------ |
| `award_id`       | string           | The award. The same stored ID as `application_id`.                 |
| `award_code`     | string, nullable | The award's 8-character code. Null when no code has been assigned. |
| `application_id` | string           | The awarded application.                                           |
| `opportunity_id` | string           | The scholarship.                                                   |
| `user_id`        | string           | The recipient.                                                     |
| `amount`         | number, nullable | The awarded amount. Null when no amount has been set yet.          |
| `awarded_at`     | string, nullable | ISO-8601 UTC.                                                      |

## award.disbursed

Sent per disbursement, when a disbursement is marked disbursed. An award paid in two terms produces two of these.

```json
{
  "award_id": "R2X8D5MKT",
  "award_code": "K7Q2M4XA",
  "application_id": "R2X8D5MKT",
  "opportunity_id": "S6H4B9VQE",
  "user_id": "U9F3K7PZM",
  "amount": 1000.00,
  "amount_paid_out": 500.00,
  "disbursement_id": "D3W7J5NRY",
  "disbursement_order": 1,
  "disbursed_at": "2026-08-20T09:00:00.0000000Z"
}
```

| Field                | Type             | Notes                                                                                                                                                                 |
| -------------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `award_id`           | string           | The award. The same stored ID as `application_id`.                                                                                                                    |
| `award_code`         | string, nullable | The award's 8-character code. Null when no code has been assigned.                                                                                                    |
| `application_id`     | string           | The awarded application.                                                                                                                                              |
| `opportunity_id`     | string           | The scholarship.                                                                                                                                                      |
| `user_id`            | string           | The recipient.                                                                                                                                                        |
| `amount`             | number, nullable | The **full award** amount, the same on every disbursement of the award.                                                                                               |
| `amount_paid_out`    | number, nullable | **This disbursement's** amount: the amount recorded for this payment, or, when none was recorded, the award split evenly across the scholarship's payments per award. |
| `disbursement_id`    | string           | This payment.                                                                                                                                                         |
| `disbursement_order` | integer          | Position in the disbursement schedule, starting at 1.                                                                                                                 |
| `disbursed_at`       | string, nullable | ISO-8601 UTC.                                                                                                                                                         |

## scholarship.created

```json
{
  "scholarship_id": "S6H4B9VQE",
  "name": "Helen Ruiz Memorial Scholarship",
  "award_cycle_id": "C4T8N2WHP",
  "deadline": "2026-05-01T00:00:00.0000000Z",
  "start_date": "2026-01-15T00:00:00.0000000Z",
  "total_amount": 5000.00,
  "number_of_awards": 5,
  "amount_per_award": 1000.00,
  "department_id": "P8E2G6TCK",
  "created_at": "2026-01-05T11:41:03.0000000Z"
}
```

| Field              | Type              | Notes                                               |
| ------------------ | ----------------- | --------------------------------------------------- |
| `scholarship_id`   | string            |                                                     |
| `name`             | string, nullable  |                                                     |
| `award_cycle_id`   | string            |                                                     |
| `deadline`         | string, nullable  | Application deadline, ISO-8601 UTC.                 |
| `start_date`       | string, nullable  | When applications open, ISO-8601 UTC.               |
| `total_amount`     | number, nullable  |                                                     |
| `number_of_awards` | integer, nullable |                                                     |
| `amount_per_award` | number, nullable  |                                                     |
| `department_id`    | string, nullable  | Null when the scholarship is not department-scoped. |
| `created_at`       | string, nullable  | ISO-8601 UTC.                                       |

A scholarship is often created before its amounts and dates are filled in, so expect nulls here and read the current state from the REST API when you need it complete.

## scholarship.deadline_changed

Sent when the application deadline moves. Useful for anything that has messaged applicants about a date.

```json
{
  "scholarship_id": "S6H4B9VQE",
  "name": "Helen Ruiz Memorial Scholarship",
  "old_deadline": "2026-05-01T00:00:00.0000000Z",
  "new_deadline": "2026-06-15T00:00:00.0000000Z"
}
```

| Field            | Type             | Notes                                             |
| ---------------- | ---------------- | ------------------------------------------------- |
| `scholarship_id` | string           |                                                   |
| `name`           | string, nullable |                                                   |
| `old_deadline`   | string, nullable | ISO-8601 UTC. Null if no deadline was set before. |
| `new_deadline`   | string, nullable | ISO-8601 UTC. Null if the deadline was cleared.   |

## Adding fields

New fields can be added to any `data` object without a change to `api_version`. A field being added is not a breaking change; parse permissively and ignore what you do not recognise.

Removing a field or changing its meaning **is** breaking, and would come with a new `api_version` value and notice to integrators.