---
title: "Create a quote (one-shot)"
method: POST
path: "/api/v1/quotes"
tags: ["Quotes"]
---

# Create a quote (one-shot)

`POST /api/v1/quotes`

## Request

- Base URL: `https://www.gerezi.com`
- URL: `https://www.gerezi.com/api/v1/quotes`
- Auth: HTTP bearer

Creates a complete devis in a single transaction: customer (lookup-or-upsert) + quote shell + N options + N×M line items. Optionally sends the devis to the customer (DRAFT → SENT + email) when `send: true`. Scope: quotes:write (and quotes:send if `send: true`).

## Request body

- object
  - `customer` union, required
    - object
      - `guest_id` string, required
    - object
      - `email` string, email, required
      - `first_name` string, required
      - `last_name` string, required
      - `phone` string
  - `title` string, required
  - `sector` string
  - `event_date` string, date-time, nullable
  - `event_location` string, nullable
  - `estimated_guests` integer, nullable
  - `internal_notes` string, nullable
  - `customer_narrative` string, nullable: Prose introduction shown to the customer on the public devis page and the PDF. Plain text; blank lines separate paragraphs. Frozen per version on send.
  - `expires_in_days` integer
  - `options` object[], required
    - `label` string, required
    - `description` string, nullable
    - `is_recommended` boolean
    - `deposit_percent` number
    - `line_items` object[], required
      - `menu_item_id` string, nullable: POS MenuItem id (must belong to the restaurant). Provenance + snapshot source; the stored price stays frozen after compose.
      - `unit` 'FLAT' | 'PER_PERSON': FLAT = forfait (does not scale with guests), PER_PERSON scales. Defaults from the catalogue's '(par pers.)' category convention when resolved, else FLAT.
      - `label` string
      - `quantity` number, required
      - `unit_price_excl_vat` number
      - `vat_rate` number: Decimal rate, e.g. 0.20 for 20%, 0.10, 0.055
      - `category` 'food' | 'beverage' | 'service' | 'equipment' | 'staff' | 'other'
      - `is_optional` boolean
      - `notes` string, nullable
  - `send` boolean: When true and the key has quotes:send, immediately transitions DRAFT → SENT and fires the customer email.

## Response `201`

Quote created

## Other responses

- `401`: Missing or invalid API key
- `403`: Key lacks required scope
- `422`: Validation error

---

[API](https://skmtc.dev/gerezi/apis/gerezi-restaurant-api.md) · [All operations](https://skmtc.dev/gerezi/apis/gerezi-restaurant-api/llms.txt) · [OpenAPI document](https://skmtc.dev/gerezi/apis/gerezi-restaurant-api/revisions/323b530e81cb?raw)
