---
title: "Create quotation"
method: POST
path: "/quotations"
tags: ["Objects"]
---

# Create quotation

`POST /quotations`

Creates a new quotation with line items. Requires clientId (clt_) and templateId (tpl_). Custom field values use `cf_*` keys — see the [Custom fields](/api-v2/custom-fields) guide.

## Request body

- QuotationCreateInput
  - `clientId` string, required — 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, required — Document template ID (tpl_ prefix)
  - `date` string, date-time, required — 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[], required — 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)
