Facturino / Documentation / Devis

Devis

L'objet quote représente une proposition commerciale envoyée au client avant émission de la facture définitive. À la différence des factures, les devis n'ont pas de numérotation opposable et peuvent être modifiés tant qu'ils ne sont pas acceptés.

Endpoints

MéthodeCheminDescription
POST/v1/quotesCréer un devis
GET/v1/quotesLister les devis
GET/v1/quotes/:idRécupérer un devis
PATCH/v1/quotes/:idModifier (drafts uniquement)
DELETE/v1/quotes/:idSupprimer un brouillon
POST/v1/quotes/:id/sendPasser en sent (attribue le numéro, planifie le rappel J-7)
POST/v1/quotes/:id/emailRenvoyer par email
POST/v1/quotes/:id/acceptMarquer comme accepté
POST/v1/quotes/:id/refuseMarquer comme refusé
POST/v1/quotes/:id/convertConvertir en facture brouillon
POST/v1/quotes/:id/cloneDupliquer en brouillon
GET/v1/quotes/:id/pdfTélécharger le PDF

Créer un devis

$ curl -X POST https://facturino.com/api/v1/quotes \
  -H "Authorization: Bearer fac_test_..." \
  -H "Idempotency-Key: quote-create-opportunity-1842" \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": "cus_8f2k4m9n",
    "lines": [
      {
        "description": "Refonte du site corporate",
        "quantity": "1", "unit": "flat_rate",
        "unitPrice": 1250000, "vatRate": 2000, "vatCode": "S"
      }
    ],
    "dates": { "issued": "2026-04-22", "validUntil": "2026-05-22" },
    "notes": "Devis valable 30 jours, signature électronique acceptée."
  }'

La structure des lignes (lines), des totaux (totals) et des montants suit exactement la même convention que les factures — des centimes entiers aussi bien en requête qu'en réponse (symétrie entrée/sortie).

La fenêtre de validité est obligatoire et se fournit de deux façons exclusives : soit une date absolue dates.validUntil, soit validityDays (entier 1–365) — un nombre de jours à partir de la date d'émission. Fournir l'un ou l'autre (mais pas les deux). Si dates.issued est omis, il prend par défaut la date du jour.

Cycle de vie

StatutDescriptionTransitions
draftBrouillon éditablesent, suppression
sentEnvoyé au clientviewed, accepted, refused, expired
viewedConsulté par le clientaccepted, refused, expired
acceptedAccepté par le clientconverted
refusedRefusé par le clientdraft (correction)
expiredDate de validité dépasséesent (renvoi)
convertedConverti en facture(terminal)

Le suivi viewed repose sur le lien public envoyé par email — il s'active dès la première consultation, idempotent ensuite. Un rappel automatique est envoyé avant la date de validité (J-7 avant dates.validUntil), tant que le devis reste en attente (sent ou viewed).

Envoyer au client

$ curl -X POST https://facturino.com/api/v1/quotes/quo_a740665b/email \
  -H "Authorization: Bearer fac_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "recipientEmail": "marie@durand.fr",
    "customMessage": "Bonjour Marie, voici notre proposition comme convenu."
  }'

L'envoi joint le PDF en pièce attachée et inclut un lien public unique (token opaque, sans compte) permettant au client de consulter le devis, puis de l'accepter ou le refuser en ligne — l'action déclenche la transition de statut (accepted / refused) et l'événement webhook correspondant. Si le PDF n'a pas encore été généré (création récente), la réponse retourne 202 Accepted avec un identifiant de job (id) à poller — relancez l'envoi quand le PDF est prêt.

Convertir en facture

Quand le client accepte, convertissez le devis en facture en un seul appel. La facture créée est en statut draft — finalisez-la pour attribuer le numéro et entamer le cycle de dépôt.

$ curl -X POST https://facturino.com/api/v1/quotes/quo_a740665b/convert \
  -H "Authorization: Bearer fac_test_..."

# Réponse — facture brouillon créée à partir du devis
# (la facture seule est retournée, pas le couple { quote, invoice })
{
  "id": "inv_new_draft",
  "object": "invoice",
  "status": "draft",
  "sourceQuoteId": "quo_a740665b"
}

La facture créée hérite intégralement des lignes, totaux, client et conditions du devis. Elle hérite de sourceQuoteId=quo_... ; retrouvez les factures issues d'un devis via GET /v1/invoices?convertedFrom=quo_....

Acceptation explicite ou implicite ? L'endpoint convert exige que le devis soit en statut accepted. Pour passer en accepted sans interaction client (cas d'usage interne, importation legacy), appelez POST /v1/quotes/:id/accept (sans corps de requête) — la réponse est { id, object: "quote", status: "accepted" } et l'événement quote.accepted est émis.

Lister et filtrer

Filtres supportés :

ParamètreDescription
statusFiltrer par statut (draft, sent, accepted…)
date_from / date_toPlage de dates ISO (sur created par défaut, ou updated selon sort)
sortcreated (défaut) ou updated
limit, starting_afterPagination cursor-based (défaut 25, max 100)

Conformité

Les devis ne sont pas soumis à la facturation électronique obligatoire (article 289 bis du CGI vise uniquement les factures). Ils restent toutefois soumis à l'article L.441-9 du Code de commerce sur les mentions obligatoires entre professionnels :

  • Identité et SIRET du vendeur
  • Désignation des prestations / produits
  • Quantités et prix unitaires HT
  • Date d'émission et durée de validité
  • Modalités de paiement (acompte, échelonnement)
  • Conditions générales de vente (annexées ou référencées)

Le générateur PDF Facturino applique automatiquement ces mentions à partir des données de l'entreprise (paramétrables depuis Paramètres → Facturation).

Étapes suivantes