API Dazr Files : documentation pour développeurs
Lisez les fichiers de Dazr Files dans votre propre logiciel, par exemple pour les sauvegarder : une API REST avec un flux de changements, et WebDAV pour les outils de sauvegarde. Lecture seule.
- Démarrage rapide
- Accès d’une organisation
- Les fichiers personnels d’une personne
- Référence
- Sauvegardes incrémentielles
- Erreurs et limites
- WebDAV
Démarrage rapide
- Enregistrez votre application et activez l’API Dazr Files. Enregistrez votre application, ou utilisez-en une existante, dans la console Dazr Identity : au même endroit que pour Se connecter avec Dazr Identity et l’API Dazr Sign, avec le même identifiant client et le même secret. Sur la page de votre application, choisissez Activer la Dazr Files API. Pour des sauvegardes sans surveillance, ce doit être une application serveur web (avec un secret client).
- Faites-vous approuver. Donnez votre identifiant client à l’organisation. Un propriétaire ou un administrateur ouvre Dazr Identity → Organisations → l’organisation → Applications connectées à Files, saisit l’identifiant client et choisit ce que votre application peut lire : tous les fichiers partagés, ou des dossiers choisis avec tout leur contenu. Il peut aussi limiter votre application à des réseaux indiqués (plages IP).
- Obtenez un jeton. Votre serveur demande un jeton avec
grant_type=client_credentials, l’idde l’organisation dansorg, et votre identifiant client et votre secret (HTTP Basic ou le corps du formulaire). Seules les applications avec un secret client peuvent le faire. - Appelez l’API. Envoyez le jeton d’accès dans
Authorization: Bearer. Il dure 10 minutes et il n’y a pas de jeton d’actualisation : demandez-en un nouveau quand il expire.
curl -u "$DAZR_CLIENT_ID:$DAZR_CLIENT_SECRET" https://identity.dazr.eu/oauth/token \
-d grant_type=client_credentials -d scope=files.read -d org=org_3k9x2m0q8w1v5t7a
{ "access_token": "eyJhbGciOiJFUzI1NiIs...", "token_type": "Bearer", "expires_in": 600, "scope": "files.read" }
curl -H "Authorization: Bearer $TOKEN" https://suite.dazr.eu/api/files/v1/spaces
Accès d’une organisation pour les sauvegardes
Il y a deux voies d’accès. Un propriétaire ou un administrateur d’une organisation approuve votre application pour les fichiers partagés de l’organisation, et votre serveur obtient alors des jetons sans personne (idéal pour des sauvegardes sans surveillance). Ou une personne autorise votre application avec le scope files.read, et votre application lit les fichiers personnels de cette personne.
Une organisation qui n’a pas approuvé votre application, une qui l’a révoquée et une qui n’existe pas répondent toutes invalid_grant. Les administrateurs voient quand votre application a été utilisée pour la dernière fois et chaque fichier qu’elle a téléchargé, et peuvent modifier ses dossiers ou la révoquer à tout moment. Une approbation révoquée s’arrête dès la requête suivante : les jetons déjà émis cessent aussitôt de fonctionner, tout comme les liens de téléchargement déjà fournis. Les fichiers personnels des membres ne font jamais partie de l’approbation d’une organisation.
| Paramètre | Signification |
|---|---|
grant_type | client_credentials |
org | L’id de l’organisation, visible par ses administrateurs dans Applications connectées à Files. |
scope | files.read (le scope par défaut et le seul). |
| Client authentication | Votre identifiant client et votre secret client actuel, en HTTP Basic (client_secret_basic) ou dans le corps du formulaire (client_secret_post). Un ancien secret conservé après un transfert n’est pas accepté. |
Les fichiers personnels d’une personne
Demandez openid files.read (et offline_access pour un jeton d’actualisation) dans le flux authorization code habituel avec PKCE. La personne voit sur l’écran de consentement que votre application peut voir et télécharger ses fichiers. Le jeton atteint ses fichiers personnels, et les fichiers partagés d’une organisation seulement si cette organisation a aussi approuvé votre application et que la personne en est membre et peut les ouvrir, avec les mêmes dossiers. Quand la personne retire votre application dans Applications connectées, ses jetons cessent de fonctionner.
Référence
URL de base https://suite.dazr.eu/api/files/v1. Chaque endpoint est en GET (et HEAD) ; toute autre méthode répond 405. Les erreurs sont en JSON : { "error": { "code", "message" } }. Les listes acceptent limit (1 à 1000, 200 par défaut) et renvoient next_cursor tant qu’il y a une suite.
| Requête | Ce qui est renvoyé |
|---|---|
GET /spaces | Les espaces que votre jeton atteint : me pour les fichiers personnels d’une personne, et les organisations par leur id. |
GET /spaces/{space} | Un espace. |
GET /spaces/{space}/folders/root/children | Les dossiers, puis les fichiers, au niveau le plus haut de ce que votre jeton atteint. Pour un dossier, utilisez son id au lieu de root. |
GET /spaces/{space}/folders/{id} | Un dossier. |
GET /spaces/{space}/files/{id} | Un fichier : name, path, parent_id, size, mime, version, etag, created_at, modified_at et trashed_at. |
GET /spaces/{space}/files/{id}/versions | Les versions conservées d’un fichier, de la plus récente à la plus ancienne. |
GET /spaces/{space}/files/{id}/content | Une redirection (302) vers un lien de téléchargement sur files.dazr.eu valable 5 minutes et compatible avec les plages d’octets. Ajoutez version= pour une version antérieure, ou redirect=false pour obtenir le lien en JSON. |
GET /spaces/{space}/trash | Les fichiers de la corbeille, sous forme de métadonnées. Ils ne peuvent pas être téléchargés tant que personne ne les a restaurés. |
GET /spaces/{space}/changes | Ce qui a changé depuis un curseur, pour des sauvegardes incrémentielles (ci-dessous). |
Chaque requête nécessite le scope files.read. Paramètres de requête :
| Paramètre | Signification |
|---|---|
limit | Éléments par page pour children, trash et changes : 1 à 1000 (200 par défaut, 500 pour changes). |
cursor | Le next_cursor de la page précédente, ou pour changes le cursor renvoyé. |
version | Pour content : un numéro de version issu de versions. Sans lui, la version actuelle. |
redirect | Pour content : false renvoie { "url", "expires_in" } au lieu d’un 302. |
GET /spaces
{ "spaces": [ { "id": "org_3k9x2m0q8w1v5t7a", "type": "organisation", "name": "Bakkerij Jansen", "folders": "chosen" } ] }
GET /spaces/org_3k9x2m0q8w1v5t7a/folders/root/children?limit=2
{ "items": [
{ "id": "Hk2mQ9xP4aL1", "type": "folder", "name": "Finance", "parent_id": null, "path": "/Finance",
"created_at": "2026-09-01T08:12:40.000Z" },
{ "id": "p3RtY7uW0zQe", "type": "file", "name": "Budget 2027.xlsx", "parent_id": "Hk2mQ9xP4aL1",
"path": "/Finance/Budget 2027.xlsx", "size": 48213,
"mime": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "version": 3, "version_count": 3,
"etag": "\"p3RtY7uW0zQe.3.48213\"", "sha256": null, "created_at": "2026-09-02T10:00:00.000Z",
"modified_at": "2026-10-14T16:31:09.000Z", "trashed_at": null } ],
"next_cursor": "o.2" }
GET /spaces/org_3k9x2m0q8w1v5t7a/files/p3RtY7uW0zQe/versions
{ "versions": [ { "version": 3, "size": 48213, "mime": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"created_at": "2026-10-14T16:31:09.000Z", "current": true, "restored_from": null } ] }
GET /spaces/org_3k9x2m0q8w1v5t7a/files/p3RtY7uW0zQe/content
302 Found
Location: https://files.dazr.eu/v1/file?t=g1.…
curl -L -o "Budget 2027.xlsx" -H "Authorization: Bearer $TOKEN" \
https://suite.dazr.eu/api/files/v1/spaces/org_3k9x2m0q8w1v5t7a/files/p3RtY7uW0zQe/content
Suivez la redirection (curl -L) : le lien sur files.dazr.eu n’a pas besoin d’en-tête Authorization. Un fichier qui n’est pas encore dans la passerelle Files est diffusé directement au lieu d’être redirigé.
Sommes de contrôle : Dazr Files ne stocke pas de hachage du contenu de chaque fichier, donc sha256 vaut toujours null. L’etag change chaque fois que le contenu change (une nouvelle version). Calculez votre propre hachage pendant le téléchargement si vous en avez besoin. Les fichiers sont stockés chiffrés (AES-256-GCM, avec une clé par espace détenue par Dazr) et Dazr les déchiffre quand vous les téléchargez via TLS. Ce n’est pas un chiffrement de bout en bout.
Sauvegardes incrémentielles
Appelez changes une première fois sans curseur : chaque dossier et chaque fichier revient en created, avec un cursor. Gardez le curseur et envoyez-le la fois suivante dans cursor=. Vous recevez ce qui a changé depuis : created, updated (nouveau contenu), moved (renommé ou déplacé dans un autre dossier), trashed, restored et deleted (supprimé définitivement, ou plus dans les dossiers que votre application peut lire). Chaque changement comporte l’id, l’item_type et l’item actuel (null si supprimé). Les dossiers viennent avant les fichiers, les parents avant leurs enfants. Tant que has_more vaut true, rappelez avec le nouveau curseur. Si rien n’a changé, vous récupérez le même curseur. Un curseur fonctionne 90 jours, pour votre application et cet espace uniquement ; un curseur expiré répond 410, et vous recommencez sans curseur. Seuls les 5 curseurs les plus récents de votre application pour un espace restent valides.
GET /spaces/org_3k9x2m0q8w1v5t7a/changes?cursor=dc1.ds_…
{ "changes": [
{ "type": "updated", "id": "p3RtY7uW0zQe", "item_type": "file",
"item": { "id": "p3RtY7uW0zQe", "type": "file", "name": "Budget 2027.xlsx", "version": 4, … } },
{ "type": "deleted", "id": "Zx81LmQa2bNc", "item_type": "file", "item": null } ],
"cursor": "dc1.ds_…",
"has_more": false }
Erreurs et limites
Les erreurs ont un statut HTTP et un corps comme { "error": { "code": "not_found", "message": "..." } }. Tout ce que votre jeton n’atteint pas répond 404, comme ce qui n’existe pas.
| Statut | Codes |
|---|---|
400 | invalid_limit, invalid_cursor (un curseur d’une autre application ou d’un autre espace) |
401 | unauthenticated, invalid_token (expiré ou révoqué, l’approbation ou le consentement de la personne a été retiré, ou l’API Dazr Files a été désactivée pour votre application) |
403 | insufficient_scope, files_api_disabled, network_not_allowed (l’organisation a indiqué des réseaux et cette requête vient d’ailleurs) |
404 | space_not_found, folder_not_found, not_found, version_not_found, unknown_endpoint |
405 | method_not_allowed : toute méthode autre que GET, HEAD et OPTIONS |
410 | cursor_expired : recommencez sans curseur |
429 | rate_limited, avec un en-tête Retry-After |
503 | not_available, storage_unavailable : réessayez plus tard |
L’endpoint de jeton répond par des erreurs OAuth : invalid_client (identifiant client ou secret erroné, ou application sans secret client), unauthorized_client (l’API Dazr Files n’est pas activée pour votre application), invalid_scope et invalid_grant (pas d’approbation de cette organisation, ou pas depuis ses réseaux indiqués).
| Quoi | Limite |
|---|---|
| Requêtes API | 600 par minute par approbation (ou par personne et application), 6 000 par minute par application, 1 200 par minute par adresse IP |
| Téléchargements | 300 par minute par approbation via l’API, 600 par minute via WebDAV |
changes | 120 par heure par espace sans curseur de page ; les pages suivantes ne sont pas limitées séparément |
| Requêtes WebDAV | 1 200 par minute par approbation |
/oauth/token | 600 requêtes par minute et par adresse IP, et 300 par minute et par app |
Chaque téléchargement est consigné pour les administrateurs de l’organisation avec le nom de votre application, le fichier, l’heure et une partie de l’adresse IP : les 5 000 derniers, jusqu’à 180 jours. Un même fichier téléchargé à nouveau dans les 10 minutes compte une fois. L’activité Files de l’organisation affiche une ligne par jour pour votre application. Les téléchargements depuis les fichiers personnels d’une personne apparaissent dans ses Applications connectées.
WebDAV
Pour les outils de sauvegarde qui parlent WebDAV, un administrateur de l’organisation crée un identifiant WebDAV pour votre application dans Applications connectées à Files. Le mot de passe est affiché une fois, n’est stocké que sous forme de hachage et n’est jamais le mot de passe Dazr de quelqu’un. L’identifiant suit l’approbation : mêmes dossiers, réseaux et limites, et il s’arrête quand l’approbation est révoquée.
| Réglage | Valeur |
|---|---|
| Serveur | https://files.dazr.eu/dav/ |
| Connexion | HTTP Basic avec le nom d’utilisateur (dzw_…) et le mot de passe fournis par l’administrateur. |
| Méthodes | OPTIONS, PROPFIND avec Depth: 0 ou 1, GET et HEAD avec plages d’octets. Depth: infinity est refusé. Toute écriture répond 403 ou 405. |
Les noms de dossiers et de fichiers sont affichés tels qu’ils sont dans Dazr Files. Quand deux éléments d’un dossier portent le même nom (sans tenir compte de la casse), le plus ancien le garde et les autres reçoivent leur id entre parenthèses avant l’extension, pour que chaque élément ait son propre chemin. Un dossier de plus de 10 000 éléments ne peut pas être listé via WebDAV ; utilisez l’API. Après 10 échecs de connexion depuis une adresse IP en 15 minutes, cette adresse attend 15 minutes.
rclone
- Lancez
rclone config, choisisseznpour un nouveau remote, nommez-ledazret choisissez le type de stockagewebdav. - URL :
https://files.dazr.eu/dav/. Vendor :other. User : le nom d’utilisateur (dzw_…). Password : choisissez de le saisir vous-même et collez le mot de passe. - Laissez le jeton bearer vide et enregistrez. Vérifiez avec
rclone lsd dazr:, puis sauvegardez.
# ~/.config/rclone/rclone.conf (rclone obscure <password> gives the pass value)
[dazr]
type = webdav
url = https://files.dazr.eu/dav/
vendor = other
user = dzw_0123456789abcdef0123
pass = <obscured password>
rclone lsd dazr:
rclone sync dazr: /backup/dazr --transfers 4
rclone compare la taille et l’heure de modification. Utilisez copy au lieu de sync pour garder dans votre sauvegarde les fichiers supprimés dans Dazr Files.
Synology Cloud Sync
- Ouvrez Cloud Sync sur le NAS, ajoutez un fournisseur cloud et choisissez WebDAV.
- Adresse du serveur :
https://files.dazr.eu/dav/. Nom d’utilisateur et mot de passe : l’identifiant WebDAV fourni par l’administrateur. - Choisissez un dossier local, le dossier distant
/(ou un dossier) et le sens de synchronisation Download remote changes only.
Cloud Sync avec WebDAV, sens de synchronisation « Download remote changes only ». Hyper Backup écrit des sauvegardes vers WebDAV mais ne peut pas y lire.