Referência da API REST
O EmDash expõe uma API REST em /_emdash/api/ para gerenciamento de conteúdo, uploads de mídia e operações de esquema.
Autenticação
Seção intitulada “Autenticação”As requisições à API exigem autenticação via token Bearer:
Authorization: Bearer <token>Gere tokens através da interface administrativa ou programaticamente.
Formato da Resposta
Seção intitulada “Formato da Resposta”Todas as respostas seguem um formato consistente:
// Success{ "success": true, "data": { ... }}
// Erro{ "success": false, "error": { "code": "ERROR_CODE", "message": "Mensagem legível", "details": { ... } }}Endpoints de Conteúdo
Seção intitulada “Endpoints de Conteúdo”Listar Conteúdo
Seção intitulada “Listar Conteúdo”GET /_emdash/api/content/:collectionParâmetros
Seção intitulada “Parâmetros”| Parâmetro | Tipo | Descrição |
|---|---|---|
collection | string | Slug da coleção (caminho) |
cursor | string | Cursor de paginação (consulta) |
limit | number | Itens por página (consulta, padrão: 50) |
status | string | Filtrar por status (consulta) |
orderBy | string | Campo para ordenar (consulta) |
order | string | Direção da ordenação: asc ou desc (consulta) |
Resposta
Seção intitulada “Resposta”{ "success": true, "data": { "items": [ { "id": "01HXK5MZSN...", "type": "posts", "slug": "hello-world", "data": { "title": "Ola mundo", ... }, "status": "published", "createdAt": "2025-01-24T12:00:00Z", "updatedAt": "2025-01-24T12:00:00Z" } ], "nextCursor": "eyJpZCI6..." }}Obter Conteúdo
Seção intitulada “Obter Conteúdo”GET /_emdash/api/content/:collection/:idResposta
Seção intitulada “Resposta”{ "success": true, "data": { "item": { "id": "01HXK5MZSN...", "type": "posts", "slug": "hello-world", "data": { "title": "Ola mundo", ... }, "status": "published", "createdAt": "2025-01-24T12:00:00Z", "updatedAt": "2025-01-24T12:00:00Z" } }}Criar Conteúdo
Seção intitulada “Criar Conteúdo”POST /_emdash/api/content/:collectionContent-Type: application/jsonCorpo da Requisição
Seção intitulada “Corpo da Requisição”{ "data": { "title": "New Post", "content": [...] }, "slug": "new-post", "status": "draft"}Resposta
Seção intitulada “Resposta”{ "success": true, "data": { "item": { ... } }}Atualizar Conteúdo
Seção intitulada “Atualizar Conteúdo”PUT /_emdash/api/content/:collection/:idContent-Type: application/jsonCorpo da Requisição
Seção intitulada “Corpo da Requisição”{ "data": { "title": "Updated Title" }, "status": "published"}Excluir Conteúdo
Seção intitulada “Excluir Conteúdo”DELETE /_emdash/api/content/:collection/:idResposta
Seção intitulada “Resposta”{ "success": true, "data": { "success": true }}Endpoints de Mídia
Seção intitulada “Endpoints de Mídia”Listar Mídia
Seção intitulada “Listar Mídia”GET /_emdash/api/mediaParâmetros
Seção intitulada “Parâmetros”| Parâmetro | Tipo | Descrição |
|---|---|---|
cursor | string | Cursor de paginação |
limit | number | Itens por página (padrão: 20) |
mimeType | string | Filtrar por prefixo de tipo MIME |
Resposta
Seção intitulada “Resposta”{ "success": true, "data": { "items": [ { "id": "01HXK5MZSN...", "filename": "photo.jpg", "mimeType": "image/jpeg", "size": 102400, "width": 1920, "height": 1080, "url": "https://cdn.example.com/photo.jpg", "createdAt": "2025-01-24T12:00:00Z" } ], "nextCursor": "eyJpZCI6..." }}Obter Mídia
Seção intitulada “Obter Mídia”GET /_emdash/api/media/:idCriar Mídia
Seção intitulada “Criar Mídia”POST /_emdash/api/mediaContent-Type: application/jsonCorpo da Requisição
Seção intitulada “Corpo da Requisição”{ "filename": "photo.jpg", "mimeType": "image/jpeg", "size": 102400, "width": 1920, "height": 1080, "storageKey": "uploads/photo.jpg"}Atualizar Mídia
Seção intitulada “Atualizar Mídia”PUT /_emdash/api/media/:idContent-Type: application/jsonCorpo da Requisição
Seção intitulada “Corpo da Requisição”{ "alt": "Photo description", "caption": "Photo caption"}Excluir Mídia
Seção intitulada “Excluir Mídia”DELETE /_emdash/api/media/:idObter Arquivo de Mídia
Seção intitulada “Obter Arquivo de Mídia”GET /_emdash/api/media/file/:keyServe o conteúdo real do arquivo. Apenas para armazenamento local.
Endpoints de Revisão
Seção intitulada “Endpoints de Revisão”Listar Revisões
Seção intitulada “Listar Revisões”GET /_emdash/api/content/:collection/:entryId/revisionsParâmetros
Seção intitulada “Parâmetros”| Parâmetro | Tipo | Descrição |
|---|---|---|
limit | number | Máximo de revisões a retornar (padrão: 50) |
Resposta
Seção intitulada “Resposta”{ "success": true, "data": { "items": [ { "id": "01HXK5MZSN...", "collection": "posts", "entryId": "01HXK5MZSN...", "data": { ... }, "createdAt": "2025-01-24T12:00:00Z" } ], "total": 5 }}Obter Revisão
Seção intitulada “Obter Revisão”GET /_emdash/api/revisions/:revisionIdRestaurar Revisão
Seção intitulada “Restaurar Revisão”POST /_emdash/api/revisions/:revisionId/restoreRestaura o conteúdo para o estado desta revisão e cria uma nova revisão.
Endpoints de Esquema
Seção intitulada “Endpoints de Esquema”Listar Coleções
Seção intitulada “Listar Coleções”GET /_emdash/api/schema/collectionsResposta
Seção intitulada “Resposta”{ "success": true, "data": { "items": [ { "id": "01HXK5MZSN...", "slug": "posts", "label": "Posts", "labelSingular": "Post", "supports": ["drafts", "revisions", "preview"] } ] }}Obter Coleção
Seção intitulada “Obter Coleção”GET /_emdash/api/schema/collections/:slugParâmetros
Seção intitulada “Parâmetros”| Parâmetro | Tipo | Descrição |
|---|---|---|
includeFields | boolean | Incluir definições de campos (consulta) |
Criar Coleção
Seção intitulada “Criar Coleção”POST /_emdash/api/schema/collectionsContent-Type: application/jsonCorpo da Requisição
Seção intitulada “Corpo da Requisição”{ "slug": "products", "label": "Products", "labelSingular": "Product", "description": "Product catalog", "supports": ["drafts", "revisions"]}Atualizar Coleção
Seção intitulada “Atualizar Coleção”PATCH /_emdash/api/schema/collections/:slugContent-Type: application/jsonExcluir Coleção
Seção intitulada “Excluir Coleção”DELETE /_emdash/api/schema/collections/:slugParâmetros
Seção intitulada “Parâmetros”| Parâmetro | Tipo | Descrição |
|---|---|---|
force | boolean | Excluir mesmo se a coleção tiver conteúdo (consulta) |
Listar Campos
Seção intitulada “Listar Campos”GET /_emdash/api/schema/collections/:slug/fieldsCriar Campo
Seção intitulada “Criar Campo”POST /_emdash/api/schema/collections/:slug/fieldsContent-Type: application/jsonCorpo da Requisição
Seção intitulada “Corpo da Requisição”{ "slug": "price", "label": "Price", "type": "number", "required": true, "validation": { "min": 0 }}Atualizar Campo
Seção intitulada “Atualizar Campo”PATCH /_emdash/api/schema/collections/:collectionSlug/fields/:fieldSlugContent-Type: application/jsonExcluir Campo
Seção intitulada “Excluir Campo”DELETE /_emdash/api/schema/collections/:collectionSlug/fields/:fieldSlugReordenar Campos
Seção intitulada “Reordenar Campos”POST /_emdash/api/schema/collections/:slug/fields/reorderContent-Type: application/jsonCorpo da Requisição
Seção intitulada “Corpo da Requisição”{ "fieldSlugs": ["title", "content", "author", "publishedAt"]}Exportação de Esquema
Seção intitulada “Exportação de Esquema”Exportar Esquema (JSON)
Seção intitulada “Exportar Esquema (JSON)”GET /_emdash/api/schemaAccept: application/jsonExportar Esquema (TypeScript)
Seção intitulada “Exportar Esquema (TypeScript)”GET /_emdash/api/schema?format=typescriptAccept: text/typescriptRetorna interfaces TypeScript para todas as coleções.
Endpoints de Plugin
Seção intitulada “Endpoints de Plugin”Listar Plugins
Seção intitulada “Listar Plugins”GET /_emdash/api/pluginsObter Plugin
Seção intitulada “Obter Plugin”GET /_emdash/api/plugins/:pluginIdHabilitar Plugin
Seção intitulada “Habilitar Plugin”POST /_emdash/api/plugins/:pluginId/enableDesabilitar Plugin
Seção intitulada “Desabilitar Plugin”POST /_emdash/api/plugins/:pluginId/disableCódigos de Erro
Seção intitulada “Códigos de Erro”| Código | Status HTTP | Descrição |
|---|---|---|
NOT_FOUND | 404 | Recurso não encontrado |
VALIDATION_ERROR | 400 | Dados de entrada inválidos |
UNAUTHORIZED | 401 | Token ausente ou inválido |
FORBIDDEN | 403 | Permissões insuficientes |
CONTENT_LIST_ERROR | 500 | Falha ao listar conteúdo |
CONTENT_CREATE_ERROR | 500 | Falha ao criar conteúdo |
CONTENT_UPDATE_ERROR | 500 | Falha ao atualizar conteúdo |
CONTENT_DELETE_ERROR | 500 | Falha ao excluir conteúdo |
MEDIA_LIST_ERROR | 500 | Falha ao listar mídia |
MEDIA_CREATE_ERROR | 500 | Falha ao criar mídia |
SCHEMA_ERROR | 400 | Operação de esquema falhou |
DUPLICATE_SLUG | 409 | Slug já existe |
RESERVED_SLUG | 400 | Slug é reservado |
Endpoints de Busca
Seção intitulada “Endpoints de Busca”Busca Global
Seção intitulada “Busca Global”GET /_emdash/api/search?q=hello+worldParâmetros
Seção intitulada “Parâmetros”| Parâmetro | Tipo | Descrição |
|---|---|---|
q | string | Consulta de busca (obrigatório) |
collections | string | Slugs de coleções separados por vírgula |
status | string | Filtrar por status (padrão: publicado) |
limit | number | Máximo de resultados (padrão: 20) |
cursor | string | Cursor de paginação |
Resposta
Seção intitulada “Resposta”{ "results": [ { "collection": "posts", "id": "01HXK5MZSN...", "slug": "hello-world", "title": "Ola mundo", "snippet": "...this is a <mark>hello</mark> <mark>world</mark> example...", "score": 0.95 } ], "nextCursor": "eyJvZmZzZXQiOjIwfQ"}Sugestões de Busca
Seção intitulada “Sugestões de Busca”GET /_emdash/api/search/suggest?q=hel&limit=5Retorna títulos com correspondência de prefixo para autocompletar.
Reconstruir Índice de Busca
Seção intitulada “Reconstruir Índice de Busca”POST /_emdash/api/search/rebuildReconstrói o índice FTS para todas ou coleções específicas.
Estatísticas de Busca
Seção intitulada “Estatísticas de Busca”GET /_emdash/api/search/statsRetorna contagens de documentos indexados por coleção.
Endpoints de Seção
Seção intitulada “Endpoints de Seção”Listar Seções
Seção intitulada “Listar Seções”GET /_emdash/api/sectionsGET /_emdash/api/sections?source=themeGET /_emdash/api/sections?search=newsletterObter Seção
Seção intitulada “Obter Seção”GET /_emdash/api/sections/:slugCriar Seção
Seção intitulada “Criar Seção”POST /_emdash/api/sectionsContent-Type: application/json
{ "slug": "my-section", "title": "My Section", "keywords": ["keyword1"], "content": [...]}Atualizar Seção
Seção intitulada “Atualizar Seção”PUT /_emdash/api/sections/:slugExcluir Seção
Seção intitulada “Excluir Seção”DELETE /_emdash/api/sections/:slugEndpoints de Configurações
Seção intitulada “Endpoints de Configurações”Obter Todas as Configurações
Seção intitulada “Obter Todas as Configurações”GET /_emdash/api/settingsAtualizar Configurações
Seção intitulada “Atualizar Configurações”POST /_emdash/api/settingsContent-Type: application/json
{ "siteTitle": "Meu site", "tagline": "Um ótimo site", "postsPerPage": 10}Endpoints de Menu
Seção intitulada “Endpoints de Menu”Listar Menus
Seção intitulada “Listar Menus”GET /_emdash/api/menusObter Menu
Seção intitulada “Obter Menu”GET /_emdash/api/menus/:nameCriar Menu
Seção intitulada “Criar Menu”POST /_emdash/api/menusContent-Type: application/json
{ "name": "footer", "label": "Footer Navigation"}Atualizar Menu
Seção intitulada “Atualizar Menu”PUT /_emdash/api/menus/:nameExcluir Menu
Seção intitulada “Excluir Menu”DELETE /_emdash/api/menus/:nameAdicionar Item de Menu
Seção intitulada “Adicionar Item de Menu”POST /_emdash/api/menus/:name/itemsContent-Type: application/json
{ "type": "page", "referenceCollection": "pages", "referenceId": "page_about", "label": "About Us"}Reordenar Itens de Menu
Seção intitulada “Reordenar Itens de Menu”POST /_emdash/api/menus/:name/reorderContent-Type: application/json
{ "items": [ { "id": "item_1", "parentId": null, "sortOrder": 0 }, { "id": "item_2", "parentId": null, "sortOrder": 1 }, { "id": "item_3", "parentId": "item_2", "sortOrder": 0 } ]}Endpoints de Taxonomia
Seção intitulada “Endpoints de Taxonomia”Listar Definições de Taxonomia
Seção intitulada “Listar Definições de Taxonomia”GET /_emdash/api/taxonomiesCriar Taxonomia
Seção intitulada “Criar Taxonomia”POST /_emdash/api/taxonomiesContent-Type: application/json
{ "name": "genre", "label": "Genres", "labelSingular": "Genre", "hierarchical": true, "collections": ["books", "movies"]}Listar Termos
Seção intitulada “Listar Termos”GET /_emdash/api/taxonomies/:name/termsCriar Termo
Seção intitulada “Criar Termo”POST /_emdash/api/taxonomies/:name/termsContent-Type: application/json
{ "slug": "tutorials", "label": "Tutoriais", "parentId": "term_abc", "description": "Guias práticos"}Atualizar Termo
Seção intitulada “Atualizar Termo”PUT /_emdash/api/taxonomies/:name/terms/:slugExcluir Termo
Seção intitulada “Excluir Termo”DELETE /_emdash/api/taxonomies/:name/terms/:slugDefinir Termos da Entrada
Seção intitulada “Definir Termos da Entrada”POST /_emdash/api/content/:collection/:id/terms/:taxonomyContent-Type: application/json
{ "termIds": ["term_news", "term_featured"]}Endpoints de Área de Widget
Seção intitulada “Endpoints de Área de Widget”Listar Áreas de Widget
Seção intitulada “Listar Áreas de Widget”GET /_emdash/api/widget-areasObter Área de Widget
Seção intitulada “Obter Área de Widget”GET /_emdash/api/widget-areas/:nameCriar Área de Widget
Seção intitulada “Criar Área de Widget”POST /_emdash/api/widget-areasContent-Type: application/json
{ "name": "sidebar", "label": "Barra lateral principal", "description": "Aparece nos posts"}Excluir Área de Widget
Seção intitulada “Excluir Área de Widget”DELETE /_emdash/api/widget-areas/:nameAdicionar Widget
Seção intitulada “Adicionar Widget”POST /_emdash/api/widget-areas/:name/widgetsContent-Type: application/json
{ "type": "content", "title": "Sobre", "content": [...]}Atualizar Widget
Seção intitulada “Atualizar Widget”PUT /_emdash/api/widget-areas/:name/widgets/:idExcluir Widget
Seção intitulada “Excluir Widget”DELETE /_emdash/api/widget-areas/:name/widgets/:idReordenar Widgets
Seção intitulada “Reordenar Widgets”POST /_emdash/api/widget-areas/:name/reorderContent-Type: application/json
{ "widgetIds": ["widget_1", "widget_2", "widget_3"]}Endpoints de Gerenciamento de Usuários
Seção intitulada “Endpoints de Gerenciamento de Usuários”Listar Usuários
Seção intitulada “Listar Usuários”GET /_emdash/api/admin/usersGET /_emdash/api/admin/users?role=40GET /_emdash/api/admin/users?search=johnObter Usuário
Seção intitulada “Obter Usuário”GET /_emdash/api/admin/users/:idAtualizar Usuário
Seção intitulada “Atualizar Usuário”PATCH /_emdash/api/admin/users/:idContent-Type: application/json
{ "name": "John Doe", "role": 40}Habilitar Usuário
Seção intitulada “Habilitar Usuário”POST /_emdash/api/admin/users/:id/enableDesabilitar Usuário
Seção intitulada “Desabilitar Usuário”POST /_emdash/api/admin/users/:id/disableEndpoints de Autenticação
Seção intitulada “Endpoints de Autenticação”Status de Configuração
Seção intitulada “Status de Configuração”GET /_emdash/api/setup/statusRetorna se a configuração está completa e se existem usuários.
Login com Chave de Acesso
Seção intitulada “Login com Chave de Acesso”POST /_emdash/api/auth/passkey/optionsObter opções de autenticação WebAuthn.
POST /_emdash/api/auth/passkey/verifyContent-Type: application/json
{ "id": "credential-id", "rawId": "...", "response": {...}, "type": "public-key"}Verificar chave de acesso e criar sessão.
Link Mágico
Seção intitulada “Link Mágico”POST /_emdash/api/auth/magic-link/sendContent-Type: application/json
{ "email": "user@example.com"}GET /_emdash/api/auth/magic-link/verify?token=xxxPOST /_emdash/api/auth/logoutUsuário Atual
Seção intitulada “Usuário Atual”GET /_emdash/api/auth/meConvidar Usuário
Seção intitulada “Convidar Usuário”POST /_emdash/api/auth/inviteContent-Type: application/json
{ "email": "newuser@example.com", "role": 30}Gerenciamento de Chaves de Acesso
Seção intitulada “Gerenciamento de Chaves de Acesso”GET /_emdash/api/auth/passkeyListar chaves de acesso do usuário.
POST /_emdash/api/auth/passkey/register/optionsPOST /_emdash/api/auth/passkey/register/verifyRegistrar nova chave de acesso.
PATCH /_emdash/api/auth/passkey/:idContent-Type: application/json
{ "name": "MacBook Pro"}Renomear chave de acesso.
DELETE /_emdash/api/auth/passkey/:idExcluir chave de acesso.
Endpoints de Importação
Seção intitulada “Endpoints de Importação”Analisar Exportação WordPress
Seção intitulada “Analisar Exportação WordPress”POST /_emdash/api/import/wordpress/analyzeContent-Type: multipart/form-data
arquivo: <arquivo WXR>Executar Importação WordPress
Seção intitulada “Executar Importação WordPress”POST /_emdash/api/import/wordpress/executeContent-Type: application/json
{ "analysisId": "...", "options": { "includeMedia": true, "includeTaxonomies": true, "includeMenus": true }}Limitação de Taxa
Seção intitulada “Limitação de Taxa”Os endpoints da API podem ter limitação de taxa com base na configuração de implantação. Quando limitados, as respostas incluem:
HTTP/1.1 429 Too Many RequestsRetry-After: 60A API suporta CORS para requisições de navegador. Configure origens permitidas na sua implantação.