# quote.updated

> A quote changed.

A quote changed. `changed` names the fields.

**Needs:** `quotes:read` on the subscription's key · **Subject:** `quote`

## Envelope

```json
{
  "id": "evt_…",
  "type": "quote.updated",
  "timestamp": "2027-05-01T09:00:00Z",
  "subject": {
    "object": "quote",
    "id": "<id>",
    "tripId": "<tripId>"
  },
  "changed": [
    "title"
  ],
  "data": {}
}
```

## `data`

`data` is the quote exactly as [Get a quote](https://api.bymundi.com/docs/reference/quotes.get.md) returns it, read at delivery time with the subscription key's permissions.

| Field | Type | Required | Description |
|---|---|---|---|
| `object` | "quote" | yes |  |
| `id` | uuid | yes |  |
| `tripId` | uuid | yes |  |
| `code` | string | yes |  |
| `name` | string | yes |  |
| `mode` | "package" \| "per_item" | yes |  |
| `status` | "draft" \| "sent" \| "accepted" \| "rejected" \| "expired" \| "superseded" | yes |  |
| `travelers` | integer | yes |  |
| `marginPct` | number | yes |  |
| `finalPriceOverride` | string \| null | yes |  |
| `validUntil` | string \| null | yes |  |
| `ctaUrl` | string \| null | yes |  |
| `templateId` | string \| null | yes |  |
| `packages` | object[] | yes |  |
| `packages[].id` | string | yes |  |
| `packages[].name` | string | yes |  |
| `lines` | object \| object \| object[] | yes |  |
| `totals` | object | yes |  |
| `totals.currency` | "EUR" | yes |  |
| `totals.net` | string | yes |  |
| `totals.marginAmount` | string | yes |  |
| `totals.total` | string | yes |  |
| `totals.finalPrice` | string | yes |  |
| `totals.perPax` | string | yes |  |
| `totals.finalMargin` | string | yes |  |
| `totals.packages` | object[] | yes |  |
| `totals.packages[].id` | string | yes |  |
| `totals.packages[].name` | string | yes |  |
| `totals.packages[].deltaNet` | string | yes |  |
| `totals.packages[].deltaPvp` | string | yes |  |
| `totals.packages[].lineIds` | string[] | yes |  |
| `textOverrides` | object | yes |  |
| `imageOverrides` | object | yes |  |
| `sentAt` | string \| null | yes |  |
| `modifiedSinceSent` | boolean | yes |  |
| `acceptedAt` | string \| null | yes |  |
| `acceptedVia` | "prospect_link" \| "agent" \| null | yes |  |
| `acceptedPackageId` | string \| null | yes |  |
| `acceptedLineIds` | string[] | yes |  |
| `acceptance` | object \| null | yes | What the customer typed when accepting on the quote page — personal data: present only for a key holding `travelers:read`, only on quote reads (a write's response carries null; read the quote), and every such read is audited. |
| `acceptance.name` | string \| null | yes |  |
| `acceptance.email` | string \| null | yes |  |
| `acceptance.phone` | string \| null | yes |  |
| `acceptance.message` | string \| null | yes |  |
| `engagement` | object | yes |  |
| `engagement.views` | integer | yes |  |
| `engagement.uniqueSessions` | integer | yes |  |
| `engagement.activeSeconds` | integer | yes |  |
| `engagement.ctaClicks` | integer | yes |  |
| `engagement.maxScrollPct` | number | yes |  |
| `engagement.sectionsSeen` | integer | yes |  |
| `engagement.interactions` | integer | yes |  |
| `engagement.lastSeenAt` | string \| null | yes |  |
| `engagement.lastCtaAt` | string \| null | yes |  |
| `metadata` | object | yes |  |
| `appUrl` | string \| null | yes |  |
| `publicUrl` | string \| null | yes |  |
| `createdAt` | string | yes |  |
| `updatedAt` | string | yes |  |

Verify the signature before trusting the body: [Webhooks guide](https://api.bymundi.com/docs/guides/webhooks.md#verifying-signatures).
