Docs · API v1

API pública do JSPress

Consuma o conteúdo dos seus sites de qualquer stack — Nuxt, Next, React, Vue, PHP, Python. Endpoints REST, respostas JSON, autenticação via Bearer token.

Introdução

JSPress é um CMS multi-tenant headless. Você modela conteúdo no painel (posts, produtos, imóveis, cursos — o que quiser) e consome via API REST no front que preferir. Sem plugin, sem tema, sem PHP.

Cada site tem sua própria API key com escopo isolado. Você pode ter dezenas de sites num único painel sem que um vaze conteúdo do outro.

Base URL

Todas as requisições começam com o prefixo abaixo:

https://api.jspress.app/v1

Autenticação

Todas as chamadas exigem o header Authorization com sua API key:

header
Authorization: Bearer sk_live_...

Gere sua key em Painel → Site → API keys. Chaves podem ser revogadas ou rotacionadas sem afetar as outras.

GET/v1/site

Dados do site

Retorna metadados e configurações do site autenticado.

Requisição

curl
curl https://api.jspress.app/v1/site \
  -H "Authorization: Bearer sk_live_..."

Resposta

json
{
  "name": "Meu Site",
  "description": "Blog do dev",
  "url": "https://meusite.com",
  "timezone": "America/Sao_Paulo",
  "locale": "pt-BR",
  "settings": {}
}
GET/v1/post-types

Tipos de conteúdo

Lista todos os Custom Post Types cadastrados — schema dos campos, slug, labels e taxonomias relacionadas.

Requisição

curl
curl https://api.jspress.app/v1/post-types \
  -H "Authorization: Bearer sk_live_..."

Resposta

json
{
  "data": [
    {
      "slug": "blog",
      "label": "Blog",
      "fields": ["title", "content", "featured_image"],
      "taxonomies": ["categoria", "tag"]
    }
  ]
}
GET/v1/posts

Lista de posts

Retorna posts com paginação, filtros e ordenação. Aceita filtro por tipo, taxonomia, status e busca full-text.

Parâmetros

NomeTipoDescrição
typestringSlug do post type (ex: blog).
taxonomystringSlug da taxonomia pra filtrar (usar com "term").
termstringSlug do termo dentro da taxonomia.
searchstringBusca full-text no título e no conteúdo.
pageintegerPágina (default: 1).
per_pageintegerItens por página (default: 20, max: 100).

Requisição

curl
curl "https://api.jspress.app/v1/posts?type=blog&per_page=10" \
  -H "Authorization: Bearer sk_live_..."

Resposta

json
{
  "data": [
    {
      "id": "abc123",
      "type": "blog",
      "title": "Post de exemplo",
      "slug": "post-de-exemplo",
      "content": "...",
      "published_at": "2026-07-10T14:30:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "per_page": 10,
    "total": 42,
    "total_pages": 5
  }
}
GET/v1/taxonomies

Lista de taxonomias

Retorna todas as taxonomias do site — categorias, tags ou qualquer classificação customizada.

Requisição

curl
curl https://api.jspress.app/v1/taxonomies \
  -H "Authorization: Bearer sk_live_..."

Resposta

json
{
  "data": [
    {
      "slug": "categoria",
      "label": "Categoria",
      "hierarchical": true
    }
  ]
}
GET/v1/terms

Termos de uma taxonomia

Retorna os termos dentro de uma taxonomia. Passe o slug da taxonomia como filtro.

Parâmetros

NomeTipoDescrição
taxonomystringSlug da taxonomia (obrigatório).

Requisição

curl
curl "https://api.jspress.app/v1/terms?taxonomy=categoria" \
  -H "Authorization: Bearer sk_live_..."

Resposta

json
{
  "data": [
    {
      "id": "t1",
      "slug": "marketing",
      "label": "Marketing",
      "parent": null
    }
  ]
}

Paginação

Endpoints de lista aceitam ?page e ?per_page. A resposta traz um objeto meta com total de itens e páginas.

json
{
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 132,
    "total_pages": 7
  }
}

Filtros

/v1/posts aceita filtros combinados por query string. Alguns exemplos:

# Posts do tipo blog
/v1/posts?type=blog

# Posts com termo "marketing" na taxonomia categoria
/v1/posts?taxonomy=categoria&term=marketing

# Busca full-text
/v1/posts?search=api+headless

Erros

Erros são retornados como JSON no formato abaixo, com o status HTTP correspondente.

json
{
  "error": {
    "code": "invalid_api_key",
    "message": "API key inválida ou revogada."
  }
}
StatusCódigoSignificado
401unauthorizedAPI key ausente ou inválida.
403forbiddenAPI key sem permissão pro recurso.
404not_foundRecurso não existe.
429rate_limitExcedeu o limite de requests.
500server_errorErro inesperado — reporte pra gente.