Format des réponses
Toutes les réponses sont en JSON, encodage UTF-8.
Succès
{
"data": <résultat>
}
<résultat> peut être un objet (pour POST ou GET d'un seul élément) ou un tableau (pour une liste).
Erreur
{
"error": {
"code": "invalid_request",
"message": "Description lisible par un humain.",
"details": { ... } // Optionnel — détails par champ
}
}
Codes d'erreur
| HTTP | Code | Quand |
|---|---|---|
400 | invalid_request | Le payload est mal formé ou contient des données invalides |
401 | unauthorized | Token manquant, invalide, expiré, ou révoqué |
403 | forbidden | Token valide mais sans le scope requis, OU plan insuffisant |
404 | not_found | La ressource demandée n'existe pas dans ton organisation |
429 | rate_limited | Tu as dépassé 100 req/min |
500 | internal_error | Erreur serveur FIDΣLIS — réessaie dans quelques secondes |
📇 Contacts
GET /api/v1/contacts
Liste les contacts (clients et fournisseurs) de ton organisation.
Paramètres de requête (query string)
| Nom | Type | Description |
|---|---|---|
type | string | Optionnel. CLIENT, SUPPLIER ou BOTH pour filtrer |
limit | int | Optionnel. Max résultats (défaut 50, max 200) |
Scope requis : contacts:read
Exemple
curl "https://fidelis-comptable.com/api/v1/contacts?type=CLIENT&limit=10" \
-H "Authorization: Bearer fdl_TON_TOKEN"
Réponse (200 OK)
{
"data": [
{
"id": "cmpkqx8ab000abc123",
"type": "CLIENT",
"name": "Restaurant Le Coq d'Or",
"email": "contact@coqdor.qc.ca",
"phone": "514-555-0142",
"address": "2310 rue Saint-Denis, Montréal",
"taxNumberTPS": null,
"taxNumberTVQ": null,
"createdAt": "2026-03-15T14:23:45.123Z",
"updatedAt": "2026-05-01T09:12:00.000Z"
}
]
}
POST /api/v1/contacts
Crée un nouveau contact.
Body JSON
| Champ | Type | Requis | Description |
|---|---|---|---|
type | string | ✅ | CLIENT, SUPPLIER ou BOTH |
name | string | ✅ | Nom du contact (max 200 caractères) |
email | string | Adresse courriel valide | |
phone | string | Numéro de téléphone (max 50) | |
address | string | Adresse postale (max 500) | |
taxNumberTPS | string | N° de TPS (max 50) | |
taxNumberTVQ | string | N° de TVQ (max 50) |
Scope requis : contacts:write
Exemple
curl -X POST https://fidelis-comptable.com/api/v1/contacts \
-H "Authorization: Bearer fdl_TON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"type": "CLIENT",
"name": "Café Boucherville",
"email": "info@cafe-bv.qc.ca",
"phone": "450-555-0101"
}'
Réponse (201 Created)
{
"data": {
"id": "cmpkxyz...",
"type": "CLIENT",
"name": "Café Boucherville",
"email": "info@cafe-bv.qc.ca",
"phone": "450-555-0101",
"createdAt": "2026-05-18T16:30:00.000Z"
}
}
📦 Produits
GET /api/v1/products
Liste les produits / services de ton catalogue.
Paramètres : limit (1-200, défaut 50)
Scope requis : products:read
Réponse (200 OK)
{
"data": [
{
"id": "cmpprod123",
"sku": "CAB_8X12",
"name": "Cabanon (8x12)",
"description": "Cabanon préfabriqué, vinyle, plancher 2x6...",
"type": "PRODUCT",
"unitPrice": "7976.0000",
"taxable": true,
"createdAt": "2026-04-01T10:00:00.000Z",
"updatedAt": "2026-04-01T10:00:00.000Z"
}
]
}
⚠️ Les montants sont retournés comme strings décimales pour préserver la précision (évite les erreurs de virgule flottante en JavaScript). Utilise une lib comme decimal.js ou BigDecimal côté client.
POST /api/v1/products
Crée un nouveau produit.
Body JSON
| Champ | Type | Requis | Description |
|---|---|---|---|
sku | string | ✅ | Code article unique (max 100) |
name | string | ✅ | Nom (max 200) |
description | string | Description longue (max 2000) | |
type | string | PRODUCT (défaut) ou SERVICE | |
unitPrice | number | ✅ | Prix unitaire ≥ 0 |
taxable | boolean | true par défaut (TPS+TVQ appliquées) |
Scope requis : products:write
Erreur courante : SKU dupliqué → 400 invalid_request.
💰 Factures
GET /api/v1/invoices
Liste les factures de ton organisation.
Paramètres
| Nom | Type | Description |
|---|---|---|
status | string | DRAFT, SENT, PAID, OVERDUE, VOIDED |
limit | int | 1-200 (défaut 50) |
Scope requis : invoices:read
Réponse (200 OK)
{
"data": [
{
"id": "cminv001",
"invoiceNumber": "FAC-2026-042",
"date": "2026-05-15T00:00:00.000Z",
"dueDate": "2026-06-14T00:00:00.000Z",
"status": "PAID",
"subtotal": "1058.0000",
"tps": "52.9000",
"tvq": "105.5355",
"total": "1216.4355",
"description": "Catering événement mai",
"contact": {
"id": "cmcontact001",
"name": "Bistro Saint-Henri",
"email": "compta@bistrosh.ca"
},
"createdAt": "2026-05-15T08:30:00.000Z"
}
]
}
🚧 Création de factures (POST /api/v1/invoices) — bientôt disponible. La complexité vient de la gestion des lignes avec calcul de TPS/TVQ par item et association avec les comptes du grand livre. En attendant, utilise l'interface web /dashboard/invoices/new.
🧾 Dépenses
GET /api/v1/expenses
Liste les dépenses de ton organisation.
Paramètres
| Nom | Type | Description |
|---|---|---|
status | string | DRAFT, APPROVED, PAID, REJECTED |
limit | int | 1-200 (défaut 50) |
Scope requis : expenses:read
Réponse (200 OK)
{
"data": [
{
"id": "cmexp001",
"date": "2026-05-12T00:00:00.000Z",
"status": "APPROVED",
"amount": "340.0000",
"tps": "17.0000",
"tvq": "33.9150",
"total": "390.9150",
"description": "Achat fournitures Sysco",
"contact": {
"id": "cmcontact002",
"name": "Sysco"
},
"account": {
"id": "cmacc005",
"code": "5000",
"name": "Coût des marchandises vendues"
},
"createdAt": "2026-05-12T11:00:00.000Z"
}
]
}
CORS et pré-flight
L'API supporte le CORS (Cross-Origin Resource Sharing) :
- Origin autorisée :
*(toutes) - Méthodes :
GET, POST, PUT, PATCH, DELETE, OPTIONS - Headers :
Authorization, Content-Type
Tu peux donc appeler l'API directement depuis le navigateur (ex. dans une SPA). Attention : si tu fais ça, ton token sera visible par les utilisateurs — préfère un backend proxy pour les apps publiques.
Pagination
Pour récupérer plus de 200 résultats, utilise limit + filtre sur la date :
# Page 1
GET /api/v1/invoices?limit=200
# Page 2 — filtre sur la date du dernier résultat de la page précédente
GET /api/v1/invoices?limit=200&before=2026-04-15
(Le paramètre before est ajouté progressivement aux endpoints.)
Support
- 📧 bonjour@fidelis-comptable.com
- 💬 Slack dédié (clients Ultra uniquement)
Tu veux un endpoint qui n'existe pas encore ? Écris-nous — la roadmap API est conduite par tes besoins.