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/v1Autenticação
Todas as chamadas exigem o header Authorization com sua API key:
Authorization: Bearer sk_live_...Gere sua key em Painel → Site → API keys. Chaves podem ser revogadas ou rotacionadas sem afetar as outras.
/v1/siteDados do site
Retorna metadados e configurações do site autenticado.
Requisição
curl https://api.jspress.app/v1/site \
-H "Authorization: Bearer sk_live_..."Resposta
{
"name": "Meu Site",
"description": "Blog do dev",
"url": "https://meusite.com",
"timezone": "America/Sao_Paulo",
"locale": "pt-BR",
"settings": {}
}/v1/post-typesTipos de conteúdo
Lista todos os Custom Post Types cadastrados — schema dos campos, slug, labels e taxonomias relacionadas.
Requisição
curl https://api.jspress.app/v1/post-types \
-H "Authorization: Bearer sk_live_..."Resposta
{
"data": [
{
"slug": "blog",
"label": "Blog",
"fields": ["title", "content", "featured_image"],
"taxonomies": ["categoria", "tag"]
}
]
}/v1/postsLista de posts
Retorna posts com paginação, filtros e ordenação. Aceita filtro por tipo, taxonomia, status e busca full-text.
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
| type | string | Slug do post type (ex: blog). |
| taxonomy | string | Slug da taxonomia pra filtrar (usar com "term"). |
| term | string | Slug do termo dentro da taxonomia. |
| search | string | Busca full-text no título e no conteúdo. |
| page | integer | Página (default: 1). |
| per_page | integer | Itens por página (default: 20, max: 100). |
Requisição
curl "https://api.jspress.app/v1/posts?type=blog&per_page=10" \
-H "Authorization: Bearer sk_live_..."Resposta
{
"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
}
}/v1/taxonomiesLista de taxonomias
Retorna todas as taxonomias do site — categorias, tags ou qualquer classificação customizada.
Requisição
curl https://api.jspress.app/v1/taxonomies \
-H "Authorization: Bearer sk_live_..."Resposta
{
"data": [
{
"slug": "categoria",
"label": "Categoria",
"hierarchical": true
}
]
}/v1/termsTermos de uma taxonomia
Retorna os termos dentro de uma taxonomia. Passe o slug da taxonomia como filtro.
Parâmetros
| Nome | Tipo | Descrição |
|---|---|---|
| taxonomy | string | Slug da taxonomia (obrigatório). |
Requisição
curl "https://api.jspress.app/v1/terms?taxonomy=categoria" \
-H "Authorization: Bearer sk_live_..."Resposta
{
"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.
{
"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+headlessErros
Erros são retornados como JSON no formato abaixo, com o status HTTP correspondente.
{
"error": {
"code": "invalid_api_key",
"message": "API key inválida ou revogada."
}
}| Status | Código | Significado |
|---|---|---|
| 401 | unauthorized | API key ausente ou inválida. |
| 403 | forbidden | API key sem permissão pro recurso. |
| 404 | not_found | Recurso não existe. |
| 429 | rate_limit | Excedeu o limite de requests. |
| 500 | server_error | Erro inesperado — reporte pra gente. |