L’API Console vous permet d’effectuer des tâches administratives d’un blog. C’est la même API que nous utilisons en interne dans la Console. Vous pouvez l’utiliser pour automatiser certaines tâches ou même créer une mini-console entièrement nouvelle par vous-même.
https://blogs.hyvor.com/api/console/v0/blog/{subdomain}X-API-KEY.GET - pour obtenir des données, généralement un tableau de ressourcesPOST - pour créer une ressourcePATCH - pour mettre à jour partiellement ou complètement une ressourceDELETE - pour supprimer une ressourceL’API Console dispose de nombreux points de terminaison et est classée selon la “ressource” à laquelle vous souhaitez accéder ou que vous souhaitez gérer. La plupart des catégories disposent d’opérations CRUD, mais certaines peuvent avoir davantage de points de terminaison pour des tâches spécifiques. Ces objets sont définis au sein de la catégorie. Notez également que les objets de l’API Console sont différents des objets de l’API Data.
Accédez directement à chaque catégorie :
Points de terminaison :
GET /blog - Obtenir les données du blogPATCH /blog - Mettre à jour les données du blogPOST /blog/variant - Créer une variante de blogPATCH /blog/variant - Mettre à jour une variante de blogObjets :
GET /blog
type Request = {};
type Response = Blog;PATCH /blog
type Request = Partial<Blog>; // sauf id et variants
type Response = Blog;POST /blog/variant
type Request = {
language_id: number;
};
type Response = BlogVariant;PATCH /blog/variant
type Request = {
language_id: number;
name?: string;
description?: string;
};
type Response = BlogVariant;Points de terminaison :
GET /posts - Obtenir les articlesGET /pages - Obtenir les pagesPOST /post - Créer un article/une pageGET /post/{id} - Obtenir un article/une pagePATCH /post/{id} - Mettre à jour un article/une pageDELETE /post/{id} - Supprimer un article/une pagePOST /post/{id}/variant - Créer une variante d’articlePATCH /post/{id}/variant - Mettre à jour une variante d’articlePOST /post/{id}/variant/publish - Publier une variante d’articlePOST /post/{id}/variant/unpublish - Dépublier une variante d’articleDELETE /post/{id}/variant - Supprimer une variante d’articlePATCH /post/{id}/tags - Mettre à jour les tags d’un articlePATCH /post/{id}/authors - Mettre à jour les auteurs d’un articleObjets :
Obtient les articles avec filtrage. Les paramètres de filtrage sont similaires à ceux de la Console. Renvoie un objet PostListItem léger par article, plutôt que l’objet complet Post - récupérez GET /post/{id} pour obtenir l’article complet.
GET /posts
type Request = {
status?: 'featured' | 'published' | 'draft' | 'scheduled';
author_id?: number;
tag_id?: number;
start_timestamp?: number; // horodatage unix
end_timestamp?: number; // horodatage unix
search?: string;
language_id?: number; // par défaut la langue principale du blog
limit?: number; // par défaut 50, max 100
offset?: number;
};
type Response = PostListItem[];Même forme légère PostListItem que GET /posts.
GET /pages
type Request = {};
type Response = PostListItem[];Crée un article brouillon vide. Une variante d’article sera créée à partir de la langue principale du blog.
POST /post
type Request = {
is_page?: boolean; // par défaut false
};
type Response = Post;GET /post/{id}
type Request = {};
type Response = Post;PATCH /post/{id}
type Request = {
is_featured?: boolean;
featured_image_url?: string | null;
canonical_url?: string | null;
code_head?: string | null;
code_foot?: string | null;
published_at?: number | null; // horodatage unix
};
type Response = Post;DELETE /post/{id}
type Request = {};
type Response = {};POST /post/{id}/variant
type Request = {
language_id: number;
};
type Response = PostVariant;PATCH /post/{id}/variant
type Request = {
language_id: number;
slug?: string; // max 255 caractères
content?: string | null;
content_unsaved?: string | null;
title?: string | null; // max 255 caractères
description?: string | null; // max 255 caractères
};
type Response = PostVariant;content et content_unsaved doivent ĂŞtre au format JSON ProseMirror. Consultez le point de terminaison Obtenir le JSON ProseMirror pour convertir du HTML en JSON ProseMirror.
POST /post/{id}/variant/publish
type Request = {
language_id: number;
};
type Response = PostVariant;Publie une variante d’article. Si la variante n’a pas de slug, un slug est automatiquement généré à partir du titre. Si l’article n’a pas d’heure published_at, elle est définie sur maintenant. Nécessite la portée posts.publish.own.
POST /post/{id}/variant/unpublish
type Request = {
language_id: number;
};
type Response = PostVariant;Remet le statut de la variante à draft. Fonctionne aussi bien sur les variantes publiées que programmées. Nécessite la portée posts.publish.own.
DELETE /post/{id}/variant
type Request = {
language_id: number;
};
type Response = {};PATCH /post/{id}/tags
type Request = {
ids: number[]; // IDs des tags
};
type Response = {};PATCH /post/{id}/authors
type Request = {
ids: number[]; // IDs des auteurs (utilisateurs)
};
type Response = {};Points de terminaison :
GET /tags - Obtenir ou rechercher des tagsPOST /tag - Créer un tagPATCH /tag/{id} - Mettre à jour un tagDELETE /tag/{id} - Supprimer un tagPOST /tag/{id}/variant - Créer une variante de tagPATCH /tag/{id}/variant - Mettre à jour une variante de tagDELETE /tag/{id}/variant - Supprimer une variante de tagObjets :
Liste les tags, avec une recherche optionnelle par nom (langue principale).
GET /tags
type Request = {
limit?: number; // par défaut 50, max 100
offset?: number;
search?: string; // filtre les tags par nom (langue principale)
};
type Response = Tag[];POST /tag
type Request = {
name: string; // nom pour la variante de langue principale
is_private: boolean; // par défaut false
};
type Response = Tag;PATCH /tag/{id}
type Request = {
is_private?: boolean;
slug?: string;
code_head?: string | null;
code_foot?: string | null;
};
type Response = Tag;DELETE /tag/{id}
type Request = {};
type Response = {};POST /tag/{id}/variant
type Request = {
language_id: number;
};PATCH /tag/{id}/variant
type Request = {
language_id: number;
name?: string;
description?: string | null;
};DELETE /tag/{id}/variant
type Request = {
language_id: number;
};Points de terminaison :
GET /users - Obtenir les utilisateursGET /users/search - Rechercher des utilisateursPOST /user - Créer un utilisateurPOST /user/guest - Créer un utilisateur invitéPATCH /user/{id} - Mettre à jour un utilisateurDELETE /user/{id} - Supprimer un utilisateurPOST /user/{id}/variant - Créer une variante d’utilisateurPATCH /user/{id}/variant - Mettre à jour une variante d’utilisateurDELETE /user/{id}/variant - Supprimer une variante d’utilisateurObjets :
GET /users
type Request = {
offset?: number;
};
type Response = User[];Recherche des utilisateurs par nom.
GET /users/search
type Request = {
search: string;
};
type Response = User[];POST /user
type Request = {
username_or_email: string;
role: 'owner' | 'admin' | 'editor' | 'writer' | 'contributor';
};
type Response = User;POST /user/guest
type Request = {
name: string;
};
type Response = User;PATCH /user/{id}
type Request = {
hyvor_user_id?: number;
role?: 'owner' | 'admin' | 'editor' | 'writer' | 'contributor';
status: 'active' | 'blocked';
slug: string;
email?: string;
website_url?: string;
picture_url?: string;
social_facebook?: string;
social_twitter?: string;
social_linkedin?: string;
social_youtube?: string;
social_tiktok?: string;
social_instagram?: string;
social_github?: string;
};
type Response = User;DELETE /user/{id}
type Request = {};
type Response = {};POST /user/{id}/variant
type Request = {};
type Response = UserVariant;PATCH /user/{id}/variant
type Request = {
name?: string;
bio?: string;
location?: string;
};
type Response = UserVariant;DELETE /user/{id}/variant
type Request = {};
type Response = {};Points de terminaison :
GET /media - Obtenir les médiasPOST /media - Créer un médiaPOST /media/from-url - Créer un média à partir d’une URLDELETE /media/{id} - Supprimer une navigationGET /media/unsplash/search - Obtenir des médias depuis unsplashPATCH /media - Modifier un médiaObjets :
GET /media
type Request = {
limit: number;
offset: number;
search?: string;
extensions?: string[];
type?: string;
};
type Response = Media[];POST /media
type Request = {
file: File;
post_id: number;
};
type Response = Media;POST /media/from-url
type Request = {
url: string;
post_id?: number;
};
type Response = Media;DELETE /media/{id}
type Request = {};
type Response = {};PATCH /media/{id}
type Request = Partial<Media>;
type Response = Media;Points de terminaison :
GET /navigations - Obtenir les navigationsPATCH /navigations/sort - Mettre à jour l’ordre des navigationsPOST /navigation - Créer une navigationPATCH /navigation/{id} - Mettre à jour une navigationDELETE /navigation/{id} - Supprimer une navigationPOST /navigation/{id}/variant - Créer une variante de navigationPATCH /navigation/{id}/variant - Mettre à jour une variante de navigationDELETE /navigation/{id}/variant - Supprimer une variante de navigationObjets :
GET /navigations
type Request = {};
type Response = Navigation[];PATCH /navigations/sort
type Request = {
ids?: number[];
};
type Response = {};POST /navigation
type Request = {
url: string;
name: string;
type: 'header' | 'footer';
};
type Response = Navigation;PATCH /navigation/{id}
type Request = {
url: string;
type: 'header' | 'footer';
};
type Response = Navigation;DELETE /navigation/{id}
type Request = {};
type Response = {};POST /navigation/{id}/variant
type Request = {
language_id: number;
name?: string;
};
type Response = NavigationVariant;PATCH /navigation/{id}/variant
type Request = {
language_id: number;
name: string;
};
type Response = NavigationVariant;DELETE /navigation/{id}/variant
type Request = {
language_id: number;
};
type Response = {};Points de terminaison :
GET /languages - Obtenir les languesPOST /language - Créer une languePATCH /language/{id} - Mettre à jour une langueDELETE /language/{id} - Supprimer une langueObjets :
GET /languages
type Request = {};
type Response = Languages[];POST /language
type Request = {
code: string; // max 12 caractères
name: string; // max 255 caractères
direction: 'ltr' | 'rtl';
};
type Response = Language;PATCH /language/{id}
type Request = {
code: string; // max 12 caractères
name: string; // max 255 caractères
direction: 'ltr' | 'rtl';
};
type Response = Language;DELETE /language/{id}
type Request = {};
type Response = {};Points de terminaison :
GET /redirects - Obtenir les redirectionsPOST /redirect - Créer une redirectionPATCH /redirect/{id} - Mettre à jour une redirectionDELETE /redirect/{id} - Supprimer une redirectionObjets :
GET /redirects
type Request = {
search?: string;
limit?: number;
offset?: number;
};
type Response = Redirect[];POST /redirect
type Request = {
dynamic: boolean;
path: string;
to: string;
type: 'temporary' | 'permanent';
};
type Response = Redirect;PATCH /redirect/{id}
type Request = {
path?: string;
to?: string;
type?: 'temporary' | 'permanent';
};
type Response = Redirect;DELETE /redirect/{id}
type Request = {};
type Response = {};Points de terminaison :
GET /webhooks - Obtenir les webhooksPOST /webhook - Créer un webhookPATCH /webhook/{id} - Mettre à jour un webhookDELETE /webhook/{id} - Supprimer un webhookObjets :
GET /webhooks
type Request = {};
type Response = Webhook[];POST /webhook
type Request = {
url: string;
events: 'cache.single' | 'cache.templates' | 'cache.all'[];
};
type Response = Webhook;PATCH /webhook/{id}
type Request = {
url?: string;
events?: 'cache.single' | 'cache.templates' | 'cache.all'[];
};
type Response = Webhook;DELETE /webhook/{id}
type Request = {};
type Response = {};Points de terminaison :
GET /theme/files - Obtenir les fichiers du thèmePOST /theme/file - Créer un fichier de thèmePATCH /theme/file/{id} - Mettre à jour un fichier de thèmeDELETE /theme/file/{id} - Supprimer un fichier de thèmeObjets :
GET /theme/files
type Request = {};
type Response = FileObject[];POST /theme/file
type Request = {
folder: 'templates' | 'assets' | 'styles' | 'lang';
name: string;
content?: string;
file: File;
};
type Response = FileObject;PATCH /theme/file/{id}
type Request = {
name?: string;
content?: string;
};
type Response = FileObject;DELETE /theme/file/{id}
type Request = {};
type Response = {};Points de terminaison :
GET /exports - Obtenir les exportsPOST /export - Créer un exportObjets :
GET /exports
type Request = {};
type Response = ExportObject[];POST /export
type Request = {};
type Response = ExportObject;Points de terminaison :
POST /link-analysis/check-urls - Vérifier un lien de variante d’articlePATCH /link-analysis/ignore-link - Ignorer un lienGET /link-analysis/stats - Obtenir les statistiques des liensGET /link-analysis/links - Obtenir les liensGET /link-analysis/checks - Obtenir les vérificationsPOST /link-analysis/check - Créer une vérificationObjets :
POST /link-analysis/check-urls
type Request = {
post_variant_id: number;
urls: string[];
force?: boolean;
};
type Response = LinkObject[];PATCH /link-analysis/ignore-link
type Request = {
post_variant_id: number;
urls: string[];
status: boolean;
};
type Response = LinkObject;GET /link-analysis/stats
type Request = {};
type Response = {
counts: number;
};GET /link-analysis/links
type Request = {
type?: 'ok' | 'broken' | 'ignored' | 'redirected';
limit?: number;
offset?: number;
};
type Response = LinkObject[];GET /link-analysis/checks
type Request = {
limit?: number;
offset?: number;
};
type Response = CheckObject[];POST /link-analysis/check
type Request = {};
type Response = CheckObject;Points de terminaison :
GET /routes - Obtenir les routesPOST /route - Créer une routePATCH /route/{id} - Mettre à jour une routeDELETE /route/{id} - Supprimer une routeObjets :
GET /routes
type Request = {};
type Response = Route[];POST /route
type Request = {
name: string;
match: string;
template: string;
post_filter?: string;
content_type?: string;
};
type Response = Route;PATCH /route/{id}
type Request = {
name: string;
match: string;
template: string;
post_filter?: string;
content_type?: string;
};
type Response = Route;DELETE /route/{id}
type Request = {};
type Response = {};Points de terminaison :
GET /misc/themes - Obtenir tous les thèmesGET /misc/prosemirror/json - Obtenir le json prosemirrorDELETE /blog/cache - Supprimer le cache du blogDELETE /blog - Supprimer le blogGET /misc/themes
type Request = {};
type Response = Theme[];GET /misc/prosemirror/json
type Request = {
html: string;
};
type Response = {
json: string;
};DELETE /blog/cache
type Request = {
type: 'all' | 'template' | 'paths';
paths?: string[];
};
type Response = {};Supprime le blog de manière réversible (soft-delete). Le blog et ses données sont définitivement supprimés 30 jours plus tard. Nécessite la portée blog.delete.
DELETE /blog
type Request = {};
type Response = {};interface Blog {
id: number;
created_at: number;
is_blocked: boolean;
subdomain: string;
type: 'default' | 'dev';
hosting_at: 'subdomain' | 'domain' | 'self';
hosting_domain: string | null;
hosting_url: string | null;
embeddable: boolean;
embedding_domains: string | null;
logo_url: string | null;
cover_url: string | null;
social_facebook: string | null;
social_twitter: string | null;
social_linkedin: string | null;
social_youtube: string | null;
social_tiktok: string | null;
social_instagram: string | null;
social_github: string | null;
code_head: string | null;
code_foot: string | null;
seo_indexing: boolean;
seo_robots_txt: string | null;
seo_external_links_follow: 'follow' | 'nofollow';
comments_code: string | null;
newsletter_code: string | null;
color_modes: 'light' | 'dark' | 'both';
color_mode_default: 'light' | 'dark' | 'os';
syntax_on: boolean;
syntax_line_numbers: boolean;
syntax_theme: string | null;
flashload: boolean;
variants: BlogVariant[];
}interface BlogVariant {
language_id: number;
name: string | null;
description: string | null;
}interface Post {
id: number;
preview_id: string;
created_at: number;
updated_at: number;
published_at: number | null;
is_featured: boolean;
is_page: boolean;
featured_image_url: string | null;
canonical_url: string | null;
code_head: string | null;
code_foot: string | null;
variant_statuses: {
id: number;
language_id: number;
status: 'draft' | 'published' | 'scheduled';
}[];
tags: Tag[];
authors: User[];
}variant_statuses vous indique uniquement quelles langues un article possède et leur statut. Récupérez GET /post/{id}?variant_language_code=... pour obtenir l’objet complet PostVariant (contenu, titre, champs SEO, etc.) pour une seule langue.
interface PostVariant {
language_id: number;
slug: string | null;
status: 'draft' | 'published' | 'scheduled';
url: string;
content: string | null;
content_unsaved: string | null;
title: string | null;
description: string | null;
}Renvoyé par GET /posts et GET /pages. Un résumé léger par article : slug, url, title, et link_analysis reflètent la variante de la langue demandée (ou la langue principale du blog), et tags/authors sont uniquement leurs noms dans la langue principale. Récupérez GET /post/{id} pour obtenir l’objet complet Post, incluant les tags et les auteurs.
interface PostListItem {
id: number;
created_at: number;
updated_at: number;
published_at: number | null;
is_featured: boolean;
is_page: boolean;
slug: string | null;
url: string | null;
title: string | null;
link_analysis: Record<string, number>;
variant_statuses: {
language_id: number;
status: 'draft' | 'published' | 'scheduled';
}[];
tags: string[]; // noms des tags, langue principale
authors: string[]; // noms des auteurs, langue principale
}interface Tag {
id: number;
created_at: number;
updated_at: number;
is_private: boolean;
slug: string;
posts_count: number;
code_head: string | null;
code_foot: string | null;
variants: TagVariant[];
}interface TagVariant {
language_id: number;
url: string | null;
name: string | null;
description: string | null;
}interface User {
id: number;
created_at: number;
updated_at: number;
hyvor_user_id: number | null;
status: 'invited' | 'active' | 'blocked';
role: 'owner' | 'admin' | 'editor' | 'writer' | 'contributor';
slug: string;
posts_count: number;
email: string;
picture_url: string | null;
website_url: string | null;
social_facebook: string | null;
social_twitter: string | null;
social_linkedin: string | null;
social_youtube: string | null;
social_tiktok: string | null;
social_instagram: string | null;
social_github: string | null;
variants: UserVariant[];
}interface UserVariant {
language_id: number;
url: string;
name: string | null;
bio: string | null;
location: string | null;
}interface Media {
id: number;
uploaded_at: number;
name: string;
url: string;
original_name: string;
extension: string;
}interface Navigation {
id: number;
created_at: number;
url: string;
type: NavigationType;
sort: number;
variants: NavigationVariant[];
}interface NavigationVariant {
language_id: number;
name: string | null;
}interface Language {
id: number;
code: string;
name: string;
is_primary: boolean;
}interface Redirect {
id: number;
created_at: number;
path: string;
to: string;
type: 'temporary' | 'permanent';
}interface Webhook {
id: number;
url: string;
events: string[];
secret: string;
}interface Route {
id: number;
created_at: number;
name: string;
match: string;
template: string;
posts_filter: string | null;
content_type: string | null;
is_enabled: boolean;
}interface FileObject {
id: number;
name: string;
content: string | null;
folder: 'templates' | 'assets' | 'styles' | 'lang';
}interface Export {
id: number;
createdf_at: number;
format: 'hyvor_blogs' | 'wordpress';
status: 'pending' | 'completed' | 'failed';
url: string | null;
error?: string;
}interface Theme {
id: number;
type: 'original' | 'ported';
name: string;
}interface LinkObject {
id: number;
url: string;
full_url: string;
status_code: number;
status_type: 'ok' | 'broken' | 'redirect' | 'ignored';
ignored: boolean;
post_id: number;
post_variant_id: number;
post_variant_language_id: number;
post_variant_title: string;
}interface CheckObject {
id: number;
created_at: number;
status: 'pending' | 'completed' | 'failed';
error: string | null;
post_count: number;
post_variants_count: number;
page_count: number;
page_variants_count: number;
links_total_count: number;
links_ok_count: number;
links_broken_count: number;
links_redirect_count: number;
links_ignored_count: number;
}