# Update a quote

> The update_quote MCP tool: update a quote.

`update_quote` · writes

[REST: `PATCH /v1/quotes/{quoteId}`](https://api.bymundi.com/docs/reference/quotes.update.md)

## What the model reads

Changes the quote's own fields: name, travelers (must equal the trip's headcount), marginPct (a % of the sale price), finalPriceOverride (the rounded price asked of the customer; null = the computed total), validUntil, ctaUrl, templateId, and the template's editable texts and images (`textOverrides`, `imageOverrides`: merged key by key, null restores the template's). `metadata` merges key by key. Lines: use edit_quote_lines.

Permissions: quotes:write.
Set `dryRun: true` to preview the effect without writing anything.
Undo: the result names a change id; undo_change reverts it.

## Input

| Field | Type | Required | Description |
|---|---|---|---|
| `quoteId` | uuid | yes |  |
| `name` | string |  | max 200 chars |
| `travelers` | integer |  | Must equal the trip's headcount. 1–40 |
| `marginPct` | number |  | A % of the SALE price. 0–99 |
| `finalPriceOverride` | string \| null |  | The rounded price the customer is asked to pay; null = the computed total. |
| `validUntil` | string \| null |  |  |
| `ctaUrl` | string \| null |  | Where the public page's button leads (WhatsApp, email, a URL). |
| `templateId` | uuid \| null |  | A quote template; null = the agency's default. |
| `textOverrides` | object |  | The template's editable texts, by key; null restores the template's text. |
| `imageOverrides` | object |  | The template's editable images (URLs), by key; null restores the template's image. |
| `expectedUpdatedAt` | datetime |  | The quote's updatedAt as you read it; the write is refused (409) if the quote changed since. |
| `metadata` | object |  |  |
| `dryRun` | boolean |  | Preview only: plan the change and return its effect without writing. |

## Input schema (JSON)

```json
{
  "type": "object",
  "properties": {
    "quoteId": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "travelers": {
      "type": "integer",
      "minimum": 1,
      "maximum": 40,
      "description": "Must equal the trip's headcount."
    },
    "marginPct": {
      "type": "number",
      "minimum": 0,
      "maximum": 99,
      "description": "A % of the SALE price."
    },
    "finalPriceOverride": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^-?\\d{1,9}(\\.\\d{1,2})?$"
        },
        {
          "type": "null"
        }
      ],
      "description": "The rounded price the customer is asked to pay; null = the computed total."
    },
    "validUntil": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
        },
        {
          "type": "null"
        }
      ]
    },
    "ctaUrl": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Where the public page's button leads (WhatsApp, email, a URL)."
    },
    "templateId": {
      "anyOf": [
        {
          "type": "string",
          "format": "uuid"
        },
        {
          "type": "null"
        }
      ],
      "description": "A quote template; null = the agency's default."
    },
    "textOverrides": {
      "type": "object",
      "additionalProperties": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 4000
          },
          {
            "type": "null"
          }
        ]
      },
      "propertyNames": {
        "minLength": 1,
        "maxLength": 100
      },
      "description": "The template's editable texts, by key; null restores the template's text."
    },
    "imageOverrides": {
      "type": "object",
      "additionalProperties": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 2000
          },
          {
            "type": "null"
          }
        ]
      },
      "propertyNames": {
        "minLength": 1,
        "maxLength": 100
      },
      "description": "The template's editable images (URLs), by key; null restores the template's image."
    },
    "expectedUpdatedAt": {
      "type": "string",
      "format": "date-time",
      "description": "The quote's updatedAt as you read it; the write is refused (409) if the quote changed since."
    },
    "metadata": {
      "type": "object",
      "additionalProperties": {
        "anyOf": [
          {
            "type": "string",
            "maxLength": 500
          },
          {
            "type": "null"
          }
        ]
      },
      "propertyNames": {
        "pattern": "^[A-Za-z0-9_.-]{1,40}$"
      }
    },
    "dryRun": {
      "type": "boolean",
      "description": "Preview only: plan the change and return its effect without writing."
    }
  },
  "required": [
    "quoteId"
  ],
  "additionalProperties": false
}
```
