Obtenir un devis
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"
}
]
},
"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"
}
}
}
}
Devis
Obtenir un devis
Récupérer le devis complet pour un projet spécifique
GET
/
api
/
quote
/
{id}
Obtenir un devis
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"
}
]
},
"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"
}
}
}
}
Autorisation
string
requis
Jeton Bearer pour l’authentification. Format :
Bearer qwoty_your_tokenParamètres de chemin
string
requis
UUID du projet
Exemples
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()
Réponse
boolean
Indique si la requête a été effectuée avec succès
object
L’enveloppe contenant les données du devis
Afficher Objet Devis
Afficher Objet Devis
object
Informations complètes du devis
Afficher Structure du devis
Afficher Structure du devis
string
Identifiant unique du devis (UUID)
string
Numéro de devis lisible par l’humain
string
Statut du devis (ex. : ‘draft’, ‘sent’, ‘accepted’)
boolean
Indique si le devis est actuellement publié
string
Date du premier envoi au destinataire (
email_sent_timestamp du premier destinataire envoyé)object
string
Date d’expiration au format ISO 8601
string
Code de devise (ex. : ‘EUR’, ‘USD’)
string
Code de langue (ex. : ‘en’, ‘fr’)
string
Titre du devis
string
ID de l’opportunité CRM associée
string | null
URL pré-signée (valide 1 heure) pointant vers le PDF généré.
null si aucun PDF n’a encore été généré pour ce devis (ex. : le devis n’a jamais été téléchargé ou signé).string
URL vers la salle de négociation client
object
Informations sur l’unité commerciale, incluant la marque, l’adresse, le logo et les numéros fiscaux
object
Informations client incluant les détails de l’entreprise, les contacts, les adresses de facturation et de livraison
Afficher Client
Afficher Client
string
UUID du client
string
Type d’entité :
company ou individualstring
Nom de l’entreprise ou de la personne
object
Identifiants des systèmes externes :
crm, erp, accountingarray
Liste des contacts avec
id, first_name, last_name, email, roleobject
Adresse de facturation avec
line1, line2, city, postal_code, country (nom complet), country_code (ISO 3166-1 alpha-2)object
Adresse de livraison avec
line1, line2, city, postal_code, country (nom complet), country_code (ISO 3166-1 alpha-2)object
Carte clé/valeur des valeurs de champs personnalisés définis pour ce client. Les clés sont les noms API des définitions de champs personnalisés. Présent uniquement lorsqu’au moins un champ personnalisé a une valeur.
object
Structure tarifaire complète avec sections, lignes et périodes
object
object
Remises appliquées au niveau des lignes et au niveau global
object
Configuration et montants des taxes
object
Conditions de paiement et échéanciers
object
Moyens de paiement acceptés
object
Informations sur le solde du compte client
array
Blocs de contenu pour la personnalisation du devis (textes, images, etc.)
array
Contrats associés avec le statut de signature
object
Destinataires de signature regroupés par
signers et viewers, avec signature_type et signing_orderobject
Horodatages de création/mise à jour et métadonnées contextuelles
{
"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"
}
]
},
"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"
}
}
}
}
Réponses d’erreur
{
"success": false,
"error": "Project not found"
}
{
"success": false,
"error": "Invalid API token"
}
{
"success": false,
"error": "Quote has not been generated for this project"
}
Notes
L’endpoint de devis retourne une structure complète incluant :- Vendeur & Client : Informations complètes sur l’entreprise et les contacts, y compris les valeurs des champs personnalisés (
custom_properties) - Tableau de tarification : Tous les produits/services organisés par sections et périodes
- Résumé : Totaux ponctuels, totaux récurrents par intervalle et indicateurs (
mrr,arr,tcv) - Remises & Taxes : Remises appliquées et calculs de taxes
- Contenu & Contrats : Blocs de contenu personnalisables et contrats prêts à la signature
- Destinataires : Destinataires de signature regroupés par signataires/observateurs
- Afficher les devis dans les salles de négociation client
- Générer des documents PDF
- S’intégrer avec les systèmes CRM
- Suivre les indicateurs et les performances des devis
Cette page vous a-t-elle été utile ?
⌘I

