Documentation API

L'API Wasate Cloud permet d'intégrer notre plateforme à vos outils. REST classique, JSON, authentification simple par clé API.

Introduction

L'API Wasate Cloud expose les fonctionnalités suivantes :

Base URL : https://wasate.fr

Authentification

Trois mécanismes d'authentification selon le type d'endpoint :

1. Session utilisateur (cookies)

Pour les endpoints utilisés depuis le frontend web. Connexion via /app/login, cookie de session HttpOnly + Secure.

2. Clé API (header)

Pour les intégrations serveur-à-serveur. Créez une clé depuis la console superadmin, puis :

curl -H "Authorization: Bearer wsc_abc123_xxxxxxxxxxxxx" \
     https://wasate.fr/api/your-endpoint

Format de la clé : wsc_[8 chars prefix]_[48 chars secret]. La clé n'est affichée qu'une seule fois à la création.

3. Webhook HMAC

Pour les webhooks entrants, signature HMAC-SHA256 du body avec le secret configuré.

Gestion des erreurs

Toutes les erreurs retournent un JSON avec un champ error contenant un code court :

{
  "error": "invalid_email"
}

Codes HTTP utilisés :

Rate limits

Limites par défaut, par IP :

Endpoints publics

POST /api/contact

Envoi d'un message via le formulaire de contact public.

Body JSON :

{
  "email": "client@example.com",
  "name": "Marie Dupont",
  "subject": "general",
  "message": "Bonjour, j'aimerais en savoir plus sur..."
}

Réponse : 200 OK avec { "status": "received" }

GET /api/status

État global du service. Aucune information sensible.

Réponse :

{
  "status": "ok",
  "service": "wasate-cloud",
  "time": "2026-05-22T14:30:00+00:00"
}

POST /api/newsletter

Inscription à la newsletter.

{ "email": "contact@example.com" }

POST /api/account/request

Soumet une demande d'inscription. Le compte sera créé après validation manuelle par un administrateur.

{
  "first_name": "Marie",
  "last_name": "Dupont",
  "email": "marie@example.com",
  "phone": "+33 6 12 34 56 78",
  "account_type": "client_pro",
  "plan": "solo_pro",
  "captcha_token": "..."
}

account_type : client, client_pro, ou distributor

Webhook : paiement reçu

Endpoint exposé par Wasate Cloud, appelé par votre passerelle bancaire ou Zapier après réception d'un virement SEPA.

POST /api/webhook/payment

Headers requis : X-Wasate-Signature: <hmac-sha256-hex>

Body :

{
  "reference": "WAS-MARIEDUPONT",
  "amount": 8.00,
  "currency": "EUR",
  "date": "2026-05-22T10:00:00Z"
}

Signature HMAC

Pour les webhooks entrants, la signature est calculée ainsi :

// Node.js
const crypto = require('crypto');
const signature = crypto
    .createHmac('sha256', WEBHOOK_SECRET)
    .update(rawBody)
    .digest('hex');

// Envoyer dans header X-Wasate-Signature

Bureau portable (Wasate Connect)

L'agent Wasate Connect relie un ordinateur au cloud du client et synchronise ses dossiers. Chaque appareil est enrôlé via un code à usage unique généré depuis l'espace client, échangé contre un mot de passe d'application Nextcloud révocable — le mot de passe principal n'est jamais transmis.

Installation en une commande (Linux, macOS, Raspberry Pi, Docker, serveur headless) :

curl -fsSL https://wasate.fr/connect.sh | WASATE_CODE=xxxxx bash

POST /connect/enroll

Public. Échange un code d'enrôlement contre des identifiants de synchronisation. Appelé par l'agent depuis la machine du client.

Body :

{
  "code": "xxxxx",
  "device_name": "PC bureau",
  "os": "linux"
}

Réponse 200 :

{
  "server_url": "https://wasate.fr/app",
  "webdav_url": "https://wasate.fr/app/remote.php/dav/files/USER/",
  "username": "USER",
  "password": "<mot de passe d'application>",
  "sync_folder": "Wasate",
  "device_id": 12
}

Erreurs : 403 invalid_or_expired_code, 400 code_required.

POST /connect/heartbeat

Public. L'agent signale qu'il est en ligne, authentifié par possession de son mot de passe d'application.

{ "password": "<mot de passe d'application>" }

GET /api/workspace/devices

Session requise. Liste les appareils de l'utilisateur (statut en ligne, OS, dernière activité).

POST /api/workspace/devices

Session requise. Crée un enrôlement et renvoie un code à usage unique (valable 1 h).

{ "name": "PC bureau", "os": "linux" }  →  { "code": "xxxxx", "expires_in": 3600 }

DELETE /api/workspace/devices/{id}

Session requise. Révoque un appareil : son mot de passe d'application est invalidé immédiatement.

Endpoints publics qui servent une galerie partagée via son token (lien /galerie.html?t={token}, 4 thèmes + lightbox). Galerie protégée par mot de passe → l'envoyer une fois sur /auth pour obtenir un grant à rejouer sur les autres appels.

GET /g/{token}

Métadonnées (titre, description, thème) ou { "status": "password_required" }.

POST /g/{token}/auth

Body password. Renvoie { "grant": "…" } (valable 2 h) pour les galeries protégées.

GET /g/{token}/items

Liste des médias (images/vidéos) de la galerie. Paramètre grant si protégée.

GET /g/{token}/file?name=…&size=thumb|full

Sert un média : aperçu Nextcloud borné (600 px miniature / 1600 px plein écran) ou flux vidéo. Strictement confiné au dossier source de la galerie.

GET /g/{token}/zip

Demande la préparation d'un ZIP complet (traité en file d'attente par les workers).

Compte (utilisateur connecté)

GET /api/me/notifications  ·  PUT

Préférences de notification email (consultation / téléchargement de galeries) + destinataires. Body PUT : notify_view, notify_download, recipients (CSV, max 5).

POST /api/me/upgrade-request

Demande d'augmentation de stockage (4 €/To). Body : requested_tb (1-100), message. Traitement manuel par l'équipe, aucun paiement en ligne.

Connexion avec Google + intégrations

Sign-in OAuth via Google, scopes basiques openid email profile (aucun accès aux fichiers, aucun audit). Boutons « Continuer avec Google » sur connexion et inscription.

GET /app/apps/creatif_integrations/api/signin/google/start

Redirige vers Google. Au retour, le compte est créé (Free 50 Go, actif) si l'email vérifié est nouveau, puis la session Wasate est ouverte.

GET /api/integrations

Session requise. Liste les services d'import (Dropbox/OneDrive) avec leur statut connecté/configuré. Jetons chiffrés (libsodium), jamais exposés. La publication sortante vers les réseaux sociaux a été retirée du produit.

Spec OpenAPI

Une spécification OpenAPI 3.1 complète est disponible : /docs/openapi.yaml (à venir).

SDKs

Aucun SDK officiel n'est encore distribué. L'API étant REST classique, tous les clients HTTP fonctionnent (curl, fetch, axios, requests, Guzzle, …).

Changelog