Zenex CMSDocs

GET Posts

Fetch a list of published posts with pagination support.

Endpoint

Endpoint
GET /api/blogs/{blogId}/posts

Query Parameters

  • page - Page number (default: 1)
  • limit - Posts per page (default: 10)
  • category - Filter by category ID (optional)
  • language - Filter by language code (ISO 639-1, optional)
    • Examples: en (English), es (Spanish), fr (French)
    • If omitted, returns posts in all languages
    • Each post in the response includes an availableLanguages array showing all available translations

Response

Response
{
"data": [
{
"id": "clx1234567890",
"title": "My First Post",
"slug": "my-first-post",
"excerpt": "A short description of the post",
"coverImage": "https://example.com/image.jpg",
"language": "en",
"html": "<p class=\"zenex-cms__paragraph\">A short description of the post</p>",
"publishedAt": "2024-01-01T00:00:00.000Z",
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z",
"categories": [
{
"id": "cat123",
"name": "Technology",
"slug": "technology"
}
],
"tags": [
{
"id": "tag123",
"name": "JavaScript",
"slug": "javascript"
}
],
"metaTitle": "SEO optimized title",
"metaDescription": "SEO description",
"ogImage": "https://example.com/og-image.jpg",
"ogTitle": "Social media title",
"ogDescription": "Social media description",
"canonicalUrl": "https://example.com/blog/my-first-post",
"keywords": "javascript, web development"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 42,
"totalPages": 5
}
}

Examples

Basic Example

example.ts
const blogId = "your-blog-id";
const page = 1;
const limit = 10;
const res = await fetch(
`https://yourdomain.com/api/blogs/${blogId}/posts?page=${page}&limit=${limit}`
);
const { data: posts, pagination } = await res.json();
console.log(`Total posts: ${pagination.total}`);
console.log(`Total pages: ${pagination.totalPages}`);
// Render content using post.html
// See "GET Single Post" documentation for styling instructions.

Filter by Language

filter-by-language.ts
const blogId = "your-blog-id";
const language = "es"; // Spanish
// Fetch only Spanish posts
const res = await fetch(
`https://yourdomain.com/api/blogs/${blogId}/posts?language=${language}`
);
const { data: posts } = await res.json();
// All posts in the response will have language: "es"
posts.forEach(post => {
console.log(`${post.title} (Language: ${post.language})`);
console.log(`Available translations: ${post.availableLanguages.join(", ")}`);
});

Get All Languages

all-languages.ts
const blogId = "your-blog-id";
// Fetch posts in all languages (no language parameter)
const res = await fetch(
`https://yourdomain.com/api/blogs/${blogId}/posts`
);
const { data: posts } = await res.json();
// Group posts by language
const postsByLanguage = posts.reduce((acc, post) => {
const lang = post.language || "unknown";
if (!acc[lang]) acc[lang] = [];
acc[lang].push(post);
return acc;
}, {} as Record<string, typeof posts>);
console.log("Posts by language:", postsByLanguage);