Get Quote
curl --request GET \
--url https://qwoty.app/api/quote/{id} \
--header 'Authorization: <authorization>'import requests
url = "https://qwoty.app/api/quote/{id}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://qwoty.app/api/quote/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://qwoty.app/api/quote/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://qwoty.app/api/quote/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://qwoty.app/api/quote/{id}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://qwoty.app/api/quote/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"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"
}
}
}
}
Quotes
Get Quote
Retrieve the complete quote for a specific project
GET
/
api
/
quote
/
{id}
Get Quote
curl --request GET \
--url https://qwoty.app/api/quote/{id} \
--header 'Authorization: <authorization>'import requests
url = "https://qwoty.app/api/quote/{id}"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://qwoty.app/api/quote/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://qwoty.app/api/quote/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://qwoty.app/api/quote/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://qwoty.app/api/quote/{id}")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://qwoty.app/api/quote/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"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"
}
}
}
}
Authorization
string
required
Bearer token for authentication. Format:
Bearer qwoty_your_tokenPath Parameters
string
required
UUID of the project
Examples
curl https://qwoty.app/api/quote/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer qwoty_your_token"
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()
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()
Response
boolean
Indicates if the request was successful
object
The quote data wrapper
Show Quote Object
Show Quote Object
object
Complete quote information
Show Quote Structure
Show Quote Structure
string
Unique quote identifier (UUID)
string
Human-readable quote number
string
Quote status (e.g., ‘draft’, ‘sent’, ‘accepted’)
boolean
Indicates whether the quote is currently published
string
First recipient send date (
email_sent_timestamp of the first sent recipient)object
string
ISO 8601 expiration date
string
Currency code (e.g., ‘EUR’, ‘USD’)
string
Language code (e.g., ‘en’, ‘fr’)
string
Quote title
string
Associated CRM opportunity ID
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).string
URL to customer dealroom
object
Business unit information including brand, address, logo, and tax IDs
object
Customer information including company details, contacts, billing and shipping addresses
Show Customer
Show Customer
string
Customer UUID
string
Entity type:
company or individualstring
Company or individual name
object
External system identifiers:
crm, erp, accountingarray
List of contacts with
id, first_name, last_name, email, roleobject
Billing address with
line1, line2, city, postal_code, country (full name), country_code (ISO 3166-1 alpha-2)object
Shipping address with
line1, line2, city, postal_code, country (full name), country_code (ISO 3166-1 alpha-2)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.
object
Complete pricing structure with sections, line items, and periods
object
object
Line-level and global discounts applied
object
Sales tax configuration and amounts
object
Payment terms and installments
object
Accepted payment methods
object
Customer account balance information
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.array
Content blocks for quote customization (text, images, etc.)
array
Associated contracts with signature status
object
Signature recipients grouped by
signers and viewers, with signature_type and signing_orderobject
Creation/update timestamps and context metadata
{
"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"
}
}
}
}
Error Responses
{
"success": false,
"error": "Project not found"
}
{
"success": false,
"error": "Invalid API token"
}
{
"success": false,
"error": "Quote has not been generated for this project"
}
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
- Display quotes in customer dealrooms
- Generate PDF documents
- Integrate with CRM systems
- Track quote metrics and performance
Was this page helpful?
⌘I

