Ir para o conteúdo

Documentação para programadores · API REST v1

Desenvolva com a Eyivo através de uma única API estruturada.

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.

URL base

https://app.eyivo.com/api/v1

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

  1. 1
    Crie 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.

  2. 2
    Liste os seus sites.

    Confirme a autenticação e obtenha o ID numérico do site usado pelos endpoints subordinados.

  3. 3
    Envie 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

  1. Crie um code_verifier de alta entropia e seu code_challenge SHA-256.
  2. Redirecione o utilizador para /oauth/authorize com response_type=code, o client_id público, o redirect_uri registado exatamente, os âmbitos solicitados em scope separados por espaços, state, code_challenge e code_challenge_method=S256.
  3. Verifique state após o redirecionamento e troque o código de autorização recebido em /oauth/token usando o code_verifier original.
  4. Guarde os tokens de acesso e renovação em segurança. Renove-os antes de expirarem e substitua atomicamente as credenciais alteradas.
Nunca exponha tokens: não coloque tokens Bearer em URLs, registos do navegador, repositórios de código, capturas de ecrã ou código do cliente que não consiga proteger segredos.

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.

ÂmbitoCapacidade REST
sites:readListe os sites próprios e consulte um site.
sites:writeCriar sites com um token válido para toda a conta.
content:readLer conteúdos, esquemas, menus, formulários e configurações.
content:writeCriar, editar, excluir e publicar explicitamente; executar ações declaradas dos painéis.
media:readGET /sites/{site}/media, GET /sites/{site}/media/stock-photos
media:writePOST /sites/{site}/media, DELETE /sites/{site}/media/{media}
domains:readListe os domínios de um site.
domains:writeSolicite, 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çãoResultado
Primeiro pedidoA 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 corpoA resposta guardada é devolvida sem repetir a operação.
Mesma chave com um pedido diferente422 — a reutilização da chave com um payload diferente é rejeitada.
Mesma chave enquanto o primeiro pedido está em curso409 — o pedido já está em curso.
Sem chaveO 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

GET/sites

Listar sites próprios · sites:read

POST/sites

Criar um site · sites:write

GET/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"
  }'
CampoRegras
display_nameTexto obrigatório, máximo de 200 caracteres.
template_keyChave obrigatória de um modelo integrado. A lista completa dos valores atuais está no OpenAPI.
native_localeCó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

GET/sites/{site}/pages

Listar páginas · content:read

POST/sites/{site}/pages

Criar um rascunho · content:write

GET/sites/{site}/pages/{page}

Consultar uma página · content:read

PATCH/sites/{site}/pages/{page}

Atualizar um rascunho · content:write

DELETE/sites/{site}/pages/{page}

Eliminar uma página · content:write

POST/sites/{site}/pages/{page}/publication

content: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."
}
CampoRegras de criação e atualização
typeUse page para conteúdo comum. Os tipos aceitos e esquemas de componentes estão nas capacidades do site.
sort_orderNúmero inteiro opcional, pode ser null, de 0 a 9999; na criação, o valor predefinido é 0.
localeCriação: obrigatório. Atualização: obrigatório ao alterar title, slug ou body.
slugCriação: obrigatório. Letras ASCII, algarismos, hífenes e sublinhados; máximo de 160 caracteres.
titleCriação: texto obrigatório; máximo de 200 caracteres.
bodyTexto que pode ser null; máximo de 50 000 caracteres.
meta_titleTexto que pode ser null; máximo de 200 caracteres.
meta_descriptionTexto 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

GET/sites/{site}/catalog-items

Listar itens · content:read

POST/sites/{site}/catalog-items

Criar um item em rascunho · content:write

GET/sites/{site}/catalog-items/{catalogItem}

Consultar um item · content:read

DELETE/sites/{site}/catalog-items/{catalogItem}

Eliminar um item · content:write

PUT/sites/{site}/catalog-items/{catalogItem}

content:write · locale, slug, title

POST/sites/{site}/catalog-items/{catalogItem}/publication

content: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."
}
CampoRegras
sort_orderNúmero inteiro opcional, pode ser null, de 0 a 9999; o valor predefinido é 0.
localeCódigo de idioma suportado obrigatório.
slugSlug ASCII obrigatório; máximo de 160 caracteres.
titleTexto obrigatório; máximo de 200 caracteres.
summaryTexto que pode ser null; máximo de 1000 caracteres.
bodyTexto 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

GET/sites/{site}/domains

Listar domínios · domains:read

POST/sites/{site}/domains

Solicitar um domínio · domains:write

POST/sites/{site}/domains/{domain}/activate

Ativar após a verificação · domains:write

POST/sites/{site}/domains/{domain}/primary

Selecionar 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

EstadoSignificadoAção recomendada
401Token Bearer ausente, inválido, expirado ou revogado.Substitua ou renove a credencial.
403Permissã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.
404O recurso não existe ou não pertence ao utilizador.Verifique os IDs e a titularidade.
409Um 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.
422Erro 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.
5xxFalha 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, 404 e 422 erros 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.