📄 API WAD — Guide d'intégration

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) :

Documentation (Swagger)



🔐 Authentification

Chaque appel à l'API requiert deux éléments d'identification passés dans les headers HTTP :

HeaderValeurDescription
X-API-KEYVotre clé APIClé propre à votre organisation, fournie par WAD
AuthorizationBearer {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éthodeEndpointDescription
GET/customersListe paginée de tous les clients
GET/customers/{id}Détail d'un client
POST/customersCréer un client (et optionnellement ses POW)
PATCH/customers/{id}Mettre à jour un client
GET/customers/{id}/projectsProjets d'un client
GET/customers/{id}/powsPoints 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éthodeEndpointDescription
POST/powsCré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éthodeEndpointDescription
GET/projectsListe paginée (filtre : ?filter_by_status=OPEN|CLOSED)
GET/projects/{id}Détail d'un projet
POST/projectsCréer un projet
PATCH/projects/{id}Mettre à jour un projet
GET/projects/typesTypes de projets disponibles
GET/projects/{id}/worksTravaux d'un projet (filtre : ?fromDate / ?toDate)
DELETE/projects/{id}/action-categoriesRetirer 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éthodeEndpointDescription
POST/actionsCréer une action
PATCH/actions/{id}Mettre à jour une action
DELETE/actions/{id}Supprimer une action
GET/action-categoriesListe paginée des catégories
GET/action-categories/{id}Détail d'une catégorie (option ?actions pour inclure les actions)
POST/action-categoriesCré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éthodeEndpointDescription
GET/projects/eventsListe de tous les événements
POST/projects/eventsCréer un événement
GET/projects/events/typesTypes 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éthodeEndpointDescription
GET/medias/worksListe des photos de travaux (filtre : ?project_id)
GET/medias/works/{id}Télécharger une photo de travail (retourne du JPEG binaire)
GET/medias/todosListe 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éthodeEndpointDescription
GET/planningsListe des plannings de l'organisation
GET/teams/usersMembres de l'équipe
GET/tagsTags 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

CodeSignification
200Succès — données retournées
201Ressource créée ou modifiée avec succès
400Requête incorrecte — données manquantes ou invalides
401Non authentifié — clé ou token invalide
403Accès refusé — permissions insuffisantes
404Ressource introuvable
500Erreur 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.