> ## 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.

# Crear Regla

> Crear una nueva regla para detección de riesgos y monitoreo de cumplimiento — en el motor de reglas gu1 para compliance y detección de riesgo.

## Descripción General

Crea una nueva regla para detección automatizada de riesgos, monitoreo de cumplimiento y prevención de fraude. **Toda alta ejecuta una revisión IA síncrona** (incluida; no debita tokens de IA) antes de persistir. Las reglas nuevas quedan siempre en **`in_progress`** con **`enabled: false`** para que revises sugerencias y actives manualmente.

<Note>
  Los campos `status` y `enabled` en el body de create **se ignoran** — la API fuerza `status: in_progress` y `enabled: false`. Esperá **varios segundos** de latencia. Flujos bundle/plantilla crean una revisión por regla.
</Note>

## Endpoint

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

## Autenticación

Requiere una clave API válida en el encabezado de Authorization:

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

## Cuerpo de la Solicitud

<ParamField body="name" type="string" required>
  Nombre descriptivo para la regla
</ParamField>

<ParamField body="description" type="string" required>
  Descripción detallada de lo que detecta la regla
</ParamField>

<ParamField body="category" type="string" required>
  Categoría de la regla: `kyc`, `kyb`, `aml`, `fraud`, `compliance`, `custom`
</ParamField>

<ParamField body="targetEntityTypes" type="array" required>
  Array de tipos de entidad a los que aplica esta regla: `["person"]`, `["company"]`, `["transaction"]`, `["person", "company"]`
</ParamField>

<ParamField body="conditions" type="object" required>
  Estructura de lógica de condiciones (ver [Estructura de Condiciones](#estructura-de-condiciones) a continuación)
</ParamField>

<ParamField body="actions" type="array" required>
  Array de acciones a ejecutar cuando las condiciones coincidan (ver [Acciones](#acciones) a continuación)
</ParamField>

<ParamField body="enabled" type="boolean">
  Ignorado en create — siempre se guarda `enabled: false`.
</ParamField>

<ParamField body="priority" type="number" default="50">
  Prioridad de la regla (1-100). Valores más altos = mayor prioridad
</ParamField>

<ParamField body="score" type="number">
  Puntaje de riesgo a asignar cuando la regla coincida (0-100). Usado en matrices de riesgo basadas en puntajes
</ParamField>

<ParamField body="status" type="string">
  Ignorado en create — siempre se guarda `in_progress` (en configuración).
</ParamField>

<ParamField body="evaluationMode" type="string" default="async">
  Modo de evaluación: `sync` (inmediato) o `async` (procesamiento en segundo plano)
</ParamField>

<ParamField body="riskMatrixId" type="string">
  UUID de la matriz de riesgo para asociar esta regla
</ParamField>

<ParamField body="countries" type="array">
  Array de códigos de país ISO para restringir la ejecución de la regla: `["BR", "AR", "US"]`
</ParamField>

<ParamField body="scope" type="object">
  Configuración de alcance adicional incluyendo ventanas temporales y disparadores
</ParamField>

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

<ParamField body="creationProvenance" type="object">
  Metadatos opcionales de origen. Si se omite, default `api` (API key) o `user` (sesión). Campos: `sourceType`, `conversationId`, `messageId`, `platformAgentCategory`, `triggeredByUserId`.
</ParamField>

## Estructura de Condiciones

Las reglas utilizan una estructura de condiciones anidadas con 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 Condiciones

* **operator**: Operador lógico que conecta condiciones (`AND`, `OR`, `NOT`, `XOR`)
* **conditions**: Array de objetos de condición (pueden estar anidados para lógica compleja)
* **id**: Identificador único para la condición
* **type**: Tipo de condición (`simple`, `complex`, `array`, `object`)
* **field**: Ruta del campo a evaluar (ej., `taxId`, `entityData.company.revenue`, `enrichmentData.normalized.sanctions.$.type`)
* **operator**: Operador de comparación (ver [Operadores](#operadores) a continuación)
* **value**: Valor con el que comparar
* **filters**: Array de filtros para campos de array/objeto
* **countryMetadata**: Metadatos específicos del país para la condición

### Operadores

#### Operadores de Comparación

* `eq` - Igual
* `neq` - No igual
* `gt` - Mayor que
* `gte` - Mayor o igual que
* `lt` - Menor que
* `lte` - Menor o igual que

#### Operadores de Texto

* `contains` - Contiene subcadena
* `notContains` - No contiene subcadena
* `startsWith` - Comienza con
* `endsWith` - Termina con
* `regex` - Coincide con expresión regular

#### Operadores de Array

* `in` - El valor está en el array
* `notIn` - El valor no está en el array
* `hasAny` - Tiene alguno de los valores
* `hasAll` - Tiene todos los valores

#### Operadores de Lista

* `inList` - El valor existe en una lista de datos
* `notInList` - El valor no existe en una lista de datos

#### Operadores de Existencia

* `exists` - El campo existe
* `notExists` - El campo no existe
* `isEmpty` - El campo está vacío/nulo
* `isNotEmpty` - El campo no está vacío/nulo

#### Operadores Booleanos

* `isTrue` - El campo booleano es verdadero
* `isFalse` - El campo booleano es falso

## Sintaxis de Campos de Array

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

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

Esto evalúa si ALGÚN elemento en el array `sanctions` tiene `type` igual a `"terrorism"`.

### Filtros

Puede pre-filtrar elementos del array antes de la evaluación:

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

Esto evalúa si ALGÚN proceso legal activo tiene un monto mayor a 100,000.

## Acciones

Las reglas soportan múltiples tipos de acciones:

### Crear 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"]
}
```

### Actualizar Estado de Entidad

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

### Enviar Notificación

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

### Crear Caso

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

## Ejemplos de Solicitudes

### Regla KYC Simple - 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('Rule created:', 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"Rule created: {rule['id']}")
  ```
</CodeGroup>

### Regla Compleja - Verificación de Sanciones con Múltiples Condiciones

<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>

### Regla de Monitoreo de Transacciones

<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>

## Respuesta

<ResponseField name="id" type="string">
  UUID de la regla creada
</ResponseField>

<ResponseField name="name" type="string">
  Nombre de la regla
</ResponseField>

<ResponseField name="description" type="string">
  Descripción de la regla
</ResponseField>

<ResponseField name="organizationId" type="string">
  ID de su organización
</ResponseField>

<ResponseField name="status" type="string">
  Estado actual de la regla
</ResponseField>

<ResponseField name="enabled" type="boolean">
  Si la regla está habilitada
</ResponseField>

<ResponseField name="version" type="number">
  Número de versión de la regla
</ResponseField>

<ResponseField name="createdAt" type="string">
  Marca de tiempo ISO de creación
</ResponseField>

<ResponseField name="createdBy" type="string">
  ID del usuario que creó la regla
</ResponseField>

<ResponseField name="creationProvenance" type="object">
  Metadatos de origen (`sourceType`, ids de chat agente opcionales).
</ResponseField>

<ResponseField name="aiReview" type="object">
  Resumen de revisión IA síncrona: `verified`, `reason`, `functionalityDescription`, `suggestions`, `issues`.
</ResponseField>

## Ejemplo de Respuesta

```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": "Las condiciones están alineadas con la descripción.",
    "functionalityDescription": "Genera alerta KYB cuando el CNPJ coincide con la blocklist.",
    "suggestions": [],
    "issues": []
  }
}
```

## Respuestas de Error

### 400 Bad Request - Condición Inválida

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

### 400 Bad Request - Campos Requeridos Faltantes

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

### 401 Unauthorized

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

## Mejores Prácticas

1. **Comience con Modo Shadow**: Use `status: "shadow"` para probar reglas sin afectar producción
2. **Use Nombres Descriptivos**: Haga que los nombres de las reglas sean claros y buscables
3. **Establezca Prioridades Apropiadas**: Las reglas de mayor prioridad se ejecutan primero (escala 1-100)
4. **Etiquete sus Reglas**: Use etiquetas para organización y filtrado
5. **Reglas Específicas por País**: Use `scope.countries` para cumplimiento geo-específico
6. **Pruebe Exhaustivamente**: Pruebe las reglas con datos de ejemplo antes de habilitar
7. **Monitoree el Rendimiento**: Use modo sync para reglas críticas en tiempo real, async para procesamiento por lotes
8. **Puntúe Estratégicamente**: Alinee los puntajes con los umbrales de su matriz de riesgo

## Ver También

* [Referencia de Campos de Condiciones](/es/api-reference/rules/conditions) - Lista completa de campos de condición disponibles por tipo de entidad y país
* [Ejecutar Regla](/es/api-reference/rules/execute) - Probar reglas contra entidades específicas
* [Listar Reglas](/es/api-reference/rules/list) - Consultar y filtrar reglas
* [Actualizar Regla](/es/api-reference/rules/update) - Modificar reglas existentes
