---
title: "Update a quotation"
method: PATCH
path: "/quotations/{id}"
tags: ["Objects"]
---

# Update a quotation

`PATCH /quotations/{id}`

Updates an existing quotation (partial update). Line items and tags replace the full set when provided. Custom field values use `cf_*` keys and are merged with existing values.

## Path parameters

- `id` string, required

## Request body

- QuotationUpdateInput
  - `clientId` string — Contact or company ID (clt_ prefix)
  - `contactId` string — Optional contact person ID (clt_ prefix) when clientId is a company
  - `dealId` string — Deal ID (dl_ prefix)
  - `templateId` string — Document template ID (tpl_ prefix)
  - `date` string, date-time — Quotation date
  - `expiryDate` string, date-time — Expiry date
  - `subject` string — Subject
  - `title` string — Internal title
  - `status` 'DRAFT' | 'SENT' | 'ACCEPTED' | 'REJECTED' — Initial status (defaults to DRAFT)
  - `isInclusiveTax` boolean — Whether prices include tax
  - `contentHtml` string — Document HTML (defaults from template when omitted)
  - `internalNotes` string — Internal notes
  - `salesPersonId` string — Sales person user ID (usr_ prefix)
  - `currency` string — ISO 4217 currency code
  - `conversionRate` number — Quotation currency to team currency rate
  - `quotationProducts` QuotationLineItem[] — Line items
    - `name` string, required — Line item name
    - `productId` string, nullable — Product ID (prd_ prefix)
    - `quantity` number, required — Quantity
    - `price` number, required — Unit price
    - `description` string, nullable — Line item description
    - `tax` number — Tax percentage when taxRateId is omitted
    - `taxRateId` string, nullable — Tax rate ID (txr_ prefix)
    - `discount` number — Discount value
    - `discountType` 'fixed' | 'percent' — Discount type
    - `viewType` 'LINE_ITEM' | 'HEADING' — Line display type
    - `scope` string, nullable — Optional scope label
  - `tags` string[] — Tag IDs (tag_ prefix)

## Response `200`

OK

- Quotation
  - `id` string, required — Quotation ID (qtn_ prefix)
  - `number` string, required — Auto-generated quotation number
  - `date` string, date-time, required — Quotation date
  - `status` 'DRAFT' | 'SENT' | 'ACCEPTED' | 'REJECTED', required — Quotation status
  - `subject` string, nullable — Subject
  - `expiryDate` string, date-time, nullable — Expiry date
  - `currency` string, required — ISO 4217 currency code
  - `conversionRate` number — Quotation currency to team currency rate
  - `isInclusiveTax` boolean — Whether prices include tax
  - `clientId` string, nullable — Contact or company ID (clt_ prefix)
  - `contactId` string, nullable — Optional contact person ID (clt_ prefix) when clientId is a company
  - `dealId` string, nullable — Deal ID (dl_ prefix)
  - `salesPersonId` string, nullable — Sales person user ID (usr_ prefix)
  - `templateId` string, nullable — Document template ID (tpl_ prefix)
  - `contentHtml` string, nullable — Rendered document HTML
  - `internalNotes` string, nullable — Internal notes
  - `totalAmount` number — Total including tax
  - `subtotalAmount` number — Subtotal before tax
  - `totalTaxAmount` number — Total tax amount
  - `totalDiscountAmount` number — Total discount amount
  - `tagIds` string[] — Tag IDs (tag_ prefix)
  - `lineItems` QuotationLineItem[] — Line items (included on get; empty on list)
    - `name` string, required — Line item name
    - `productId` string, nullable — Product ID (prd_ prefix)
    - `quantity` number, required — Quantity
    - `price` number, required — Unit price
    - `description` string, nullable — Line item description
    - `tax` number — Tax percentage when taxRateId is omitted
    - `taxRateId` string, nullable — Tax rate ID (txr_ prefix)
    - `discount` number — Discount value
    - `discountType` 'fixed' | 'percent' — Discount type
    - `viewType` 'LINE_ITEM' | 'HEADING' — Line display type
    - `scope` string, nullable — Optional scope label
  - `markedAcceptedOn` string, date-time, nullable — When the quotation was accepted
  - `markedRejectedOn` string, date-time, nullable — When the quotation was rejected
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, nullable

## Other responses

- `400` — Validation error or bad request
- `401` — Missing or invalid API key
- `403` — Insufficient permission
- `404` — Resource not found
- `429` — Rate limit exceeded

---

[API](https://skmtc.net/heffl/apis/heffl-api-v2-beta.md) · [All operations](https://skmtc.net/heffl/apis/heffl-api-v2-beta/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/heffl/heffl-api-v2-beta/versions/27006cfef4d8/schema)
