Paramètres · Avancé
API v1.0 Module en option

API Almawarid

Branchez votre site, votre boutique en ligne ou votre logiciel métier sur Almawarid : catalogue et stock en temps réel, factures, clients, et des webhooks qui vous préviennent au lieu de vous faire interroger.

Démarrer en 3 étapes

1
Activer le module
L'API est un module en option, activé à la demande sur n'importe quel plan.
2
Récupérer votre jeton
Il s'affiche ci-dessous une fois connecté. Il vaut votre compte : ne le publiez jamais.
3
Appeler en HTTPS
Une seule en-tête suffit : Authorization: Token …

Authentification

Authorization: Token votre_jeton_ici
Adresse de base : https://almawarid.app/api/
Connectez-vous pour voir votre jeton.

Limites, format et mode

20
appels / minute
500
appels / jour
JSON
requête et réponse
HTTPS
obligatoire
Le plafond est compté par jeton, lectures et écritures confondues. Au-delà, l'API répond 429 : espacez vos appels, ne les relancez pas en boucle.
👁 Lecture seule, par défaut
Une clé fraîchement ouverte lit vos données ; elle ne peut ni créer ni modifier. Demandez le mode lecture / écriture pour poser un mouvement de stock, créer une facture, un client ou un adhérent. Une écriture refusée répond 403 avec "mode": "lecture_seule".

Accès des employés et pagination

Un jeton vaut le compte qui l'a créé. Le jeton d'un employé fait par l'API exactement ce que l'écran lui permet : Voir lit, Modifier crée et modifie, Supprimer supprime. Le propriétaire a tout ; certaines routes lui sont réservées, comme à l'écran.
Les listes acceptent limit (200 au plus, 100 par défaut) et offset ; le nombre total d'éléments est rendu dans l'en-tête X-Total-Count.
Les montants s'écrivent avec un point ou une virgule (« 1500.50 » ou « 1 500,50 ») et sont rendus en chaînes pour garder leur précision. Les dates s'écrivent AAAA-MM-JJ. Chaque écriture est complète ou n'a pas lieu.

Exemples

# Lire le catalogue avec les quantités en stock
curl -s https://almawarid.app/api/stock/products/?active=1 \
     -H "Authorization: Token VOTRE_JETON"

# Poser une entrée de stock (mode lecture/écriture requis)
curl -s -X POST https://almawarid.app/api/stock/move/ \
     -H "Authorization: Token VOTRE_JETON" \
     -H "Content-Type: application/json" \
     -d '{"product_id": 12, "delta": 10, "reason": "Réception fournisseur"}'

Ce que répond l'API

CodeSensQue faire
200 / 201SuccèsLa réponse est du JSON.
400Saisie illisibleLe message précise le champ, et l'index de la ligne fautive le cas échéant. Rien n'a été enregistré.
401Jeton absent ou invalideVérifiez l'en-tête Authorization.
402Module API non activéDemandez l'activation du module.
402Abonnement expiré : écriture suspendueLe corps porte paywall=true et le motif. Les lectures restent permises : vos données sont toujours récupérables.
403Droit insuffisant, ou clé en lecture seuleLe corps précise mode=lecture_seule le cas échéant.
404IntrouvableL'objet n'existe pas, ou appartient à une autre société.
409ConflitL'opération est déjà faite (validation, sortie de stock) ou interdite par l'état du document.
429Plafond dépasséAttendez : 20 appels par minute maximum.
Module optionnel, facturé à part

L'accès programmatique n'est inclus dans aucun abonnement : il s'active à la demande sur n'importe quel plan, sans réinstallation.

L'usage normal du logiciel — application mobile, poste de bureau, pointeuses biométriques — ne nécessite pas ce module.

Documentation Activer le module API

Assistance IA et MCP

Le MCP permet de découvrir les modules, lire les réglages autorisés et comprendre les écrans. Les API REST ci-dessous restent distinctes : un module documenté n’a pas nécessairement une API REST.

Guide de l’assistant IA

Points d'entrée

Facturation

GET /api/billing/invoices/

Factures de la société (100 au plus). Un employé sans le droit « voit toutes les factures » ne voit que les siennes.

Niveau d'accès requis : Voir
Paramètres : status · type
Exemple de réponse
[{"id":41,"number":"FAC-2026-0041","invoice_type":"facture","client_id":7,"status":"sent","total_ht":"10000.00","total_ttc":"11900.00"}]
POST /api/billing/invoices/create/ ✏️ mode écriture requis

Crée une facture brouillon (numéro provisoire ; le numéro définitif est tiré à l'émission). Quota de pièces du plan appliqué.

Niveau d'accès requis : Modifier
Paramètres : client_id · invoice_type · date · due_date · notes · payment_method · lines[description, qty, unit_price, tax_rate]
Exemple de requête
{"client_id":7,"date":"2026-10-08","payment_method":"virement","lines":[{"description":"Prestation","qty":1,"unit_price":"10000","tax_rate":19}]}
Exemple de réponse
{"id":42,"number":"BRO-FAC-0007","status":"draft","total_ttc":"11900.00","lines":[…]}
GET /api/billing/invoices/<invoice_id>/

Une facture avec ses lignes.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":42,"number":"FAC-2026-0042","lines":[{"description":"Prestation","qty":"1.00","unit_price":"10000.00"}]}
PATCH /api/billing/invoices/<invoice_id>/status/ ✏️ mode écriture requis

Change le statut. Mêmes verrous que l'écran : une facture numérotée ne redevient pas brouillon, une facture encaissée ne s'annule pas (avoir), « payée » exige un reste dû nul — sinon 409.

Niveau d'accès requis : Modifier
Paramètres : status = draft | sent | confirmed | paid | cancelled
Exemple de requête
{"status":"sent"}
Exemple de réponse
{"id":42,"status":"sent"}
GET /api/billing/invoices/<invoice_id>/payments/

Versements enregistrés sur un document.

Niveau d'accès requis : Voir
Exemple de réponse
[{"id":9,"invoice_id":42,"amount":"5000.00","date":"2026-10-08","method":"virement","reference_number":"VIR-1"}]
POST /api/billing/invoices/<invoice_id>/payments/ ✏️ mode écriture requis

Enregistre un versement. Un brouillon encaissé est validé automatiquement (numéro définitif) ; le statut « payée » se pose seul quand les versements couvrent le total, timbre compris. Document annulé ou proforma déjà facturée : 409.

Niveau d'accès requis : Modifier
Paramètres : amount · date · method (especes | virement | cheque | ccp | autre) · reference_number · note
Exemple de requête
{"amount":"5000","method":"virement","reference_number":"VIR-1"}
Exemple de réponse
{"payment":{"id":9,"amount":"5000.00"},"invoice":{"id":42,"number":"FAC-2026-0042","status":"confirmed","balance_remaining":"6900.00"},"excedent":"0"}
GET /api/billing/invoices/<invoice_id>/pdf/

Le document imprimable (HTML prêt à imprimer, identique au bouton « PDF » de l'écran ; « Enregistrer au format PDF » depuis le navigateur). Fonctionne pour tout type de pièce.

Niveau d'accès requis : Voir
Exemple de réponse
text/html — FAC-2026-0042.html
GET /api/billing/quotes/

Devis (liste paginée).

Niveau d'accès requis : Voir
Paramètres : status · client_id · limit · offset
Exemple de réponse
[{"id":51,"number":"DEV-2026-0012","invoice_type":"devis","status":"draft","total_ttc":"3571.19"}]
POST /api/billing/quotes/create/ ✏️ mode écriture requis

Crée un devis. Même corps pour proformas, bons de commande, bons de livraison et avoirs.

Niveau d'accès requis : Modifier
Paramètres : client_id · date · due_date · reference · notes · payment_method · currency · retenue_garantie_pct · lines[description, qty, unit_price, tax_rate, discount, unit, section]
Exemple de requête
{"client_id":7,"date":"2026-10-08","lines":[{"description":"Ciment 50 kg","qty":"2","unit_price":"1500,50","tax_rate":19}]}
Exemple de réponse
{"id":51,"number":"DEV-2026-0012","total_ht":"3001.00","total_ttc":"3571.19","lines":[…]}
GET /api/billing/quotes/<doc_id>/

Un devis avec ses lignes et versements.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":51,"lines":[…],"payments":[]}
GET /api/billing/proformas/

Proformas (liste paginée).

Niveau d'accès requis : Voir
Paramètres : status · client_id · limit · offset
Exemple de réponse
[{"id":60,"number":"PRO-2026-0004"}]
POST /api/billing/proformas/create/ ✏️ mode écriture requis

Crée une proforma (corps identique aux devis).

Niveau d'accès requis : Modifier
Paramètres : voir /api/billing/quotes/create/
Exemple de requête
{"client_id":7,"lines":[{"description":"Lot A","qty":1,"unit_price":"250000"}]}
Exemple de réponse
{"id":60,"number":"PRO-2026-0004"}
GET /api/billing/proformas/<doc_id>/

Une proforma.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":60,"lines":[…]}
POST /api/billing/proformas/<doc_id>/invoice/ ✏️ mode écriture requis

Facture la proforma par la même fonction que l'écran : lignes, échéancier et versements suivent. Déjà facturée : rend sa facture (200, creee=false).

Niveau d'accès requis : Modifier
Exemple de requête
{}
Exemple de réponse
{"id":61,"number":"BRO-FAC-0008","invoice_type":"facture","source_document_id":60,"creee":true}
GET /api/billing/orders/

Bons de commande client (liste paginée).

Niveau d'accès requis : Voir
Paramètres : status · client_id · limit · offset
Exemple de réponse
[{"id":70,"number":"BC-2026-0003"}]
POST /api/billing/orders/create/ ✏️ mode écriture requis

Crée un bon de commande client (TVA par défaut 0, comme l'écran ; exchange_rate pour une devise étrangère).

Niveau d'accès requis : Modifier
Paramètres : voir /api/billing/quotes/create/ · exchange_rate
Exemple de requête
{"client_id":7,"currency":"DZD","lines":[{"description":"Palette","qty":3,"unit_price":"9000"}]}
Exemple de réponse
{"id":70,"number":"BC-2026-0003"}
GET /api/billing/orders/<doc_id>/

Un bon de commande.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":70,"lines":[…]}
GET /api/billing/delivery-notes/

Bons de livraison (liste paginée).

Niveau d'accès requis : Voir
Paramètres : status · client_id · limit · offset
Exemple de réponse
[{"id":80,"number":"BL-2026-0021"}]
POST /api/billing/delivery-notes/create/ ✏️ mode écriture requis

Crée un bon de livraison (TVA par défaut 0). Le stock ne bouge pas à la création : voir stock-out.

Niveau d'accès requis : Modifier
Paramètres : voir /api/billing/quotes/create/
Exemple de requête
{"client_id":7,"lines":[{"description":"Ciment 50 kg","qty":2,"unit_price":"1500"}]}
Exemple de réponse
{"id":80,"number":"BL-2026-0021"}
GET /api/billing/delivery-notes/<doc_id>/

Un bon de livraison.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":80,"lines":[…]}
POST /api/billing/delivery-notes/<doc_id>/stock-out/ ✏️ mode écriture requis

Sort la marchandise du stock, UNE fois (rejouée : 409). Lignes rapprochées des produits par leur nom, nomenclatures consommées, comme l'écran. 409 aussi quand Paramètres → Stock sort le stock depuis les factures, ou quand la facture de cette livraison l'a déjà sortie.

Niveau d'accès requis : Modifier
Paramètres : depot_id (facultatif)
Exemple de requête
{"depot_id":2}
Exemple de réponse
{"bl_id":80,"produits_sortis":1,"lignes_sans_produit":[],"depot_id":2}
GET /api/billing/credit-notes/

Avoirs (liste paginée).

Niveau d'accès requis : Voir
Paramètres : status · client_id · limit · offset
Exemple de réponse
[{"id":90,"number":"AVO-2026-0002"}]
POST /api/billing/credit-notes/create/ ✏️ mode écriture requis

Crée un avoir brouillon (pièce fiscale : numéro définitif à l'émission). Indiquez la facture d'origine dans reference.

Niveau d'accès requis : Modifier
Paramètres : voir /api/billing/quotes/create/ · reference
Exemple de requête
{"client_id":7,"reference":"Annule FAC-2026-0041","lines":[{"description":"Retour","qty":1,"unit_price":"1000"}]}
Exemple de réponse
{"id":90,"number":"BRO-AVO-0001","invoice_type":"avoir"}
GET /api/billing/credit-notes/<doc_id>/

Un avoir.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":90,"lines":[…]}
GET /api/billing/clients/

Clients de la société.

Niveau d'accès requis : Voir
Exemple de réponse
[{"id":7,"name":"SARL Atlas","city":"Oran","phone":"0550123456","nif":"000016001234567"}]
POST /api/billing/clients/create/ ✏️ mode écriture requis

Crée un client (déclenche le webhook client.created).

Niveau d'accès requis : Modifier
Paramètres : name · address · city · phone · email · nif · nis · rc · ai
Exemple de requête
{"name":"SARL Atlas","city":"Oran"}
Exemple de réponse
{"id":7,"name":"SARL Atlas"}
GET /api/billing/clients/<client_id>/

Fiche et compte client : solde = (factures − versements) − (avoirs − remboursements), brouillons et annulées exclus, comme l'écran.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":7,"name":"SARL Atlas","facture_total":"11900.00","facture_paid":"5000.00","solde":"6900.00"}
PATCH /api/billing/clients/<client_id>/ ✏️ mode écriture requis

Met à jour les champs ENVOYÉS seulement. NIF, NIS, RC, AI et NIN passent par les validateurs de l'écran (400 si invalides).

Niveau d'accès requis : Modifier
Paramètres : name · client_type (b2b | b2c | b2g) · categorie_publique (epa | epic | administration, b2g seulement) · address · city · phone · email · nif · nis · rc · ai · nin · default_discount · credit_limit
Exemple de requête
{"city":"Alger","default_discount":"5"}
Exemple de réponse
{"id":7,"city":"Alger","solde":"6900.00"}
DELETE /api/billing/clients/<client_id>/ ✏️ mode écriture requis

Supprime un client sans document (sinon 409). Réservé au propriétaire, comme l'écran.

Niveau d'accès requis : Propriétaire seulement
Exemple de réponse
{"deleted":true}

Stock et achats

GET /api/stock/products/

Produits du catalogue avec niveau de stock en temps réel — la brique d'une intégration e-commerce.

Niveau d'accès requis : Voir
Paramètres : q (recherche nom) · active=1 (actifs seulement)
Exemple de réponse
[{"id":12,"name":"Café 250g","sku":"CAF-250","sell_price":450.0,"tax_rate":19.0,"quantity":38.0}]
POST /api/stock/products/create/ ✏️ mode écriture requis

Crée un produit (quota de produits du plan). opening_qty pose le stock initial au coût opening_cost (à défaut le prix d'achat) : c'est lui qui nourrit le CMUP.

Niveau d'accès requis : Modifier
Paramètres : name · sku · barcode · description · unit · buy_price · sell_price · tax_rate · quantity_alert · track_stock · est_vendu · category_id · emplacement · opening_qty · opening_cost · opening_depot_id · opening_lot · opening_expiry
Exemple de requête
{"name":"Peinture 20 L","sku":"PB-20","buy_price":"3000","sell_price":"4500","opening_qty":"12"}
Exemple de réponse
{"id":13,"name":"Peinture 20 L","quantity":"12.000","cmup":"3000.0000"}
GET /api/stock/products/<product_id>/

Fiche produit, stock par dépôt et 5 dernières modifications. Recette, en lecture : recette_pour (quantité que fabrique la composition), pertes_pct (perte attendue) et cout_theorique (coût unitaire par la recette, sous-recettes comprises ; null sans composition).

Niveau d'accès requis : Voir
Exemple de réponse
{"id":13,"quantity":"12.000","stock_par_depot":[{"depot_id":2,"depot":"Oran","quantity":"12.000"}],"recette_pour":"24.000","pertes_pct":"5.00","cout_theorique":"54.1530","historique":[…]}
PATCH /api/stock/products/<product_id>/ ✏️ mode écriture requis

Met à jour les champs ENVOYÉS (journalisés comme à l'écran). stock_target pose l'ajustement « Ajustement manuel → N ».

Niveau d'accès requis : Modifier
Paramètres : mêmes champs que la création · stock_target
Exemple de requête
{"sell_price":"4800","stock_target":"10"}
Exemple de réponse
{"id":13,"sell_price":"4800.00","quantity":"10.000"}
POST /api/stock/move/ ✏️ mode écriture requis

Mouvement de stock : delta positif = entrée, négatif = sortie. Une sortie qui rendrait le stock négatif est refusée (mêmes règles que la caisse).

Niveau d'accès requis : Modifier
Paramètres : product_id · delta · reason
Exemple de requête
{"product_id":12,"delta":10,"reason":"Réception fournisseur"}
Exemple de réponse
{"movement_id":901,"quantity":33.0}
GET /api/stock/movements/

Historique des mouvements de stock, du plus récent au plus ancien.

Niveau d'accès requis : Voir
Paramètres : product_id · depot_id · type (in | out | adjust | transfer) · from · to (AAAA-MM-JJ) · limit · offset
Exemple de réponse
[{"id":901,"product_id":12,"type":"in","quantity_delta":"10.000","unit_cost":"300.0000","date":"2026-10-08"}]
GET /api/stock/depots/

Dépôts de la société.

Niveau d'accès requis : Voir
Exemple de réponse
[{"id":2,"name":"Oran","is_active":true}]
GET /api/stock/depots/<depot_id>/stock/

Quantités par produit dans un dépôt (règle mono-dépôt de l'écran Stock comprise).

Niveau d'accès requis : Voir
Exemple de réponse
{"depot_id":2,"depot":"Oran","stock":[{"product_id":12,"name":"Café 250g","quantity":"7.000"}]}
GET /api/stock/inventories/

Inventaires (sessions de comptage).

Niveau d'accès requis : Voir
Paramètres : limit · offset
Exemple de réponse
[{"id":4,"date":"2026-10-08","status":"counting","nb_lignes":120,"nb_comptees":80}]
POST /api/stock/inventories/create/ ✏️ mode écriture requis

Ouvre un inventaire : le théorique de chaque produit est FIGÉ à l'ouverture, par le calcul de l'écran.

Niveau d'accès requis : Modifier
Paramètres : label · date · depot_id · scope (all | category | selection) · category_id · product_ids · blind
Exemple de requête
{"label":"Fin de mois","scope":"all","blind":true}
Exemple de réponse
{"id":4,"status":"draft","lines":[{"product_id":12,"expected":null,"counted":null}]}
GET /api/stock/inventories/<inventory_id>/

Un inventaire et ses lignes (comptage aveugle : théorique et écart masqués jusqu'à la validation).

Niveau d'accès requis : Voir
Exemple de réponse
{"id":4,"lines":[{"product_id":12,"expected":"10.000","counted":"8.000","ecart":"-2.000"}]}
POST /api/stock/inventories/<inventory_id>/count/ ✏️ mode écriture requis

Enregistre des quantités comptées. Toutes les lignes sont validées avant écriture ; inventaire validé : 409.

Niveau d'accès requis : Modifier
Paramètres : lines[product_id, counted, motif, note]
Exemple de requête
{"lines":[{"product_id":12,"counted":"8","motif":"casse"}]}
Exemple de réponse
{"id":4,"status":"counting","lines":[…]}
POST /api/stock/inventories/<inventory_id>/validate/ ✏️ mode écriture requis

Valide l'inventaire et pose les ajustements d'écart, UNE seule fois (seconde validation : 409).

Niveau d'accès requis : Modifier
Exemple de requête
{}
Exemple de réponse
{"id":4,"status":"validated","ajustements":1}
GET /api/stock/suppliers/

Fournisseurs (liste paginée).

Niveau d'accès requis : Voir
Paramètres : limit · offset
Exemple de réponse
[{"id":3,"name":"Lafarge","phone":"021000000","nif":""}]
POST /api/stock/suppliers/create/ ✏️ mode écriture requis

Crée un fournisseur.

Niveau d'accès requis : Modifier
Paramètres : name · contact_name · address · city · phone · email · nif · nis · rc · notes
Exemple de requête
{"name":"Lafarge","phone":"021 00 00 00"}
Exemple de réponse
{"id":3,"name":"Lafarge"}
GET /api/stock/suppliers/<supplier_id>/

Un fournisseur.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":3,"name":"Lafarge","city":"Alger"}
GET /api/stock/purchases/

Achats (bons d'achat et factures fournisseur) avec leur état de règlement.

Niveau d'accès requis : Voir
Paramètres : status (draft | confirmed | received | cancelled) · supplier_id · limit · offset
Exemple de réponse
[{"id":15,"number":"FA-77","status":"received","total_ttc":"11305.00","payment_status":"unpaid"}]
POST /api/stock/purchases/create/ ✏️ mode écriture requis

Crée un achat. status=received (facture d'achat) entre la marchandise en stock par la réception de l'écran : conversion d'unités, CMUP, produit créé si la désignation est inconnue.

Niveau d'accès requis : Modifier
Paramètres : supplier_id · date · expected_date · number · notes · status · lines[designation, quantity, unit_price, tax_rate, unit_label, qty_stock]
Exemple de requête
{"supplier_id":3,"status":"received","number":"FA-77","lines":[{"designation":"Ciment","quantity":"10","unit_price":"800"}]}
Exemple de réponse
{"id":15,"status":"received","lignes_entrees_en_stock":1,"lines":[…]}
GET /api/stock/purchases/<purchase_id>/

Un achat avec ses lignes.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":15,"lines":[{"designation":"Ciment","quantity":"10.000"}]}
POST /api/stock/purchases/<purchase_id>/status/ ✏️ mode écriture requis

Change le statut ; « received » entre la marchandise en stock une seule fois (rejoué : rien ne bouge).

Niveau d'accès requis : Modifier
Paramètres : status
Exemple de requête
{"status":"received"}
Exemple de réponse
{"id":15,"status":"received","lignes_entrees_en_stock":1}

Ressources humaines

GET /api/rh/employees/

Salariés de la société et leur fiche RH.

Niveau d'accès requis : Propriétaire seulement
Paramètres : archived=1 (inclure les archivés) · limit · offset
Exemple de réponse
[{"id":21,"hr_id":9,"email":"karim.benali@acme.dz","nom":"Benali","prenom":"Karim","poste":"Magasinier","date_embauche":"2026-09-01"}]
POST /api/rh/employees/create/ ✏️ mode écriture requis

Crée un salarié comme l'écran « Ajouter un employé » : identifiant et mot de passe générés s'ils manquent (affichés UNE fois), aucun module accordé.

Niveau d'accès requis : Propriétaire seulement
Paramètres : nom · prenom · email · password · matricule · poste · categorie · type_contrat · date_embauche · salaire_base · date_naissance · sexe · nss · nni · rib · telephone · nb_enfants · situation_familiale
Exemple de requête
{"nom":"Benali","prenom":"Karim","poste":"Magasinier","type_contrat":"cdi","salaire_base":"45000"}
Exemple de réponse
{"id":21,"identifiant":"karim.benali@acme.dz","mot_de_passe":"Xy7…","note":"Mot de passe affiché une seule fois"}
GET /api/rh/employees/<employee_id>/

Un salarié.

Niveau d'accès requis : Propriétaire seulement
Exemple de réponse
{"id":21,"poste":"Magasinier","salaire_base":"45000.00"}
PATCH /api/rh/employees/<employee_id>/ ✏️ mode écriture requis

Met à jour la fiche RH (champs ENVOYÉS seulement ; dates invraisemblables refusées).

Niveau d'accès requis : Propriétaire seulement
Paramètres : mêmes champs que la création (hors email et mot de passe) · date_sortie · motif_sortie
Exemple de requête
{"poste":"Chef magasinier","nb_enfants":2}
Exemple de réponse
{"id":21,"poste":"Chef magasinier"}
GET /api/rh/payslips/

Bulletins de paie (lecture seule : un bulletin s'établit à l'écran, où se vérifient barèmes, absences et avances).

Niveau d'accès requis : Voir
Paramètres : annee · mois · employee_id · limit · offset
Exemple de réponse
[{"id":300,"employee_id":21,"mois":9,"annee":2026,"salaire_brut":"45000","irg":"…","salaire_net":"…"}]
GET /api/rh/payslips/<payslip_id>/

Un bulletin avec ses rubriques (gains, retenues), cotisations et net.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":300,"salaire_net":"…","lignes":[{"label":"Prime de panier","type":"gain","montant":"3000.00"}]}
GET /api/rh/contracts/

Contrats et documents RH (le patron voit tout ; un employé, les siens et ceux partagés).

Niveau d'accès requis : Voir
Paramètres : status · limit · offset
Exemple de réponse
[{"id":5,"title":"CDI — Karim Benali","status":"finalized","language":"fr"}]
GET /api/rh/contracts/<contract_id>/

Un contrat : texte final et variables.

Niveau d'accès requis : Voir
Exemple de réponse
{"id":5,"body":"…","variables":{"salaire":"45000"}}
GET /api/rh/attendance/

Pointages bruts (pointeuses et saisies manuelles), 31 jours au plus ; un chef d'équipe ne voit que ses sites.

Niveau d'accès requis : Voir
Paramètres : from · to (AAAA-MM-JJ, défaut : 7 derniers jours) · employee_id · limit · offset
Exemple de réponse
[{"id":7001,"employee_id":21,"timestamp":"2026-10-08T07:58:00+01:00","kind":"in","manual":false}]
GET /api/rh/advances/

Avances sur salaire.

Niveau d'accès requis : Voir
Paramètres : employee_id · status (pending | paid | deducted) · limit · offset
Exemple de réponse
[{"id":40,"employee_id":21,"montant":"3334.00","target_mois":11,"target_annee":2026,"status":"paid"}]
POST /api/rh/advances/create/ ✏️ mode écriture requis

Enregistre une avance ; regulariser=true la répartit sur nb_mois à partir de start_mois/start_annee, par la fonction de l'écran.

Niveau d'accès requis : Propriétaire seulement
Paramètres : employee_id · montant · date · motif · regulariser · nb_mois (1-36) · start_mois · start_annee
Exemple de requête
{"employee_id":21,"montant":"10000","regulariser":true,"nb_mois":3,"start_mois":11,"start_annee":2026}
Exemple de réponse
[{"id":40,"montant":"3334.00","target_mois":11},{"id":41,"montant":"3333.00","target_mois":12},{"id":42,"montant":"3333.00","target_mois":1}]
GET /api/enterprise/employees/

Plan Entreprise : liste tous les employés actifs avec leur rôle, poste et date d'embauche.

Niveau d'accès requis : Propriétaire seulement
Exemple de réponse
{"count":12,"employees":[{"id":1,"email":"ahmed@acme.dz","role":"employee","nom":"Benali","prenom":"Ahmed","poste":"Comptable"}]}
GET /api/enterprise/timesheets/

Plan Entreprise : suivi du temps de toutes les équipes sur une plage de dates (max 31 jours).

Niveau d'accès requis : Propriétaire seulement
Paramètres : from=YYYY-MM-DD&to=YYYY-MM-DD
Exemple de réponse
{"count":45,"from":"2025-01-01","to":"2025-01-31","entries":[{"id":101,"user_email":"ahmed@acme.dz","duration_seconds":30600}]}
GET /api/enterprise/leaves/

Plan Entreprise : demandes de congés avec filtrage par statut.

Niveau d'accès requis : Propriétaire seulement
Paramètres : status=pending|approved|rejected
Exemple de réponse
{"count":3,"leaves":[{"id":5,"employee":"sara@acme.dz","start_date":"2025-02-10","status":"approved"}]}
GET /api/enterprise/

Plan Entreprise : informations de l'entreprise, nombre d'employés, modules actifs.

Niveau d'accès requis : Propriétaire seulement
Exemple de réponse
{"company":"Acme SARL","employees":12,"modules":{"erp":true,"payroll":false},"api_version":"1.0"}

Webhooks

POST /api/webhooks/ ✏️ mode écriture requis

Déclare une URL HTTPS à notifier (POST signé HMAC-SHA256, en-tête X-Almawarid-Signature). Événements : invoice.paid, invoice.status, client.created. Le secret n'est affiché qu'une fois.

Niveau d'accès requis : Propriétaire seulement
Paramètres : url (https, hôte public) · events (liste séparée par virgules, vide = tous)
Exemple de requête
{"url":"https://boutique.dz/hooks/almawarid","events":"invoice.paid"}
Exemple de réponse
{"id":3,"url":"https://boutique.dz/hooks/almawarid","secret":"…affiché une seule fois…"}
GET /api/webhooks/

Liste des webhooks avec leur santé (dernier statut, échecs). Un webhook qui échoue 20 fois d'affilée se désactive seul.

Niveau d'accès requis : Propriétaire seulement
Exemple de réponse
[{"id":3,"url":"https://boutique.dz/hooks/almawarid","is_active":true,"last_status":"http 200","failure_count":0}]
DELETE /api/webhooks/<webhook_id>/ ✏️ mode écriture requis

Supprime un webhook.

Niveau d'accès requis : Propriétaire seulement
Exemple de réponse
{"deleted":true}
Connectez-vous pour voir vos exemples

Votre jeton et des exemples prêts à copier apparaissent une fois connecté.