EN

Quotes

4 endpoints

get/v1/quotes

Lister 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)
Scopes requis: quotes:read

Paramètres de requête

NomTypeobligatoireDescription
statusstringoptionnelFiltre exact sur le cycle de vie du devis.

Responses

StatusDescription
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 code : insufficient_scope (la clé ne possède pas le scope requis — details.required_scope) ou feature_not_available (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — details.feature nomme la fonctionnalité, ex. public_api, quotes). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.

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 request_id au support.

Exemple de requête

curl -X GET 'https://app.capturia.io/api/v1/quotes' \
  -H 'Authorization: Bearer cap_live_<your-key>' \
  -H 'Content-Type: application/json'
post/v1/quotes

Cré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).

Scopes requis: quotes:write

Corps de requête

#/components/schemas/QuoteCreate

Responses

StatusDescription
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 code : insufficient_scope (la clé ne possède pas le scope requis — details.required_scope) ou feature_not_available (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — details.feature nomme la fonctionnalité, ex. public_api, quotes). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.

415

Le header Content-Type est manquant ou non supporté pour cet endpoint.

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 request_id au support.

Exemple de requête

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"
}'
patch/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.

Scopes requis: quotes:write

Corps de requête

#/components/schemas/QuoteUpdate

Responses

StatusDescription
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 code : insufficient_scope (la clé ne possède pas le scope requis — details.required_scope) ou feature_not_available (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — details.feature nomme la fonctionnalité, ex. public_api, quotes). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.

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 request_id au support.

Exemple de requête

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"
}'
post/v1/quotes/{id}/send

Marquer 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_signed si le devis est déjà signé (statut terminal).
  • 409 quote_cancelled si le devis a été annulé (non renvoyable).

Aucun body n'est requis — l'opération est purement transitionnelle.

Scopes requis: quotes:write

Corps de requête

Body optionnel — aucun champ utilisé aujourd'hui (réservé pour usage futur).

Responses

StatusDescription
200

Devis marqué comme envoyé. Réponse non-standard avec un champ warning top-level signalant que l'API ne déclenche pas l'envoi email réel.

401

Clé API inconnue ou format invalide.

403

Refus d'autorisation. Deux causes, distinguées par code : insufficient_scope (la clé ne possède pas le scope requis — details.required_scope) ou feature_not_available (l'API publique ou le module visé n'est pas inclus dans le forfait du compte — details.feature nomme la fonctionnalité, ex. public_api, quotes). Un refus de forfait est définitif pour la clé : inutile de réessayer, le compte doit changer de forfait.

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 request_id au support.

Exemple de requête

curl -X POST 'https://app.capturia.io/api/v1/quotes/{id}/send' \
  -H 'Authorization: Bearer cap_live_<your-key>' \
  -H 'Content-Type: application/json'