API de conexões privadas
Use estas rotas para consultar os recursos visíveis de uma organização, criar e remover conexões privadas entre aplicações, Jobs agendados, bancos de dados e Valkey, e salvar a posição dos cartões do mapa. O layout é independente e não altera conexões, permissões nem configurações dos recursos.
Autenticação e autorização
Estas rotas exigem uma sessão de usuário válida. Chaves de API não são aceitas e retornam 401. Selecione a organização ativa: o valor do cabeçalho x-organization-id deve corresponder ao ID da organização na rota.
Authorization: Bearer <user-token>
x-organization-id: <organization-id>
Content-Type: application/jsonPara consultar o mapa, o usuário precisa poder ver os recursos da organização. Para criar ou remover uma conexão, são necessárias duas permissões:
| Permissão | Onde |
|---|---|
project.connections.outgoing.update | Origem (aplicação ou Job agendado) |
project.connections.incoming.update | Destino (aplicação, banco de dados ou Valkey) |
O proprietário da organização tem todas as permissões. As respostas descrevem apenas recursos que o usuário pode consultar e não incluem credenciais nem detalhes de implementação.
URL base e rotas
https://api.zenifra.com/v1| Objetivo | Método e rota |
|---|---|
| Consultar recursos e conexões | GET /organizations/:id/connections |
| Criar uma conexão | PUT /organizations/:id/connections/:sourceId/:targetId |
| Remover uma conexão | DELETE /organizations/:id/connections/:sourceId/:targetId |
| Consultar o layout do mapa | GET /organizations/:id/connection-layout |
| Salvar o layout do mapa | PUT /organizations/:id/connection-layout |
Consultar o mapa
GET /v1/organizations/:id/connectionsA resposta usa o envelope { "data": ... } e contém nodes (recursos visíveis) e connections (conexões entre recursos). Origens podem ser aplicações HTTP e Jobs agendados; destinos podem ser aplicações HTTP, PostgreSQL, MariaDB, ClickHouse e Valkey. Bancos de dados e Valkey nunca são origem, e Jobs nunca são destino.
{
"data": {
"nodes": [
{
"id": "<application-id>",
"name": "Checkout API",
"kind": "application",
"status": "<resource-status>",
"eligible": true,
"sourceEligible": true,
"targetEligible": true,
"internalHostname": "checkout-api.6a11bedda78ad3108eb20e2c.zenifra.local"
},
{
"id": "<another-application-id>",
"name": "Orders worker",
"kind": "application",
"status": "<resource-status>",
"eligible": true,
"sourceEligible": true,
"targetEligible": true
},
{
"id": "<database-id>",
"name": "Orders PostgreSQL database",
"kind": "database",
"status": "<resource-status>",
"eligible": true,
"sourceEligible": false,
"targetEligible": true,
"internalHostname": "orders-db.6a11bedda78ad3108eb20e2c.zenifra.local",
"internalPort": 5432,
"internalReadHostname": "ro.orders-db.6a11bedda78ad3108eb20e2c.zenifra.local"
},
{
"id": "<job-id>",
"name": "Nightly report",
"kind": "job",
"status": "<resource-status>",
"eligible": true,
"sourceEligible": true,
"targetEligible": false
}
],
"connections": [
{
"id": "<connection-id>",
"sourceId": "<another-application-id>",
"targetId": "<application-id>",
"status": "active"
}
]
}
}Recursos (nodes)
| Campo | Descrição |
|---|---|
id, name, status | Identificação e estado atual do recurso. |
kind | Família do recurso, como application, job, database ou managed_service. |
eligible | Indica se o recurso pode participar de conexões. |
sourceEligible | Indica se o recurso pode ser origem. |
targetEligible | Indica se o recurso pode ser destino. |
reason | Motivo, quando o recurso não é elegível. |
internalHostname | Endereço interno do projeto. Aparece depois que o projeto é destino de uma conexão pela primeira vez e permanece depois. É liberado se o projeto for excluído. |
internalPort | Porta do endereço interno. Presente em destinos gerenciados (PostgreSQL 5432, MariaDB 3306, ClickHouse 9440, que também libera a porta HTTPS 8443; Valkey a porta do serviço). Em aplicações HTTP, a porta é a padrão e o campo não aparece. |
internalReadHostname | Endereço interno de leitura (ro.<projeto>.<id-da-organização>.zenifra.local). Presente apenas em bancos PostgreSQL ou MariaDB com réplicas (planos com mais de uma instância). |
Conexões (connections)
| Campo | Descrição |
|---|---|
id | Identificador da conexão. |
sourceId | Origem (quem chama): aplicação HTTP ou Job agendado. |
targetId | Destino (quem recebe): aplicação HTTP, banco de dados ou Valkey. |
status | preparing, active, removing ou failed. |
failedAction | connect ou disconnect. Presente apenas quando status é failed. |
Uma conexão failed indica que a última operação não foi concluída. Repita a mesma chamada (PUT se failedAction é connect, DELETE se é disconnect) para tentar de novo.
Criar uma conexão
PUT /v1/organizations/:id/connections/:sourceId/:targetIdA requisição não tem corpo. A conexão vale somente de sourceId para targetId; para permitir o sentido oposto, crie outra conexão. A origem chama uma aplicação de destino em http://<projeto>.<id-da-organização>.zenifra.local, em HTTP na porta padrão; essa chamada trafega só dentro da rede privada da organização, e o tráfego público continua em HTTPS. Para um banco de dados ou Valkey, a origem conecta no mesmo endereço, na porta de internalPort, com TLS sem verificação de nome (por exemplo, sslmode=require; o nome do parâmetro varia por cliente); as credenciais continuam as mesmas do banco. O endereço usa o identificador da organização (24 caracteres hexadecimais) para ser único e não muda se o projeto ou a organização forem renomeados.
| Status | Significado |
|---|---|
201 | Conexão criada. |
200 | A conexão já estava ativa. |
A resposta contém { "status": "success", "data": <conexão> }, com a conexão no mesmo formato de um item de connections.
{
"status": "success",
"data": {
"id": "<connection-id>",
"sourceId": "<another-application-id>",
"targetId": "<application-id>",
"status": "active"
}
}Uma aplicação de origem pode ser reiniciada para aplicar a mudança, e o endereço fica disponível em todas as instâncias dela depois que o reinício terminar. Um Job agendado não reinicia: a mudança vale para as próximas execuções.
Remover uma conexão
DELETE /v1/organizations/:id/connections/:sourceId/:targetIdResponde 204 e é idempotente: remover uma conexão que não existe também retorna 204. Novas conexões do par são bloqueadas na hora. Conexões já abertas não são interrompidas pelo desligamento em si, mas podem ser encerradas se uma aplicação de origem for reiniciada para aplicar a mudança.
Erros
| Status | Quando |
|---|---|
401 | Sessão ausente ou inválida. Chaves de API não são aceitas nestas rotas. |
403 | Sem permissão na origem, no destino ou para consultar a organização. |
409 | O destino ainda não está pronto, ou já existe uma operação em andamento para o par. |
422 | Origem ou destino não é elegível, por exemplo por ser um preview, um banco usado como origem, um Job usado como destino ou um recurso de outra organização. |
502 | A operação falhou. A conexão fica com status: "failed" e pode ser tentada de novo. |
Em 409 por operação em andamento ou destino ainda não pronto, aguarde e repita a chamada. Mensagens de erro são sanitizadas e não expõem detalhes de implementação.
Consultar e salvar o layout
GET /v1/organizations/:id/connection-layoutO layout é individual por usuário e organização e tem o formato abaixo:
{
"data": {
"positions": [
{ "projectId": "<resource-id>", "x": 160, "y": 80 },
{ "projectId": "<another-resource-id>", "x": 520, "y": 80 }
]
}
}Salve posições com PUT /v1/organizations/:id/connection-layout, enviando { "positions": [...] }. Cada item contém projectId, x e y. A lista pode ter até 5.000 posições; as coordenadas devem ser números finitos entre -100000 e 100000, e cada ID precisa pertencer a um recurso que o usuário pode consultar naquela organização.
Mover um cartão altera somente esse layout. Essa operação não cria nem remove conexões.
Próximos passos
- Leia o guia de conexões privadas.
- Consulte a visão geral da API.
- Revise as regras de acesso a organizações.
Última atualização em