Descripción General
Actualiza la configuración de una regla existente. Todos los campos son opcionales - solo incluya los campos que desea actualizar. Actualizar una regla incrementa automáticamente su número de versión y mantiene el historial de versiones para propósitos de auditoría.
Endpoint
PATCH http://api.gu1.ai/rules/{id}
Autenticación
Requiere una clave API válida en el encabezado de Authorization:
Authorization: Bearer YOUR_API_KEY
Parámetros de Ruta
UUID de la regla a actualizar
Cuerpo de la Solicitud
Todos los campos son opcionales. Solo incluya los campos que desea modificar.
Actualizar nombre de la regla
Actualizar descripción de la regla
Actualizar categoría: kyc, kyb, aml, fraud, compliance, custom
Habilitar o deshabilitar la regla
Actualizar prioridad (1-100)
Actualizar puntaje de riesgo (0-100)
Actualizar estado: draft, in_progress, in_review, active, shadow, archived, inactive
Actualizar lógica de condiciones
Actualizar array de acciones
Actualizar tipos de entidad objetivo
Actualizar modo de evaluación: sync o async
Actualizar UUID de matriz de riesgo asociada
Actualizar configuración de alcance
Actualizar array de etiquetas
Respuesta
UUID de la regla actualizada
Nuevo número de versión (incrementado)
UUID de la versión anterior
ID del usuario que actualizó la regla
Marca de tiempo ISO de la actualización
Devuelve el objeto de regla actualizado completo con todos los campos.
Ejemplos de Solicitudes
Habilitar/Deshabilitar Regla
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'
Actualizar Prioridad y Puntaje
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"priority": 90,
"score": 75
}'
Actualizar Condiciones
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"conditions": {
"operator": "OR",
"conditions": [
{
"id": "cond-1",
"type": "simple",
"field": "enrichmentData.normalized.taxId",
"operator": "eq",
"value": "33.592.510/0001-54",
"filters": []
},
{
"id": "cond-2",
"type": "simple",
"field": "enrichmentData.normalized.taxId",
"operator": "eq",
"value": "12.345.678/0001-90",
"filters": []
}
]
}
}'
Agregar Acciones
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"actions": [
{
"type": "createAlert",
"createAlert": {
"type": "COMPLIANCE",
"title": "High Risk Entity Detected",
"description": "Entity matched high-risk criteria",
"severity": "CRITICAL",
"recipients": ["compliance@company.com", "security@company.com"]
},
"tags": ["high-risk", "urgent"]
},
{
"type": "updateEntityStatus",
"updateEntityStatus": {
"status": "under_review",
"reason": "Flagged by automated rule"
}
},
{
"type": "sendNotification",
"sendNotification": {
"channel": "email",
"recipients": ["compliance-lead@company.com"],
"message": "Immediate review required for high-risk entity"
}
}
]
}'
Actualizar Estado a Modo Shadow
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "shadow",
"enabled": true
}'
Actualizar Etiquetas
curl -X PATCH http://api.gu1.ai/rules/e2cdd639-52cc-4749-9b16-927bfa5dfaea \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tags": ["blocklist", "high-priority", "brazil", "automated"]
}'
Ejemplo de Respuesta
{
"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": "active",
"enabled": true,
"priority": 90,
"score": 75,
"conditions": {...},
"actions": [...],
"scope": {...},
"targetEntityTypes": ["company"],
"evaluationMode": "sync",
"riskMatrixId": "d257247b-af7b-402a-ad8f-eac209e2990e",
"version": 2,
"previousVersionId": "e2cdd639-52cc-4749-9b16-927bfa5dfaea-v1",
"tags": ["blocklist", "high-priority"],
"createdBy": "f35c10cb-9b67-4cda-9aea-f36567375dba",
"createdAt": "2024-12-22T14:10:28.131Z",
"updatedBy": "f35c10cb-9b67-4cda-9aea-f36567375dba",
"updatedAt": "2024-12-23T10:30:00.000Z",
"stats": {
"failures": 0,
"successes": 7,
"executions": 7
}
}
Respuestas de Error
404 Not Found
{
"error": "Rule not found",
"id": "e2cdd639-52cc-4749-9b16-927bfa5dfaea"
}
400 Bad Request - Datos Inválidos
{
"error": "Validation failed",
"details": {
"field": "priority",
"message": "Priority must be between 1 and 100"
}
}
401 Unauthorized
{
"error": "Invalid or missing API key"
}
403 Forbidden
{
"error": "Access denied",
"message": "You don't have permission to update this rule"
}
409 Conflict
{
"error": "Rule is currently being executed",
"message": "Cannot update rule during active execution"
}
Casos de Uso
Refinamiento Progresivo de Reglas
// Comenzar con modo shadow, luego activar gradualmente
async function deployRuleProgressively(ruleId) {
// Fase 1: Desplegar en modo shadow
console.log('Fase 1: Despliegue en modo shadow...');
await fetch(`http://api.gu1.ai/rules/${ruleId}`, {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
status: 'shadow',
enabled: true
})
});
// Esperar y monitorear por 1 semana...
console.log('Monitoreando modo shadow por 1 semana...');
// Fase 2: Activar con baja prioridad
console.log('Fase 2: Activando con baja prioridad...');
await fetch(`http://api.gu1.ai/rules/${ruleId}`, {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
status: 'active',
priority: 20
})
});
// Esperar y monitorear rendimiento...
console.log('Monitoreando rendimiento...');
// Fase 3: Aumentar prioridad si funciona bien
console.log('Fase 3: Aumentando prioridad...');
await fetch(`http://api.gu1.ai/rules/${ruleId}`, {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
priority: 80
})
});
console.log('Regla completamente desplegada');
}
Actualización Masiva de Reglas por Categoría
def bulk_update_by_category(category, updates):
"""Actualizar todas las reglas en una categoría"""
# Obtener todas las reglas en la categoría
response = requests.get(
'http://api.gu1.ai/rules',
headers={
'Authorization': 'Bearer YOUR_API_KEY'
},
params={
'category': category,
'pageSize': 100
}
)
rules = response.json()['rules']
print(f"Actualizando {len(rules)} reglas en categoría '{category}'...")
for rule in rules:
update_response = requests.patch(
f'http://api.gu1.ai/rules/{rule["id"]}',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json=updates
)
if update_response.status_code == 200:
print(f" Actualizada: {rule['name']}")
else:
print(f" Falló: {rule['name']}")
print(f"Actualización masiva completada")
# Ejemplo: Deshabilitar todas las reglas AML temporalmente
bulk_update_by_category('aml', {'enabled': False})
Pruebas A/B de Reglas
async function setupRuleABTest(ruleId) {
// Obtener regla original
const originalResponse = await fetch(
`http://api.gu1.ai/rules/${ruleId}`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
}
);
const original = await originalResponse.json();
// Crear variante con diferente puntaje
const variantResponse = await fetch(
'http://api.gu1.ai/rules',
{
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
...original,
id: undefined,
name: original.name + ' (Variante)',
score: original.score + 10,
tags: [...original.tags, 'ab-test', 'variant'],
enabled: false // Iniciar deshabilitada
})
}
);
const variant = await variantResponse.json();
// Etiquetar original como control
await fetch(`http://api.gu1.ai/rules/${ruleId}`, {
method: 'PATCH',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
tags: [...original.tags, 'ab-test', 'control']
})
});
console.log('Prueba A/B configurada completamente');
console.log('Control:', ruleId);
console.log('Variante:', variant.id);
return { control: ruleId, variant: variant.id };
}
Rotar Destinatarios de Acciones
def rotate_alert_recipients(rule_id, new_recipients):
"""Actualizar destinatarios de alertas para una regla"""
# Obtener regla actual
response = requests.get(
f'http://api.gu1.ai/rules/{rule_id}',
headers={
'Authorization': 'Bearer YOUR_API_KEY'
}
)
rule = response.json()
# Actualizar destinatarios de alertas en acciones
updated_actions = []
for action in rule['actions']:
if action['type'] == 'createAlert':
action['createAlert']['recipients'] = new_recipients
updated_actions.append(action)
# Actualizar regla
update_response = requests.patch(
f'http://api.gu1.ai/rules/{rule_id}',
headers={
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
json={
'actions': updated_actions
}
)
if update_response.status_code == 200:
print(f"Destinatarios de alerta actualizados a: {new_recipients}")
else:
print(f"Falló la actualización de destinatarios")
return update_response.json()
Mejores Prácticas
- Actualizaciones Parciales: Solo envíe campos que desea cambiar
- Probar Primero: Use endpoint de ejecución para probar antes de actualizar reglas de producción
- Modo Shadow: Pruebe cambios de condiciones en modo shadow antes de activar
- Historial de Versiones: Mantenga registro de números de versión para capacidad de rollback
- Monitorear Estadísticas: Observe estadísticas de ejecución después de actualizaciones
- Despliegue Gradual: Actualice prioridad gradualmente al desplegar nueva lógica
- Etiquetar Cambios: Etiquete reglas con metadatos de actualización para seguimiento
Versionamiento
Cada actualización crea una nueva versión:
version: Se incrementa en 1
previousVersionId: Enlaza a versión anterior
- El historial de versiones se mantiene para auditoría y rollback
Notas
- Las actualizaciones se aplican inmediatamente para reglas sync
- Las reglas async pueden tomar algunos minutos en reflejar cambios
- Las estadísticas se preservan a través de actualizaciones
- Las reglas deshabilitadas no se ejecutan pero permanecen en el sistema
Ver También