# Diamond: Class 3 completed

The student completed class 3. The event is `spyhub.diamond.class_3_concluded`.

## Example body

```json
{
  "version": "1",
  "event": "spyhub.diamond.class_3_concluded",
  "event_id": "01K5QW7M2Z3Y4X5W6V7U8T9S0R",
  "data": {
    "framework": {
      "id": 0,
      "email": {
        "active": false,
        "reply_to": "string",
        "sender": "string",
        "subject": "string",
        "tags": [
          "string"
        ],
        "text": "string"
      },
      "links": {
        "checkout": "https://example.com",
        "class_1": "https://example.com",
        "class_2": "https://example.com",
        "class_3": "https://example.com",
        "login": "https://example.com"
      },
      "sms": {
        "active": false,
        "message": "string"
      },
      "whatsapp": {
        "active": false,
        "message": "string"
      }
    },
    "user": {
      "id": 1042,
      "access": {
        "first_at": {
          "iso": "2025-09-23T12:00:00-03:00",
          "unix": "1758639600"
        },
        "last_at": {
          "iso": "2025-09-23T12:00:00-03:00",
          "unix": "1758639600"
        }
      },
      "created": {
        "at": {
          "iso": "2025-09-23T12:00:00-03:00",
          "unix": "1758639600"
        }
      },
      "document": "string",
      "email": "string",
      "first_name": "Maria",
      "magic_login_token": "string",
      "magic_login_url": "https://example.com",
      "name": "Maria Souza",
      "phone": "string",
      "src": {
        "utm_campaign": "string",
        "utm_content": "string",
        "utm_medium": "string",
        "utm_source": "string",
        "utm_term": "string"
      }
    }
  }
}
```

## Fields

| Field | Type | Required | Description |
|---|---|---|---|
| `version` | string | yes | The payload version set in the webhook. One of `1`, `2`. |
| `event` | string | yes | Always `spyhub.diamond.class_3_concluded`. |
| `event_id` | string | yes | Unique id of the delivery (ULID). Retries of the same delivery keep it, so use it to ignore duplicates. |
| `data` | object | yes |  |
| `data.framework` | object | yes | The funnel step: links for the messages and the channels configured for it. |
| `data.framework.id` | integer | yes | The funnel. |
| `data.framework.email` | object | yes |  |
| `data.framework.email.active` | boolean | yes |  |
| `data.framework.email.reply_to` | string | yes |  |
| `data.framework.email.sender` | string \| null | yes |  |
| `data.framework.email.subject` | string \| null | yes |  |
| `data.framework.email.tags` | array of string | yes |  |
| `data.framework.email.text` | string \| null | yes |  |
| `data.framework.links` | object | yes |  |
| `data.framework.links.checkout` | string \| null | yes |  |
| `data.framework.links.class_1` | string \| null | yes |  |
| `data.framework.links.class_2` | string \| null | yes |  |
| `data.framework.links.class_3` | string \| null | yes |  |
| `data.framework.links.login` | string \| null | yes |  |
| `data.framework.sms` | object | yes |  |
| `data.framework.sms.active` | boolean | yes |  |
| `data.framework.sms.message` | string | yes |  |
| `data.framework.whatsapp` | object | yes |  |
| `data.framework.whatsapp.active` | boolean | yes |  |
| `data.framework.whatsapp.message` | string | yes |  |
| `data.user` | object | yes | The student in the funnel. |
| `data.user.id` | integer | yes |  |
| `data.user.access` | object | yes |  |
| `data.user.access.first_at` | object | no | A point in time, as Unix seconds (a string) and ISO 8601 with the offset. Both are null when there is no date. |
| `data.user.access.first_at.iso` | string \| null | yes |  |
| `data.user.access.first_at.unix` | string \| null | yes |  |
| `data.user.access.last_at` | object | no | A point in time, as Unix seconds (a string) and ISO 8601 with the offset. Both are null when there is no date. |
| `data.user.access.last_at.iso` | string \| null | yes |  |
| `data.user.access.last_at.unix` | string \| null | yes |  |
| `data.user.created` | object | yes |  |
| `data.user.created.at` | object | no | A point in time, as Unix seconds (a string) and ISO 8601 with the offset. Both are null when there is no date. |
| `data.user.created.at.iso` | string \| null | yes |  |
| `data.user.created.at.unix` | string \| null | yes |  |
| `data.user.document` | string \| null | yes |  |
| `data.user.email` | string \| null | yes |  |
| `data.user.first_name` | string | yes |  |
| `data.user.magic_login_token` | string | yes | The sign-in token used by `magic_login_url`. |
| `data.user.magic_login_url` | string | yes | Link that signs the student in when opened. Treat it as a password. |
| `data.user.name` | string \| null | yes |  |
| `data.user.phone` | string \| null | yes |  |
| `data.user.src` | object | yes | Attribution captured at sign-up. |
| `data.user.src.utm_campaign` | string \| null | no |  |
| `data.user.src.utm_content` | string \| null | no |  |
| `data.user.src.utm_medium` | string \| null | no |  |
| `data.user.src.utm_source` | string \| null | no |  |
| `data.user.src.utm_term` | string \| null | no |  |

Your endpoint answers with any `2xx` status to confirm the delivery. See [Deliveries and retries](https://cademi.dev/webhooks/deliveries.md).
