Devis
Créez un devis, gardez-le en brouillon, finalisez son PDF et convertissez-le en facture.
L’API Devis couvre tout le cycle : création, modification du brouillon, finalisation, téléchargement du PDF, changement de statut et conversion en facture.
Sandbox et production utilisent
https://api.yaoka.fr. Pour passer en production, remplacez la clé test et l’identifiant de l’organisation sandbox par la clé live et l’organisation cliente.
Le workflow recommandé
- Créez le devis avec
finalize: false. - Enregistrez le
quoteIdretourné dans votre logiciel. - Modifiez le brouillon si nécessaire avec
PATCH /api/v1/quotes/{id}. - Finalisez-le avec
POST /api/v1/quotes/{id}/finalize. - Passez-le à
sent, puisacceptedoudeclined. - Convertissez un devis accepté avec
POST /api/v1/quotes/{id}/convert.
Les 7 opérations disponibles
| Action | Requête | Scope |
|---|---|---|
| Lister | GET /api/v1/quotes | quotes:read |
| Créer | POST /api/v1/quotes | quotes:write |
| Consulter | GET /api/v1/quotes/{id} | quotes:read |
| Modifier / changer le statut | PATCH /api/v1/quotes/{id} | quotes:write |
| Finaliser | POST /api/v1/quotes/{id}/finalize | quotes:write |
| Télécharger le PDF | GET /api/v1/quotes/{id}/pdf | quotes:read |
| Convertir en facture | POST /api/v1/quotes/{id}/convert | quotes:write + invoices:write |
Toutes les requêtes demandent Authorization. Ajoutez X-Yaoka-Organization-Id uniquement avec une clé partenaire ; une clé client sk_org_... déduit automatiquement son organisation. Les trois opérations POST demandent aussi une Idempotency-Key.
Créer un devis
POST /api/v1/quotes retourne directement le devis créé avec le statut HTTP 201.
Corps de la requête
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
customerId | string | oui | Identifiant d’un client de l’organisation. |
lines | array | oui | Au moins une ligne. |
validUntilDays | integer | non | Durée de validité, 30 par défaut. |
finalize | boolean | non | true par défaut. Utilisez false pour créer un brouillon modifiable. |
language | string | non | Langue du document, fr_FR par défaut. |
paymentConditions | string | non | Conditions de paiement affichées sur le devis. |
specialMention | string | non | Mention personnalisée affichée sur le document. |
Une ligne de devis
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
label | string | oui | Libellé de la prestation ou du produit. |
quantity | number | oui | Quantité strictement positive. |
unitPrice | string décimale | oui | Prix unitaire HT, par exemple "120.00". |
vatRate | string décimale | oui | Taux de TVA, par exemple "20.00". |
description | string | non | Détail complémentaire. |
unit | string | non | Par exemple piece, hour ou day. |
productId | string | non | Produit YAOKA associé. |
N’envoyez pas les totaux : YAOKA calcule totalHt, totalTax et totalTtc côté serveur.
Lister et retrouver un devis
GET /api/v1/quotes?status=draft&customerId=cus_6xA...&limit=20&cursor=...
GET /api/v1/quotes/quo_9pL...limit accepte de 1 à 100. La liste retourne data et nextCursor. Les statuts filtrables sont draft, finalized, sent, accepted, declined, partially_invoiced, invoiced et expired.
Modifier le brouillon
PATCH /api/v1/quotes/{id} remplace uniquement les champs envoyés. Tant que le devis est draft, vous pouvez modifier customerId, lines, expiresAt, paymentConditions et specialMention.
{
"lines": [
{
"label": "Prestation mensuelle révisée",
"quantity": 2,
"unitPrice": "120.00",
"unit": "piece",
"vatRate": "20.00"
}
]
}Envoyer lines remplace toutes les lignes existantes. Cette requête PATCH ne demande pas de clé d’idempotence.
Finaliser et récupérer le PDF
curl -X POST "$YAOKA_BASE_URL/api/v1/quotes/$QUOTE_ID/finalize" \
-H "Authorization: Bearer $YAOKA_API_KEY" \
-H "X-Yaoka-Organization-Id: $YAOKA_ORG_ID" \
-H "Idempotency-Key: finalize-$QUOTE_ID-v1"La finalisation attribue un numéro légal, verrouille les montants et lance la génération du PDF. Le descripteur pdf et l’état pdfStatus sont présents dans la réponse lorsqu’ils sont disponibles.
Pour télécharger le binaire :
GET /api/v1/quotes/{id}/pdfModifier le statut
PATCH /api/v1/quotes/{id}
Content-Type: application/json
{"status":"accepted"}Transitions autorisées :
finalized→sent,accepted,declinedouexpiredsent→accepted,declinedouexpired
Un brouillon doit être finalisé avant ces transitions. Un devis déjà facturé n’est plus modifiable.
Convertir en facture
curl -X POST "$YAOKA_BASE_URL/api/v1/quotes/$QUOTE_ID/convert" \
-H "Authorization: Bearer $YAOKA_API_KEY" \
-H "X-Yaoka-Organization-Id: $YAOKA_ORG_ID" \
-H "Idempotency-Key: convert-$QUOTE_ID-v1" \
-H "Content-Type: application/json" \
-d '{"dueInDays":30,"finalize":false}'La réponse HTTP 201 est la facture créée. finalize vaut false par défaut : vous pouvez donc vérifier la facture avant sa finalisation. Cette opération exige les deux scopes quotes:write et invoices:write.
La conversion est refusée si le devis est encore en brouillon, refusé, expiré ou déjà facturé.
Idempotence sans doublons
Choisissez une clé stable liée à l’action de votre logiciel, par exemple quote-order-847-v1. En cas de timeout, relancez exactement la même requête avec la même clé. Pour une nouvelle opération, utilisez une nouvelle clé.
Erreurs à traiter
| HTTP | Code | Que faire |
|---|---|---|
400 | validation_error | Corriger le champ indiqué dans error.field. |
401 | auth_invalid | Vérifier la clé et son environnement. |
403 | insufficient_scope | Ajouter le scope requis à la clé. |
404 | not_found | Vérifier le client, le devis et l’organisation. |
409 | business_rule_violation | Vérifier le statut courant et la transition demandée. |
429 | rate_limited | Respecter Retry-After, puis réessayer. |
Conservez error.requestId : le support YAOKA peut l’utiliser pour retrouver l’appel exact.