API v2

L'API de référence. Elle ne manipule que des données chiffrées : le chiffrement se fait chez toi, avec le SDK.

La v1 est dépréciée
L'API v1 stocke en clair et sera retirée le 30 septembre 2027 (en-têtes Deprecation / Sunset). Migre vers la v2.

Authentification

Deux types de jetons, tous deux en Authorization: Bearer … :

  • Jeton d'application (dvc_at_…) obtenu via OAuth 2.1 + PKCE: confiné au dossier de l'application.
  • Jeton personnel (dvc_pat_…), créé dans Réglages → Jetons personnels, pour tes propres scripts : accès à tout le drive selon ses permissions (drive:read|write|delete|share).
Un jeton ne donne que du chiffré
Pour lire un fichier, ton code doit aussi détenir la clé du drive. Avec Node, utilise @drivecord/node qui fait tout le chiffrement.

Envoyer un fichier

  1. POST /api/v2/uploads avec { fileId, size } (identifiant de 21 caractères généré chez toi, taille chiffrée).
  2. PUT /api/v2/uploads/:id/chunks/:i pour chaque morceau (application/octet-stream, 8 Mio + 16 octets, tous sauf le dernier).
  3. POST /api/v2/uploads/:id/complete avec { encMeta, fkWrapped, noncePrefix }.
bash
curl -X POST https://drivecord.app/api/v2/uploads \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"fileId":"aBcDeFgHiJkLmNoPqRsTu","size":1048592}'

Conventions

Erreurs

Toujours { "error": { "code", "message", "requestId" } }. Le code est stable (insufficient_scope, rate_limited, chunk_mismatch…).

Idempotence

Envoie Idempotency-Key sur les POST : la même requête est rejouée pendant 24 h, une requête différente avec la même clé donne 422.

Limites

En-têtes RateLimit-Limit/Remaining/Reset et Retry-After. Quota d'envoi quotidien par compte.

CORS

Jamais * sur les routes authentifiées : seules les origines enregistrées pour le jeton sont autorisées.

Pagination & synchronisation

GET /files et /folders utilisent un cursor. GET /changes?cursor= (jetons personnels) renvoie le journal des modifications du drive.

Fichiers publics

visibility: "public" à la création stocke le fichier en clair pour pouvoir le servir en lien direct (POST /files/:id/public). Un fichier chiffré ne peut jamais avoir de lien public.

Référence complète

Spécification OpenAPI 3.1 : /openapi-v2.json.