API WAD — Guide d'intégration
L'API WAD permet à des systèmes externes de lire et d'écrire des données dans votre espace WAD de manière programmatique, sans passer par l'interface web. Elle suit le standard REST et échange des données au format JSON.
Pourquoi utiliser l'API ?
- Synchroniser WAD avec un CRM, un ERP ou un outil de facturation
- Importer automatiquement des clients et des chantiers depuis une source externe
- Exporter les données de terrain vers un outil de reporting ou de BI
- Créer des automatisations (ex. : créer un projet WAD dès qu'une commande est validée)
- Développer des applications personnalisées qui s'appuient sur les données WAD
📖 Documentation interactive (Swagger) :
🔐 Authentification
Chaque appel à l'API requiert deux éléments d'identification passés dans les headers HTTP :
| Header | Valeur | Description |
|---|---|---|
| X-API-KEY | Votre clé API | Clé propre à votre organisation, fournie par WAD |
| Authorization | Bearer {token} | Token JWT obtenu via le endpoint /login |
Obtenir un token JWT
Avant tout autre appel, authentifiez-vous pour récupérer un token :
POST /api/index.php/v2/public/login
// Header requis
X-API-KEY: votre_clé_api
// Réponse
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Ce token doit ensuite être inclus dans tous les appels suivants via Authorization: Bearer {token}.
⚠️ Les tokens JWT ont une durée de vie limitée. Prévoyez une gestion automatique des erreurs 401 pour vous ré-authentifier.
📋 Endpoints disponibles
Tous les endpoints retournent un objet JSON avec les champs data, total et has_more. La pagination se fait via le paramètre ?page=N.
👤 Clients
Gérez le référentiel clients de votre organisation.
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /customers | Liste paginée de tous les clients |
| GET | /customers/{id} | Détail d'un client |
| POST | /customers | Créer un client (et optionnellement ses POW) |
| PATCH | /customers/{id} | Mettre à jour un client |
| GET | /customers/{id}/projects | Projets d'un client |
| GET | /customers/{id}/pows | Points de Travail d'un client |
Champs obligatoires (création) : name, email, address_street, address_zip, address_city, address_country_code.
📍 Points de Travail (POW)
Un POW représente un site physique rattaché à un client (adresse de chantier, site d'intervention…).
| Méthode | Endpoint | Description |
|---|---|---|
| POST | /pows | Créer un Point de Travail |
| PATCH | /pows/{id} | Mettre à jour un Point de Travail |
Champs obligatoires : customer_id, address_street, address_zip, address_city, address_country_code. Les champs geo_latitude / geo_longitude sont optionnels mais recommandés.
🗂️ Projets
Les projets sont le cœur opérationnel de WAD. Chaque projet est rattaché à un client et peut être lié à des POW et des catégories d'actions.
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /projects | Liste paginée (filtre : ?filter_by_status=OPEN|CLOSED) |
| GET | /projects/{id} | Détail d'un projet |
| POST | /projects | Créer un projet |
| PATCH | /projects/{id} | Mettre à jour un projet |
| GET | /projects/types | Types de projets disponibles |
| GET | /projects/{id}/works | Travaux d'un projet (filtre : ?fromDate / ?toDate) |
| DELETE | /projects/{id}/action-categories | Retirer des catégories d'actions d'un projet |
Champs obligatoires (création) : customer_id, type_id, name. Statut possible : OPEN ou CLOSED.
⚡ Actions & Catégories d'actions
Les actions représentent les tâches réalisables sur le terrain, organisées en catégories.
| Méthode | Endpoint | Description |
|---|---|---|
| POST | /actions | Créer une action |
| PATCH | /actions/{id} | Mettre à jour une action |
| DELETE | /actions/{id} | Supprimer une action |
| GET | /action-categories | Liste paginée des catégories |
| GET | /action-categories/{id} | Détail d'une catégorie (option ?actions pour inclure les actions) |
| POST | /action-categories | Créer une catégorie |
| PATCH | /action-categories/{id} | Mettre à jour une catégorie |
📅 Événements de projet
Journalisez des jalons ou faits marquants sur un projet (visite client, réception de chantier…).
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /projects/events | Liste de tous les événements |
| POST | /projects/events | Créer un événement |
| GET | /projects/events/types | Types d'événements disponibles |
🖼️ Médias (photos)
Accédez aux photos prises par les équipes de terrain, associées à des travaux ou à des Todo Memos.
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /medias/works | Liste des photos de travaux (filtre : ?project_id) |
| GET | /medias/works/{id} | Télécharger une photo de travail (retourne du JPEG binaire) |
| GET | /medias/todos | Liste des photos de Todo Memos |
| GET | /medias/todos/{id} | Télécharger une photo de Todo Memo |
Le paramètre ?size=bigs|mediums permet de choisir la résolution souhaitée.
📆 Plannings, équipe & tags
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /plannings | Liste des plannings de l'organisation |
| GET | /teams/users | Membres de l'équipe |
| GET | /tags | Tags de l'organisation |
📦 Format des réponses
Toutes les réponses suivent une structure cohérente :
// Réponse liste
{
"data": [ { ... }, { ... } ], // tableau d'objets
"total": 42, // nombre total d'enregistrements
"has_more": true // s'il reste des pages
}
// Réponse création / mise à jour
{
"data": { "id": 123 } // ID de la ressource créée/modifiée
}
Codes HTTP
| Code | Signification |
|---|---|
| 200 | Succès — données retournées |
| 201 | Ressource créée ou modifiée avec succès |
| 400 | Requête incorrecte — données manquantes ou invalides |
| 401 | Non authentifié — clé ou token invalide |
| 403 | Accès refusé — permissions insuffisantes |
| 404 | Ressource introuvable |
| 500 | Erreur interne du serveur |
💡 Exemple d'intégration
Exemple complet en JavaScript : authentification puis création d'un client avec son chantier.
const BASE_URL = 'https://app.wad.work/api/v2/public';
const API_KEY = 'votre_clé_api';
// 1. Authentification
const { token } = await fetch(`${BASE_URL}/login`, {
method: 'POST',
headers: { 'X-API-KEY': API_KEY }
}).then(r => r.json());
const headers = {
'Content-Type': 'application/json',
'X-API-KEY': API_KEY,
'Authorization': `Bearer ${token}`
};
// 2. Créer le client avec son premier POW
const { data } = await fetch(`${BASE_URL}/customers`, {
method: 'POST',
headers,
body: JSON.stringify({
name: 'Dupont SA',
email: '[email protected]',
address_street: 'Rue de la Paix 12',
address_zip: '1000',
address_city: 'Bruxelles',
address_country_code: 'BE',
pows: [{
address_street: 'Chaussée de Namur 45',
address_zip: '1400',
address_city: 'Nivelles',
address_country_code: 'BE'
}]
})
}).then(r => r.json());
console.log('Client créé, ID :', data.id);
console.log('POW créé, ID :', data.pow_ids[0]);
✅ Bonnes pratiques
Pagination
Toutes les listes sont paginées. Parcourez les pages en incrémentant ?page=N jusqu'à ce que has_more soit false. Ne supposez jamais recevoir tous les enregistrements en un seul appel.
Identifiants externes
Les endpoints Actions et Projets exposent les champs id_external et ref_external. Utilisez-les pour stocker les identifiants de votre système source — cela facilite la synchronisation bidirectionnelle sans table de correspondance externe.
Sécurité
- Ne jamais exposer votre X-API-KEY dans du code client (navigateur, app mobile).
- Toutes les communications doivent se faire via HTTPS.
- Gérez les erreurs 401 automatiquement en vous ré-authentifiant.