> ## Documentation Index
> Fetch the complete documentation index at: https://docs.gu1.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Criar Regra

> Criar uma nova regra para detecção de riscos e monitoramento de conformidade — no motor de regras gu1 para compliance e detecção de risco.

## Visão Geral

Cria uma nova regra para detecção automatizada de riscos, monitoramento de conformidade e prevenção de fraudes. **Toda criação executa revisão IA síncrona** (incluída; não debita tokens de IA) antes de persistir. Regras novas ficam sempre em **`in_progress`** com **`enabled: false`**.

<Note>
  Os campos `status` e `enabled` no create **são ignorados** — a API força `in_progress` e `enabled: false`. Espere **vários segundos** de latência. Bundles/modelos disparam uma revisão por regra.
</Note>

## Endpoint

```
POST http://api.gu1.ai/rules
```

## Autenticação

Requer uma chave API válida no cabeçalho de Authorization:

```bash theme={null}
Authorization: Bearer YOUR_API_KEY
```

## Corpo da Requisição

<ParamField body="name" type="string" required>
  Nome descritivo para a regra
</ParamField>

<ParamField body="description" type="string" required>
  Descrição detalhada do que a regra detecta
</ParamField>

<ParamField body="category" type="string" required>
  Categoria da regra: `kyc`, `kyb`, `aml`, `fraud`, `compliance`, `custom`
</ParamField>

<ParamField body="targetEntityTypes" type="array" required>
  Array de tipos de entidade aos quais esta regra se aplica: `["person"]`, `["company"]`, `["transaction"]`, `["person", "company"]`
</ParamField>

<ParamField body="conditions" type="object" required>
  Estrutura de lógica de condições (veja [Estrutura de Condições](#estrutura-de-condicoes) abaixo)
</ParamField>

<ParamField body="actions" type="array" required>
  Array de ações a executar quando as condições corresponderem (veja [Ações](#acoes) abaixo)
</ParamField>

<ParamField body="enabled" type="boolean">
  Ignorado no create — sempre salva `enabled: false`.
</ParamField>

<ParamField body="priority" type="number" default="50">
  Prioridade da regra (1-100). Valores maiores = maior prioridade
</ParamField>

<ParamField body="score" type="number">
  Pontuação de risco a atribuir quando a regra corresponder (0-100). Usado em matrizes de risco baseadas em pontuação
</ParamField>

<ParamField body="status" type="string">
  Ignorado no create — sempre salva `in_progress` (em configuração).
</ParamField>

<ParamField body="evaluationMode" type="string" default="async">
  Modo de avaliação: `sync` (imediato) ou `async` (processamento em segundo plano)
</ParamField>

<ParamField body="riskMatrixId" type="string">
  UUID da matriz de risco para associar esta regra
</ParamField>

<ParamField body="countries" type="array">
  Array de códigos de país ISO para restringir a execução da regra: `["BR", "AR", "US"]`
</ParamField>

<ParamField body="scope" type="object">
  Configuração de escopo adicional incluindo janelas temporais e gatilhos
</ParamField>

<ParamField body="tags" type="array">
  Array de tags para organizar regras: `["high-risk", "pep", "sanctions"]`
</ParamField>

<ParamField body="creationProvenance" type="object">
  Metadados opcionais de origem. Se omitido, default `api` ou `user`. Campos: `sourceType`, `conversationId`, `messageId`, `platformAgentCategory`, `triggeredByUserId`.
</ParamField>

## Estrutura de Condições

As regras usam uma estrutura de condições aninhadas com operadores lógicos:

```json theme={null}
{
  "operator": "AND" | "OR" | "NOT" | "XOR",
  "conditions": [
    {
      "id": "cond-unique-id",
      "type": "simple",
      "field": "enrichmentData.normalized.taxId",
      "operator": "eq",
      "value": "12.345.678/0001-90",
      "filters": [],
      "countryMetadata": {
        "countryCode": "BR",
        "confidence": 100,
        "manuallySet": true,
        "autoDetected": false,
        "reason": "Selected from BR enrichment fields"
      }
    }
  ]
}
```

### Campos de Condições

* **operator**: Operador lógico conectando condições (`AND`, `OR`, `NOT`, `XOR`)
* **conditions**: Array de objetos de condição (podem ser aninhados para lógica complexa)
* **id**: Identificador único para a condição
* **type**: Tipo de condição (`simple`, `complex`, `array`, `object`)
* **field**: Caminho do campo a avaliar (ex., `taxId`, `entityData.company.revenue`, `enrichmentData.normalized.sanctions.$.type`)
* **operator**: Operador de comparação (veja [Operadores](#operadores) abaixo)
* **value**: Valor para comparar
* **filters**: Array de filtros para campos de array/objeto
* **countryMetadata**: Metadados específicos do país para a condição

### Operadores

#### Operadores de Comparação

* `eq` - Igual
* `neq` - Não igual
* `gt` - Maior que
* `gte` - Maior ou igual
* `lt` - Menor que
* `lte` - Menor ou igual

#### Operadores de String

* `contains` - Contém substring
* `notContains` - Não contém substring
* `startsWith` - Começa com
* `endsWith` - Termina com
* `regex` - Corresponde à expressão regular

#### Operadores de Array

* `in` - Valor está no array
* `notIn` - Valor não está no array
* `hasAny` - Tem algum dos valores
* `hasAll` - Tem todos os valores

#### Operadores de Lista

* `inList` - Valor existe em uma lista de dados
* `notInList` - Valor não existe em uma lista de dados

#### Operadores de Existência

* `exists` - Campo existe
* `notExists` - Campo não existe
* `isEmpty` - Campo está vazio/nulo
* `isNotEmpty` - Campo não está vazio/nulo

#### Operadores Booleanos

* `isTrue` - Campo booleano é verdadeiro
* `isFalse` - Campo booleano é falso

## Sintaxe de Campos de Array

Para campos dentro de arrays, use o símbolo `$`:

```json theme={null}
{
  "field": "enrichmentData.normalized.sanctions.$.type",
  "operator": "in",
  "value": "terrorism",
  "filters": []
}
```

Isso avalia se QUALQUER item no array `sanctions` tem `type` igual a `"terrorism"`.

### Filtros

Você pode pré-filtrar itens do array antes da avaliação:

```json theme={null}
{
  "field": "enrichmentData.normalized.legalProceedings.$.amount",
  "operator": "gt",
  "value": 100000,
  "filters": [
    {
      "field": "status",
      "operator": "eq",
      "value": "active"
    }
  ]
}
```

Isso avalia se QUALQUER processo legal ativo tem um valor maior que 100.000.

## Ações

As regras suportam múltiplos tipos de ações:

### Criar Alerta

```json theme={null}
{
  "type": "createAlert",
  "createAlert": {
    "type": "FRAUD" | "COMPLIANCE" | "AML" | "KYC" | "OTHER",
    "title": "High Risk Transaction Detected",
    "description": "Transaction exceeds threshold",
    "severity": "LOW" | "MEDIUM" | "HIGH" | "CRITICAL",
    "recipients": ["user@example.com"]
  },
  "tags": ["high-value", "cross-border"]
}
```

### Atualizar Status da Entidade

```json theme={null}
{
  "type": "updateEntityStatus",
  "updateEntityStatus": {
    "status": "blocked",
    "reason": "Failed sanctions check"
  }
}
```

### Enviar Notificação

```json theme={null}
{
  "type": "sendNotification",
  "sendNotification": {
    "channel": "email" | "sms" | "webhook",
    "recipients": ["compliance@company.com"],
    "message": "Urgent: High risk entity detected"
  }
}
```

### Criar Caso

```json theme={null}
{
  "type": "createCase",
  "createCase": {
    "title": "PEP Investigation Required",
    "description": "Entity flagged as politically exposed person",
    "assignee": "user-uuid"
  }
}
```

## Exemplos de Requisições

### Regra KYC Simples - Verificar Tax ID

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST http://api.gu1.ai/rules \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "CNPJ Blocklist Check",
      "description": "Block companies with specific CNPJ",
      "category": "kyb",
      "targetEntityTypes": ["company"],
      "enabled": true,
      "priority": 100,
      "score": 85,
      "conditions": {
        "operator": "AND",
        "conditions": [
          {
            "id": "cond-1",
            "type": "simple",
            "field": "enrichmentData.normalized.taxId",
            "operator": "eq",
            "value": "33.592.510/0001-54",
            "filters": [],
            "countryMetadata": {
              "countryCode": "BR",
              "confidence": 100,
              "manuallySet": true,
              "autoDetected": false,
              "reason": "Selected from BR enrichment fields"
            }
          }
        ]
      },
      "actions": [
        {
          "type": "createAlert",
          "createAlert": {
            "type": "COMPLIANCE",
            "title": "Blocklisted Company Detected",
            "description": "Company CNPJ found in blocklist",
            "severity": "CRITICAL",
            "recipients": ["compliance@company.com"]
          },
          "tags": ["blocklist", "high-priority"]
        },
        {
          "type": "updateEntityStatus",
          "updateEntityStatus": {
            "status": "blocked",
            "reason": "CNPJ in blocklist"
          }
        }
      ],
      "scope": {
        "type": "entity",
        "countries": ["BR"],
        "entityTypes": ["company"]
      },
      "status": "active",
      "evaluationMode": "sync"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('http://api.gu1.ai/rules', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: 'CNPJ Blocklist Check',
      description: 'Block companies with specific CNPJ',
      category: 'kyb',
      targetEntityTypes: ['company'],
      enabled: true,
      priority: 100,
      score: 85,
      conditions: {
        operator: 'AND',
        conditions: [
          {
            id: 'cond-1',
            type: 'simple',
            field: 'enrichmentData.normalized.taxId',
            operator: 'eq',
            value: '33.592.510/0001-54',
            filters: [],
            countryMetadata: {
              countryCode: 'BR',
              confidence: 100,
              manuallySet: true,
              autoDetected: false,
              reason: 'Selected from BR enrichment fields'
            }
          }
        ]
      },
      actions: [
        {
          type: 'createAlert',
          createAlert: {
            type: 'COMPLIANCE',
            title: 'Blocklisted Company Detected',
            description: 'Company CNPJ found in blocklist',
            severity: 'CRITICAL',
            recipients: ['compliance@company.com']
          },
          tags: ['blocklist', 'high-priority']
        }
      ],
      scope: {
        type: 'entity',
        countries: ['BR'],
        entityTypes: ['company']
      },
      status: 'active',
      evaluationMode: 'sync'
    })
  });

  const rule = await response.json();
  console.log('Regra criada:', rule.id);
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'http://api.gu1.ai/rules',
      headers={
          'Authorization': 'Bearer YOUR_API_KEY',
          'Content-Type': 'application/json'
      },
      json={
          'name': 'CNPJ Blocklist Check',
          'description': 'Block companies with specific CNPJ',
          'category': 'kyb',
          'targetEntityTypes': ['company'],
          'enabled': True,
          'priority': 100,
          'score': 85,
          'conditions': {
              'operator': 'AND',
              'conditions': [
                  {
                      'id': 'cond-1',
                      'type': 'simple',
                      'field': 'enrichmentData.normalized.taxId',
                      'operator': 'eq',
                      'value': '33.592.510/0001-54',
                      'filters': [],
                      'countryMetadata': {
                          'countryCode': 'BR',
                          'confidence': 100,
                          'manuallySet': True,
                          'autoDetected': False,
                          'reason': 'Selected from BR enrichment fields'
                      }
                  }
              ]
          },
          'actions': [
              {
                  'type': 'createAlert',
                  'createAlert': {
                      'type': 'COMPLIANCE',
                      'title': 'Blocklisted Company Detected',
                      'description': 'Company CNPJ found in blocklist',
                      'severity': 'CRITICAL',
                      'recipients': ['compliance@company.com']
                  },
                  'tags': ['blocklist', 'high-priority']
              }
          ],
          'scope': {
              'type': 'entity',
              'countries': ['BR'],
              'entityTypes': ['company']
          },
          'status': 'active',
          'evaluationMode': 'sync'
      }
  )

  rule = response.json()
  print(f"Regra criada: {rule['id']}")
  ```
</CodeGroup>

### Regra Complexa - Verificação de Sanções com Múltiplas Condições

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST http://api.gu1.ai/rules \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Terrorism Sanctions Check",
      "description": "Detect entities with terrorism-related sanctions",
      "category": "aml",
      "targetEntityTypes": ["person", "company"],
      "enabled": true,
      "priority": 100,
      "score": 95,
      "conditions": {
        "operator": "OR",
        "conditions": [
          {
            "id": "cond-1",
            "type": "simple",
            "field": "enrichmentData.normalized.sanctions.$.type",
            "operator": "in",
            "value": "terrorism",
            "filters": [],
            "countryMetadata": {
              "countryCode": "GLOBAL",
              "confidence": 100,
              "manuallySet": true,
              "autoDetected": false,
              "reason": "Global sanctions field"
            }
          },
          {
            "id": "cond-2",
            "type": "simple",
            "field": "enrichmentData.normalized.sanctioned",
            "operator": "isTrue",
            "value": true,
            "filters": []
          }
        ]
      },
      "actions": [
        {
          "type": "createAlert",
          "createAlert": {
            "type": "AML",
            "title": "Sanctions Match - Immediate Review Required",
            "description": "Entity matched terrorism sanctions list",
            "severity": "CRITICAL",
            "recipients": ["aml-team@company.com"]
          },
          "tags": ["sanctions", "terrorism", "critical"]
        },
        {
          "type": "updateEntityStatus",
          "updateEntityStatus": {
            "status": "blocked",
            "reason": "Terrorism sanctions match"
          }
        },
        {
          "type": "createCase",
          "createCase": {
            "title": "Sanctions Investigation Required",
            "description": "Entity flagged for terrorism-related sanctions",
            "assignee": "compliance-lead-uuid"
          }
        }
      ],
      "scope": {
        "type": "entity",
        "entityTypes": ["person", "company"]
      },
      "status": "active",
      "evaluationMode": "sync",
      "tags": ["sanctions", "aml", "critical"]
    }'
  ```
</CodeGroup>

### Regra de Monitoramento de Transações

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST http://api.gu1.ai/rules \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "High Value Transaction Alert",
      "description": "Alert on transactions over $50,000 USD",
      "category": "fraud",
      "targetEntityTypes": ["transaction"],
      "enabled": true,
      "priority": 80,
      "score": 70,
      "conditions": {
        "operator": "AND",
        "conditions": [
          {
            "id": "cond-1",
            "type": "simple",
            "field": "amountInUsd",
            "operator": "gt",
            "value": 50000,
            "filters": []
          },
          {
            "id": "cond-2",
            "type": "simple",
            "field": "status",
            "operator": "eq",
            "value": "PENDING",
            "filters": []
          }
        ]
      },
      "actions": [
        {
          "type": "createAlert",
          "createAlert": {
            "type": "FRAUD",
            "title": "High Value Transaction Detected",
            "description": "Transaction exceeds $50,000 threshold",
            "severity": "HIGH",
            "recipients": ["fraud-team@company.com"]
          },
          "tags": ["high-value", "pending-review"]
        }
      ],
      "scope": {
        "type": "transaction"
      },
      "status": "active",
      "evaluationMode": "sync"
    }'
  ```
</CodeGroup>

## Resposta

<ResponseField name="id" type="string">
  UUID da regra criada
</ResponseField>

<ResponseField name="name" type="string">
  Nome da regra
</ResponseField>

<ResponseField name="description" type="string">
  Descrição da regra
</ResponseField>

<ResponseField name="organizationId" type="string">
  ID da sua organização
</ResponseField>

<ResponseField name="status" type="string">
  Status atual da regra
</ResponseField>

<ResponseField name="enabled" type="boolean">
  Se a regra está habilitada
</ResponseField>

<ResponseField name="version" type="number">
  Número da versão da regra
</ResponseField>

<ResponseField name="createdAt" type="string">
  Timestamp ISO de criação
</ResponseField>

<ResponseField name="createdBy" type="string">
  ID do usuário que criou a regra
</ResponseField>

<ResponseField name="creationProvenance" type="object">
  Metadados de origem (`sourceType`, ids opcionais de chat do agente).
</ResponseField>

<ResponseField name="aiReview" type="object">
  Resumo da revisão IA síncrona: `verified`, `reason`, `functionalityDescription`, `suggestions`, `issues`.
</ResponseField>

## Exemplo de Resposta

```json theme={null}
{
  "success": true,
  "message": "Rule created successfully",
  "rule": {
  "id": "e2cdd639-52cc-4749-9b16-927bfa5dfaea",
  "organizationId": "71e8f908-e032-4fcb-b0ce-ad0cd0ffb236",
  "name": "CNPJ Blocklist Check",
  "description": "Block companies with specific CNPJ",
  "category": "kyb",
  "status": "in_progress",
  "enabled": false,
  "priority": 100,
  "score": 85,
  "conditions": {
    "operator": "AND",
    "conditions": [...]
  },
  "actions": [
    {
      "type": "createAlert",
      "createAlert": {...},
      "tags": ["blocklist", "high-priority"]
    }
  ],
  "scope": {
    "type": "entity",
    "countries": ["BR"],
    "entityTypes": ["company"]
  },
  "targetEntityTypes": ["company"],
  "evaluationMode": "sync",
  "version": 1,
  "previousVersionId": null,
  "tags": [],
  "createdBy": "f35c10cb-9b67-4cda-9aea-f36567375dba",
  "createdAt": "2024-12-23T10:00:00.000Z",
  "updatedAt": "2024-12-23T10:00:00.000Z",
  "stats": {
    "executions": 0,
    "successes": 0,
    "failures": 0
  }
  },
  "aiReview": {
    "verified": true,
    "reason": "Condições alinhadas com a descrição.",
    "functionalityDescription": "Cria alerta KYB quando o CNPJ coincide com a blocklist.",
    "suggestions": [],
    "issues": []
  }
}
```

## Respostas de Erro

### 400 Bad Request - Condição Inválida

```json theme={null}
{
  "error": "Validation failed",
  "details": {
    "field": "conditions",
    "message": "Invalid operator 'xyz'"
  }
}
```

### 400 Bad Request - Campos Obrigatórios Faltando

```json theme={null}
{
  "error": "Validation failed",
  "details": {
    "missingFields": ["name", "targetEntityTypes", "conditions"]
  }
}
```

### 401 Unauthorized

```json theme={null}
{
  "error": "Invalid or missing API key"
}
```

## Melhores Práticas

1. **Comece com Modo Shadow**: Use `status: "shadow"` para testar regras sem afetar produção
2. **Use Nomes Descritivos**: Torne os nomes das regras claros e pesquisáveis
3. **Defina Prioridades Apropriadas**: Regras de maior prioridade executam primeiro (escala 1-100)
4. **Marque suas Regras**: Use tags para organização e filtragem
5. **Regras Específicas por País**: Use `scope.countries` para conformidade geo-específica
6. **Teste Completamente**: Teste regras com dados de exemplo antes de habilitar
7. **Monitore o Desempenho**: Use modo sync para regras críticas em tempo real, async para processamento em lote
8. **Pontue Estrategicamente**: Alinhe pontuações com os limites da sua matriz de risco

## Veja Também

* [Referência de Campos de Condições](/pt/api-reference/rules/conditions) - Lista completa de campos de condição disponíveis por tipo de entidade e país
* [Executar Regra](/pt/api-reference/rules/execute) - Testar regras contra entidades específicas
* [Listar Regras](/pt/api-reference/rules/list) - Consultar e filtrar regras
* [Atualizar Regra](/pt/api-reference/rules/update) - Modificar regras existentes
