Référence de l'API REST
EmDash expose une API REST à l’adresse /_emdash/api/ pour la gestion de contenu, les téléchargements de médias et les opérations sur les schémas.
Authentification
Section intitulée « Authentification »Les requêtes API nécessitent une authentification via un jeton Bearer :
Authorization: Bearer <token>Générez les jetons via l’interface d’administration ou de manière programmatique.
Format de Réponse
Section intitulée « Format de Réponse »Toutes les réponses suivent un format cohérent :
// Success{ "success": true, "data": { ... }}
// Erreur{ "success": false, "error": { "code": "ERROR_CODE", "message": "Message lisible par un humain", "details": { ... } }}Points de Terminaison de Contenu
Section intitulée « Points de Terminaison de Contenu »Lister le Contenu
Section intitulée « Lister le Contenu »GET /_emdash/api/content/:collectionParamètres
Section intitulée « Paramètres »| Paramètre | Type | Description |
|---|---|---|
collection | string | Slug de la collection (chemin) |
cursor | string | Curseur de pagination (requête) |
limit | number | Éléments par page (requête, défaut : 50) |
status | string | Filtrer par statut (requête) |
orderBy | string | Champ de tri (requête) |
order | string | Direction du tri : asc ou desc (requête) |
{ "success": true, "data": { "items": [ { "id": "01HXK5MZSN...", "type": "posts", "slug": "hello-world", "data": { "title": "Bonjour le monde", ... }, "status": "published", "createdAt": "2025-01-24T12:00:00Z", "updatedAt": "2025-01-24T12:00:00Z" } ], "nextCursor": "eyJpZCI6..." }}Obtenir le Contenu
Section intitulée « Obtenir le Contenu »GET /_emdash/api/content/:collection/:id{ "success": true, "data": { "item": { "id": "01HXK5MZSN...", "type": "posts", "slug": "hello-world", "data": { "title": "Bonjour le monde", ... }, "status": "published", "createdAt": "2025-01-24T12:00:00Z", "updatedAt": "2025-01-24T12:00:00Z" } }}Créer du Contenu
Section intitulée « Créer du Contenu »POST /_emdash/api/content/:collectionContent-Type: application/jsonCorps de la Requête
Section intitulée « Corps de la Requête »{ "data": { "title": "New Post", "content": [...] }, "slug": "new-post", "status": "draft"}{ "success": true, "data": { "item": { ... } }}Mettre à Jour le Contenu
Section intitulée « Mettre à Jour le Contenu »PUT /_emdash/api/content/:collection/:idContent-Type: application/jsonCorps de la Requête
Section intitulée « Corps de la Requête »{ "data": { "title": "Updated Title" }, "status": "published"}Supprimer le Contenu
Section intitulée « Supprimer le Contenu »DELETE /_emdash/api/content/:collection/:id{ "success": true, "data": { "success": true }}Points de Terminaison des Médias
Section intitulée « Points de Terminaison des Médias »Lister les Médias
Section intitulée « Lister les Médias »GET /_emdash/api/mediaParamètres
Section intitulée « Paramètres »| Paramètre | Type | Description |
|---|---|---|
cursor | string | Curseur de pagination |
limit | number | Éléments par page (défaut : 20) |
mimeType | string | Filtrer par préfixe de type MIME |
{ "success": true, "data": { "items": [ { "id": "01HXK5MZSN...", "filename": "photo.jpg", "mimeType": "image/jpeg", "size": 102400, "width": 1920, "height": 1080, "url": "https://cdn.example.com/photo.jpg", "createdAt": "2025-01-24T12:00:00Z" } ], "nextCursor": "eyJpZCI6..." }}Obtenir un Média
Section intitulée « Obtenir un Média »GET /_emdash/api/media/:idCréer un Média
Section intitulée « Créer un Média »POST /_emdash/api/mediaContent-Type: application/jsonCorps de la Requête
Section intitulée « Corps de la Requête »{ "filename": "photo.jpg", "mimeType": "image/jpeg", "size": 102400, "width": 1920, "height": 1080, "storageKey": "uploads/photo.jpg"}Mettre à Jour un Média
Section intitulée « Mettre à Jour un Média »PUT /_emdash/api/media/:idContent-Type: application/jsonCorps de la Requête
Section intitulée « Corps de la Requête »{ "alt": "Photo description", "caption": "Photo caption"}Supprimer un Média
Section intitulée « Supprimer un Média »DELETE /_emdash/api/media/:idObtenir le Fichier Média
Section intitulée « Obtenir le Fichier Média »GET /_emdash/api/media/file/:keySert le contenu réel du fichier. Uniquement pour le stockage local.
Points de Terminaison des Révisions
Section intitulée « Points de Terminaison des Révisions »Lister les Révisions
Section intitulée « Lister les Révisions »GET /_emdash/api/content/:collection/:entryId/revisionsParamètres
Section intitulée « Paramètres »| Paramètre | Type | Description |
|---|---|---|
limit | number | Nombre maximum de révisions à retourner (défaut : 50) |
{ "success": true, "data": { "items": [ { "id": "01HXK5MZSN...", "collection": "posts", "entryId": "01HXK5MZSN...", "data": { ... }, "createdAt": "2025-01-24T12:00:00Z" } ], "total": 5 }}Obtenir une Révision
Section intitulée « Obtenir une Révision »GET /_emdash/api/revisions/:revisionIdRestaurer une Révision
Section intitulée « Restaurer une Révision »POST /_emdash/api/revisions/:revisionId/restoreRestaure le contenu à l’état de cette révision et crée une nouvelle révision.
Points de Terminaison des Schémas
Section intitulée « Points de Terminaison des Schémas »Lister les Collections
Section intitulée « Lister les Collections »GET /_emdash/api/schema/collections{ "success": true, "data": { "items": [ { "id": "01HXK5MZSN...", "slug": "posts", "label": "Posts", "labelSingular": "Post", "supports": ["drafts", "revisions", "preview"] } ] }}Obtenir une Collection
Section intitulée « Obtenir une Collection »GET /_emdash/api/schema/collections/:slugParamètres
Section intitulée « Paramètres »| Paramètre | Type | Description |
|---|---|---|
includeFields | boolean | Inclure les définitions de champs (requête) |
Créer une Collection
Section intitulée « Créer une Collection »POST /_emdash/api/schema/collectionsContent-Type: application/jsonCorps de la Requête
Section intitulée « Corps de la Requête »{ "slug": "products", "label": "Products", "labelSingular": "Product", "description": "Product catalog", "supports": ["drafts", "revisions"]}Mettre à Jour une Collection
Section intitulée « Mettre à Jour une Collection »PATCH /_emdash/api/schema/collections/:slugContent-Type: application/jsonSupprimer une Collection
Section intitulée « Supprimer une Collection »DELETE /_emdash/api/schema/collections/:slugParamètres
Section intitulée « Paramètres »| Paramètre | Type | Description |
|---|---|---|
force | boolean | Supprimer même si la collection a du contenu (requête) |
Lister les Champs
Section intitulée « Lister les Champs »GET /_emdash/api/schema/collections/:slug/fieldsCréer un Champ
Section intitulée « Créer un Champ »POST /_emdash/api/schema/collections/:slug/fieldsContent-Type: application/jsonCorps de la Requête
Section intitulée « Corps de la Requête »{ "slug": "price", "label": "Price", "type": "number", "required": true, "validation": { "min": 0 }}Mettre à Jour un Champ
Section intitulée « Mettre à Jour un Champ »PATCH /_emdash/api/schema/collections/:collectionSlug/fields/:fieldSlugContent-Type: application/jsonSupprimer un Champ
Section intitulée « Supprimer un Champ »DELETE /_emdash/api/schema/collections/:collectionSlug/fields/:fieldSlugRéorganiser les Champs
Section intitulée « Réorganiser les Champs »POST /_emdash/api/schema/collections/:slug/fields/reorderContent-Type: application/jsonCorps de la Requête
Section intitulée « Corps de la Requête »{ "fieldSlugs": ["title", "content", "author", "publishedAt"]}Exportation du Schéma
Section intitulée « Exportation du Schéma »Exporter le Schéma (JSON)
Section intitulée « Exporter le Schéma (JSON) »GET /_emdash/api/schemaAccept: application/jsonExporter le Schéma (TypeScript)
Section intitulée « Exporter le Schéma (TypeScript) »GET /_emdash/api/schema?format=typescriptAccept: text/typescriptRetourne les interfaces TypeScript pour toutes les collections.
Points de Terminaison des Plugins
Section intitulée « Points de Terminaison des Plugins »Lister les Plugins
Section intitulée « Lister les Plugins »GET /_emdash/api/pluginsObtenir un Plugin
Section intitulée « Obtenir un Plugin »GET /_emdash/api/plugins/:pluginIdActiver un Plugin
Section intitulée « Activer un Plugin »POST /_emdash/api/plugins/:pluginId/enableDésactiver un Plugin
Section intitulée « Désactiver un Plugin »POST /_emdash/api/plugins/:pluginId/disableCodes d’Erreur
Section intitulée « Codes d’Erreur »| Code | Statut HTTP | Description |
|---|---|---|
NOT_FOUND | 404 | Ressource non trouvée |
VALIDATION_ERROR | 400 | Données d’entrée invalides |
UNAUTHORIZED | 401 | Jeton manquant ou invalide |
FORBIDDEN | 403 | Permissions insuffisantes |
CONTENT_LIST_ERROR | 500 | Échec de la liste de contenu |
CONTENT_CREATE_ERROR | 500 | Échec de la création de contenu |
CONTENT_UPDATE_ERROR | 500 | Échec de la mise à jour du contenu |
CONTENT_DELETE_ERROR | 500 | Échec de la suppression du contenu |
MEDIA_LIST_ERROR | 500 | Échec de la liste des médias |
MEDIA_CREATE_ERROR | 500 | Échec de la création de média |
SCHEMA_ERROR | 400 | Échec de l’opération sur le schéma |
DUPLICATE_SLUG | 409 | Le slug existe déjà |
RESERVED_SLUG | 400 | Le slug est réservé |
Points de Terminaison de Recherche
Section intitulée « Points de Terminaison de Recherche »Recherche Globale
Section intitulée « Recherche Globale »GET /_emdash/api/search?q=hello+worldParamètres
Section intitulée « Paramètres »| Paramètre | Type | Description |
|---|---|---|
q | string | Requête de recherche (requise) |
collections | string | Slugs de collections séparés par des virgules |
status | string | Filtrer par statut (défaut : publié) |
limit | number | Résultats maximum (défaut : 20) |
cursor | string | Curseur de pagination |
{ "results": [ { "collection": "posts", "id": "01HXK5MZSN...", "slug": "hello-world", "title": "Bonjour le monde", "snippet": "...this is a <mark>hello</mark> <mark>world</mark> example...", "score": 0.95 } ], "nextCursor": "eyJvZmZzZXQiOjIwfQ"}Suggestions de Recherche
Section intitulée « Suggestions de Recherche »GET /_emdash/api/search/suggest?q=hel&limit=5Retourne les titres correspondant par préfixe pour l’auto-complétion.
Reconstruire l’Index de Recherche
Section intitulée « Reconstruire l’Index de Recherche »POST /_emdash/api/search/rebuildReconstruit l’index FTS pour toutes les collections ou des collections spécifiques.
Statistiques de Recherche
Section intitulée « Statistiques de Recherche »GET /_emdash/api/search/statsRetourne le nombre de documents indexés par collection.
Points de Terminaison des Sections
Section intitulée « Points de Terminaison des Sections »Lister les Sections
Section intitulée « Lister les Sections »GET /_emdash/api/sectionsGET /_emdash/api/sections?source=themeGET /_emdash/api/sections?search=newsletterObtenir une Section
Section intitulée « Obtenir une Section »GET /_emdash/api/sections/:slugCréer une Section
Section intitulée « Créer une Section »POST /_emdash/api/sectionsContent-Type: application/json
{ "slug": "my-section", "title": "My Section", "keywords": ["keyword1"], "content": [...]}Mettre à Jour une Section
Section intitulée « Mettre à Jour une Section »PUT /_emdash/api/sections/:slugSupprimer une Section
Section intitulée « Supprimer une Section »DELETE /_emdash/api/sections/:slugPoints de Terminaison des Paramètres
Section intitulée « Points de Terminaison des Paramètres »Obtenir Tous les Paramètres
Section intitulée « Obtenir Tous les Paramètres »GET /_emdash/api/settingsMettre à Jour les Paramètres
Section intitulée « Mettre à Jour les Paramètres »POST /_emdash/api/settingsContent-Type: application/json
{ "siteTitle": "Mon site", "tagline": "Un excellent site", "postsPerPage": 10}Points de Terminaison des Menus
Section intitulée « Points de Terminaison des Menus »Lister les Menus
Section intitulée « Lister les Menus »GET /_emdash/api/menusObtenir un Menu
Section intitulée « Obtenir un Menu »GET /_emdash/api/menus/:nameCréer un Menu
Section intitulée « Créer un Menu »POST /_emdash/api/menusContent-Type: application/json
{ "name": "footer", "label": "Footer Navigation"}Mettre à Jour un Menu
Section intitulée « Mettre à Jour un Menu »PUT /_emdash/api/menus/:nameSupprimer un Menu
Section intitulée « Supprimer un Menu »DELETE /_emdash/api/menus/:nameAjouter un Élément de Menu
Section intitulée « Ajouter un Élément de Menu »POST /_emdash/api/menus/:name/itemsContent-Type: application/json
{ "type": "page", "referenceCollection": "pages", "referenceId": "page_about", "label": "About Us"}Réorganiser les Éléments de Menu
Section intitulée « Réorganiser les Éléments de Menu »POST /_emdash/api/menus/:name/reorderContent-Type: application/json
{ "items": [ { "id": "item_1", "parentId": null, "sortOrder": 0 }, { "id": "item_2", "parentId": null, "sortOrder": 1 }, { "id": "item_3", "parentId": "item_2", "sortOrder": 0 } ]}Points de Terminaison de Taxonomie
Section intitulée « Points de Terminaison de Taxonomie »Lister les Définitions de Taxonomie
Section intitulée « Lister les Définitions de Taxonomie »GET /_emdash/api/taxonomiesCréer une Taxonomie
Section intitulée « Créer une Taxonomie »POST /_emdash/api/taxonomiesContent-Type: application/json
{ "name": "genre", "label": "Genres", "labelSingular": "Genre", "hierarchical": true, "collections": ["books", "movies"]}Lister les Termes
Section intitulée « Lister les Termes »GET /_emdash/api/taxonomies/:name/termsCréer un Terme
Section intitulée « Créer un Terme »POST /_emdash/api/taxonomies/:name/termsContent-Type: application/json
{ "slug": "tutorials", "label": "Tutoriels", "parentId": "term_abc", "description": "Guides pratiques"}Mettre à Jour un Terme
Section intitulée « Mettre à Jour un Terme »PUT /_emdash/api/taxonomies/:name/terms/:slugSupprimer un Terme
Section intitulée « Supprimer un Terme »DELETE /_emdash/api/taxonomies/:name/terms/:slugDéfinir les Termes d’une Entrée
Section intitulée « Définir les Termes d’une Entrée »POST /_emdash/api/content/:collection/:id/terms/:taxonomyContent-Type: application/json
{ "termIds": ["term_news", "term_featured"]}Points de Terminaison des Zones de Widgets
Section intitulée « Points de Terminaison des Zones de Widgets »Lister les Zones de Widgets
Section intitulée « Lister les Zones de Widgets »GET /_emdash/api/widget-areasObtenir une Zone de Widgets
Section intitulée « Obtenir une Zone de Widgets »GET /_emdash/api/widget-areas/:nameCréer une Zone de Widgets
Section intitulée « Créer une Zone de Widgets »POST /_emdash/api/widget-areasContent-Type: application/json
{ "name": "sidebar", "label": "Barre latérale principale", "description": "Apparaît sur les articles"}Supprimer une Zone de Widgets
Section intitulée « Supprimer une Zone de Widgets »DELETE /_emdash/api/widget-areas/:nameAjouter un Widget
Section intitulée « Ajouter un Widget »POST /_emdash/api/widget-areas/:name/widgetsContent-Type: application/json
{ "type": "content", "title": "A propos", "content": [...]}Mettre à Jour un Widget
Section intitulée « Mettre à Jour un Widget »PUT /_emdash/api/widget-areas/:name/widgets/:idSupprimer un Widget
Section intitulée « Supprimer un Widget »DELETE /_emdash/api/widget-areas/:name/widgets/:idRéorganiser les Widgets
Section intitulée « Réorganiser les Widgets »POST /_emdash/api/widget-areas/:name/reorderContent-Type: application/json
{ "widgetIds": ["widget_1", "widget_2", "widget_3"]}Points de Terminaison de Gestion des Utilisateurs
Section intitulée « Points de Terminaison de Gestion des Utilisateurs »Lister les Utilisateurs
Section intitulée « Lister les Utilisateurs »GET /_emdash/api/admin/usersGET /_emdash/api/admin/users?role=40GET /_emdash/api/admin/users?search=johnObtenir un Utilisateur
Section intitulée « Obtenir un Utilisateur »GET /_emdash/api/admin/users/:idMettre à Jour un Utilisateur
Section intitulée « Mettre à Jour un Utilisateur »PATCH /_emdash/api/admin/users/:idContent-Type: application/json
{ "name": "John Doe", "role": 40}Activer un Utilisateur
Section intitulée « Activer un Utilisateur »POST /_emdash/api/admin/users/:id/enableDésactiver un Utilisateur
Section intitulée « Désactiver un Utilisateur »POST /_emdash/api/admin/users/:id/disablePoints de Terminaison d’Authentification
Section intitulée « Points de Terminaison d’Authentification »Statut de Configuration
Section intitulée « Statut de Configuration »GET /_emdash/api/setup/statusIndique si la configuration est terminée et si des utilisateurs existent.
Connexion par clé d’accès
Section intitulée « Connexion par clé d’accès »POST /_emdash/api/auth/passkey/optionsObtenir les options d’authentification WebAuthn.
POST /_emdash/api/auth/passkey/verifyContent-Type: application/json
{ "id": "credential-id", "rawId": "...", "response": {...}, "type": "public-key"}Vérifier la clé d’accès et créer une session.
Lien magique
Section intitulée « Lien magique »POST /_emdash/api/auth/magic-link/sendContent-Type: application/json
{ "email": "user@example.com"}GET /_emdash/api/auth/magic-link/verify?token=xxxDéconnexion
Section intitulée « Déconnexion »POST /_emdash/api/auth/logoutUtilisateur actuel
Section intitulée « Utilisateur actuel »GET /_emdash/api/auth/meInviter un utilisateur
Section intitulée « Inviter un utilisateur »POST /_emdash/api/auth/inviteContent-Type: application/json
{ "email": "newuser@example.com", "role": 30}Gestion des clés d’accès
Section intitulée « Gestion des clés d’accès »GET /_emdash/api/auth/passkeyLister les clés d’accès de l’utilisateur.
POST /_emdash/api/auth/passkey/register/optionsPOST /_emdash/api/auth/passkey/register/verifyEnregistrer une nouvelle clé d’accès.
PATCH /_emdash/api/auth/passkey/:idContent-Type: application/json
{ "name": "MacBook Pro"}Renommer une clé d’accès.
DELETE /_emdash/api/auth/passkey/:idSupprimer une clé d’accès.
Points de terminaison d’importation
Section intitulée « Points de terminaison d’importation »Analyser l’export WordPress
Section intitulée « Analyser l’export WordPress »POST /_emdash/api/import/wordpress/analyzeContent-Type: multipart/form-data
fichier : <fichier WXR>Exécuter l’importation WordPress
Section intitulée « Exécuter l’importation WordPress »POST /_emdash/api/import/wordpress/executeContent-Type: application/json
{ "analysisId": "...", "options": { "includeMedia": true, "includeTaxonomies": true, "includeMenus": true }}Limitation du débit
Section intitulée « Limitation du débit »Les points de terminaison de l’API peuvent être limités en débit selon la configuration du déploiement. Lorsqu’ils sont limités, les réponses incluent :
HTTP/1.1 429 Too Many RequestsRetry-After: 60L’API prend en charge CORS pour les requêtes du navigateur. Configurez les origines autorisées dans votre déploiement.