Download OpenAPI specification:
API de la GED Hubdoc : workspaces, dossiers, documents, éditique (Markdown/Typst), uploads, annuaire (users, contacts, groupes) et permissions.
Toutes les requêtes exigent un token Bearer OAuth2 (ou PAT) avec le
scope adapté au verbe HTTP : read pour les GET, write pour les
mutations. L'obtention des tokens (flows OAuth2, device flow CLI,
token exchange Edifice, PAT) est documentée sur la page
Authentification.
Récupérer la liste de tous les espaces de travail
[- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}
]Créer un nouvel espace de travail
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| label | string Libellé de l'espace de travail |
| description | string Description de l'espace de travail |
| classification_plan_id | string <uuid> Identifiant du plan de classement associé |
| classification_plan_csv | string Données CSV du plan de classement |
| classification_plan_label | string Libellé du plan de classement |
| domain_id | string <uuid> Identifiant du domaine associé |
object | |
| metadata_user | object Métadonnées définies par l'utilisateur |
{- "label": "Project Alpha",
- "description": "Main project workspace",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_csv": "string",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { }
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Récupérer un espace de travail spécifique par identifiant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Mettre à jour un espace de travail existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| label | string Libellé de l'espace de travail |
| description | string Description de l'espace de travail |
| classification_plan_id | string <uuid> Identifiant du plan de classement associé |
| classification_plan_csv | string Données CSV du plan de classement |
| classification_plan_label | string Libellé du plan de classement |
| domain_id | string <uuid> Identifiant du domaine associé |
object | |
| metadata_user | object Métadonnées définies par l'utilisateur |
{- "label": "Project Alpha",
- "description": "Main project workspace",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_csv": "string",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { }
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Supprimer un espace de travail existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Récupère une liste de dossiers selon les paramètres de filtrage fournis.
Filtrage par contexte :
workspace_id : dossiers d'un workspace spécifiquedocuments_folder_id : sous-dossiers d'un dossier parent spécifiqueFiltrage avancé avec Ransack :
q pour des recherches avancéesq[name_cont]=admin pour chercher les dossiers contenant "admin"| workspace_id | string <uuid> ID du workspace pour filtrer les dossiers |
| documents_folder_id | string <uuid> ID du dossier parent pour filtrer les sous-dossiers |
| sort | string Default: "updated_at" Champ de tri (name, updated_at, created_at, etc.) |
| direction | string Default: "desc" Enum: "asc" "desc" Direction du tri |
| per_page | integer [ 1 .. 100 ] Default: 20 Nombre d'éléments par page |
| page | integer >= 1 Default: 1 Numéro de page |
object Filtres Ransack pour recherche avancée. Exemples :
|
[- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Documents",
- "description": "Main documents folder",
- "color": "#e74c3c",
- "icon": "folder-open",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "external_id": "ext-folder-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "parent": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Parent Folder"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}
]Créer un nouveau dossier
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| name | string Nom du dossier |
| description | string Description du dossier |
| color | string Couleur du dossier |
| icon | string Icône du dossier |
| documents_folder_id | string <uuid> Identifiant du dossier parent |
| workspace_id | string <uuid> Identifiant de l'espace de travail associé |
{- "name": "Documents",
- "description": "Main documents folder",
- "color": "#e74c3c",
- "icon": "folder-open",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Documents",
- "description": "Main documents folder",
- "color": "#e74c3c",
- "icon": "folder-open",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "external_id": "ext-folder-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "parent": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Parent Folder"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Récupérer un dossier spécifique par identifiant avec son contenu (sous-dossiers et fichiers)
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Documents",
- "description": "Main documents folder",
- "color": "#e74c3c",
- "icon": "folder-open",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "external_id": "ext-folder-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "parent": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Parent Folder"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z",
- "items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Documents",
- "description": "Main documents folder",
- "color": "#e74c3c",
- "icon": "folder-open",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "external_id": "ext-folder-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "parent": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Parent Folder"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z",
- "type": "folder"
}
]
}Mettre à jour un dossier existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| name | string Nom du dossier |
| description | string Description du dossier |
| color | string Couleur du dossier |
| icon | string Icône du dossier |
| documents_folder_id | string <uuid> Identifiant du dossier parent |
| workspace_id | string <uuid> Identifiant de l'espace de travail associé |
{- "name": "Documents",
- "description": "Main documents folder",
- "color": "#e74c3c",
- "icon": "folder-open",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Documents",
- "description": "Main documents folder",
- "color": "#e74c3c",
- "icon": "folder-open",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "external_id": "ext-folder-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "parent": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Parent Folder"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Supprimer un dossier existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Récupère une liste de documents selon les paramètres de filtrage fournis.
Filtrage par contexte :
workspace_id : documents d'un workspace spécifiquedocuments_folder_id : documents d'un dossier spécifiqueFiltrage avancé avec Ransack :
q pour des recherches avancéesq[name_cont]=rapport pour chercher les documents contenant "rapport"| workspace_id | string <uuid> ID du workspace pour filtrer les documents |
| documents_folder_id | string <uuid> ID du dossier pour filtrer les documents |
| sort | string Default: "updated_at" Champ de tri (name, updated_at, created_at, etc.) |
| direction | string Default: "desc" Enum: "asc" "desc" Direction du tri |
| per_page | integer [ 1 .. 100 ] Default: 20 Nombre d'éléments par page |
| page | integer >= 1 Default: 1 Numéro de page |
object Filtres Ransack pour recherche avancée. Exemples :
|
[- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "document.pdf",
- "description": "Important document",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "document_type_id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "external_id": "ext-doc-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "byte_size": 342502,
- "content_type": "application/pdf",
- "metadata_user": { },
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "folder": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Documents"
}, - "domain": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "name": "Legal"
}, - "document_type": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "name": "Contract"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}
]Créer un document en uploadant un fichier (classique ou chunked).
Deux modes d'upload :
uploaded_filechunked_upload_idDeux scénarios :
Mode fusion (bulk_upload avec merge_to_pdf) : le fichier est stagé
(réponse 202 Accepted, aucun document individuel créé) à sa position
(obligatoire, unique, à partir de 0). Quand total_files sources ont été
reçues, elles sont fusionnées en un seul document PDF dans l'ordre des
positions ; son ID est exposé par GET /bulk_uploads/:id
(merged_document_id). Formats acceptés : PDF, JPEG, PNG.
Fonctionnalités :
| bulk_upload_id | string <uuid> ID d'un BulkUpload existant (optionnel, pour uploads groupés) |
| workspace_id | string <uuid> ID du workspace |
| documents_folder_id | string <uuid> ID du dossier parent |
| domain_id | string <uuid> ID du domaine |
| document_type_id | string <uuid> ID du type de document |
| auto_classify | boolean Default: false Active la classification automatique des documents |
| metadata_user | object Métadonnées utilisateur personnalisées |
| uploaded_file | string <binary> Fichier à uploader (soit uploaded_file, soit chunked_upload_id requis) |
| position | integer >= 0 Position du fichier dans le PDF fusionné (requis si le BulkUpload est en mode merge_to_pdf) |
| pages | string Réservé (sélection de plages de pages, non implémenté — envoyer null) |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "document.pdf",
- "description": "Important document",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "document_type_id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "external_id": "ext-doc-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "byte_size": 342502,
- "content_type": "application/pdf",
- "metadata_user": { },
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "folder": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Documents"
}, - "domain": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "name": "Legal"
}, - "document_type": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "name": "Contract"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z",
- "bulk_upload_id": "0fa9eaf7-c3d9-40df-8b1c-75e752c9eaa3"
}Récupérer un document spécifique par identifiant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "document.pdf",
- "description": "Important document",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "document_type_id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "external_id": "ext-doc-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "byte_size": 342502,
- "content_type": "application/pdf",
- "metadata_user": { },
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "folder": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Documents"
}, - "domain": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "name": "Legal"
}, - "document_type": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "name": "Contract"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Mettre à jour un document existant.
Deux modes :
uploaded_file| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| name | string Nom du fichier |
| description | string Description du fichier |
| uploaded_file | string <binary> Fichier à télécharger |
| documents_folder_id | string <uuid> Identifiant du dossier parent |
| workspace_id | string <uuid> Identifiant de l'espace de travail associé |
| domain_id | string <uuid> Identifiant du domaine associé |
| document_type_id | string <uuid> Identifiant du type de document associé |
| metadata_user | object Métadonnées définies par l'utilisateur |
| auto_classify | boolean Default: false Active la classification automatique du document |
{- "name": "document.pdf",
- "description": "Important document",
- "uploaded_file": "string",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "document_type_id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "metadata_user": { },
- "auto_classify": true
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "document.pdf",
- "description": "Important document",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "document_type_id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "external_id": "ext-doc-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "byte_size": 342502,
- "content_type": "application/pdf",
- "metadata_user": { },
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "folder": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Documents"
}, - "domain": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "name": "Legal"
}, - "document_type": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "name": "Contract"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Supprimer un document existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Crée une nouvelle version du document : le contenu courant est d'abord archivé comme version (historique), puis remplacé par le fichier uploadé. L'identifiant du document reste inchangé.
À utiliser lorsqu'un livrable déjà présent doit être mis à jour sans créer de doublon ni casser les liens existants (ex. resync d'un artefact modifié par un agent Hubdoc/Synapse).
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| uploaded_file | string <binary> Nouveau contenu du document (soit uploaded_file, soit chunked_upload_id requis) |
| chunked_upload_id | string <uuid> Référence à un upload chunked complété (alternative à uploaded_file) |
| comment | string Commentaire optionnel associé à la version créée |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "document.pdf",
- "description": "Important document",
- "documents_folder_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "workspace_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "document_type_id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "external_id": "ext-doc-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed891",
- "byte_size": 342502,
- "content_type": "application/pdf",
- "metadata_user": { },
- "workspace": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "label": "Project Alpha",
- "description": "Main project workspace",
- "external_id": "ext-workspace-12345",
- "classification_plan_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "classification_plan_label": "Standard Plan",
- "domain_id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "completion_percentage": 75.5,
- "settings": {
- "code": "PROJ-001",
- "start_date": "2023-01-01",
- "color": "#3498db",
- "icon": "folder",
- "address": "123 Main St",
- "postal_code": "12345",
- "city": "Paris",
- "agency": "Construction Agency",
- "project_type": "Construction",
- "status": "active",
- "end_date": "2023-12-31",
- "validation": {
- "default_deadline_days": 30,
- "auto_reminder_days": [
- 7,
- 14
], - "super_validator_ids": [
- "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "019951a3-01b7-7eb9-88bb-f872a01ed887"
]
}
}, - "metadata_user": { },
- "user": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}, - "folder": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "name": "Documents"
}, - "domain": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed889",
- "name": "Legal"
}, - "document_type": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed890",
- "name": "Contract"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Catalogue des polices effectivement résolvables par le compilateur
Typst (mêmes chemins que la compilation des ComposedDocument).
Permet de découvrir les font_family valides avant de configurer
page_settings.font_family.
Réponse cachée 1h (les polices ne changent qu'au déploiement / à l'installation de paquets).
| include_system | boolean Default: true Inclure les polices système (/usr/share/fonts) en plus des polices embarquées. |
| with_variants | boolean Default: true Inclure la liste des variantes (graisses/styles) par famille. |
{- "fonts": [
- {
- "family": "Plus Jakarta Sans",
- "variants": [
- "Regular",
- "Bold",
- "Italic",
- "Bold Italic"
]
}
], - "total": 238,
- "font_paths": [
- "/usr/share/fonts",
- "engines/documents/fonts"
]
}Composed Documents — éditique Markdown/Typst. Permet de créer des documents à partir d'un template, gérer les parts (sections), et compiler en PDF via le pipeline Typst.
Liste les ComposedDocument accessibles à l'utilisateur (scopés
par ComposedDocumentPolicy::Scope).
Filtres optionnels :
workspace_id : workspace propriétairefolder_id : dossier propriétairestatus : draft / in_progress / ready / exported| workspace_id | string <uuid> |
| folder_id | string <uuid> |
| status | string Enum: "draft" "in_progress" "ready" "exported" |
| per_page | integer [ 1 .. 100 ] Default: 20 |
| page | integer >= 1 Default: 1 |
{- "composed_documents": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed999",
- "name": "Facture Sinoia 2026-05",
- "description": "string",
- "status": "draft",
- "assembly_mode": "composed",
- "typst_source": "string",
- "variables": {
- "client": "Sinoia",
- "montant": 1500
}, - "page_settings": { },
- "metadata": { },
- "metadata_ai": { },
- "metadata_user": { },
- "document_template_id": "2574412b-843e-409c-ab85-b4d8aeb24485",
- "file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767",
- "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",
- "workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "parts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "Annexe — Conditions générales",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 12,
- "page_break": false,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "markdown_file_id": "80bb14d2-a193-4c03-9423-5710684c0b0f",
- "metadata": { },
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Instancie un ComposedDocument depuis un DocumentTemplate
identifié par sa key. Le typst_source, variables_schema et
default_parts sont hérités du template ; les variables du body
remplissent les placeholders.
Pipeline d'interactor : Documents::ComposedDocuments::CreateFromTemplate.
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| template_key required | string (Création seulement) Slug d'un DocumentTemplate. Le composed
document hérite du typst_source, variables_schema et default_parts
du template. La création utilise l'interactor
|
| name | string Nom du document (par défaut, nom du template) |
| description | string |
object Valeurs des variables du template | |
object | |
| typst_source | string (Update) Source Typst complète. Combiné à |
| assembly_mode | string Enum: "composed" "pure_typst" (Update) Bascule le mode d'assemblage (#463). Un mode invalide est rejeté en 422. |
| workspace_id | string <uuid> |
| folder_id | string <uuid> |
object |
{- "template_key": "facture-edf",
- "name": "Facture Sinoia 2026-05",
- "description": "string",
- "variables": {
- "client": "Sinoia",
- "montant": 1500
}, - "page_settings": { },
- "typst_source": "string",
- "assembly_mode": "composed",
- "workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9",
- "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",
- "metadata_user": { }
}{- "composed_document": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed999",
- "name": "Facture Sinoia 2026-05",
- "description": "string",
- "status": "draft",
- "assembly_mode": "composed",
- "typst_source": "string",
- "variables": {
- "client": "Sinoia",
- "montant": 1500
}, - "page_settings": { },
- "metadata": { },
- "metadata_ai": { },
- "metadata_user": { },
- "document_template_id": "2574412b-843e-409c-ab85-b4d8aeb24485",
- "file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767",
- "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",
- "workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "parts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "Annexe — Conditions générales",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 12,
- "page_break": false,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "markdown_file_id": "80bb14d2-a193-4c03-9423-5710684c0b0f",
- "metadata": { },
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "composed_document": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed999",
- "name": "Facture Sinoia 2026-05",
- "description": "string",
- "status": "draft",
- "assembly_mode": "composed",
- "typst_source": "string",
- "variables": {
- "client": "Sinoia",
- "montant": 1500
}, - "page_settings": { },
- "metadata": { },
- "metadata_ai": { },
- "metadata_user": { },
- "document_template_id": "2574412b-843e-409c-ab85-b4d8aeb24485",
- "file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767",
- "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",
- "workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "parts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "Annexe — Conditions générales",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 12,
- "page_break": false,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "markdown_file_id": "80bb14d2-a193-4c03-9423-5710684c0b0f",
- "metadata": { },
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Met à jour les attributs modifiables : name, description,
variables, page_settings, metadata_user. Le typst_source
n'est pas modifié directement par cette route — pour modifier le
contenu, utiliser les endpoints /parts.
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| template_key | string (Création seulement) Slug d'un DocumentTemplate. Le composed
document hérite du typst_source, variables_schema et default_parts
du template. La création utilise l'interactor
|
| name | string Nom du document (par défaut, nom du template) |
| description | string |
object Valeurs des variables du template | |
object | |
| typst_source | string (Update) Source Typst complète. Combiné à |
| assembly_mode | string Enum: "composed" "pure_typst" (Update) Bascule le mode d'assemblage (#463). Un mode invalide est rejeté en 422. |
| workspace_id | string <uuid> |
| folder_id | string <uuid> |
object |
{- "template_key": "facture-edf",
- "name": "Facture Sinoia 2026-05",
- "description": "string",
- "variables": {
- "client": "Sinoia",
- "montant": 1500
}, - "page_settings": { },
- "typst_source": "string",
- "assembly_mode": "composed",
- "workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9",
- "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",
- "metadata_user": { }
}{- "composed_document": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed999",
- "name": "Facture Sinoia 2026-05",
- "description": "string",
- "status": "draft",
- "assembly_mode": "composed",
- "typst_source": "string",
- "variables": {
- "client": "Sinoia",
- "montant": 1500
}, - "page_settings": { },
- "metadata": { },
- "metadata_ai": { },
- "metadata_user": { },
- "document_template_id": "2574412b-843e-409c-ab85-b4d8aeb24485",
- "file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767",
- "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",
- "workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "parts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "Annexe — Conditions générales",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 12,
- "page_break": false,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "markdown_file_id": "80bb14d2-a193-4c03-9423-5710684c0b0f",
- "metadata": { },
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Déclenche le pipeline Documents::ComposedDocuments::AssembleAndCompile :
parts (markdown converti, typst concaténé)Documents::TypstCompiler → PDFDocuments::File du composed_documentexportedSynchrone : la réponse n'arrive qu'une fois le PDF compilé et attaché — pas de polling nécessaire côté client.
Retourne une structure PLATE dédiée au résultat d'export (le PDF est
en tête via pdf_file_id). Le détail du composé reste accessible via
GET /composed_documents/:id.
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| include_draft | boolean Default: false Inclure les parts en statut |
{- "ok": true,
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "pdf_file_id": "6a7dcbf8-1e43-4725-a957-8ce105ffa1c7",
- "pdf_byte_size": 12415202,
- "took_ms": 22341,
- "warnings": [
- "string"
]
}Retourne toutes les Documents::Part du composed_document,
ordonnées par position.
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "parts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "Annexe — Conditions générales",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 12,
- "page_break": false,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "markdown_file_id": "80bb14d2-a193-4c03-9423-5710684c0b0f",
- "metadata": { },
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}| id required | string <uuid> ID du composed_document parent |
| part_id required | string <uuid> ID de la part |
{- "part": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "Annexe — Conditions générales",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 12,
- "page_break": false,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "markdown_file_id": "80bb14d2-a193-4c03-9423-5710684c0b0f",
- "metadata": { },
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Met à jour les attributs modifiables d'une part : title, content, content_format, position, status, alignment, page_break, etc.
Les transitions de status sont validées par
Documents::Part::VALID_TRANSITIONS.
| id required | string <uuid> ID du composed_document parent |
| part_id required | string <uuid> ID de la part |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| title | string |
| content | string |
| content_format | string Enum: "typst" "markdown" |
| content_source | string Enum: "human" "agent" "template" |
| part_type | string Enum: "content" "header" "footer" "signature" "appendix" |
| position | integer |
| status | string Enum: "draft" "editing" "ready" "validated" "locked" |
| alignment | string Enum: "left" "center" "right" |
| bsize | integer [ 1 .. 12 ] |
| page_break | boolean |
| row_group | integer |
| key | string |
| instructions | string |
| assignee_id | string <uuid> |
| assignee_type | string |
object |
{- "title": "string",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 1,
- "page_break": true,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "metadata": { }
}{- "part": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "Annexe — Conditions générales",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 12,
- "page_break": false,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "markdown_file_id": "80bb14d2-a193-4c03-9423-5710684c0b0f",
- "metadata": { },
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string <uuid> ID du composed_document parent |
| part_id required | string <uuid> ID de la part |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Met à jour les positions de toutes les parts en un seul appel.
Le body est un array [{ id: uuid, position: int }, ...].
Toutes les parts du document doivent être incluses (sinon les omises restent à leur position actuelle, mais on recommande de toujours envoyer la liste complète).
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
required | Array of objects Liste {id, position} pour chaque part à repositionner |
{- "parts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "position": 0
}
]
}{- "parts": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "title": "Annexe — Conditions générales",
- "content": "string",
- "content_format": "typst",
- "content_source": "human",
- "part_type": "content",
- "position": 0,
- "status": "draft",
- "alignment": "left",
- "bsize": 12,
- "page_break": false,
- "row_group": 0,
- "key": "string",
- "instructions": "string",
- "assignee_id": "e209ca2d-190b-4818-b659-67d4ef4f1ce8",
- "assignee_type": "string",
- "markdown_file_id": "80bb14d2-a193-4c03-9423-5710684c0b0f",
- "metadata": { },
- "composed_document_id": "3e511901-efa2-416e-a86e-41629be23601",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Document Templates — modèles Typst/Markdown réutilisables. Read-only pour tous les users, CRUD réservé aux admins.
Retourne tous les DocumentTemplate actifs, triés par nom.
Templates = modèles de documents Typst/Markdown servant de base à
la création de ComposedDocument. Read-only pour tout user
authentifié, CRUD réservé aux admins.
{- "templates": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed999",
- "key": "facture-edf",
- "name": "Facture EDF",
- "description": "Modèle de facture standard EDF",
- "category": "billing",
- "locale": "fr",
- "typst_source": "#set page(paper: \"a4\")\n= Facture {{client}}\n",
- "variables_schema": {
- "properties": {
- "client": {
- "type": "string",
- "title": "Nom du client"
}, - "montant": {
- "type": "number"
}
}, - "required": [
- "client"
]
}, - "default_parts": [
- {
- "title": "Header",
- "content": "Logo EDF",
- "content_format": "typst",
- "part_type": "header",
- "position": 1
}, - {
- "title": "Corps",
- "content": "Facture pour {{client}} : {{montant}}€",
- "content_format": "typst",
- "part_type": "content",
- "position": 2
}
], - "page_settings": { },
- "active": true,
- "solution_instance_id": "504f0bb7-ce66-4064-9a34-fb67a214185b",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}Crée un DocumentTemplate. Réservé aux administrateurs (Pundit
DocumentTemplatePolicy#create? = administrator?).
Le typst_source et la key sont obligatoires. key doit être
unique.
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| key | string Slug unique du template |
| name | string Nom affiché du template |
| description | string Description longue |
| category | string Catégorie fonctionnelle |
| locale | string Default: "fr" |
| typst_source | string Source Typst du template (placeholders {{var}} supportés) |
object JSON Schema simplifié décrivant les variables attendues | |
Array of objects Parts par défaut du template (JSONB array d'objets) | |
object Configuration page | |
| active | boolean Default: true Le template est-il actif |
{- "key": "facture-edf",
- "name": "Facture EDF",
- "description": "string",
- "category": "billing",
- "locale": "fr",
- "typst_source": "string",
- "variables_schema": { },
- "default_parts": [
- { }
], - "page_settings": { },
- "active": true
}{- "template": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed999",
- "key": "facture-edf",
- "name": "Facture EDF",
- "description": "Modèle de facture standard EDF",
- "category": "billing",
- "locale": "fr",
- "typst_source": "#set page(paper: \"a4\")\n= Facture {{client}}\n",
- "variables_schema": {
- "properties": {
- "client": {
- "type": "string",
- "title": "Nom du client"
}, - "montant": {
- "type": "number"
}
}, - "required": [
- "client"
]
}, - "default_parts": [
- {
- "title": "Header",
- "content": "Logo EDF",
- "content_format": "typst",
- "part_type": "header",
- "position": 1
}, - {
- "title": "Corps",
- "content": "Facture pour {{client}} : {{montant}}€",
- "content_format": "typst",
- "part_type": "content",
- "position": 2
}
], - "page_settings": { },
- "active": true,
- "solution_instance_id": "504f0bb7-ce66-4064-9a34-fb67a214185b",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "template": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed999",
- "key": "facture-edf",
- "name": "Facture EDF",
- "description": "Modèle de facture standard EDF",
- "category": "billing",
- "locale": "fr",
- "typst_source": "#set page(paper: \"a4\")\n= Facture {{client}}\n",
- "variables_schema": {
- "properties": {
- "client": {
- "type": "string",
- "title": "Nom du client"
}, - "montant": {
- "type": "number"
}
}, - "required": [
- "client"
]
}, - "default_parts": [
- {
- "title": "Header",
- "content": "Logo EDF",
- "content_format": "typst",
- "part_type": "header",
- "position": 1
}, - {
- "title": "Corps",
- "content": "Facture pour {{client}} : {{montant}}€",
- "content_format": "typst",
- "part_type": "content",
- "position": 2
}
], - "page_settings": { },
- "active": true,
- "solution_instance_id": "504f0bb7-ce66-4064-9a34-fb67a214185b",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Met à jour les attributs d'un template. Seuls les champs présents dans le body sont touchés. Réservé aux administrateurs.
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| key | string Slug unique du template |
| name | string Nom affiché du template |
| description | string Description longue |
| category | string Catégorie fonctionnelle |
| locale | string Default: "fr" |
| typst_source | string Source Typst du template (placeholders {{var}} supportés) |
object JSON Schema simplifié décrivant les variables attendues | |
Array of objects Parts par défaut du template (JSONB array d'objets) | |
object Configuration page | |
| active | boolean Default: true Le template est-il actif |
{- "key": "facture-edf",
- "name": "Facture EDF",
- "description": "string",
- "category": "billing",
- "locale": "fr",
- "typst_source": "string",
- "variables_schema": { },
- "default_parts": [
- { }
], - "page_settings": { },
- "active": true
}{- "template": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed999",
- "key": "facture-edf",
- "name": "Facture EDF",
- "description": "Modèle de facture standard EDF",
- "category": "billing",
- "locale": "fr",
- "typst_source": "#set page(paper: \"a4\")\n= Facture {{client}}\n",
- "variables_schema": {
- "properties": {
- "client": {
- "type": "string",
- "title": "Nom du client"
}, - "montant": {
- "type": "number"
}
}, - "required": [
- "client"
]
}, - "default_parts": [
- {
- "title": "Header",
- "content": "Logo EDF",
- "content_format": "typst",
- "part_type": "header",
- "position": 1
}, - {
- "title": "Corps",
- "content": "Facture pour {{client}} : {{montant}}€",
- "content_format": "typst",
- "part_type": "content",
- "position": 2
}
], - "page_settings": { },
- "active": true,
- "solution_instance_id": "504f0bb7-ce66-4064-9a34-fb67a214185b",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}Supprime un template. Refuse si des composed_documents y sont
rattachés (422). Passer ?force=true pour nullifier les
références au lieu de bloquer.
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| force | boolean Default: false Nullifier les composed_documents rattachés au lieu de bloquer |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Créer un BulkUpload pour regrouper plusieurs fichiers uploadés séparément.
Workflow typique :
Cas d'usage :
Mode fusion PDF (merge_to_pdf: true + merged_file_name) : les
fichiers du lot ne créent pas de documents individuels ; chacun est envoyé
avec une position explicite, puis toutes les sources sont fusionnées en
un seul document PDF dans l'ordre des positions dès que total_files
sources ont été reçues. Suivre GET /bulk_uploads/:id jusqu'au statut
completed pour récupérer merged_document_id. Formats acceptés : PDF,
JPEG, PNG (les images deviennent une page A4).
| total_files required | integer [ 1 .. 100 ] Nombre total de fichiers qui seront uploadés |
| documents_folder_id | string <uuid> ID du dossier de destination |
| workspace_id | string <uuid> ID du workspace |
| auto_classify | boolean Default: false Activer la classification automatique des documents |
| source | string Source de l'upload (sera auto-détecté depuis OAuth si non fourni) |
| merge_to_pdf | boolean Default: false Fusionner toutes les sources du lot en un seul document PDF.
Chaque fichier doit alors être envoyé avec une |
| merged_file_name | string Nom du document PDF fusionné (requis si merge_to_pdf est vrai, l'extension .pdf est ajoutée si absente) |
{- "total_files": 50,
- "source": "hubdoc-tools"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "pending",
- "source": "string",
- "total_files": 0,
- "processed_files": 0,
- "successful_files": 0,
- "failed_files": 0,
- "progress": 100,
- "auto_classify": true,
- "merge_to_pdf": true,
- "merged_file_name": "string",
- "received_files": 0,
- "merged_document_id": "2627a545-7148-455e-bfe7-7ae47aa3b9f9",
- "started_at": "2019-08-24T14:15:22Z",
- "completed_at": "2019-08-24T14:15:22Z",
- "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",
- "workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "metadata": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Récupère les informations et le statut d'un BulkUpload.
Utilisation :
| id required | string <uuid> ID du BulkUpload |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "status": "pending",
- "source": "string",
- "total_files": 0,
- "processed_files": 0,
- "successful_files": 0,
- "failed_files": 0,
- "progress": 100,
- "auto_classify": true,
- "merge_to_pdf": true,
- "merged_file_name": "string",
- "received_files": 0,
- "merged_document_id": "2627a545-7148-455e-bfe7-7ae47aa3b9f9",
- "started_at": "2019-08-24T14:15:22Z",
- "completed_at": "2019-08-24T14:15:22Z",
- "folder_id": "7695bac3-9397-4ec2-9335-45a2a16f1901",
- "workspace_id": "0967198e-ec7b-4c6b-b4d3-f71244cadbe9",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "metadata": { },
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}Crée une session d'upload pour un fichier volumineux qui sera uploadé par morceaux (chunks).
Workflow typique :
Limites :
Cas d'usage :
| filename required | string Nom du fichier à uploader |
| file_size required | integer <int64> [ 1 .. 5368709120 ] Taille totale du fichier en octets |
| content_type required | string Type MIME du fichier |
| chunk_size | integer [ 1048576 .. 104857600 ] Default: 5242880 Taille de chaque chunk en octets (optionnel, défaut 5MB) |
| workspace_id | string or null <uuid> ID du workspace de destination (optionnel) |
| documents_folder_id | string or null <uuid> ID du dossier de destination (optionnel) |
object or null Métadonnées additionnelles (optionnel) |
{- "filename": "document.pdf",
- "file_size": 52428800,
- "content_type": "application/pdf",
- "chunk_size": 5242880
}{- "success": true,
- "data": {
- "upload_id": "a1b2c3d4e5f6",
- "chunk_size": 5242880,
- "total_chunks": 10,
- "expires_at": "2024-11-10T10:00:00Z"
}
}Upload un chunk spécifique d'un fichier dans une session d'upload par chunks.
Important :
Retry :
Progression :
| id required | string Example: a1b2c3d4e5f6 Identifiant unique de la session d'upload (upload_id) |
| chunk_number required | integer >= 1 Example: 5 Numéro du chunk à uploader (1-indexed) |
Données binaires du chunk
{- "success": true,
- "data": {
- "chunk_number": 5,
- "upload_id": "a1b2c3d4e5f6",
- "progress": 50,
- "uploaded_chunks": 5,
- "total_chunks": 10,
- "status": "processing"
}
}Finalise une session d'upload par chunks en assemblant tous les chunks.
Prérequis :
Processus :
Après finalisation :
| id required | string Example: a1b2c3d4e5f6 Identifiant unique de la session d'upload (upload_id) |
| checksum | string or null Checksum MD5 du fichier complet en base64 (optionnel mais recommandé) |
{- "checksum": "1B2M2Y8AsgTpgAmY7PhCfg=="
}{- "success": true,
- "data": {
- "upload_id": "a1b2c3d4e5f6",
- "status": "completed",
- "assembled_file_size": 52428800,
- "object_key": "uploads/abc123/document.pdf"
}
}Récupère le statut actuel d'une session d'upload par chunks.
Informations retournées :
Cas d'usage :
| id required | string Example: a1b2c3d4e5f6 Identifiant unique de la session d'upload (upload_id) |
{- "success": true,
- "data": {
- "upload_id": "a1b2c3d4e5f6",
- "status": "processing",
- "progress": 50,
- "uploaded_chunks": 5,
- "total_chunks": 10,
- "expires_at": "2024-11-10T10:00:00Z",
- "expired": false
}
}Annule une session d'upload par chunks en cours.
Actions effectuées :
Restrictions :
Cas d'usage :
| id required | string Example: a1b2c3d4e5f6 Identifiant unique de la session d'upload (upload_id) |
{- "success": true,
- "data": {
- "status": "cancelled"
}
}Récupère une liste d'utilisateurs selon les paramètres de filtrage fournis.
Filtrage avancé avec Ransack :
q pour des recherches avancéesq[role_eq]=admin pour chercher les utilisateurs administrateurs| sort | string Default: "updated_at" Champ de tri (email_address, first_name, last_name, role, created_at, updated_at, etc.) |
| direction | string Default: "desc" Enum: "asc" "desc" Direction du tri |
| per_page | integer [ 1 .. 100 ] Default: 20 Nombre d'éléments par page |
| page | integer >= 1 Default: 1 Numéro de page |
object Filtres Ransack pour recherche avancée. Exemples :
|
[- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}
]Créer un nouvel utilisateur
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| email_address required | string <email> Adresse email de l'utilisateur |
| password | string <password> >= 6 characters Mot de passe de l'utilisateur (minimum 6 caractères) |
| first_name | string <= 50 characters Prénom de l'utilisateur |
| last_name | string <= 50 characters Nom de famille de l'utilisateur |
| role | string Default: "user" Enum: "user" "manager" "admin" "super_admin" Rôle de l'utilisateur |
| external_id | string or null Identifiant externe pour l'intégration avec des systèmes tiers |
{- "email_address": "john.doe@example.com",
- "password": "securePassword123",
- "first_name": "John",
- "last_name": "Doe",
- "role": "user",
- "external_id": "ext-user-12345"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Récupérer un utilisateur spécifique par identifiant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Mettre à jour un utilisateur existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| email_address required | string <email> Adresse email de l'utilisateur |
| password | string <password> >= 6 characters Mot de passe de l'utilisateur (minimum 6 caractères) |
| first_name | string <= 50 characters Prénom de l'utilisateur |
| last_name | string <= 50 characters Nom de famille de l'utilisateur |
| role | string Default: "user" Enum: "user" "manager" "admin" "super_admin" Rôle de l'utilisateur |
| external_id | string or null Identifiant externe pour l'intégration avec des systèmes tiers |
{- "email_address": "john.doe@example.com",
- "password": "securePassword123",
- "first_name": "John",
- "last_name": "Doe",
- "role": "user",
- "external_id": "ext-user-12345"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "john.doe@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "display_name": "John Doe",
- "initials": "JD",
- "role": "user",
- "externa_id": "ext-user-12345",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Supprimer un utilisateur existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Récupère une liste de contacts selon les paramètres de filtrage fournis.
Filtrage avancé avec Ransack :
q pour des recherches avancéesq[email_address_cont]=example.com pour chercher les contacts avec une adresse contenant "example.com"| sort | string Default: "updated_at" Champ de tri (email_address, first_name, last_name, created_at, updated_at, etc.) |
| direction | string Default: "desc" Enum: "asc" "desc" Direction du tri |
| per_page | integer [ 1 .. 100 ] Default: 20 Nombre d'éléments par page |
| page | integer >= 1 Default: 1 Numéro de page |
object Filtres Ransack pour recherche avancée. Exemples :
|
[- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "contact@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "external_id": "ext-12345",
- "display_name": "John Doe",
- "full_name": "John Doe",
- "type": "Contact",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}
]Créer un nouveau contact
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| email_address required | string <email> Adresse email du contact |
| first_name | string Prénom du contact |
| last_name | string Nom du contact |
| external_id | string Identifiant externe pour l'intégration avec des systèmes tiers |
{- "email_address": "contact@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "external_id": "ext-12345"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "contact@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "external_id": "ext-12345",
- "display_name": "John Doe",
- "full_name": "John Doe",
- "type": "Contact",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Récupérer un contact spécifique par identifiant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "contact@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "external_id": "ext-12345",
- "display_name": "John Doe",
- "full_name": "John Doe",
- "type": "Contact",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Mettre à jour un contact existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| email_address required | string <email> Adresse email du contact |
| first_name | string Prénom du contact |
| last_name | string Nom du contact |
| external_id | string Identifiant externe pour l'intégration avec des systèmes tiers |
{- "email_address": "contact@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "external_id": "ext-12345"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "email_address": "contact@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "external_id": "ext-12345",
- "display_name": "John Doe",
- "full_name": "John Doe",
- "type": "Contact",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Supprimer un contact existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Récupère une liste de groupes selon les paramètres de filtrage fournis.
Filtrage avancé avec Ransack :
q pour des recherches avancéesq[name_cont]=admin pour chercher les groupes contenant "admin"| sort | string Default: "updated_at" Champ de tri (name, description, created_at, updated_at, etc.) |
| direction | string Default: "desc" Enum: "asc" "desc" Direction du tri |
| per_page | integer [ 1 .. 100 ] Default: 20 Nombre d'éléments par page |
| page | integer >= 1 Default: 1 Numéro de page |
object Filtres Ransack pour recherche avancée. Exemples :
|
[- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Administrators",
- "description": "Group for system administrators",
- "external_id": "ext-admin-group",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}
]Créer un nouveau groupe
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| name required | string Nom du groupe |
| description | string Description du groupe |
| external_id | string Identifiant externe pour l'intégration avec des systèmes tiers |
{- "name": "Administrators",
- "description": "Group for system administrators",
- "external_id": "ext-admin-group"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Administrators",
- "description": "Group for system administrators",
- "external_id": "ext-admin-group",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Récupérer un groupe spécifique par identifiant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Administrators",
- "description": "Group for system administrators",
- "external_id": "ext-admin-group",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Mettre à jour un groupe existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| name required | string Nom du groupe |
| description | string Description du groupe |
| external_id | string Identifiant externe pour l'intégration avec des systèmes tiers |
{- "name": "Administrators",
- "description": "Group for system administrators",
- "external_id": "ext-admin-group"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "name": "Administrators",
- "description": "Group for system administrators",
- "external_id": "ext-admin-group",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Supprimer un groupe existant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Récupère la liste des membres d'un groupe spécifique. Requiert les droits administrateur.
| group_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed887 Identifiant du groupe |
[- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "group_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "member_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "member_type": "User",
- "role": "member",
- "user_external_id": "ext-user-123",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}
]Ajoute un utilisateur comme membre d'un groupe via son identifiant externe. L'opération est idempotente : si l'utilisateur est déjà membre, retourne le membership existant avec un statut 200. Requiert les droits administrateur.
| group_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed887 Identifiant du groupe |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| user_external_id required | string Identifiant externe de l'utilisateur à ajouter au groupe |
| role | string Default: "member" Enum: "member" "admin" "owner" Rôle à attribuer au membre (par défaut "member") |
{- "user_external_id": "ext-user-123",
- "role": "member"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "group_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "member_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "member_type": "User",
- "role": "member",
- "user_external_id": "ext-user-123",
- "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Retire un membre d'un groupe par son identifiant de membership.
Alternativement, le paramètre user_external_id peut être passé pour identifier le membre à retirer.
Requiert les droits administrateur.
| group_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed887 Identifiant du groupe |
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant du membership |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Récupère une liste de permissions selon les paramètres de filtrage fournis.
Filtrage avancé avec Ransack :
q pour des recherches avancéesq[level_eq]=admin pour chercher les permissions de niveau admin| permissible_type required | string Example: permissible_type=Documents::File Type de la ressource (ex. Documents::File, Documents::Folder, Documents::Workspace) |
| permissible_id required | string <uuid> Example: permissible_id=019951a3-01b7-7eb9-88bb-f872a01ed886 ID de la ressource |
| sort | string Default: "updated_at" Champ de tri (level, actor_type, permissible_type, created_at, updated_at, etc.) |
| direction | string Default: "desc" Enum: "asc" "desc" Direction du tri |
| per_page | integer [ 1 .. 100 ] Default: 20 Nombre d'éléments par page |
| page | integer >= 1 Default: 1 Numéro de page |
object Filtres Ransack pour recherche avancée. Exemples :
|
[- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "level": "read",
- "actor_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "actor_type": "User",
- "permissible_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "permissible_type": "Documents::File",
- "external_id": "ext-perm-12345",
- "actor": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "display_name": "John Doe",
- "type": "User"
}, - "permissible": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "name": "document.pdf",
- "type": "Documents::File"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}
]Créer une nouvelle permission
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| level required | string Enum: "read" "write" "admin" Niveau de permission (read, write, admin) |
| actor_id required | string <uuid> Identifiant de l'acteur (User, Contact, Group) |
| actor_type required | string Type d'acteur (User, Contact, Group) |
| permissible_id required | string <uuid> Identifiant de la ressource protégée |
| permissible_type required | string Type de ressource protégée (Documents::File, Documents::Folder, etc.) |
| external_id | string Identifiant externe pour l'intégration avec des systèmes tiers |
{- "level": "read",
- "actor_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "actor_type": "User",
- "permissible_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "permissible_type": "Documents::File",
- "external_id": "ext-perm-12345"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "level": "read",
- "actor_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "actor_type": "User",
- "permissible_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "permissible_type": "Documents::File",
- "external_id": "ext-perm-12345",
- "actor": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "display_name": "John Doe",
- "type": "User"
}, - "permissible": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "name": "document.pdf",
- "type": "Documents::File"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Récupérer une permission spécifique par identifiant
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "level": "read",
- "actor_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "actor_type": "User",
- "permissible_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "permissible_type": "Documents::File",
- "external_id": "ext-perm-12345",
- "actor": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "display_name": "John Doe",
- "type": "User"
}, - "permissible": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "name": "document.pdf",
- "type": "Documents::File"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Mettre à jour une permission existante
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
| Content-Type required | string Value: "application/json" Example: application/json Type de contenu de la requête |
| level required | string Enum: "read" "write" "admin" Niveau de permission (read, write, admin) |
| actor_id required | string <uuid> Identifiant de l'acteur (User, Contact, Group) |
| actor_type required | string Type d'acteur (User, Contact, Group) |
| permissible_id required | string <uuid> Identifiant de la ressource protégée |
| permissible_type required | string Type de ressource protégée (Documents::File, Documents::Folder, etc.) |
| external_id | string Identifiant externe pour l'intégration avec des systèmes tiers |
{- "level": "read",
- "actor_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "actor_type": "User",
- "permissible_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "permissible_type": "Documents::File",
- "external_id": "ext-perm-12345"
}{- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "level": "read",
- "actor_id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "actor_type": "User",
- "permissible_id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "permissible_type": "Documents::File",
- "external_id": "ext-perm-12345",
- "actor": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed887",
- "display_name": "John Doe",
- "type": "User"
}, - "permissible": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed888",
- "name": "document.pdf",
- "type": "Documents::File"
}, - "created_at": "2023-01-01T00:00:00Z",
- "updated_at": "2023-01-01T00:00:00Z"
}Supprimer une permission existante
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "error": "unauthorized",
- "message": "Authentification requise"
}Accès public — la troisième voie d'accès, à côté des ACL nominatives et des liens de partage. Rendre public, rendre privé, repropager, exclure, lever une exclusion, et lire l'état qui en résulte.
| ACL nominatives | Accès public | |
|---|---|---|
| Mécanisme | ascendance évaluée à la lecture | estampillage explicite, ligne par ressource |
| Document ajouté après | hérite immédiatement | pas public tant qu'on n'a pas repropagé |
| Document déplacé hors du sous-arbre | perd le droit | concession périmée |
| Retrait sur une ressource | impossible sans permission négative | marqueur d'exclusion, transitif |
La divergence est volontaire : fail-closed assumé, pour qu'aucune
ressource ne soit publique sans qu'un dossier l'annonce. Elle surprend,
d'où subtree.unstamped et reason dans l'état rendu.
Rend l'état complet : publique ou non, la racine qui l'explique, les exclusions, et le bilan du sous-arbre — dont les ressources non estampillées, celles qu'une repropagation rendrait publiques.
Exige le droit d'écriture sur le dossier, et non de lecture : l'état énumère nommément le complément privé du sous-arbre publié. L'ouvrir en lecture rendrait un dossier public utilisable comme annuaire de ce qu'il ne publie pas.
| folder_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant du dossier |
| limit | integer [ 0 .. 500 ] Default: 50 Borne le tableau |
{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Publie le dossier comme racine publique et propage la concession sur tout son sous-arbre. Geste explicite, tracé et révocable.
C'est la porte générique du « rendre public » : elle remplace le détour
par POST /api/v1/documents/folders/{id}/site, qui reste servi le temps
que le CLI publié migre (hubdoc-tools#29) mais ne doit plus être employé
pour ce geste.
La racine d'une publication est toujours un dossier : rendre un document isolé public n'existe pas. Les documents sont couverts par la propagation depuis un dossier.
Idempotent : republier un dossier déjà publié rend 200 et ne ressuscite
aucune concession que personne n'a reprise. Publier lève l'exclusion
portée par le dossier lui-même (celles de ses descendants restent).
Action à conséquence : la portée doit être annoncée à l'utilisateur avant validation, jamais après.
| folder_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant du dossier |
| propagate | boolean Default: true
|
{- "propagate": true
}{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Retire la racine publique. Une seule écriture : toutes les concessions du sous-arbre sont conditionnées à la présence de cette racine, elles périment donc d'un coup, sans dépropagation ni tâche de fond.
Idempotent. L'état rendu après coup n'est pas redondant : un dossier imbriqué dans un AUTRE sous-arbre publié reste public une fois dépublié, et seul l'état le dit.
| folder_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant du dossier |
{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Réestampille tout le sous-arbre d'une racine publiée : l'existant est réestampillé, les ajouts sont couverts. Idempotent.
C'est la contrepartie assumée du fail-closed. Un document déposé dans
un dossier publié n'est pas public tant que ce geste n'a pas eu lieu :
subtree.unstamped le compte, ce geste le résorbe. Un agent qui régénère
un site doit enchaîner régénération et repropagation.
Les ressources explicitement exclues ne sont jamais réestampillées — sans quoi l'exclusion serait illusoire dès la première régénération.
Échoue en 422 si le dossier n'est pas publié comme racine : propager
n'est pas un raccourci pour publier.
| folder_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant du dossier |
{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Pose le marqueur « jamais public ici » sur le dossier et coupe l'accès immédiatement : les concessions qu'il portait sont retirées, celles de son sous-arbre aussi.
La portée est TRANSITIVE : exclure un dossier exclut tout ce qu'il contient, aujourd'hui et demain. Elle doit être annoncée à l'utilisateur avant validation — sans quoi « jamais public ici » ne protégerait que le libellé du dossier pendant que son contenu resterait lisible par URL directe.
Le marqueur survit aux repropagations et voyage avec la ressource :
un dossier exclu déplacé dans un autre sous-arbre public reste exclu. Le
retirer est un geste explicite (DELETE).
Exclure un dossier qui est lui-même une racine publiée le dépublie : c'est bien le sens du geste.
Idempotent : 200 si l'exclusion existait déjà, 201 sinon.
| folder_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant du dossier |
{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Retire le marqueur « jamais public ici ». Ne rend rien public : cela rend seulement le dossier à nouveau éligible à une propagation, qui reste un geste distinct.
Idempotent.
| folder_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant du dossier |
{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Rend l'état complet du document : publique ou non, quelle racine l'explique, s'il est exclu et par quoi.
Le champ reason porte le diagnostic quand le document n'est pas public.
stale y est le cas le plus instructif : le document a été estampillé un
jour, mais sa racine a été dépubliée ou lui-même déplacé — la concession
est périmée, sans qu'aucune écriture n'ait été nécessaire.
subtree est toujours null : un document n'a pas de sous-arbre.
Exige le droit d'écriture sur le document (cf. l'endpoint dossier).
| file_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed887 Identifiant du document |
{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Pose le marqueur « jamais public ici » sur le document et coupe l'accès immédiatement : la concession qu'il portait est retirée.
C'est le SEUL moyen de retirer une ressource d'un sous-arbre public sans dépublier la racine entière.
Le marqueur survit aux repropagations et voyage avec le document : déplacé dans un autre sous-arbre public, il reste exclu — un marqueur de confidentialité qui s'évaporerait au déplacement serait le pire des deux mondes.
Idempotent : 200 si l'exclusion existait déjà, 201 sinon.
| file_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed887 Identifiant du document |
{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Retire le marqueur « jamais public ici ». Ne rend rien public : le
document redevient seulement éligible à une propagation, qu'il faut
déclencher explicitement sur la racine (POST …/public_access/propagate).
Idempotent.
| file_id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed887 Identifiant du document |
{- "resource": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "public": true,
- "reason": "not_stamped",
- "published_root": true,
- "root": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "excluded": false,
- "excluded_by": {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}, - "granted_count": 42,
- "subtree": {
- "total": 120,
- "granted": 118,
- "excluded": 1,
- "unstamped": 1,
- "unstamped_items": [
- {
- "id": "019951a3-01b7-7eb9-88bb-f872a01ed886",
- "type": "folder",
- "name": "Rapports publics",
- "path": "019951a3.019951a4.019951a5"
}
]
}
}Récupère la liste des communications de masse de l'utilisateur.
| q[name_cont] | string Filtrer par nom (contient) |
| q[status_eq] | string Enum: "draft" "sending" "sent" "failed" Filtrer par statut |
{- "mass_communications": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "name": "Newsletter Janvier 2024",
- "subject": "Actualités du mois",
- "body": "Bonjour {{ recipient.first_name }},\n\nVoici les actualités...",
- "communication_type": "email",
- "status": "draft",
- "template_id": "c6d67e98-83ea-49f0-8812-e4abae2b68bc",
- "settings": { },
- "attribute_definitions": [
- {
- "key": "string",
- "label": "string",
- "type": "string",
- "required": true,
- "placeholder": "string"
}
], - "recipients_count": 150,
- "sent_count": 148,
- "failed_count": 2,
- "created_by_id": "9377d689-01fb-4abf-8450-3368d2c1924f",
- "created_at": "2024-01-16T10:00:00Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "sent_at": "2024-01-16T10:05:00Z"
}
]
}Crée une nouvelle communication de masse avec ses destinataires et pièces jointes.
Modes de création:
send=true): La communication est créée et envoyée immédiatementDestinataires: Les destinataires peuvent être fournis de deux façons:
fileVariables de template: Le corps du message supporte les variables Liquid:
{{ recipient.first_name }} - Prénom du destinataire{{ recipient.last_name }} - Nom du destinataire{{ recipient.email }} - Email du destinataire{{ recipient.custom_attributes.xxx }} - Attributs personnalisésrequired | object |
required | Array of objects non-empty Liste des destinataires |
Array of objects Pièces jointes | |
| send | boolean Default: false Envoyer immédiatement après création |
{- "mass_communication": {
- "name": "Newsletter Janvier 2024",
- "subject": "Actualités du mois",
- "body": "Bonjour {{ recipient.first_name }},\n\nVoici les actualités...",
- "communication_type": "email"
}, - "recipients": [
- {
- "email": "john@example.com",
- "first_name": "John",
- "last_name": "Doe"
}, - {
- "email": "jane@example.com",
- "first_name": "Jane",
- "last_name": "Smith"
}
], - "send": false
}{- "mass_communication": {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "name": "Newsletter Janvier 2024",
- "subject": "Actualités du mois",
- "status": "draft",
- "recipients_count": 2,
- "created_at": "2024-01-16T10:00:00Z"
}, - "recipients": [
- {
- "id": "660e8400-e29b-41d4-a716-446655440001",
- "email": "john@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "status": "pending"
}
], - "attachments": [ ],
- "skipped_recipients": [ ],
- "sending": false,
- "enqueued_count": 0
}Récupère les détails d'une communication de masse avec ses destinataires et pièces jointes.
| id required | string <uuid> Example: 019951a3-01b7-7eb9-88bb-f872a01ed886 Identifiant de la ressource |
{- "mass_communication": {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "name": "Newsletter Janvier 2024",
- "subject": "Actualités du mois",
- "body": "Bonjour {{ recipient.first_name }}...",
- "communication_type": "email",
- "status": "sent",
- "recipients_count": 150,
- "sent_count": 148,
- "failed_count": 2,
- "created_at": "2024-01-16T10:00:00Z",
- "sent_at": "2024-01-16T10:05:00Z"
}, - "recipients": [
- {
- "id": "660e8400-e29b-41d4-a716-446655440001",
- "email": "john@example.com",
- "first_name": "John",
- "last_name": "Doe",
- "status": "sent",
- "sent_at": "2024-01-16T10:05:01Z"
}
], - "attachments": [
- {
- "id": "770e8400-e29b-41d4-a716-446655440002",
- "name": "document.pdf",
- "scope_type": "all"
}
]
}