Devis — Lecture + écriture (pas de suppression)
Gestion des devis. Comme les factures, pas de DELETE (un devis envoyé reste traçable).
Source : server/publicApi/routes/billing.ts:186-303. Schéma : insertQuoteSchema dans shared/schema.ts.
Vue d'ensemble
| Méthode | Path | Scope |
|---|---|---|
GET | /quotes | quotes:read |
GET | /quotes/:id | quotes:read |
POST | /quotes | quotes:write |
PATCH | /quotes/:id | quotes:write |
Webhooks émis : quote.created, quote.updated, quote.accepted (status change → accepted).
Statuts canoniques
status | Description |
|---|---|
draft | Brouillon |
sent | Envoyé au client |
accepted | Accepté (déclenche quote.accepted) |
rejected | Refusé |
expired | Hors validité (validUntil dépassé) |
GET /quotes
Liste paginée triée par createdAt DESC.
json
{
"data": [
{
"id": 1,
"clientId": 42,
"quoteNumber": "D-2026-0042",
"status": "sent",
"totalHt": "5000.00",
"totalTtc": "6000.00",
"issueDate": "2026-04-01T00:00:00.000Z",
"validUntil": "2026-05-01T00:00:00.000Z"
}
],
"total": 28,
"limit": 50,
"offset": 0
}POST /quotes
Création d'un devis.
Body
json
{
"clientId": 42,
"quoteNumber": "D-2026-0042",
"status": "draft",
"totalHt": "5000.00",
"totalTtc": "6000.00",
"issueDate": "2026-04-27",
"validUntil": "2026-05-27",
"lines": [
{ "description": "Refonte site", "quantity": 1, "unitPrice": "5000.00", "vatRate": "20" }
]
}Dates en ISO 8601 (converties serveur). validUntil optionnel.
Webhook émis
quote.created.
PATCH /quotes/:id
Mise à jour partielle.
Webhooks émis
quote.updated(toujours)quote.accepted(sistatuspasse àaccepted)
Exemple — accepter un devis
bash
curl -X PATCH \
-H "x-api-key: spk_..." \
-H "Content-Type: application/json" \
-d '{"status":"accepted","acceptedAt":"2026-04-27T15:00:00.000Z"}' \
https://beta.stormeo.io/api/public/v1/quotes/42Workflow type : un devis
acceptedpeut déclencher la création automatique d'une facture côté agence (logique métier interne, hors périmètre Public API).