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.
https://almawarid.app/api/
429 : espacez vos appels, ne les relancez pas en boucle.
403 avec "mode": "lecture_seule".
# 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"}'
# pip install requests import requests BASE = "https://almawarid.app/api" ENTETES = {"Authorization": "Token VOTRE_JETON"} # 1) Lire le catalogue et les quantités r = requests.get(f"{BASE}/stock/products/", headers=ENTETES, params={"active": 1}, timeout=20) r.raise_for_status() for produit in r.json(): print(produit["sku"], produit["name"], produit["quantity"]) # 2) Entrée de stock — nécessite le mode lecture/écriture r = requests.post(f"{BASE}/stock/move/", headers=ENTETES, timeout=20, json={"product_id": 12, "delta": 10, "reason": "Réception fournisseur"}) if r.status_code == 403 and r.json().get("mode") == "lecture_seule": print("Clé en lecture seule : demandez le mode écriture.") elif r.status_code == 429: print("Plafond atteint (20 appels/minute) : ralentissez.") else: print(r.json()) # {"movement_id": 901, "quantity": 33.0}
<?php $base = 'https://almawarid.app/api'; $entetes = ['Authorization: Token VOTRE_JETON', 'Content-Type: application/json']; function appel($url, $entetes, $corps = null) { $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $entetes, CURLOPT_TIMEOUT => 20, ]); if ($corps !== null) { curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($corps)); } $reponse = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return [$code, json_decode($reponse, true)]; } // 1) Catalogue + stock list($code, $produits) = appel("$base/stock/products/?active=1", $entetes); foreach ($produits as $p) { echo $p['sku'], ' ', $p['name'], ' ', $p['quantity'], PHP_EOL; } // 2) Entrée de stock (mode lecture/écriture requis) list($code, $res) = appel("$base/stock/move/", $entetes, ['product_id' => 12, 'delta' => 10, 'reason' => 'Réception fournisseur']); if ($code === 403 && ($res['mode'] ?? '') === 'lecture_seule') { echo "Clé en lecture seule : demandez le mode écriture.", PHP_EOL; } elseif ($code === 429) { echo "Plafond atteint : 20 appels par minute.", PHP_EOL; }
| Code | Sens | Que faire |
|---|---|---|
200 / 201 | Succès | La réponse est du JSON. |
401 | Jeton absent ou invalide | Vérifiez l'en-tête Authorization. |
402 | Module API non activé | Demandez l'activation du module. |
403 | Droit insuffisant, ou clé en lecture seule | Le corps précise mode=lecture_seule le cas échéant. |
429 | Plafond dépassé | Attendez : 20 appels par minute maximum. |
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/api/stock/products/
Produits du catalogue avec niveau de stock en temps réel — la brique d'une intégration e-commerce.
[{"id":12,"name":"Café 250g","sku":"CAF-250","sell_price":450.0,"tax_rate":19.0,"quantity":38.0}]
/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).
{"movement_id":901,"quantity":33.0}
/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.
{"id":3,"url":"https://boutique.dz/hooks/almawarid","secret":"…affiché une seule fois…"}
/api/webhooks/
Liste des webhooks avec leur santé (dernier statut, échecs). Un webhook qui échoue 20 fois d'affilée se désactive seul. DELETE /api/webhooks/<id>/ pour supprimer.
[{"id":3,"url":"https://boutique.dz/hooks/almawarid","is_active":true,"last_status":"http 200","failure_count":0}]
/api/enterprise/
Informations de l'entreprise, nombre d'employés, modules actifs.
{"company":"Acme SARL","employees":12,"modules":{"erp":true,"payroll":false},"api_version":"1.0"}
/api/enterprise/employees/
Liste tous les employés actifs avec leur rôle, poste et date d'embauche.
{"count":12,"employees":[{"id":1,"email":"ahmed@acme.dz","role":"employee","nom":"Benali","prenom":"Ahmed","poste":"Comptable","date_embauche":"2023-01-15","type_contrat":"CDI"}]}
/api/enterprise/timesheets/
Pointages de toutes les équipes sur une plage de dates (max 31 jours).
{"count":45,"from":"2025-01-01","to":"2025-01-31","entries":[{"id":101,"user_email":"ahmed@acme.dz","task":"Rapport Q1","start":"2025-01-02T08:30:00+01:00","end":"2025-01-02T17:00:00+01:00","duration_seconds":30600,"is_manual":false}]}
/api/enterprise/leaves/
Demandes de congés avec filtrage par statut.
{"count":3,"leaves":[{"id":5,"employee":"sara@acme.dz","start_date":"2025-02-10","end_date":"2025-02-14","status":"approved","reason":"Congé annuel"}]}
Votre jeton et des exemples prêts à copier apparaissent une fois connecté.