> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qwoty.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Quote

> Retrieve the complete quote for a specific project

## Authorization

<ParamField header="Authorization" type="string" required>
  Bearer token for authentication. Format: `Bearer qwoty_your_token`
</ParamField>

## Path Parameters

<ParamField path="id" type="string" required>
  UUID of the project
</ParamField>

## Examples

<CodeGroup>
  ```bash cURL theme={null}
  curl https://qwoty.app/api/quote/550e8400-e29b-41d4-a716-446655440000 \
    -H "Authorization: Bearer qwoty_your_token"
  ```

  ```javascript JavaScript theme={null}
  const id = '550e8400-e29b-41d4-a716-446655440000'

  const response = await fetch(`https://qwoty.app/api/quote/${id}`, {
    headers: {
      Authorization: 'Bearer qwoty_your_token',
    },
  })

  const data = await response.json()
  ```

  ```python Python theme={null}
  import requests

  id = '550e8400-e29b-41d4-a716-446655440000'

  response = requests.get(
    f'https://qwoty.app/api/quote/{id}',
      headers={
          'Authorization': 'Bearer qwoty_your_token'
      }
  )

  data = response.json()
  ```
</CodeGroup>

## Response

<ResponseField name="success" type="boolean">
  Indicates if the request was successful
</ResponseField>

<ResponseField name="data" type="object">
  The quote data wrapper

  <Expandable title="Quote Object">
    <ResponseField name="quote" type="object">
      Complete quote information

      <Expandable title="Quote Structure">
        <ResponseField name="id" type="string">
          Unique quote identifier (UUID)
        </ResponseField>

        <ResponseField name="number" type="string">
          Human-readable quote number
        </ResponseField>

        <ResponseField name="status" type="string">
          Quote status (e.g., 'draft', 'sent', 'accepted')
        </ResponseField>

        <ResponseField name="publish" type="boolean">
          Indicates whether the quote is currently published
        </ResponseField>

        <ResponseField name="issue_date" type="string">
          First recipient send date (`email_sent_timestamp` of the first sent recipient)
        </ResponseField>

        <ResponseField name="owner" type="object">
          Quote owner information

          <Expandable title="Owner">
            <ResponseField name="id" type="string">Owner profile UUID</ResponseField>
            <ResponseField name="first_name" type="string">First name</ResponseField>
            <ResponseField name="last_name" type="string">Last name</ResponseField>
            <ResponseField name="email" type="string">Email address</ResponseField>

            <ResponseField name="external_ids" type="object">
              External system identifiers: `crm`, `erp`, `accounting`
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="expiration_date" type="string">
          ISO 8601 expiration date
        </ResponseField>

        <ResponseField name="currency" type="string">
          Currency code (e.g., 'EUR', 'USD')
        </ResponseField>

        <ResponseField name="language" type="string">
          Language code (e.g., 'en', 'fr')
        </ResponseField>

        <ResponseField name="title" type="string">
          Quote title
        </ResponseField>

        <ResponseField name="opportunity_id" type="string">
          Associated CRM opportunity ID
        </ResponseField>

        <ResponseField name="pdf_link" type="string | null">
          Pre-signed URL (valid 1 hour) pointing to the generated PDF. `null` if no PDF has been generated yet for this quote (e.g. the quote has never been downloaded or signed).
        </ResponseField>

        <ResponseField name="dealroom_link" type="string">
          URL to customer dealroom
        </ResponseField>

        <ResponseField name="business_unit" type="object">
          Business unit information including brand, address, logo, and tax IDs
        </ResponseField>

        <ResponseField name="customer" type="object">
          Customer information including company details, contacts, billing and shipping addresses

          <Expandable title="Customer">
            <ResponseField name="id" type="string">Customer UUID</ResponseField>
            <ResponseField name="type" type="string">Entity type: `company` or `individual`</ResponseField>
            <ResponseField name="name" type="string">Company or individual name</ResponseField>

            <ResponseField name="external_ids" type="object">
              External system identifiers: `crm`, `erp`, `accounting`
            </ResponseField>

            <ResponseField name="contacts" type="array">List of contacts with `id`, `first_name`, `last_name`, `email`, `role`</ResponseField>

            <ResponseField name="billing_address" type="object">
              Billing address with `line1`, `line2`, `city`, `postal_code`, `country` (full name), `country_code` (ISO 3166-1 alpha-2)
            </ResponseField>

            <ResponseField name="shipping_address" type="object">
              Shipping address with `line1`, `line2`, `city`, `postal_code`, `country` (full name), `country_code` (ISO 3166-1 alpha-2)
            </ResponseField>

            <ResponseField name="custom_properties" type="object">
              Key/value map of custom field values defined for this customer. Keys are the API names of the custom field definitions. Only present when at least one custom field has a value.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="pricing_table" type="object">
          Complete pricing structure with sections, line items, and periods

          <Expandable title="Pricing Table">
            <ResponseField name="catalog" type="object">
              Associated catalog data
            </ResponseField>

            <ResponseField name="pricebook" type="object">
              Associated pricebook data
            </ResponseField>

            <ResponseField name="markup" type="object">
              Markup configuration (enabled, percent)
            </ResponseField>

            <ResponseField name="settings" type="object">
              Display settings (is\_prices\_hidden, etc.)
            </ResponseField>

            <ResponseField name="sections" type="array">
              Array of quote sections with line items, organized by phases/periods
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="summary" type="object">
          Financial summary (breaking contract)

          <Expandable title="Summary">
            <ResponseField name="one_off" type="object">
              One-off totals: `net_amount`, `tax_amount`, `total_amount`
            </ResponseField>

            <ResponseField name="recurring" type="array">
              Recurring totals by interval with `interval`, `interval_count`, and amounts
            </ResponseField>

            <ResponseField name="metrics" type="object">
              KPI metrics: `mrr`, `arr`, `tcv`
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="discounts" type="object">
          Line-level and global discounts applied
        </ResponseField>

        <ResponseField name="taxes" type="object">
          Sales tax configuration and amounts
        </ResponseField>

        <ResponseField name="payment_terms" type="object">
          Payment terms and installments
        </ResponseField>

        <ResponseField name="payment_methods" type="object">
          Accepted payment methods
        </ResponseField>

        <ResponseField name="customer_balance" type="object">
          Customer account balance information
        </ResponseField>

        <ResponseField name="custom_properties" type="object">
          Key/value map of custom field values defined on the quote. Keys are the `api_name` of each custom field definition. All fields with a defined `api_name` are included; the value may be an empty string when no value has been set.
        </ResponseField>

        <ResponseField name="content" type="array">
          Content blocks for quote customization (text, images, etc.)
        </ResponseField>

        <ResponseField name="contracts" type="array">
          Associated contracts with signature status
        </ResponseField>

        <ResponseField name="recipients" type="object">
          Signature recipients grouped by `signers` and `viewers`, with `signature_type` and `signing_order`
        </ResponseField>

        <ResponseField name="metadata" type="object">
          Creation/update timestamps and context metadata
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json Success Response (Simplified) theme={null}
  {
    "success": true,
    "data": {
      "quote": {
        "id": "550e8400-e29b-41d4-a716-446655440000",
        "number": "Q-2024-001",
        "status": "sent",
        "publish": true,
        "issue_date": "2026-03-10T09:15:00.000Z",
        "owner": {
          "id": "2f4c94f0-a27d-45e3-8b5e-b4ad0c9f57c9",
          "first_name": "Paul",
          "last_name": "Martin",
          "email": "paul@acme.com",
          "external_ids": {
            "crm": "CRM-7654321",
            "erp": "ERP-7654321",
            "accounting": "ACC-7654321"
          }
        },
        "expiration_date": "2024-12-31T23:59:59Z",
        "currency": "EUR",
        "language": "en",
        "title": "Q4 2024 Services Proposal",
        "opportunity_id": "opp_123456",
        "pdf_link": "https://storage.qwoty.io/project/path/to/quote.pdf?token=...&expires=1744233600",
        "dealroom_link": "https://qwoty.app/dealroom/abc123",
        "business_unit": {
          "id": "bu_123",
          "type": "company",
          "brand": "Acme",
          "name": "Acme Corporation",
          "logo": {
            "url": "https://storage.qwoty.io/logos/acme.png",
            "alt": "Acme Logo"
          },
          "tax_ids": [
            {
              "code": "VAT",
              "value": "FR12345678901"
            }
          ],
          "address": {
            "line1": "123 Main Street",
            "city": "Paris",
            "postal_code": "75001",
            "country": "France",
            "country_code": "FR"
          }
        },
        "customer": {
          "id": "cust_456",
          "type": "company",
          "name": "Customer Inc.",
          "external_ids": {
            "crm": "CRM-1234567",
            "erp": null,
            "accounting": "ACC-1234567"
          },
          "contacts": [
            {
              "id": "contact_789",
              "first_name": "John",
              "last_name": "Doe",
              "email": "john.doe@customer.com",
              "role": "decision_maker"
            }
          ],
          "billing_address": {
            "line1": "456 Customer Ave",
            "line2": null,
            "city": "Lyon",
            "postal_code": "69001",
            "country": "France",
            "country_code": "FR"
          },
          "shipping_address": null,
          "custom_properties": {
            "industry": "SaaS",
            "account_manager": "Sophie Dubois"
          }
        },
        "pricing_table": {
          "settings": {
            "is_prices_hidden": false
          },
          "sections": [
            {
              "id": "section_001",
              "type": "standard",
              "rank": 1,
              "name": "Professional Services",
              "phases": [
                {
                  "id": "period_001",
                  "name": "Year 1",
                  "rank": 1,
                  "line_items": [
                    {
                      "id": "item_001",
                      "rank": 1,
                      "product": {
                        "product_id": "prod_123",
                        "name": "Consulting Services",
                        "unit_of_measure": "hour"
                      },
                      "quantity": 100,
                      "pricing": {
                        "model": "per_unit",
                        "list_price": 150.0,
                        "currency": "EUR"
                      }
                    }
                  ]
                }
              ]
            }
          ]
        },
        "summary": {
          "one_off": {
            "net_amount": 50000.0,
            "tax_amount": 10000.0,
            "total_amount": 60000.0
          },
          "recurring": [
            {
              "interval": "month",
              "interval_count": 1,
              "net_amount": 5000.0,
              "tax_amount": 1000.0,
              "total_amount": 6000.0
            }
          ],
          "metrics": {
            "mrr": 5000.0,
            "arr": 60000.0,
            "tcv": 180000.0
          }
        },
        "recipients": {
          "signature_type": "restricted",
          "signing_order": "parallel",
          "signers": [
            {
              "rank": 1,
              "name": "Michel Lee",
              "email": "michel.lee@external.com",
              "type": "external",
              "status": "not_viewed"
            }
          ],
          "viewers": [
            {
              "name": "Emmanuel Laureau",
              "email": "emmanuel.laureau@company.com",
              "user_id": "usr_001",
              "type": "internal",
              "status": "not_viewed"
            }
          ]
        },
        "custom_properties": {
          "sales_channel": "inbound",
          "contract_duration": "12"
        },
        "metadata": {
          "created_at": "2024-12-01T10:00:00Z",
          "updated_at": "2024-12-15T14:30:00Z",
          "template_id": "tmpl_123",
          "workspace_id": "ws_123",
          "organisation_id": "org_123"
        }
      }
    }
  }
  ```
</ResponseExample>

## Error Responses

<ResponseExample>
  ```json Not Found theme={null}
  {
    "success": false,
    "error": "Project not found"
  }
  ```

  ```json Unauthorized theme={null}
  {
    "success": false,
    "error": "Invalid API token"
  }
  ```

  ```json Quote Not Generated theme={null}
  {
    "success": false,
    "error": "Quote has not been generated for this project"
  }
  ```
</ResponseExample>

## Notes

The quote endpoint returns a comprehensive structure including:

* **Seller & Customer**: Complete company and contact information, including custom field values (`custom_properties`)
* **Pricing Table**: All products/services organized by sections and time periods
* **Summary**: One-off totals, recurring totals by interval, and metrics (`mrr`, `arr`, `tcv`)
* **Discounts & Taxes**: Applied discounts and tax calculations
* **Content & Contracts**: Customizable content blocks and signature-ready contracts
* **Recipients**: Signature recipients grouped by signers/viewers

This endpoint is typically used to:

* Display quotes in customer dealrooms
* Generate PDF documents
* Integrate with CRM systems
* Track quote metrics and performance
