Référence de l'API

Base : https://api.rempar.org/v1. JSON partout. Les réponses réussies sont enveloppées dans {"data": ...}, les erreurs dans {"error": {"code": "...", "message": "..."}}. Authentification par jeton Bearer propre à chaque appareil.

L'API est à connaissance nulle : elle ne reçoit jamais de mot de passe ni de contenu en clair. Les clients tiers sont bienvenus tant qu'ils respectent le protocole v1.

Santé

GET /v1/health
→ { "data": { "status": "ok", "release": "1.1.0" } }

Authentification

Méthode Route Corps Réponse
POST /auth/prelogin {email} {kdf, kdf_salt}. Sel factice déterministe si l'e-mail est inconnu.
POST /auth/register {email, auth_key, kdf, kdf_salt, device} 201 {status: "verification_sent"}. Un code à six chiffres est envoyé par e-mail.
POST /auth/verify-email {email, code} {}
POST /auth/login {email, auth_key, device, totp?, code?} {tokens, device_id, vault_key_sealed?}. Erreur totp_required (403) si la 2FA est active et le code absent. Puis email_code_required (403) : un code à six chiffres est envoyé par e-mail, à renvoyer dans code pour obtenir les jetons (10 min, 5 essais).
POST /auth/refresh {refresh_token} {access_token, refresh_token, ...}. Rotation ; un rejeu révoque l'appareil.
POST /auth/logout Révoque l'appareil courant.
POST /auth/recover {email, recovery_auth, totp?} Preuve du kit de secours : renvoie {vault_key_recovery, recovery_token} (15 min). totp_required si la 2FA est active.
POST /auth/recover/complete {email, recovery_token, auth_key, kdf, kdf_salt, vault_key_sealed, device} Nouveau mot de passe maître : remplace la clé d'authentification et la clé du coffre rescellée, révoque tous les autres appareils, connecte celui-ci ({tokens, device_id, vault_key_sealed}).

device : {name, platform, client_id} où client_id est un UUID choisi par le client, stable pour cet appareil.

kdf : {"algo": "argon2id", "m": 65536, "t": 3, "p": 4}. Les clients refusent des paramètres plus faibles que m=19456, t=2, p=1.

Compte

Méthode Route Description
GET /account E-mail, état 2FA, révision du coffre, abonnement {plan, active, until}.
GET /account/subscription Abonnement seul.
POST /account/password Remplace auth_key après un changement de mot de passe maître. Le client republie d'abord la clé du coffre rescellée.
GET /account/devices Appareils actifs.
DELETE /account/devices/{id} Révoque un appareil.
POST /account/totp/setup Génère un secret et renvoie {secret, otpauth_url}.
POST /account/totp/enable {code} : active la 2FA.
POST /account/totp/disable {code} : désactive la 2FA.

Coffre

Méthode Route Description
PUT /vault/key {vault_key_sealed, vault_key_recovery?} : blobs scellés uniquement, remplacés atomiquement. Toujours autorisé (restauration).
GET /vault/items?since=<revision>&limit=500 {items: [{id, revision, deleted, blob, updated_at}], revision}. Nécessite un abonnement actif.
POST /vault/items {base_revision, items: [{id, blob|null}]} → {revision, conflicts: []}. blob: null supprime (pierre tombale). Si base_revision est périmée, le serveur renvoie newer_items au lieu d'écrire. Maximum 500 éléments par envoi. Nécessite un abonnement actif.

Abonnement

Chaque compte démarre en trial pour 30 jours. Les routes de synchronisation répondent 402 subscription_required à l'expiration ; la clé du coffre scellée reste lisible pour permettre une restauration. Le client affiche « En attente » et continue en local.

Codes d'erreur

Code HTTP Sens
invalid_credentials 401 E-mail, clé ou code incorrect.
unauthenticated 401 Jeton absent, expiré ou appareil révoqué.
email_unverified 403 Code e-mail non saisi.
totp_required 403 Fournir totp.
subscription_required 402 Abonnement Cloud expiré.
email_taken 409 Compte déjà vérifié avec cet e-mail.
stale_revision 409 Tirer d'abord les newer_items renvoyés.
token_reused 401 Rejeu détecté, appareil révoqué.

Limites de débit

Pré-connexion 30/min, inscription et vérification 10/min, connexion 15/min, rafraîchissement 30/min, routes authentifiées 240/min par appareil.

Exemple

curl -s https://api.rempar.org/v1/auth/prelogin \
  -H 'Content-Type: application/json' \
  -d '{"email":"vous@example.org"}'

Une question sans réponse ici ? support@rempar.org