Quotes
4 endpoints
/v1/quotesLister les devis
Retourne la liste paginée des devis du client (cursor v2). Tri stable
created_at DESC, id DESC.
Les devis archivés (archived_at IS NOT NULL) sont exclus par
défaut — l'API publique ne les expose pas. Pour récupérer un devis
archivé, utiliser le dashboard.
Filtres
?status— filtre exact (draft,sent,signed,cancelled)
quotes:readQuery parameters
| Name | Type | required | Description |
|---|---|---|---|
status | string | optional | Filtre exact sur le cycle de vie du devis. |
Responses
| Status | Description |
|---|---|
200 | Liste paginée des devis. |
400 | La requête est mal formée (header manquant, JSON invalide, paramètre invalide). |
401 | Clé API inconnue ou format invalide. |
403 | Refus d'autorisation. Deux causes, distinguées par |
429 | Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint. |
500 | Erreur serveur inattendue. Toujours fournir le |
Example request
curl -X GET 'https://app.capturia.io/api/v1/quotes' \
-H 'Authorization: Bearer cap_live_<your-key>' \
-H 'Content-Type: application/json'/v1/quotesCréer un devis
Crée un devis vide (status="draft", blocks=[]). Pour ajouter
des lignes, calculer les montants, ou envoyer le devis au prospect,
utiliser le dashboard ou l'endpoint POST /v1/quotes/{id}/send.
Le quote_number doit être unique par client (contrainte DB) — un
doublon retourne 500 internal_error (pas encore mappé en
409 duplicate_resource).
quotes:writeRequest body
#/components/schemas/QuoteCreate
Responses
| Status | Description |
|---|---|
201 | Devis créé. |
400 | Validation des paramètres ou du body a échoué. |
401 | Clé API inconnue ou format invalide. |
403 | Refus d'autorisation. Deux causes, distinguées par |
415 | Le header |
429 | Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint. |
500 | Erreur serveur inattendue. Toujours fournir le |
Example request
curl -X POST 'https://app.capturia.io/api/v1/quotes' \
-H 'Authorization: Bearer cap_live_<your-key>' \
-H 'Content-Type: application/json' \
-d '{
"quote_number": "DEV-2026-0042",
"prospect_name": "Alex Tremblay",
"prospect_email": "[email protected]",
"prospect_phone": "+15145551234",
"prospect_company": "Acme Inc.",
"valid_until": "2026-06-30",
"payment_terms": "Net 30"
}'/v1/quotes/{id}Mettre à jour un devis
Met à jour les champs fournis du devis (champs absents conservés).
Au moins un champ doit être fourni sinon 400 no_fields.
Les montants (subtotal, tps_amount, tvq_amount, total) ne
sont pas éditables via PATCH — calculés serveur-side à partir des
blocks (gérés via le dashboard).
Modifier status directement contourne le flow standard
POST /v1/quotes/{id}/send (qui horodate sent_at automatiquement).
À utiliser avec discernement (ex passer un draft à cancelled).
Les devis archivés (archived_at IS NOT NULL) ne sont pas
modifiables — retourne 404 resource_not_found.
quotes:writeRequest body
#/components/schemas/QuoteUpdate
Responses
| Status | Description |
|---|---|
200 | Devis mis à jour. |
400 | Validation des paramètres ou du body a échoué. |
401 | Clé API inconnue ou format invalide. |
403 | Refus d'autorisation. Deux causes, distinguées par |
404 | La ressource demandée n'existe pas (ou pas dans le scope du tenant). |
429 | Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint. |
500 | Erreur serveur inattendue. Toujours fournir le |
Example request
curl -X PATCH 'https://app.capturia.io/api/v1/quotes/{id}' \
-H 'Authorization: Bearer cap_live_<your-key>' \
-H 'Content-Type: application/json' \
-d '{
"prospect_name": "Alexandre Tremblay",
"valid_until": "2026-07-31",
"payment_terms": "Net 60"
}'/v1/quotes/{id}/sendMarquer un devis comme envoyé
Met à jour status="sent" et horodate sent_at. N'envoie pas
d'email réellement — la délivrance email passe par le dashboard
Capturia (Resend + templates). Cette limitation est documentée
dans la réponse via un champ top-level warning.
Forme de réponse non-standard
La réponse retourne {data, warning} au lieu de {data} seul —
le champ warning top-level n'est pas dans la convention v1
standard. Documenter dans le code intégrateur que ce champ peut
être présent et indique une limitation fonctionnelle, pas une
erreur.
États terminaux
409 already_signedsi le devis est déjà signé (statut terminal).409 quote_cancelledsi le devis a été annulé (non renvoyable).
Aucun body n'est requis — l'opération est purement transitionnelle.
quotes:writeRequest body
Body optionnel — aucun champ utilisé aujourd'hui (réservé pour usage futur).
Responses
| Status | Description |
|---|---|
200 | Devis marqué comme envoyé. Réponse non-standard avec un champ
|
401 | Clé API inconnue ou format invalide. |
403 | Refus d'autorisation. Deux causes, distinguées par |
404 | La ressource demandée n'existe pas (ou pas dans le scope du tenant). |
409 | La requête est syntaxiquement valide mais viole une règle métier. |
429 | Le quota de requêtes par fenêtre est dépassé pour cette clé API ou cet endpoint. |
500 | Erreur serveur inattendue. Toujours fournir le |
Example request
curl -X POST 'https://app.capturia.io/api/v1/quotes/{id}/send' \
-H 'Authorization: Bearer cap_live_<your-key>' \
-H 'Content-Type: application/json'