← Développeurs

API REST v1

Connectez votre CRM ou ERP à Iwana en quelques heures. Authentification par clé API, scopes granulaires et webhooks signés — sans OAuth complexe ni jeton à rafraîchir.

REST JSON Clés API org Webhooks HMAC Scopes fins

Démarrage rapide

Trois étapes pour votre première requête réussie. Tout se configure depuis le tableau de bord pro.

  1. Créez une clé APIParamètres → Développeurs → Nouvelle clé. Copiez le secret immédiatement — il n’est affiché qu’une fois.
  2. Testez l’authentificationAppelez GET /integrations/me pour vérifier l’organisation et les permissions actives.
  3. 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.

ScopeCe que ça autorise
appointments:readLire les rendez-vous
appointments:writeCréer et modifier les rendez-vous
appointments:deleteAnnuler les rendez-vous
clients:readLire les clients
clients:writeCréer et modifier les clients
clients:deleteSupprimer les clients
services:readPrestations, catégories et lieux
members:readMembres de l’équipe
availability:readPlannings et fermetures
config:readRè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.

HTTPSignificationExemples
401Clé absente, mal formée ou révoquéeunauthorized
403Scope insuffisant pour cette actionforbidden
404Ressource introuvable dans l’organisation
400Validation ou règle métierservice_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é.