# Exam passed

Sent every time a student passes an exam. The event is `prova.aprovado` (`exam.approved` in [payload version 2](https://cademi.dev/webhooks/v2/reference/exam-approved.md)).

> **Warning:** Payload version 1 is deprecated and receives fixes only. New webhooks use payload version 3, the default.

## Example body

```json
{
  "event": {
    "produto": {
      "id": 311,
      "nome": "Curso de Fotografia",
      "oferta_url": "string",
      "ordem": 0,
      "vitrine": {
        "id": 0,
        "nome": "string",
        "ordem": 0
      }
    },
    "prova": {
      "id": 57,
      "nota_minima": 70,
      "produto_id": 311,
      "titulo": "string"
    },
    "resultado": {
      "id": 9031,
      "acertos": 8,
      "erros": 2,
      "nota_final": 80
    },
    "usuario": {
      "id": 1042,
      "cargo": "string",
      "celular": "string",
      "comecou_em": "2026-09-29T12:00:00-03:00",
      "criado_em": "2026-09-29T12:00:00-03:00",
      "doc": "string",
      "email": "maria@exemplo.com",
      "gratis": false,
      "login_auto": "https://example.com",
      "login_crstk": "string",
      "nome": "Maria Souza",
      "nome_empresa": "string",
      "pontos": 0,
      "tamanho_empresa": "string",
      "ultimo_acesso_em": "2026-09-29T12:00:00-03:00",
      "utm": {
        "adcampaign": "string",
        "adid": "string",
        "fbclid": "string",
        "gclid": "string",
        "groupid": "string",
        "page_name": "string",
        "utm_content": "string",
        "utm_medium": "string",
        "utm_source": "string",
        "utm_term": "string"
      }
    }
  },
  "event_type": "prova.aprovado",
  "event_id": "01K5QW7M2Z3Y4X5W6V7U8T9S0R"
}
```

## Fields

| Field | Type | Required | Description |
|---|---|---|---|
| `event` | object | yes |  |
| `event.produto` | object | yes | The product (course) the event is about, with its showcase. |
| `event.produto.id` | integer | yes |  |
| `event.produto.nome` | string | yes |  |
| `event.produto.oferta_url` | string \| null | yes | Sales page shown to students without access. |
| `event.produto.ordem` | integer \| null | yes |  |
| `event.produto.vitrine` | object | yes | The showcase the product belongs to. |
| `event.produto.vitrine.id` | integer \| null | yes |  |
| `event.produto.vitrine.nome` | string \| null | yes |  |
| `event.produto.vitrine.ordem` | integer \| null | yes |  |
| `event.prova` | object | yes | The exam the result belongs to. |
| `event.prova.id` | integer | yes |  |
| `event.prova.nota_minima` | number \| null | yes | The minimum grade that applied to this attempt. |
| `event.prova.produto_id` | integer | yes |  |
| `event.prova.titulo` | string \| null | yes |  |
| `event.resultado` | object | yes | The finished attempt. |
| `event.resultado.id` | integer | yes |  |
| `event.resultado.acertos` | integer | yes | Questions answered correctly. |
| `event.resultado.erros` | integer | yes | Questions answered wrong. |
| `event.resultado.nota_final` | number | yes |  |
| `event.usuario` | object | yes | The student the event is about. `tamanho_empresa`, `nome_empresa`, `cargo` and `utm` are present only when the school enables the extra student fields. |
| `event.usuario.id` | integer | yes |  |
| `event.usuario.cargo` | string | no |  |
| `event.usuario.celular` | string \| null | yes | Mobile phone. |
| `event.usuario.comecou_em` | string \| null | yes | First access. |
| `event.usuario.criado_em` | string \| null | yes |  |
| `event.usuario.doc` | string \| null | yes | Document (CPF). |
| `event.usuario.email` | string \| null | yes |  |
| `event.usuario.gratis` | boolean | yes | Whether the student has free access. |
| `event.usuario.login_auto` | string | yes | Link that signs the student in when opened. Treat it as a password. |
| `event.usuario.login_crstk` | string | yes | The sign-in token used by `login_auto`. |
| `event.usuario.nome` | string \| null | yes |  |
| `event.usuario.nome_empresa` | string | no |  |
| `event.usuario.pontos` | integer \| null | yes | Gamification points. |
| `event.usuario.tamanho_empresa` | string | no |  |
| `event.usuario.ultimo_acesso_em` | string \| null | yes | Last access; the first access when there is no later one. |
| `event.usuario.utm` | object | no | Attribution captured at sign-up. Empty strings when unknown. |
| `event.usuario.utm.adcampaign` | string | no |  |
| `event.usuario.utm.adid` | string | no |  |
| `event.usuario.utm.fbclid` | string | no |  |
| `event.usuario.utm.gclid` | string | no |  |
| `event.usuario.utm.groupid` | string | no |  |
| `event.usuario.utm.page_name` | string | no |  |
| `event.usuario.utm.utm_content` | string | no |  |
| `event.usuario.utm.utm_medium` | string | no |  |
| `event.usuario.utm.utm_source` | string | no |  |
| `event.usuario.utm.utm_term` | string | no |  |
| `event_type` | string | yes | Always `prova.aprovado`. |
| `event_id` | string | yes | Unique id of the delivery (ULID). Retries of the same delivery keep it, so use it to ignore duplicates. |

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