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