Decisoes
Gerenciamento de decisões no Decision Engine.
Endpoints
| Método | Endpoint | Descrição | Permissão |
|---|---|---|---|
| POST | /api/v1/decisions | Criar decisão | DECISION_VERSIONS_CREATE |
| GET | /api/v1/decisions | Listar decisões | DECISION_VERSIONS_READ |
| GET | /api/v1/decisions/:id | Obter decisão | DECISION_VERSIONS_READ |
| PATCH | /api/v1/decisions/:id | Atualizar decisão | DECISION_VERSIONS_CREATE |
| DELETE | /api/v1/decisions/:id | Excluir decisão | DECISION_PROJECTS_DELETE |
| POST | /api/v1/decisions/:id/execute | Executar decisão | DECISION_EXECUTE |
Criar Decisão
POST /api/v1/decisions
Cria uma nova decisão dentro de um projeto.
Request
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
projectId | string (UUID) | Sim | ID do projeto |
name | string | Sim | Nome da decisão |
key | string | Sim | Chave unica (lowercase, hifens) |
description | string | Não | Descrição |
tagIds | string[] | Não | IDs de tags associadas |
- cURL
- JavaScript
curl -X POST 'https://decision-engine.stg.catalisa.app/api/v1/decisions' \
-H 'Authorization: Bearer SEU_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"projectId": "550e8400-e29b-41d4-a716-446655440000",
"name": "Verificação de Score",
"key": "score-check",
"description": "Verifica se o score atinge o mínimo para aprovação"
}'
const response = await fetch('https://decision-engine.stg.catalisa.app/api/v1/decisions', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
projectId: '550e8400-e29b-41d4-a716-446655440000',
name: 'Verificação de Score',
key: 'score-check',
description: 'Verifica se o score atinge o mínimo para aprovação',
}),
});
const decision = await response.json();
Response (201 Created)
{
"data": {
"type": "decisions",
"id": "660e8400-e29b-41d4-a716-446655440001",
"attributes": {
"projectId": "550e8400-e29b-41d4-a716-446655440000",
"name": "Verificação de Score",
"key": "score-check",
"description": "Verifica se o score atinge o mínimo para aprovação",
"status": "DRAFT",
"createdAt": "2024-01-15T10:30:00Z"
},
"links": {
"self": "/api/v1/decisions/660e8400-e29b-41d4-a716-446655440001"
}
}
}
Listar Decisoes
GET /api/v1/decisions
Lista decisões com suporte a paginação e filtros.
Query Parameters
| Parâmetro | Tipo | Descrição |
|---|---|---|
page[number] | integer | Número da página |
page[size] | integer | Itens por página |
filter[projectId] | string | Filtrar por projeto |
filter[status] | string | Filtrar por status |
filter[tagId] | string | Filtrar por tag |
- cURL
- JavaScript
curl 'https://decision-engine.stg.catalisa.app/api/v1/decisions?filter[projectId]=550e8400-e29b-41d4-a716-446655440000&filter[status]=ACTIVE' \
-H 'Authorization: Bearer SEU_TOKEN'
const params = new URLSearchParams({
'filter[projectId]': '550e8400-e29b-41d4-a716-446655440000',
'filter[status]': 'ACTIVE',
});
const response = await fetch(
`https://decision-engine.stg.catalisa.app/api/v1/decisions?${params}`,
{
headers: {
'Authorization': `Bearer ${token}`,
},
}
);
const { data, meta } = await response.json();
Atualizar Decisão
PATCH /api/v1/decisions/:decisionId
Atualiza dados de uma decisão.
Request
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
status | string | Não | Novo status |
name | string | Não | Novo nome |
description | string | Não | Nova descrição |
tagIds | string[] | Não | Novas tags |
- cURL
- JavaScript
curl -X PATCH 'https://decision-engine.stg.catalisa.app/api/v1/decisions/660e8400-e29b-41d4-a716-446655440001' \
-H 'Authorization: Bearer SEU_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"status": "ACTIVE",
"name": "Verificação de Score v2"
}'
const decisionId = '660e8400-e29b-41d4-a716-446655440001';
const response = await fetch(
`https://decision-engine.stg.catalisa.app/api/v1/decisions/${decisionId}`,
{
method: 'PATCH',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
status: 'ACTIVE',
name: 'Verificação de Score v2',
}),
}
);
const decision = await response.json();
Executar Decisão
POST /api/v1/decisions/:decisionId/execute
Executa a versão publicada mais recente da decisão e retorna o resultado com trace completo das regras avaliadas.
Request
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
input | object | Sim | Dados de entrada para a decisão (devem corresponder aos inputs definidos no DMN) |
- cURL
- JavaScript
curl -X POST 'https://decision-engine.stg.catalisa.app/api/v1/decisions/660e8400-e29b-41d4-a716-446655440001/execute' \
-H 'Authorization: Bearer SEU_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"score": 720,
"rendaMensal": 8000,
"comprometimentoRenda": 0.35
}
}'
const decisionId = '660e8400-e29b-41d4-a716-446655440001';
const response = await fetch(
`https://decision-engine.stg.catalisa.app/api/v1/decisions/${decisionId}/execute`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
input: {
score: 720,
rendaMensal: 8000,
comprometimentoRenda: 0.35,
},
}),
}
);
const result = await response.json();
Response (200 OK)
{
"output": "APROVADO|1.49|60|0.20|Bom perfil - taxa 1.49% am",
"trace": [
{
"decisionId": "creditDecision",
"decisionName": "Credit Decision",
"outcome": "APROVADO|1.49|60|0.20|Bom perfil - taxa 1.49% am",
"rulesEvaluated": [
{
"ruleId": "rule_denied_score",
"triggered": false,
"conditions": ["score: 720", "rendaMensal: 8000"],
"outcome": null
},
{
"ruleId": "rule_approved_good",
"triggered": true,
"conditions": ["score: 720", "rendaMensal: 8000", "comprometimentoRenda: 0.35"],
"outcome": "APROVADO|1.49|60|0.20|Bom perfil - taxa 1.49% am"
}
]
}
],
"executionTimeMs": 45,
"versionUsed": "1.0.0"
}
Campos da Resposta
| Campo | Tipo | Descrição |
|---|---|---|
output | any | Resultado da execução do DMN |
trace | array | Lista de decisões avaliadas com detalhes |
trace[].decisionId | string | ID da decisão no DMN |
trace[].decisionName | string | Nome da decisão no DMN |
trace[].outcome | any | Resultado da decisão |
trace[].rulesEvaluated | array | Lista de regras avaliadas |
trace[].rulesEvaluated[].ruleId | string | ID da regra no DMN |
trace[].rulesEvaluated[].triggered | boolean | Se a regra foi acionada |
trace[].rulesEvaluated[].conditions | array | Condições avaliadas |
trace[].rulesEvaluated[].outcome | any | Saída da regra (se acionada) |
executionTimeMs | number | Tempo de execução em milissegundos |
versionUsed | string | Versão do DMN utilizada |
Debugging com Trace
O campo trace é essencial para debugging:
- Veja todas as regras que foram avaliadas
- Identifique qual regra foi acionada (
triggered: true) - Entenda as condições que levaram à decisão
Entendendo o Trace
O trace mostra o caminho completo da execução do DMN. Com hit policy FIRST, apenas a primeira regra que satisfaz todas as condições é acionada.
Exemplo de análise:
Entrada: score=720, rendaMensal=8000
Regras avaliadas:
1. rule_denied_score (< 500) → NÃO acionada (720 >= 500)
2. rule_denied_income (< 3000) → NÃO acionada (8000 >= 3000)
3. rule_approved_good (>= 700, >= 8000) → ACIONADA ✓
Resultado: APROVADO
Excluir Decisão
DELETE /api/v1/decisions/:decisionId
Remove uma decisão e todas as suas versões.
- cURL
- JavaScript
curl -X DELETE 'https://decision-engine.stg.catalisa.app/api/v1/decisions/660e8400-e29b-41d4-a716-446655440001' \
-H 'Authorization: Bearer SEU_TOKEN'
const decisionId = '660e8400-e29b-41d4-a716-446655440001';
const response = await fetch(
`https://decision-engine.stg.catalisa.app/api/v1/decisions/${decisionId}`,
{
method: 'DELETE',
headers: {
'Authorization': `Bearer ${token}`,
},
}
);
// Status 204 No Content = sucesso
Erros Comuns
| Código | Erro | Descrição |
|---|---|---|
| 400 | VALIDATION | Input inválido ou campos ausentes |
| 404 | NOT_FOUND | Decisão ou projeto não encontrado |
| 404 | NOT_FOUND | Nenhuma versão publicada para executar |
| 409 | CONFLICT | Key já existe no projeto |