Settings · Advanced
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 / 201SuccessLa 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

Points d'entrée

Billing

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 : View
Settings : 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 : Edit
Settings : 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 : View
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 : Edit
Settings : 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 : View
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 : Edit
Settings : 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 : View
Exemple de réponse
text/html — FAC-2026-0042.html
GET /api/billing/quotes/

Devis (liste paginée).

Niveau d'accès requis : View
Settings : 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 : Edit
Settings : 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 : View
Exemple de réponse
{"id":51,"lines":[…],"payments":[]}
GET /api/billing/proformas/

Proformas (liste paginée).

Niveau d'accès requis : View
Settings : 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 : Edit
Settings : 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 : View
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 : Edit
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 : View
Settings : 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 : Edit
Settings : 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 : View
Exemple de réponse
{"id":70,"lines":[…]}
GET /api/billing/delivery-notes/

Bons de livraison (liste paginée).

Niveau d'accès requis : View
Settings : 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 : Edit
Settings : 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 : View
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.

Niveau d'accès requis : Edit
Settings : 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 : View
Settings : 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 : Edit
Settings : 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 : View
Exemple de réponse
{"id":90,"lines":[…]}
GET /api/billing/clients/

Clients de la société.

Niveau d'accès requis : View
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 : Edit
Settings : 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 : View
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 : Edit
Settings : name · client_type (b2b | b2c) · 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 : View
Settings : 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 : Edit
Settings : 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.

Niveau d'accès requis : View
Exemple de réponse
{"id":13,"quantity":"12.000","stock_par_depot":[{"depot_id":2,"depot":"Oran","quantity":"12.000"}],"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 : Edit
Settings : 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 : Edit
Settings : 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 : View
Settings : 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 : View
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 : View
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 : View
Settings : 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 : Edit
Settings : 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 : View
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 : Edit
Settings : 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 : Edit
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 : View
Settings : 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 : Edit
Settings : 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 : View
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 : View
Settings : 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 : Edit
Settings : 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 : View
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 : Edit
Settings : status
Exemple de requête
{"status":"received"}
Exemple de réponse
{"id":15,"status":"received","lignes_entrees_en_stock":1}

Human Resources

GET /api/rh/employees/

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

Niveau d'accès requis : Propriétaire seulement
Settings : 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
Settings : 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
Settings : 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 : View
Settings : 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 : View
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 : View
Settings : 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 : View
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 : View
Settings : 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 : View
Settings : 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
Settings : 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
Settings : 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
Settings : 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
Settings : 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é.