Modelos de dados
Referência canônica dos objetos da API pública. Cada modelo lista os campos
exatamente como aparecem na especificação. No fim da página há um arquivo types.ts pronto para copiar.
Envelope de sucesso
Todos os endpoints de conteúdo respondem dentro do envelope { success, data, meta? } — o payload documentado em cada modelo abaixo chega em data.
Os endpoints de anúncios são a exceção (contrato legado, sem envelope). Veja
Formato das respostas.
true em sucesso; false em erro.page/pageSize, contém pagination (PaginationMetaCanonical).PaginationMetaCanonical
Metadados de paginação em meta.pagination nas listagens por page/pageSize.
Post
Objeto principal de conteúdo. Retornado por todos os endpoints de Posts; também em listagens por categoria e tag.
DRAFT, PUBLISHED, SCHEDULED. Nos endpoints públicos é sempre PUBLISHED.Category
Tema do blog. Retornado pelos endpoints de Categorias e aninhado em Post.categories.
posts (integer): nº de posts na categoria.Tag
Rótulo transversal. Retornado pelos endpoints de Tags e aninhado em Post.tags. Note que não possui description.
posts (integer): nº de posts com a tag.SearchResponse
Objeto retornado em data pela busca, com resultados e metadados próprios.
q (string), limit (integer), offset (integer), count (integer).SearchResultItem
Item enxuto de resultado de busca (subconjunto de um post).
AdDeliveryResult
Resultado da entrega de um anúncio — retornado sem envelope (contrato legado). Quando não há anúncio,
vem apenas filled: false. O AdDeliverySlotResult estende
este objeto com slotId e format.
AdFormat
Enumeração de formatos de anúncio. Valores: BANNER, SIDEBAR, POPUP, INLINE, NATIVE.
Error
Envelope padrão de erro: { success: false, error: { … } }. Campos de error:
NOT_FOUND).not_found, rate_limit).retryable).fields em validação).X-Request-Id).Estratégia de tratamento e códigos comuns em Tratamento de erros.
Tipos TypeScript
Copie para o seu projeto e importe nos exemplos das páginas de endpoints:
// Modelos da API pública do DraftIn — prontos para reuso.
export type PostStatus = "DRAFT" | "PUBLISHED" | "SCHEDULED";
export type AdFormat = "BANNER" | "SIDEBAR" | "POPUP" | "INLINE" | "NATIVE";
// ——— Envelopes ———
export interface Envelope<T> {
success: true;
data: T;
meta?: { pagination?: PaginationMeta };
message?: string;
}
export interface PaginationMeta {
page: number;
pageSize: number;
total: number;
totalPages: number;
hasNextPage: boolean;
hasPrevPage: boolean;
}
export interface ApiError {
success: false;
error: {
message: string;
code: string;
type: string;
statusCode: number;
timestamp: string;
retryable: boolean;
retryDelay?: number;
details?: Record<string, unknown> | null;
path: string;
requestId: string;
docs: string;
};
}
// ——— Recursos ———
export interface Category {
id: string;
name: string;
description: string;
blogId: string;
createdAt: string;
updatedAt: string;
_count?: { posts: number };
}
export interface Tag {
id: string;
name: string;
blogId: string;
createdAt: string;
updatedAt: string;
_count?: { posts: number };
}
export interface Post {
id: string;
title: string;
subtitle: string;
content: string;
slug: string;
status: PostStatus; // público: sempre "PUBLISHED"
publishedAt: string | null;
scheduledAt: string | null;
blogId: string;
authorId: string;
createdAt: string;
updatedAt: string;
categories: Category[];
tags: Tag[];
}
export interface SearchResultItem {
id: string;
title: string;
subtitle: string | null;
slug: string;
coverUrl: string | null;
publishedAt: string | null;
}
export interface SearchResponse {
data: SearchResultItem[];
meta: { q: string; limit: number; offset: number; count: number };
}
// ——— Anúncios (contrato legado, sem envelope) ———
export interface AdDeliveryResult {
filled: boolean;
id?: string;
imageUrl?: string | null;
linkUrl?: string | null;
title?: string | null;
content?: string | null;
linkText?: string | null;
clickToken?: string;
}
export interface AdDeliverySlotResult extends AdDeliveryResult {
slotId: string;
format: AdFormat;
}