docs · api
ES
Referência

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.

successboolean
true em sucesso; false em erro.
dataT
O payload do recurso: objeto, array ou objeto composto.
metaobject
Metadados opcionais. Em listagens por page/pageSize, contém pagination (PaginationMetaCanonical).

PaginationMetaCanonical

Metadados de paginação em meta.pagination nas listagens por page/pageSize.

pageinteger
Página atual (começa em 1).
pageSizeinteger
Itens por página.
totalinteger
Total de itens na coleção.
totalPagesinteger
Número total de páginas.
hasNextPageboolean
Há próxima página?
hasPrevPageboolean
Há página anterior?

Post

Objeto principal de conteúdo. Retornado por todos os endpoints de Posts; também em listagens por categoria e tag.

idstring
Identificador único do post.
titlestring
Título do post.
subtitlestring
Subtítulo.
contentstring
Corpo em HTML ou Markdown.
slugstring
Identificador legível usado em URLs.
statusenum
Um de DRAFT, PUBLISHED, SCHEDULED. Nos endpoints públicos é sempre PUBLISHED.
publishedAtstring · date-timenullable
Data/hora de publicação (ISO 8601, UTC).
scheduledAtstring · date-timenullable
Data/hora de agendamento.
blogIdstring
ID do blog dono do post.
authorIdstring
ID do autor.
createdAtstring · date-time
Data/hora de criação.
updatedAtstring · date-time
Data/hora da última atualização.
categoriesCategory[]
Categorias associadas.
tagsTag[]
Tags associadas.

Category

Tema do blog. Retornado pelos endpoints de Categorias e aninhado em Post.categories.

idstring
Identificador único.
namestring
Nome de exibição.
descriptionstring
Descrição da categoria.
blogIdstring
ID do blog dono.
createdAtstring · date-time
Data/hora de criação.
updatedAtstring · date-time
Data/hora da última atualização.
_countobject
Contém 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.

idstring
Identificador único.
namestring
Nome da tag.
blogIdstring
ID do blog dono.
createdAtstring · date-time
Data/hora de criação.
updatedAtstring · date-time
Data/hora da última atualização.
_countobject
Contém posts (integer): nº de posts com a tag.

SearchResponse

Objeto retornado em data pela busca, com resultados e metadados próprios.

dataSearchResultItem[]
Resultados da busca.
metaobject
Metadados: q (string), limit (integer), offset (integer), count (integer).

SearchResultItem

Item enxuto de resultado de busca (subconjunto de um post).

idstring
ID do post.
titlestring
Título.
subtitlestringnullable
Subtítulo.
slugstring
Slug do post.
coverUrlstringnullable
URL da capa.
publishedAtstring · date-timenullable
Data/hora de publicação.

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.

filledboolean
Indica se há anúncio para o formato.
idstring · uuid
ID do anúncio entregue.
imageUrlstringnullable
URL da imagem.
linkUrlstringnullable
URL de destino.
titlestringnullable
Título do anúncio.
contentstringnullable
Texto do anúncio.
linkTextstringnullable
Rótulo da chamada para ação.
clickTokenstring
Token de clique (JWT, TTL 10 min).

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:

messagestring
Mensagem legível.
codestring
Código estável para tratamento programático (ex.: NOT_FOUND).
typestring
Categoria do erro (ex.: not_found, rate_limit).
statusCodeinteger
Status HTTP.
timestampstring · date-time
Momento do erro.
retryableboolean
Se vale repetir a requisição.
retryDelayintegernullable
Delay sugerido em ms (quando retryable).
detailsobjectnullable
Detalhes estruturados (ex.: fields em validação).
pathstring
Path da requisição.
requestIdstring
ID da requisição (igual ao header X-Request-Id).
docsstring
Link da documentação do erro.

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:

types.ts
// 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;
}