Démarrage rapide
Trois étapes pour votre première requête réussie. Tout se configure depuis le tableau de bord pro.
- Créez une clé APIParamètres → Développeurs → Nouvelle clé. Copiez le secret immédiatement — il n’est affiché qu’une fois.
- Testez l’authentificationAppelez
GET /integrations/me pour vérifier l’organisation et les permissions actives. - Synchronisez vos donnéesLisez le catalogue et l’équipe, créez ou mettez à jour clients et rendez-vous, puis abonnez un webhook pour les mises à jour temps réel.
Exemple curl — remplacez la clé et le domaine par les vôtres :
curl -s https://votre-domaine.iwana.fr/api/v1/pro/integrations/me \
-H "Authorization: Bearer iw_live_xxxxxxxx_your_secret_here"
Authentification
Chaque requête doit inclure une clé API organisationnelle dans l’en-tête Authorization. Pas de flux OAuth, pas de refresh token : révoquez une clé compromise en un clic depuis le tableau de bord.
Authorization: Bearer iw_live_<prefix>_<secret>
Clés production
Préfixe iw_live_* — accès aux données réelles de l’organisation.
Clés sandbox
Préfixe iw_test_* — environnements de test et intégration continue.
L’organisation est embarquée dans la clé : vous n’avez pas besoin d’envoyer x-workspace-id ni d’autres en-têtes de contexte.
Scopes
Chaque clé porte un ensemble de scopes au moment de la création. Un endpoint refusé renvoie 403 si le scope requis est absent.
| Scope | Ce que ça autorise |
|---|
appointments:read | Lire les rendez-vous |
appointments:write | Créer et modifier les rendez-vous |
appointments:delete | Annuler les rendez-vous |
clients:read | Lire les clients |
clients:write | Créer et modifier les clients |
clients:delete | Supprimer les clients |
services:read | Prestations, catégories et lieux |
members:read | Membres de l’équipe |
availability:read | Plannings et fermetures |
config:read | Règles métier (snapshot) |
Bundle par défaut à la création : lecture/écriture RDV et clients, lecture catalogue et équipe.
URL de base
Tous les endpoints vivent sous le préfixe PRO :
https://<votre-domaine>/api/v1/pro
Les exemples ci-dessous omettent ce préfixe pour la lisibilité.
Vérifier votre clé
GET/integrations/me
Retourne orgId, acteur, permissions, locale et fuseau horaire. Idéal comme health-check d’intégration.
{
"orgId": "org_…",
"actor": { "type": "api_key", "id": "key_…" },
"permissions": ["appointment:read", "appointment:write", …],
"locale": "fr",
"timezone": "Europe/Paris"
}Rendez-vous
CRUD sur les rendez-vous de type APPOINTMENT uniquement (pas les blocs d’indisponibilité). La source est automatiquement marquée API lors d’un appel par clé.
GET/appointments
Liste paginée. Filtres : from, to (ISO date), status (PENDING, CONFIRMED, CANCELLED…).
Scope requis : appointments:read
GET/appointments/{id}
Détail d’un rendez-vous avec client, prestation et membres assignés.
Scope requis : appointments:read
POST/appointments
Crée un rendez-vous. serviceId et clientId sont requis ; startAt / endAt en ISO 8601 UTC.
Scope requis : appointments:write
PATCH/appointments/{id}/status
Change le statut (ex. CONFIRMED, CANCELLED) sans réécrire tout l’objet.
Scope requis : appointments:write
DELETE/appointments/{id}
Annule le rendez-vous (soft cancel côté métier).
Scope requis : appointments:delete
Corps de création
{
"serviceId": "svc_…",
"clientId": "cli_…",
"startAt": "2026-08-10T09:00:00.000Z",
"endAt": "2026-08-10T10:00:00.000Z",
"memberIds": ["mem_…"],
"customFields": { "crmDealId": "42" },
"internalNotes": "Synchronisé depuis le CRM"
}Clients
Gérez la fiche client pour alimenter vos rendez-vous et garder le CRM aligné.
GET/clients
Liste des clients de l’organisation avec recherche et pagination.
Scope requis : clients:read
GET/clients/{id}
Fiche complète : coordonnées, tags, champs personnalisés.
Scope requis : clients:read
POST/clients
Crée ou met à jour (upsert selon email/téléphone selon vos règles métier).
Scope requis : clients:write
DELETE/clients/{id}
Supprime le client (selon les règles de rétention de l’organisation).
Scope requis : clients:delete
Exemple de création
{
"firstName": "Marie",
"lastName": "Dupont",
"email": "marie@exemple.fr",
"phone": "+33612345678",
"customFields": { "hubspotId": "12345" }
}Catalogue & équipe
Données de référence en lecture seule — utiles pour mapper vos IDs avant de créer des rendez-vous.
GET/catalog/services
Prestations proposées : durée, prix, catégorie.
Scope requis : services:read
GET/catalog/locations
Lieux d’exercice (salles, adresses).
Scope requis : services:read
GET/catalog/categories
Arborescence des catégories de prestations.
Scope requis : services:read
GET/team
Membres assignables aux rendez-vous.
Scope requis : members:read
GET/availability
Créneaux et fermetures exceptionnelles.
Scope requis : availability:read
GET/business-rules
Snapshot des règles métier (délais, annulation, etc.).
Scope requis : config:read
Mapping IDs externes
Pour une synchronisation CRM idempotente, stockez la correspondance entre vos IDs et ceux d’Iwana. Évite les doublons quand le même contact est reçu plusieurs fois.
GET/external-refs?provider=&entityType=&externalId=
Résout un ID externe vers l’ID Iwana local (client, rendez-vous…).
Scope requis : clients:read
PUT/external-refs
Crée ou met à jour un mapping bidirectionnel.
Scope requis : clients:write
PUT /external-refs
{
"provider": "hubspot",
"entityType": "client",
"localId": "cli_…",
"externalId": "12345"
}Webhooks sortants
Abonnez une URL HTTPS depuis Paramètres → Développeurs. Iwana envoie un POST JSON à chaque événement métier, signé pour que vous puissiez vérifier l’authenticité.
Événements disponibles
appointment.createdappointment.updatedappointment.cancelledclient.createdclient.updated
En-têtes de livraison
Iwana-Signature: sha256=<hmac-sha256 du corps brut>
Iwana-Event: appointment.created
Iwana-Delivery: <uuid unique par tentative>
Corps de l’événement
{
"event": "appointment.created",
"orgId": "org_…",
"data": {
"id": "apt_…",
"startAt": "2026-08-10T09:00:00.000Z",
"status": "PENDING"
},
"occurredAt": "2026-08-07T12:00:00.000Z"
}Vérification HMAC — calculez SHA-256 HMAC du corps brut (JSON tel qu’envoyé) avec le secret affiché une seule fois à la création de l’abonnement. Comparez avec Iwana-Signature. Répondez 2xx rapidement ; les échecs sont réessayés avec backoff exponentiel.
Erreurs
Les réponses d’erreur sont en JSON avec un code machine lisible quand c’est pertinent.
| HTTP | Signification | Exemples |
|---|
401 | Clé absente, mal formée ou révoquée | unauthorized |
403 | Scope insuffisant pour cette action | forbidden |
404 | Ressource introuvable dans l’organisation | — |
400 | Validation ou règle métier | service_required, invalid_range |
Versioning
Version actuelle : v1 (/api/v1/pro/…). Les changements incompatibles seront publiés sous /v2/ avec une période de chevauchement d’au moins 12 mois sur v1.
Les ajouts rétro-compatibles (nouveaux champs optionnels, nouveaux endpoints) peuvent arriver sans bump de version majeure.
Prêt à intégrer ?
Créez votre première clé dans le tableau de bord ou contactez-nous pour un accès sandbox dédié.