---
title: "Update Quote Settings"
method: PUT
path: "/quote-settings"
tags: ["Quotes"]
---

# Update Quote Settings

`PUT /quote-settings`

## Request

- Base URL: `https://be.graph8.com/api/v1`
- URL: `https://be.graph8.com/api/v1/quote-settings`
- Auth: HTTP bearer

Org-wide quote branding, terms and sender identity. ORG ADMIN.

`GET /quote-settings` was already published; this is its write half. Admin
because `sender_email` decides whose name every quote goes out under.

## Headers

- `Authorization` string, nullable
- `X-Target-Org-Id` string, nullable

## Request body

- QuoteSettingsUpdateRequest: Org-wide quote branding, terms and sender identity. A CLOSED mirror of the app's `QuoteSettingsDTO`, not an open bag. Leaving it open would have achieved nothing: the app model uses pydantic's default `extra` behaviour, so an unrecognised branding field is dropped THERE whatever this one does. Closed, the caller gets a 422 naming the field; open, they get a 200 and settings that did not change. Every field is optional, and the app writes with `exclude_none`, so a field you omit is left alone rather than blanked.
  - `company_name` string, nullable
  - `company_logo_url` string, nullable
  - `default_terms` string, nullable
  - `default_privacy` string, nullable
  - `terms_url` string, nullable
  - `privacy_url` string, nullable
  - `default_payment_terms` string, nullable
  - `default_valid_days` integer, nullable
  - `quote_number_prefix` string, nullable
  - `accent_color` string, nullable
  - `footer_text` string, nullable
  - `terms_library` object[], nullable
  - `sender_name` string, nullable
  - `sender_email` string, nullable: Whose name every quote goes out under. Admin-only for that reason.
  - `sender_mode` string, nullable: `fixed` to always use `sender_email`, or `creator`.
  - `company_address` string, nullable
  - `company_phone` string, nullable
  - `company_email` string, nullable
  - `quote_acceptance_roam_notifications_enabled` boolean, nullable
  - `quote_acceptance_roam_channel_id` string, nullable
  - `quote_acceptance_roam_channel_name` string, nullable
  - `auto_close_deal_on_acceptance` boolean, nullable: Close the linked DEAL when a quote is accepted. Org-wide, and it changes what every future acceptance does to the pipeline.
  - `auto_advance_deal_on_quote_send` boolean, nullable
  - `default_billing_provider` string, nullable
  - `required_billing_fields` string[], nullable

## Response `200`

Successful Response

- ApiResponseQuotePayload
  - `data` QuotePayload, required: An open envelope for a quote, template, contact or job result.
  - `pagination` PaginationMeta
    - `page` integer, required: Current page number (1-indexed)
    - `limit` integer, required: Items per page
    - `total` integer, required: Total number of items
    - `has_next` boolean, required: Whether there are more pages
    - `next_cursor` string, nullable: Opaque cursor for the next page; null when there are no more items. Pass it back as the `cursor` query param to fetch the following page without computing page numbers.
    - `total_available` integer, nullable: Search endpoints only: how many records really match, when known. Can be larger than `total`, which is capped at the 10,000 results that can be paged. For company search this is a distinct-company estimate. Null when unknown; absent outside search.
    - `total_is_lower_bound` boolean, nullable: Search endpoints only: true when more records match than `total` shows (the result set is larger than the 10,000 results that can be paged). Absent outside search.
    - `notes` string[], nullable: Search endpoints only: plain-language notes about the result, e.g. that more records match than can be paged, or that a reversed `between` range was put in order.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/graph8/apis/graph8-developer-api.md) · [All operations](https://skmtc.dev/graph8/apis/graph8-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/graph8/apis/graph8-developer-api/revisions/89fc11143b70?raw)
