Devis
Lister, lire, créer, modifier et supprimer des devis via l'API. Champs renvoyés, corps de création et passage au statut envoyé.
La ressource quotes permet de gérer vos devis. L'enveloppe (authentification, pagination, format des réponses) est identique aux autres ressources.
Endpoints
| Méthode | Chemin | Scope |
|---|---|---|
GET | /api/v1/quotes | read:quotes |
POST | /api/v1/quotes | write:quotes |
GET | /api/v1/quotes/{id} | read:quotes |
PATCH | /api/v1/quotes/{id} | write:quotes |
DELETE | /api/v1/quotes/{id} | write:quotes |
POST | /api/v1/quotes/{id}/send | write:quotes |
Les statuts possibles d'un devis sont décrits dans Devis et factures.
Lister les devis
Paramètres de requête : limit, offset (voir Pagination) et status.
Le filtre status accepte tout l'énum QuoteStatus : DRAFT, SENT, SENT_FOR_SIGNATURE, ACCEPTED, REJECTED, REJECTED_SIGNATURE, EXPIRED, ARCHIVED.
Champs renvoyés
id, number, title, status, clientName, clientCompany, clientEmail, taxRate, validityDays, currency, opportunityId, issuedAt, sentAt, createdAt, updatedAt.
Lire un devis
GET /api/v1/quotes/{id} renvoie les mêmes champs que la liste, plus : clientAddress, clientSiret, clientVatNumber, introText, terms, notes, signedAt, ainsi que les lignes :
lines[] : id, position, description, quantity, unitPrice, unit, discountPercent, taxRate.
Créer un devis
| Champ | Type | Requis | Notes |
|---|---|---|---|
clientName | texte, 1 à 200 caractères | Oui | |
clientEmail | email, 200 caractères max | Oui | |
currency | texte, 3 caractères | Non | EUR par défaut |
opportunityId | texte | Non | Rattacher à une opportunité |
contactId | texte | Non | Rattacher à un contact |
lines | tableau, 1 à 100 éléments | Oui | Au moins une ligne |
lines[].title | texte, 1 à 500 caractères | Oui | |
lines[].quantity | nombre, supérieur à 0 | Oui | |
lines[].unitPrice | nombre, 0 ou plus | Oui | |
lines[].taxRate | nombre, entre 0 et 100 | Non |
Nom des champs de ligne
Le libellé d'une ligne s'envoie dans lines[].title, mais il ressort sous lines[].description en lecture (GET). C'est le même texte sous deux noms, pensez-y si vous comparez ce que vous envoyez à ce que vous relisez.
Modifier un devis
PATCH /api/v1/quotes/{id} met à jour un devis en brouillon. Tous les champs sont optionnels : n'envoyez que ceux à changer.
| Champ | Type | Notes |
|---|---|---|
title | texte | Titre du devis |
validityDays | nombre, 0 à 365 | Durée de validité |
taxRate | nombre, 0 à 100 | Taux de TVA |
notes | texte | Notes |
terms | texte | Conditions |
lines | tableau | Remplace l'intégralité des lignes existantes |
- Réservé au statut
DRAFT: sinon 409quote_not_draft. linesest un remplacement complet, pas une fusion : renvoyez toutes les lignes voulues.
Supprimer un devis
DELETE /api/v1/quotes/{id} supprime un devis en brouillon (DRAFT uniquement, sinon 409 quote_not_draft). La suppression est douce (soft delete) : le devis quitte vos listes. Réponse : { "ok": true }.
Marquer un devis comme envoyé
POST /api/v1/quotes/{id}/send fait passer le devis du statut DRAFT à SENT (et renseigne sentAt). Le corps est vide.
Cet endpoint n'envoie pas d'email
Dans l'API v1, /send change seulement le statut du devis (DRAFT → SENT) : il n'envoie aucun email au client. L'envoi par email, depuis votre boîte connectée, se fait dans l'application. Utilisez cet endpoint pour refléter dans Naskel un devis que vous avez transmis par un autre canal.
- Si le devis n'est pas en
DRAFT, l'appel renvoie 409quote_not_draft. - Cet endpoint ne supporte pas l'idempotence (
Idempotency-Key). - Réponse :
{ "data": { "id": "…", "number": "…", "status": "SENT", "sentAt": "…", "updatedAt": "…" } }