1. Visão geral
A API REST da Eyivo permite controlar programaticamente sites estruturados. Usa HTTPS e JSON, tem versões em /api/v1 e aplica as mesmas regras de titularidade, limites do plano, validação e auditoria do painel.
JSON e multipart
Accept: application/json. Content-Type: application/json; file: multipart/form-data.
Pertencentes ao utilizador
Cada operação de site é limitada aos sites pertencentes ao utilizador autenticado.
Rascunho primeiro
Salve um rascunho, confira se está pronto e publique o item no idioma desejado quando o usuário quiser torná-lo público. Outros rascunhos não são publicados.
Versionamento: mudanças incompatíveis no contrato exigem uma nova versão base. Objetos JSON existentes podem ganhar campos adicionais; os clientes devem ignorar campos que não reconheçam.
2. Início rápido
- 1Crie um token.
Inicie sessão na aplicação, abra Tokens de API, escolha apenas os âmbitos necessários e copie o
ey_segredo quando for apresentado. - 2Liste os seus sites.
Confirme a autenticação e obtenha o ID numérico do site usado pelos endpoints subordinados.
- 3Envie pedidos de escrita idempotentes.
Atribua a cada pedido POST, PATCH e DELETE uma
Idempotency-Key.
curl --request GET \
--url https://app.eyivo.com/api/v1/sites \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token'
Uma resposta bem-sucedida de uma coleção inclui os registos em data:
{
"data": [
{
"id": 42,
"platform_subdomain_key": "7kr9mp2x",
"template_key": "corporate-01",
"status": "active",
"native_locale": "en",
"english_enabled": false,
"content_version": 1,
"search_visibility": "platform_noindex"
}
]
}
3. Autenticação
Cada pedido a /api/v1 exige um token Bearer:
Authorization: Bearer <token>
Tokens de API pessoais
Ideais para scripts, integrações entre servidores e automatização direta da conta. Os tokens começam por ey_, são guardados como hash e aparecem apenas uma vez.
- Crie-os e revogue-os em https://app.eyivo.com/tokens.
- Escolha um ou mais âmbitos.
- Se quiser, restrinja o token a um site da sua titularidade.
- Tokens não expirados continuam válidos até serem revogados.
OAuth 2.0 + PKCE
Ideal para aplicações que atuam em nome dos utilizadores Eyivo. Use Authorization Code com PKCE; não use os fluxos password ou implicit.
- Autorização:
https://app.eyivo.com/oauth/authorize - Token e renovação:
https://app.eyivo.com/oauth/token - Os tokens de acesso expiram após 2 horas.
- Os tokens de atualização expiram após 1 ano.
Fluxo de autorização PKCE
- Crie um
code_verifierde alta entropia e seucode_challengeSHA-256. - Redirecione o utilizador para
/oauth/authorizecomresponse_type=code, oclient_idpúblico, oredirect_uriregistado exatamente, os âmbitos solicitados emscopeseparados por espaços,state,code_challengeecode_challenge_method=S256. - Verifique
stateapós o redirecionamento e troque o código de autorização recebido em/oauth/tokenusando ocode_verifieroriginal. - Guarde os tokens de acesso e renovação em segurança. Renove-os antes de expirarem e substitua atomicamente as credenciais alteradas.
4. Âmbitos
Os pedidos exigem o âmbito exato indicado abaixo. Um token pessoal com * passa todas as verificações de âmbito; as aplicações devem ainda assim solicitar apenas os âmbitos necessários.
| Âmbito | Capacidade REST |
|---|---|
sites:read | Liste os sites próprios e consulte um site. |
sites:write | Criar sites com um token válido para toda a conta. |
content:read | Ler conteúdos, esquemas, menus, formulários e configurações. |
content:write | Criar, editar, excluir e publicar explicitamente; executar ações declaradas dos painéis. |
media:read | GET /sites/{site}/media, GET /sites/{site}/media/stock-photos |
media:write | POST /sites/{site}/media, DELETE /sites/{site}/media/{media} |
domains:read | Liste os domínios de um site. |
domains:write | Solicite, ative e selecione domínios personalizados. |
REST exige a permissão do endpoint, não mcp:use. Mídia usa media:read ou media:write.
5. Operações de escrita idempotentes
Envie Idempotency-Key nas alterações JSON para repetir a mesma solicitação com segurança. Uploads multipart e emissão de tickets ficam de fora; confira o resultado antes de tentar novamente.
Idempotency-Key: site-42-page-create-01J7M6Y8RRF3ZE6WB4Z0Y9XJXC
| Situação | Resultado |
|---|---|
| Primeiro pedido | A operação é executada e o seu código de estado e corpo JSON são guardados. |
| Mesma chave, método, caminho, parâmetros de consulta e corpo | A resposta guardada é devolvida sem repetir a operação. |
| Mesma chave com um pedido diferente | 422 — a reutilização da chave com um payload diferente é rejeitada. |
| Mesma chave enquanto o primeiro pedido está em curso | 409 — o pedido já está em curso. |
| Sem chave | O pedido é executado, mas não pode ser repetido com segurança. |
Para corresponderem, os pedidos têm de ter o mesmo método HTTP, caminho e corpo original. Ao tentar novamente, reutilize o JSON serializado original.
6. Respostas e estrutura dos recursos
Operações de conteúdo retornam um envelope data. MCP fornece structuredContent e uma cópia JSON em texto; REST retorna JSON. Consulte os esquemas para IDs, prontidão e paginação. Siga as informações de página de blogs, mídia e envios.
Recurso individual
{ "data": { "id": 42, "status": "active" } }Coleção
{ "data": [{ "id": 42 }, { "id": 43 }] }Os formatos das coleções variam. Siga a paginação documentada de cada endpoint; nem todos os resultados são listas simples ou sem paginação.
7. Sites
/sitesListar sites próprios · sites:read
/sitesCriar um site · sites:write
/sites/{site}Consultar um site próprio · sites:read
Criar um site
curl --request POST \
--url https://app.eyivo.com/api/v1/sites \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: site-create-01J7M6Y8' \
--data '{
"display_name": "Northstar Studio",
"template_key": "corporate-01",
"native_locale": "en"
}'
| Campo | Regras |
|---|---|
display_name | Texto obrigatório, máximo de 200 caracteres. |
template_key | Chave obrigatória de um modelo integrado. A lista completa dos valores atuais está no OpenAPI. |
native_locale | Código de idioma suportado obrigatório. |
Resposta: 201 Created com um recurso de site. Durante a preparação, o estado pode não estar ativo inicialmente. Os limites de sites e do plano devolvem 422.
Campos do recurso de site: id, platform_subdomain_key, template_key, status, native_locale, english_enabled, content_version, search_visibility, runtime opcional e datas de criação e atualização.
8. Páginas
/sites/{site}/pagesListar páginas · content:read
/sites/{site}/pagesCriar um rascunho · content:write
/sites/{site}/pages/{page}Consultar uma página · content:read
/sites/{site}/pages/{page}Atualizar um rascunho · content:write
/sites/{site}/pages/{page}Eliminar uma página · content:write
/sites/{site}/pages/{page}/publicationcontent:write · locale
Criar uma página
{
"type": "page",
"sort_order": 300,
"locale": "en",
"slug": "our-story",
"title": "Our story",
"body": "<p>How the company began.</p>",
"meta_title": "Our story | Northstar Studio",
"meta_description": "Learn about Northstar Studio."
}
| Campo | Regras de criação e atualização |
|---|---|
type | Use page para conteúdo comum. Os tipos aceitos e esquemas de componentes estão nas capacidades do site. |
sort_order | Número inteiro opcional, pode ser null, de 0 a 9999; na criação, o valor predefinido é 0. |
locale | Criação: obrigatório. Atualização: obrigatório ao alterar title, slug ou body. |
slug | Criação: obrigatório. Letras ASCII, algarismos, hífenes e sublinhados; máximo de 160 caracteres. |
title | Criação: texto obrigatório; máximo de 200 caracteres. |
body | Texto que pode ser null; máximo de 50 000 caracteres. |
meta_title | Texto que pode ser null; máximo de 200 caracteres. |
meta_description | Texto que pode ser null; máximo de 500 caracteres. |
Resposta à criação: 201. Resposta à atualização: 200. Resposta à eliminação: 204 sem corpo.
Salve um rascunho, confira se está pronto e publique o item no idioma desejado quando o usuário quiser torná-lo público. Outros rascunhos não são publicados.
9. Itens do catálogo
/sites/{site}/catalog-itemsListar itens · content:read
/sites/{site}/catalog-itemsCriar um item em rascunho · content:write
/sites/{site}/catalog-items/{catalogItem}Consultar um item · content:read
/sites/{site}/catalog-items/{catalogItem}Eliminar um item · content:write
/sites/{site}/catalog-items/{catalogItem}content:write · locale, slug, title
/sites/{site}/catalog-items/{catalogItem}/publicationcontent:write · locale
Criar um item do catálogo
{
"sort_order": 100,
"locale": "en",
"slug": "strategy-advisory",
"title": "Strategy advisory",
"summary": "Focused advice for consequential decisions.",
"body": "Talk to our senior advisory team."
}
| Campo | Regras |
|---|---|
sort_order | Número inteiro opcional, pode ser null, de 0 a 9999; o valor predefinido é 0. |
locale | Código de idioma suportado obrigatório. |
slug | Slug ASCII obrigatório; máximo de 160 caracteres. |
title | Texto obrigatório; máximo de 200 caracteres. |
summary | Texto que pode ser null; máximo de 1000 caracteres. |
body | Texto que pode ser null; máximo de 50 000 caracteres. |
Salve um rascunho, confira se está pronto e publique o item no idioma desejado quando o usuário quiser torná-lo público. Outros rascunhos não são publicados.
Estes são exemplos por família de conteúdo. Descubra todos os esquemas e permissões em tools/list ou OpenAPI. Os caminhos REST são relativos a /api/v1/sites/{site}.
Descoberta de sites e capacidades
GET /capabilities · GET /readiness
Páginas, componentes e links internos
/pages · /pages/{page_id}/components · POST /pages/{page_id}/publication
Produtos, galerias e vídeos
/catalog-items · /galleries · /videos · POST /{collection}/{id}/publication
Rascunhos de blog, categorias e agendamento
/blog/posts · /blog/categories · /blog/links · /blog/posts/{post_id}/publication · /blog/posts/{post_id}/schedule
Navegação principal e menus adicionais
/menus · /menus/destinations · /menu-assignments/{type}/{target_id} · /menus/{menu_key}/publication
Biblioteca de mídia e fotos de banco
/media · /media/transfers · /media/stock-photos
Formulários, envios e painéis dos plugins
/forms · /submissions · /plugins · /plugins/panel · /plugins/panel/actions
Empresa, tema, idiomas e integrações
/company · /theme · /theme/settings · /locales · /integrations · /demo · /demo/drafts · /cache/reset
Capacidades e contrato de edição
Selecione um site e leia suas capacidades: idiomas ativos, campos do tema, esquemas dos componentes, menus e painéis dos plugins. Leia o recurso content-workflow antes de escrever. Sem recursos, use get-site-capabilities-tool. Siga nextCursor de tools/list até concluir a descoberta.
GET /api/v1/sites/{site}/capabilities
GET /api/v1/sites/{site}/pages/{page_id}/components/schema?locale=en
Use o idioma solicitado e a version ou revision atual. Salvar um blog substitui o documento completo e cancela o agendamento. Menus usam revision numérica; atribuições usam um hash menu_revision separado. Preserve os itens das listas substituídas. Em conflitos, releia e combine as alterações.
A navegação principal continua automática. Menus adicionais têm seus próprios rascunhos e publicação. Salvar conteúdo prepara suas atribuições; publicar o item aplica essas atribuições sem publicar outros menus. Publicar um menu nunca publica o conteúdo vinculado. source_hash rejeita traduções baseadas em texto de origem desatualizado.
O corpo das páginas e os campos richtext aceitam HTML sanitizado. Use list-page-links-tool para links estáveis /__eyivo/pages/{id}, resolvidos no idioma do visitante após a publicação. Blogs usam document JSON estruturado com media_id do mesmo site e destinos de página/post, não body_html.
{
"type": "doc",
"content": [{
"type": "paragraph",
"content": [{ "type": "text", "text": "Our story" }]
}]
}
Envio de imagens e vídeos
upload-media-tool abre um seletor de arquivos em clientes MCP Apps como Claude. ChatGPT também pode fornecer sua referência de anexo; um anexo Claude não é uma referência OpenAI. Não invente URLs nem envie arquivos base64 como argumentos.
Codex e Claude Code podem chamar prepare-media-upload-tool e enviar o arquivo multipart para upload_url com o upload_token de uso único em até cinco minutos. Mantenha o token em segredo. Clientes REST podem usar seu próprio bearer media:write. Só o envio concluído retorna o ID da mídia; emitir um ticket não envia arquivos.
POST /api/v1/sites/{site}/media
Authorization: Bearer <media:write token>
Content-Type: multipart/form-data; boundary=<generated by HTTP client>
file: <original file bytes>
10. Domínios personalizados
/sites/{site}/domainsListar domínios · domains:read
/sites/{site}/domainsSolicitar um domínio · domains:write
/sites/{site}/domains/{domain}/activateAtivar após a verificação · domains:write
/sites/{site}/domains/{domain}/primarySelecionar o nome de host principal · domains:write
Solicitar um domínio
curl --request POST \
--url https://app.eyivo.com/api/v1/sites/42/domains \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: domain-request-example-com' \
--data '{"domain":"www.example.com"}'
Um recurso de domínio pendente inclui verification_token. Adicione o registo DNS necessário para comprovar a titularidade com o valor devolvido para o seu domínio, aguarde a propagação do DNS e chame o endpoint de ativação. Depois de ativo, chame o endpoint do domínio principal se quiser que se torne o nome de host público canónico.
Campos do recurso de domínio: id, domain, site_id, is_primary, status, verification_token quando aplicável e datas de criação e atualização. Os limites do plano para domínios personalizados e os erros de validação do domínio devolvem 422.
11. Erros
| Estado | Significado | Ação recomendada |
|---|---|---|
401 | Token Bearer ausente, inválido, expirado ou revogado. | Substitua ou renove a credencial. |
403 | Permissão ausente, restrição de site ou tentativa de alteração por alguém que não é o proprietário. | Use um âmbito e site autorizados; não repita o mesmo pedido. |
404 | O recurso não existe ou não pertence ao utilizador. | Verifique os IDs e a titularidade. |
409 | Um conflito de versão exige nova leitura e combinação das alterações. Não reenvie os mesmos dados desatualizados. | Leia o rascunho no idioma escolhido e sua revisão atual antes de editar. |
422 | Erro de validação, limite do plano, regra de domínio ou divergência de idempotência. | Leia errors ou message, corrija o pedido e use uma nova chave se alterar o respetivo corpo. |
5xx | Falha inesperada da plataforma ou de um serviço externo. | Repita as leituras seguras; repita as escritas apenas com a mesma chave de idempotência. |
Resposta de validação
{
"message": "The title field is required.",
"errors": {
"title": ["The title field is required."]
}
}
Resposta de autenticação ou autorização
{
"message": "Missing required scope [content:write]."
}
12. Limites atuais e lista de verificação para integrações
REST v1 disponibiliza intencionalmente um subconjunto definido de funcionalidades da Eyivo. A ausência de um endpoint é um limite da interface pública, não uma autorização para chamar APIs internas.
Disponível
- Listar, consultar e criar sites
- Páginas, componentes e links internos
- Gerencie páginas, componentes, blogs, produtos, galerias, vídeos, menus, mídia, formulários e configurações do site com ferramentas e endpoints REST protegidos por permissões.
- Listar, solicitar e ativar domínios e selecionar o domínio principal
Não disponível em REST v1
- Alterações de cobrança e assinaturas
- Senhas e gerenciamento de tokens
- Acesso direto ao armazenamento e APIs internas
- Instalação ou execução arbitrária de código do tema
Antes de entrar em produção
- Use HTTPS e confirme que o host esperado é
app.eyivo.com. - Mantenha os tokens Bearer no servidor e oculte os cabeçalhos de autorização nos registos.
- Solicite apenas os âmbitos necessários e, quando possível, prefira tokens pessoais restritos a um site.
- Use uma chave de idempotência única para cada operação lógica de escrita e mantenha-a nas tentativas seguintes.
- Considere
401,403,404e422erros não transitórios, exceto se o pedido ou a credencial mudar. - Para falhas transitórias, use uma espera exponencial com variação aleatória e respeite qualquer futuro cabeçalho
Retry-After. - Os formatos das coleções variam. Siga a paginação documentada de cada endpoint; nem todos os resultados são listas simples ou sem paginação.