Posts
Os endpoints de Posts entregam o conteúdo publicado do blog. Use-os para alimentar a home, as páginas de artigo, feeds e qualquer superfície que exiba textos da DraftIn. Todos exigem a chave de API e retornam apenas posts publicados.
Listar posts
Requer X-API-Key
Retorna um array de posts publicados do blog, ordenados pela
plataforma e paginados por limit/offset. É o ponto
de partida para listagens, índices e geração estática de rotas.
Quando usar
- Montar a home ou a página de índice do blog.
- Gerar rotas estáticas a partir dos
slugretornados. - Construir feeds (RSS/JSON) e seções "mais recentes".
Query parameters
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| status | string | Não | Filtra por status. O único valor aceito é PUBLISHED — os endpoints públicos não expõem rascunhos nem agendados.Padrão: PUBLISHED |
| limit | integer | Não | Quantidade de posts por página. Mínimo 1, máximo 100.Padrão: 10 |
| offset | integer | Não | Quantos posts pular (paginação por deslocamento). Mínimo 0.Padrão: 0 |
Exemplo de requisição
curl "https://api.draftin.io/public/posts?limit=10&offset=0" \
-H "X-API-Key: $DRAFTIN_API_KEY" const res = await fetch("https://api.draftin.io/public/posts?limit=10&offset=0", {
headers: { "X-API-Key": process.env.DRAFTIN_API_KEY },
});
const posts = await res.json(); // Post[] import type { Post } from "./types"; // veja "Modelos de dados"
async function listarPosts(limit = 10, offset = 0): Promise<Post[]> {
const url = new URL("/public/posts", "https://api.draftin.io");
url.searchParams.set("limit", String(limit));
url.searchParams.set("offset", String(offset));
const res = await fetch(url, {
headers: { "X-API-Key": process.env.DRAFTIN_API_KEY! },
});
if (!res.ok) throw new Error(`DraftIn API: ${res.status}`);
return res.json() as Promise<Post[]>;
} // listar-posts.js — Node 22+
const BASE = "https://api.draftin.io";
const res = await fetch(`${BASE}/public/posts?limit=10`, {
headers: { "X-API-Key": process.env.DRAFTIN_API_KEY },
});
const posts = await res.json();
console.table(posts.map((p) => ({ title: p.title, slug: p.slug, em: p.publishedAt }))); Exemplo de resposta
[
{
"id": "clxxx101",
"title": "Meu Primeiro Post",
"subtitle": "Subtítulo do post",
"content": "<p>Conteúdo do post em HTML ou Markdown</p>",
"slug": "meu-primeiro-post",
"status": "PUBLISHED",
"publishedAt": "2026-06-01T12:00:00.000Z",
"scheduledAt": null,
"blogId": "clxxx789",
"authorId": "clxxx123",
"createdAt": "2026-05-30T09:15:00.000Z",
"updatedAt": "2026-06-01T12:00:00.000Z",
"categories": [
{ "id": "clxxx201", "name": "Tecnologia", "description": "Posts sobre tecnologia", "blogId": "clxxx789" }
],
"tags": [
{ "id": "clxxx301", "name": "javascript", "blogId": "clxxx789" }
]
}
] Respostas possíveis
| Status | Significado |
|---|---|
| 200 OK | Lista de posts públicos (array de Post). |
| 401 Unauthorized | Chave de API inválida ou ausente. |
Obter post por ID
Requer X-API-Key
Recupera um único post publicado pelo seu identificador.
Útil quando você já guardou o id (por exemplo, em referências internas
ou relações).
Parâmetros de rota
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| id | string | Sim | Identificador único do post. |
Exemplo de requisição
curl "https://api.draftin.io/public/posts/clxxx101" \
-H "X-API-Key: $DRAFTIN_API_KEY" const id = "clxxx101";
const res = await fetch(`https://api.draftin.io/public/posts/${id}`, {
headers: { "X-API-Key": process.env.DRAFTIN_API_KEY },
});
if (res.status === 404) {
// post inexistente ou não publicado
}
const post = await res.json(); async function getPost(id: string): Promise<Post | null> {
const res = await fetch(`https://api.draftin.io/public/posts/${id}`, {
headers: { "X-API-Key": process.env.DRAFTIN_API_KEY! },
});
if (res.status === 404) return null;
if (!res.ok) throw new Error(`DraftIn API: ${res.status}`);
return res.json() as Promise<Post>;
} Exemplo de resposta
{
"id": "clxxx101",
"title": "Meu Primeiro Post",
"subtitle": "Subtítulo do post",
"content": "<p>Conteúdo do post em HTML ou Markdown</p>",
"slug": "meu-primeiro-post",
"status": "PUBLISHED",
"publishedAt": "2026-06-01T12:00:00.000Z",
"scheduledAt": null,
"blogId": "clxxx789",
"authorId": "clxxx123",
"createdAt": "2026-05-30T09:15:00.000Z",
"updatedAt": "2026-06-01T12:00:00.000Z",
"categories": [
{ "id": "clxxx201", "name": "Tecnologia", "description": "Posts sobre tecnologia", "blogId": "clxxx789" }
],
"tags": [
{ "id": "clxxx301", "name": "javascript", "blogId": "clxxx789" }
]
} Respostas possíveis
| Status | Significado |
|---|---|
| 200 OK | Post encontrado (objeto Post). |
| 401 Unauthorized | Chave de API inválida ou ausente. |
| 404 Not Found | Post não encontrado (inexistente ou não publicado). |
Obter post por slug
Requer X-API-Key
Recupera um post publicado pelo seu slug — o identificador legível
usado em URLs. Este é o endpoint ideal para páginas de artigo com rota amigável,
como /blog/[slug].
Parâmetros de rota
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| slug | string | Sim | Slug legível do post (ex.: meu-primeiro-post). Faça encodeURIComponent ao montar a URL. |
Exemplo de requisição
curl "https://api.draftin.io/public/posts/slug/meu-primeiro-post" \
-H "X-API-Key: $DRAFTIN_API_KEY" const slug = "meu-primeiro-post";
const res = await fetch(`https://api.draftin.io/public/posts/slug/${encodeURIComponent(slug)}`, {
headers: { "X-API-Key": process.env.DRAFTIN_API_KEY },
});
const post = res.ok ? await res.json() : null; // Ideal para rotas dinâmicas: /blog/[slug]
export async function getPostBySlug(slug: string): Promise<Post | null> {
const res = await fetch(
`https://api.draftin.io/public/posts/slug/${encodeURIComponent(slug)}`,
{ headers: { "X-API-Key": process.env.DRAFTIN_API_KEY! } },
);
if (res.status === 404) return null;
if (!res.ok) throw new Error(`DraftIn API: ${res.status}`);
return res.json() as Promise<Post>;
} // Geração estática: buscar todos os slugs e depois cada post
const BASE = "https://api.draftin.io";
const headers = { "X-API-Key": process.env.DRAFTIN_API_KEY };
const lista = await (await fetch(`${BASE}/public/posts?limit=100`, { headers })).json();
for (const { slug } of lista) {
const post = await (await fetch(`${BASE}/public/posts/slug/${slug}`, { headers })).json();
// renderiza/escreve a página de `post`
} Exemplo de resposta
{
"id": "clxxx101",
"title": "Meu Primeiro Post",
"subtitle": "Subtítulo do post",
"content": "<p>Conteúdo do post em HTML ou Markdown</p>",
"slug": "meu-primeiro-post",
"status": "PUBLISHED",
"publishedAt": "2026-06-01T12:00:00.000Z",
"scheduledAt": null,
"blogId": "clxxx789",
"authorId": "clxxx123",
"createdAt": "2026-05-30T09:15:00.000Z",
"updatedAt": "2026-06-01T12:00:00.000Z",
"categories": [
{ "id": "clxxx201", "name": "Tecnologia", "description": "Posts sobre tecnologia", "blogId": "clxxx789" }
],
"tags": [
{ "id": "clxxx301", "name": "javascript", "blogId": "clxxx789" }
]
} Respostas possíveis
| Status | Significado |
|---|---|
| 200 OK | Post encontrado (objeto Post). |
| 401 Unauthorized | Chave de API inválida ou ausente. |
| 404 Not Found | Post não encontrado (inexistente ou não publicado). |
Campos do objeto Post
PUBLISHED (o enum completo inclui DRAFT e SCHEDULED).Boas práticas
- Cacheie as respostas. Conteúdo publicado muda pouco; cachear na borda reduz latência e carga.
- Prefira
slugpara URLs públicas e reserve oidpara referências internas. - Renderize
contentcom cuidado. Como pode ser HTML, sanitize antes de injetar no DOM se a fonte não for totalmente confiável. - Trate
publishedAtnulo. Embora públicos sejamPUBLISHED, programe defensivamente para datas ausentes.
Casos de uso comuns
- Blog estático: liste com
/public/postsno build, gere uma rota porsluge busque cada post com/slug/{slug}. - Home com "últimos posts":
/public/posts?limit=5. - App nativo: pagine com
limit/offsete abra o detalhe porid.