# EA-G-OP-SO-AC - Catálogo de APIs ESGFarmGuard

<table id="bkmrk-cat%C3%A1logo-de-apis-agr" style="border-collapse: collapse; width: 100%; border-width: 1px; border-style: double;"><colgroup><col></col><col></col><col></col><col></col></colgroup><tbody><tr><td colspan="8" rowspan="2">[![image.jpeg](https://docs.eaware.io/uploads/images/gallery/2025-07/scaled-1680-/4EExK1Ige2FmsRLD-image.jpeg)](https://docs.eaware.io/uploads/images/gallery/2025-07/4EExK1Ige2FmsRLD-image.jpeg)

</td></tr><tr><td class="align-center" colspan="8">##### <span style="color: rgb(0, 0, 0);">Catálogo de APIs ESGFarmGuard</span>

</td></tr><tr style="height: 10px;"><td class="align-left" colspan="2">**Código do Documento:**

</td><td colspan="2"><span style="color: rgb(0, 0, 0);">EA-G-OP-SO-AC</span>

</td><td colspan="2">**Versão:**

</td><td colspan="2"><span style="color: rgb(0, 0, 0);">1.0</span>

</td></tr><tr><td colspan="2">**Elaborado Por:**

</td><td colspan="2"><span style="color: rgb(0, 0, 0);">Rafael Quadros</span>

</td><td colspan="2">**Data de Revisão:**

</td><td colspan="2"><span style="color: rgb(0, 0, 0);">14/04/2026</span>

</td></tr><tr><td colspan="2">**Aprovado Por:**

</td><td colspan="2"></td><td colspan="2">**Status:**

</td><td colspan="2"><span style="color: rgb(0, 0, 0);">Ativo</span>

</td></tr></tbody></table>

## 1. Visão Geral

<span style="white-space: pre-wrap;">Esta documentação descreve as rotas públicas de integração do </span>**ESG Farm Guard**<span style="white-space: pre-wrap;"> para consumo por clientes externos. O foco é exclusivamente operacional: autenticação, headers, erros, endpoints disponíveis e exemplos mínimos de uso.</span>

<span style="white-space: pre-wrap;">Escopo restrito ao data plane com prefixo </span>`<span class="editor-theme-code">/v1/</span>`.

## 2. Base URL e Escopo

- **Prefixo das rotas:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">/v1/</span>`
- **Ambientes suportados:**<span style="white-space: pre-wrap;"> produção em subdomínio dedicado e sandbox</span>
- **Consumidor:**<span style="white-space: pre-wrap;"> cliente externo autenticado por token de integração</span>

## 3. Autenticação

Todas as rotas protegidas exigem um token de integração ativo. O cliente pode autenticar a requisição usando um dos headers abaixo:

<table id="bkmrk-headerformatousox-in"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>Header

</th><th>Formato

</th><th>Uso

</th></tr><tr><td>`<span class="editor-theme-code">X-Integration-Key</span>`

</td><td>`<span class="editor-theme-code"><prefix.secret></span>`

</td><td>Forma preferencial para integração

</td></tr><tr><td>`<span class="editor-theme-code">Authorization</span>`

</td><td>`<span class="editor-theme-code">Bearer <prefix.secret></span>`

</td><td>Alternativa compatível

</td></tr></tbody></table>

**Regras essenciais:**

- o token de integração é obrigatório nas rotas protegidas
- <span style="white-space: pre-wrap;">a empresa pode manter até </span>`<span class="editor-theme-code">3</span>`<span style="white-space: pre-wrap;"> tokens ativos em paralelo</span>
- cada requisição utiliza apenas um token

### 3.1 Produção

Em produção, o cliente consome o subdomínio dedicado da integração usando somente o token ativo.

### 3.2 Sandbox

Em sandbox ou acesso direto à API, o comportamento é o mesmo: o cliente deve enviar um dos tokens ativos liberados para a empresa.

## 4. Header de Resposta

Chamadas autenticadas retornam o header abaixo para rastreabilidade:

- `<span class="editor-theme-code">X-Integration-Request-Id</span>`<span style="white-space: pre-wrap;"> - identificador único da requisição para correlação com logs</span>

## 5. Contrato de Erros

<table id="bkmrk-statusdescri%C3%A7%C3%A3o400pa"><colgroup><col></col><col></col></colgroup><tbody><tr><th>Status

</th><th>Descrição

</th></tr><tr><td>`<span class="editor-theme-code">400</span>`

</td><td>Payload inválido ou parâmetros inconsistentes

</td></tr><tr><td>`<span class="editor-theme-code">401</span>`

</td><td>Token ausente, inválido, expirado ou inativo

</td></tr><tr><td>`<span class="editor-theme-code">403</span>`

</td><td>Cliente inativo, assinatura ausente/inativa ou escopo não permitido

</td></tr><tr><td>`<span class="editor-theme-code">404</span>`

</td><td>Entidade inexistente ou fora do tenant autenticado

</td></tr><tr><td>`<span class="editor-theme-code">429</span>`

</td><td>Rate limit ou quota excedida

</td></tr></tbody></table>

<span style="white-space: pre-wrap;">Com o modo MVP ativo, erros </span>`<span class="editor-theme-code">403</span>`<span style="white-space: pre-wrap;"> por escopo/assinatura e </span>`<span class="editor-theme-code">429</span>`<span style="white-space: pre-wrap;"> por limites podem deixar de ocorrer nas rotas liberadas.</span>

## 7. Endpoints

**Observações importantes:**

- <span style="white-space: pre-wrap;">o data plane agora expõe também as rotas </span>`<span class="editor-theme-code">/groups/</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">/users/</span>`<span style="white-space: pre-wrap;"> e </span>`<span class="editor-theme-code">/tags/</span>`
- <span style="white-space: pre-wrap;">a rota </span>`<span class="editor-theme-code">/tags/</span>`<span style="white-space: pre-wrap;"> retorna apenas tags do tipo </span>`<span class="editor-theme-code">standards</span>`
- <span style="white-space: pre-wrap;">as rotas </span>`<span class="editor-theme-code">/groups/</span>`<span style="white-space: pre-wrap;"> e </span>`<span class="editor-theme-code">/users/</span>`<span style="white-space: pre-wrap;"> retornam apenas registros do tenant autenticado</span>
- <span style="white-space: pre-wrap;">o filtro de tenant continua aplicado pelo </span>`<span class="editor-theme-code">customer_id</span>`<span style="white-space: pre-wrap;"> do client autenticado</span>

GET /v1/health/

- **Autenticação:**<span style="white-space: pre-wrap;"> não exige token</span>
- **Objetivo:**<span style="white-space: pre-wrap;"> validar disponibilidade básica do namespace público</span>

#### Resposta

```
{
  "status": "ok",
  "domain": "integration-public"
}
```

GET /v1/auth-context/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">integration.auth_context.read</span>`
- **Objetivo:**<span style="white-space: pre-wrap;"> validar rapidamente se a chave está funcional e qual contexto foi resolvido</span>

#### Resposta

```
{
  "status": "ok",
  "client_id": "00000000-0000-0000-0000-000000000001",
  "customer_id": "customer-123",
  "api_key_id": "00000000-0000-0000-0000-000000000010",
  "api_key_prefix": "esg_abc123",
  "environment": "sandbox",
  "scope_code": "integration.auth_context.read",
  "endpoint_code": "auth-context-v1"
}
```

GET /v1/properties/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">properties.read</span>`
- **Query params:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">search</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page_size</span>`
- **Campos pesquisáveis em search:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">name</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">external_property_id</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">producer.name</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">city.name</span>`
- **Regra:**<span style="white-space: pre-wrap;"> retorna apenas propriedades do </span>`<span class="editor-theme-code">customer_id</span>`<span style="white-space: pre-wrap;"> autenticado, ignorando registros removidos logicamente</span>

#### Exemplo de requisição

```
GET /v1/properties/?search=Farm&page=1&page_size=50
X-Integration-Key: esg_abc123.secret-value
```

GET /v1/properties/{id}/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">properties.read</span>`
- **Regra:**<span style="white-space: pre-wrap;"> retorna </span>`<span class="editor-theme-code">404</span>`<span style="white-space: pre-wrap;"> se a propriedade não existir ou estiver fora do tenant autenticado</span>

GET /v1/consultants/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">consultants.read</span>`
- **Query params:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">search</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page_size</span>`
- **Campos pesquisáveis em search:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">name</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">email</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">cpf</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">external_consultant_id</span>`
- **Regra:**<span style="white-space: pre-wrap;"> retorna apenas consultores do tenant autenticado</span>

GET /v1/consultants/{id}/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">consultants.read</span>`

GET /v1/producers/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">producers.read</span>`
- **Query params:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">search</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page_size</span>`
- **Campos pesquisáveis em search:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">name</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">email</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">cpf</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">cnpj</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">external_producer_id</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">city.name</span>`
- **Regra:**<span style="white-space: pre-wrap;"> retorna apenas produtores do tenant autenticado</span>

GET /v1/producers/{id}/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">producers.read</span>`

GET /v1/groups/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">groups.read</span>`
- **Query params:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">search</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page_size</span>`
- **Campos pesquisáveis em search:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">name</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">description</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">external_sector_id</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">region.name</span>`
- **Regra:**<span style="white-space: pre-wrap;"> retorna apenas grupos do </span>`<span class="editor-theme-code">customer_id</span>`<span style="white-space: pre-wrap;"> autenticado</span>

GET /v1/users/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">users.read</span>`
- **Query params:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">search</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page_size</span>`
- **Campos pesquisáveis em search:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">name</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">email</span>`
- **Regra:**<span style="white-space: pre-wrap;"> retorna apenas usuários vinculados ao tenant autenticado</span>
- **Uso recomendado:**<span style="white-space: pre-wrap;"> utilize esta rota para localizar o </span>`<span class="editor-theme-code">id</span>`<span style="white-space: pre-wrap;"> do usuário antes de enviar notificações administrativas segmentadas por </span>`<span class="editor-theme-code">user_ids</span>`

GET /v1/tags/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">tags.read</span>`
- **Query params:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">search</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">page_size</span>`
- **Campos pesquisáveis em search:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">name</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">description</span>`
- **Regra:**<span style="white-space: pre-wrap;"> retorna apenas tags do tipo </span>`<span class="editor-theme-code">standards</span>`<span style="white-space: pre-wrap;">, do tenant autenticado, excluindo tags </span>`<span class="editor-theme-code">system</span>`<span style="white-space: pre-wrap;"> e </span>`<span class="editor-theme-code">personalized</span>`

#### Exemplo de requisição

```
GET /v1/tags/?search=Compliance&page=1&page_size=50
X-Integration-Key: esg_abc123.secret-value
```

POST /v1/properties/tags/attach/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">properties.tags.write</span>`
- **Objetivo:**<span style="white-space: pre-wrap;"> vincular tags a propriedades por ID interno ou ID externo</span>

#### Payload mínimo

```
{
  "tag_ids": ["00000000-0000-0000-0000-000000000003"],
  "property_external_ids": ["PROP-001"],
  "observation": "integration update"
}
```

#### Regras

- `<span class="editor-theme-code">tag_ids</span>`<span style="white-space: pre-wrap;"> é obrigatório</span>
- <span style="white-space: pre-wrap;">deve existir ao menos um entre </span>`<span class="editor-theme-code">property_ids</span>`<span style="white-space: pre-wrap;"> ou </span>`<span class="editor-theme-code">property_external_ids</span>`
- ids duplicados são normalizados
- a operação é idempotente
- respeita o tenant autenticado

POST /v1/properties/tags/detach/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">properties.tags.write</span>`
- **Objetivo:**<span style="white-space: pre-wrap;"> remover vínculo</span>

#### Payload mínimo

```
{
  "tag_ids": ["00000000-0000-0000-0000-000000000003"],
  "producer_external_ids": ["PROD-001"],
  "observation": "producer update",
  "value": "vip"
}
```

POST /v1/producers/tags/detach/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">producers.tags.write</span>`
- **Objetivo:**<span style="white-space: pre-wrap;"> remover vínculo de tags em produtores</span>

POST /v1/admin-notifications/

- **Autenticação:**<span style="white-space: pre-wrap;"> obrigatória</span>
- **Scope:**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">admin.notifications.write</span>`
- **Objetivo:**<span style="white-space: pre-wrap;"> criar notificações administrativas segmentadas</span>

#### Quando usar

<span style="white-space: pre-wrap;">Use esta rota para enviar notificações a usuários ou segmentos específicos. Quando a segmentação exigir </span>`<span class="editor-theme-code">user_ids</span>`<span style="white-space: pre-wrap;">, consulte primeiro </span>`<span class="editor-theme-code">GET /v1/users/</span>`<span style="white-space: pre-wrap;"> para localizar o identificador correto do usuário. O parâmetro </span>`<span class="editor-theme-code">search</span>`<span style="white-space: pre-wrap;"> dessa rota permite busca por </span>`<span class="editor-theme-code">name</span>`<span style="white-space: pre-wrap;"> e </span>`<span class="editor-theme-code">email</span>`.

#### Payload mínimo

```
{
  "title": "Maintenance Window",
  "message": "Window tonight",
  "segment_spec": {
    "user_ids": ["user-1"],
    "group_ids": [],
    "subgroup_ids": [],
    "region_ids": []
  }
}
```

#### Regras

- `<span class="editor-theme-code">title</span>`<span style="white-space: pre-wrap;"> é obrigatório</span>
- `<span class="editor-theme-code">segment_spec</span>`<span style="white-space: pre-wrap;"> é obrigatório</span>
- <span style="white-space: pre-wrap;">as chaves aceitas são </span>`<span class="editor-theme-code">user_ids</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">group_ids</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">subgroup_ids</span>`<span style="white-space: pre-wrap;"> e </span>`<span class="editor-theme-code">region_ids</span>`
- cada chave deve conter lista de strings não vazias

## 8. Fluxo Recomendado de Consumo

1. <span style="white-space: pre-wrap;">validar disponibilidade com </span>`<span class="editor-theme-code">GET /health/</span>`
2. <span style="white-space: pre-wrap;">validar o token com </span>`<span class="editor-theme-code">GET /auth-context/</span>`
3. <span style="white-space: pre-wrap;">consumir listas e detalhes de </span>`<span class="editor-theme-code">properties</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">consultants</span>`<span style="white-space: pre-wrap;"> e </span>`<span class="editor-theme-code">producers</span>`
4. executar mutações de tags ou notificações somente após validar leitura e contexto
5. <span style="white-space: pre-wrap;">armazenar o </span>`<span class="editor-theme-code">X-Integration-Request-Id</span>`<span style="white-space: pre-wrap;"> para auditoria e suporte</span>

## 9. Observações Finais

- <span style="white-space: pre-wrap;">as rotas de leitura não possuem filtro dedicado por </span>`<span class="editor-theme-code">external_id</span>`<span style="white-space: pre-wrap;">; a busca é feita pelo parâmetro </span>`<span class="editor-theme-code">search</span>`