Pular para o conteúdo principal
Nesta página
Exemplo interativoUsa dados de exemplo e não faz solicitações à API.
Produção
Estratégias de pagamento

Mecanismo de recomendação

Defina a rota ordenada de provedores avaliada para uma regra correspondente.

Acme LATAM · Produção
ConfiguraçãoMecanismo de recomendação
Ativa
01AdyenRota principal
02WorldpayRota alternativa
03StripeRota alternativa
RoteamentoAdyen → Worldpay → Stripe

Autenticação#

Todos os endpoints são autenticados com um Chave de API enviado no X-Api-Key header — este é o único esquema de autenticação suportado. Seu comerciante foi resolvido a partir da chave API, então o identificador do comerciante faz não aparecem no URL.

HTTP
X-Api-Key: {{DEUNA's API Key}}
X-Idempotency-Key: {{UUID v4}}
Content-Type: application/json
CabeçalhoObrigatórioDescrição
X-Api-KeySimSua chave de API. Determina o ambiente e o escopo do comerciante.
Content-TypeSimapplication/json.
X-Idempotency-KeyRecomendadoUma chave exclusiva gerada por solicitação lógica (um UUID funciona bem). Tentar novamente com a mesma chave retorna o resultado original em vez de aplicar a operação duas vezes – envie-a para que as tentativas de rede nunca criem regras duplicadas ou contem duas vezes uma ação.

Resumo do endpoint#

MétodoCaminhoObjetivo
GET/routing/v1/rulesListe todas as regras (ordem de prioridade)
POST/routing/v1/rulesCrie uma regra
GET/routing/v1/rules/{rule_id}Get a single rule by ID
PUT/routing/v1/rules/{rule_id}Atualizar uma regra (substituição completa)
PUT/routing/v1/rules/{rule_id}/reorderAlterar a prioridade de uma regra

Parâmetros do caminho:

ParâmetroTipoNotas
rule_idintegerIdentificador de regra numérico retornado por create/list.

O objeto Regra#

Uma regra é o recurso principal retornado e aceito por esses terminais.

CampoTipoObrigatórioDescrição
idintegerApenas respostaIdentificador de regra atribuído pelo servidor.
labelstringSimNome da regra legível por humanos.
data_typestringSimFamília de métodos à qual esta regra se aplica: credit_card, debit_card, prepaid_card.
priorityintegerSimOrdem de avaliação — corridas mais baixas primeiro, a primeira partida vence (números não negativos)
statusenumeraçãoSimenabled, disabled, draft
is_defaultbooleanSimSe true, esta é a regra alternativa quando nenhuma outra correspondência. Uma regra padrão deve ter não condições e não deve definir ignore_next_rules.
triggerenumeraçãoSimpayment, reject, ou merchant_rule. Consulte Gatilhos.
conditionsarray<Condition>CondicionalCritérios de correspondência, E-combinado. Obrigatório, a menos que is_default = true.
membersarray<Member>CondicionalProvedores ordenados a tentar. Obrigatório para payment; necessário (ou children) para merchant_rule; proibido para reject.
childrenarray<Child>OpcionalBranches filhos ponderados para testes A/B (somente com trigger = merchant_rule).
ignore_next_rulesbooleanSimSe true, pare de avaliar outras regras quando esta corresponder. Proibido para reject e para regras padrão.
created_atcadeia de caracteres (RFC3339)Apenas respostaCarimbo de data e hora de criação.

Gatilhos

triggerSignificadomemberschildrenignore_next_rulesis_default
paymentEncaminhe o pagamento para os provedores listados.Obrigatório (≥1)Não permitidoPermitidoPermitido
rejectBloqueie a transação imediatamente.Não permitidoNão permitidoNão permitidoNão permitido
merchant_ruleGrupo/filial: rota através de membros ou crianças pesadas.Obrigatório se não houver filhosPermitidoPermitidoPermitido

O objeto Condição#

As condições definem o que uma transação deve corresponder. Todas as condições de uma regra são combinadas com AND.

CampoTipoObrigatórioDescrição
idintegerApenas respostaID de condição atribuída pelo servidor.
rule_optionobjectSimO campo a ser correspondido, por exemplo { "id": 5, "label": "currency" }. Utilize uma opção de regra disponível para o lojista; id deve ser > 0.
operatorenumeraçãoSimOperador de comparação. Deve ser válido para essa opção de regra
operandstringCondicionalO(s) valor(es) para comparar, sempre serializado como uma string. O formato depende da operadora. Obrigatório para cada operador exceto is_present, que não aceita operando.
operand_typestringNãovalues (padrão) ou list (o operando faz referência a uma lista personalizada por UUID).
operand_configobjeto | nuloCondicionalUsado quando operand_type = list: { "custom_list": { "field_to_evaluate": "email" } }.
metadata_field_namecadeia | nuloCondicionalObrigatório quando rule_option.id = 16 (metadata). A chave de metadados a ser avaliada.
metadata_field_typecadeia | nuloCondicionalObrigatório quando rule_option.id = 16. Um dos text, numeric.
error_codestringApenas respostaDefinido quando o processamento assíncrono de uma condição (por exemplo, importação de lista) falhou.
error_messagestringApenas respostaDetalhes legíveis por humanos para error_code.

Exemplo – combinar cartões da marca Mastercard

JSON
{
  "rule_option": { "id": 3, "label": "branch" },
  "operator": "in",
  "operand": "mastercard"
}

O objeto Membro#

Os membros são os provedores que uma regra correspondente usa, tentada em sort ordem (a cascata). Um membro faz referência um provedor - um provedor de pagamento, um provedor de fraude, ou um provedor de autenticação.

CampoTipoObrigatórioDescrição
payment_provider_idintegerCondicionalID do provedor de pagamento DEUNA. Obrigatório se merchant_payment_provider_id está presente.
payment_provider_namestringApenas respostaNome do provedor (ecoado de volta).
merchant_payment_provider_idUUIDCondicionalConexão de provedor específica do comerciante. Se enviado, payment_provider_id deve também será enviado.
merchant_payment_provider_namestringApenas respostaNome da conexão (ecoado de volta).
fraud_providerstringCondicionalNome do provedor antifraude/fraude. Mutuamente exclusivos com campos de provedor de pagamento e autenticação.
fraud_provider_idstringApenas respostaID do provedor de fraude (repetido).
authentication_providerstringCondicionalNome do provedor de autenticação (por exemplo UNICO_ID, CYBERSOURCE_3DS). Mutuamente exclusivo com campos de provedor de pagamento e fraude.
authentication_provider_idstringApenas respostaID do provedor de autenticação (ecoado de volta).
authentication_typeenumeraçãoCondicionalO método de autenticação. Um dos 3ds_authentication, 3ds_data_only, unico_id. Obrigatório quando o membro é um provedor de autenticação.
failoverobjeto | nuloOpcionalAutenticação de backup usada quando o provedor principal não está disponível: { "authentication_provider": "...", "authentication_type": "..." }. Válido apenas em membros do provedor de autenticação.
sortintegerSimOrdem em cascata. Deve ser único dentro da regra.
strategyenumeraçãoSimAtualmente apenas cascade.
capabilitiesarray<string>SimCapacidades do provedor para usar, por ex. ["3ds"]. Enviar [] se nenhum.
enabled3dsbooleanNãoSolicite autenticação 3DS neste membro (crie carga útil).
post_authorizationbooleanSimApenas um fraude provedor pode definir true, e deve ser o último membro por sort.
shadow_modebooleanSimAvalie o provedor sem afetar a rota (teste seguro).
enabledbooleanApenas respostaSe o provedor está atualmente disponível para o comerciante.

Exemplo – membro do provedor de pagamento

JSON
{
  "sort": 1,
  "strategy": "cascade",
  "payment_provider_id": 45,
  "merchant_payment_provider_id": "6e4c651a-3e5f-403d-af9d-6a9e9299acb8",
  "capabilities": ["3ds"],
  "post_authorization": false,
  "shadow_mode": false
}

Exemplo – membro provedor de fraude

JSON
{
  "sort": 1,
  "strategy": "cascade",
  "fraud_provider": "CYBERSOURCE",
  "capabilities": [],
  "post_authorization": false,
  "shadow_mode": false
}

Exemplo — membro do provedor de autenticação (com failover)

JSON
{
  "sort": 1,
  "strategy": "cascade",
  "authentication_provider": "CYBERSOURCE_3DS",
  "authentication_type": "3ds_authentication",
  "failover": {
    "authentication_provider": "CYBERSOURCE_3DS",
    "authentication_type": "3ds_data_only"
  },
  "capabilities": [],
  "shadow_mode": false
}

Teste A/B – divida o tráfego entre duas rotas#

Para o teste A/B, adicione dois rotas a uma regra (como children) e dê a cada um uma porcentagem weight. O mecanismo envia essa parcela de transações correspondentes para cada rota — por exemplo, 70% para a Rota A, 30% para a Rota B – para que você possa compará-los no tráfego ao vivo.

CampoTipoObrigatórioDescrição
weightintegerSimPorcentagem de tráfego correspondente enviado para esta rota. Os pesos das duas rotas devem somar 100.
membersarray<Member>SimO(s) provedor(es) para esta rota.

Regras:

  • Exatamente dois routes.
  • weight os valores devem somar 100.
  • A regra deve ser definida ignore_next_rules: true.
  • A tarefa é pegajoso por transaction_id (uma transação sempre obtém a mesma rota), e a rota executada é ecoada de volta no /triggers response.

Exemplo – divisão 70/30

JSON
{
  "label": "A/B test — MXN cards",
  "ignore_next_rules": true,
  "conditions": [
    { "rule_option": { "id": 5, "label": "currency" }, "operator": "in", "operand": "MXN" }
  ],
  "children": [
    {
      "weight": 70,
      "members": [
        { "sort": 1, "strategy": "cascade", "payment_provider_id": 45, "merchant_payment_provider_id": "6e4c651a-3e5f-403d-af9d-6a9e9299acb8" }
      ]
    },
    {
      "weight": 30,
      "members": [
        { "sort": 1, "strategy": "cascade", "payment_provider_id": 52, "merchant_payment_provider_id": "8b3d7c90-1a2b-4c3d-9e0f-5a6b7c8d9e01" }
      ]
    }
  ]
}

Crie uma regra#

POST /routing/v1/rules

O exemplo abaixo cria um merchant_rule para cartões de crédito Mastercard em MXN, executa uma verificação de fraude e depois ramifica por fraud_risk: bloquear highe rota medium/low para a Cybersource.

cURL

curl -X POST 'https://api.sandbox.deuna.io/routing/v1/rules' \
  -H 'X-Api-Key: {{API KEY}}' \
  -H 'X-Idempotency-Key: b3f1c2d4-9a8e-4c11-bb77-2e5f9c74a6b1' \
  -H 'Content-Type: application/json' \
  -d '{
    "label": "MX Mastercard — Cybersource",
    "priority": 2,
    "status": "enabled",
    "trigger": "merchant_rule",
    "is_default": false,
    "data_type": "credit_card",
    "ignore_next_rules": true,
    "conditions": [
      { "rule_option": { "id": 3, "label": "branch" }, "operator": "in", "operand": "mastercard" },
      { "rule_option": { "id": 5, "label": "currency" }, "operator": "in", "operand": "MXN" }
    ],
    "members": [
      { "sort": 1, "strategy": "cascade", "fraud_provider": "CYBERSOURCE" }
    ],
    "children": [
      { "conditions": [ { "rule_option": { "id": 15 }, "operator": "eq", "operand": "high" } ], "members": [] },
      { "conditions": [ { "rule_option": { "id": 15 }, "operator": "eq", "operand": "medium" } ],
        "members": [ { "sort": 1, "strategy": "cascade", "payment_provider_id": 45, "merchant_payment_provider_id": "6e4c651a-3e5f-403d-af9d-6a9e9299acb8", "capabilities": ["3ds"], "enabled3ds": false } ] },
      { "conditions": [ { "rule_option": { "id": 15 }, "operator": "eq", "operand": "low" } ],
        "members": [ { "sort": 1, "strategy": "cascade", "payment_provider_id": 45, "merchant_payment_provider_id": "6e4c651a-3e5f-403d-af9d-6a9e9299acb8", "capabilities": ["3ds"], "enabled3ds": false } ] }
    ]
  }'

Resposta 201

JSON
{
  "id": 21866,
  "label": "MX Mastercard — Cybersource",
  "data_type": "credit_card",
  "priority": 2,
  "status": "enabled",
  "is_default": false,
  "trigger": "merchant_rule",
  "conditions": [
    {
      "id": 44264,
      "rule_option": { "id": 3, "label": "branch" },
      "operator": "in",
      "operand_config": null,
      "operand": "mastercard",
      "operand_type": "values",
      "metadata_field_name": null,
      "metadata_field_type": null,
      "error_code": "",
      "error_message": ""
    },
    {
      "id": 44265,
      "rule_option": { "id": 5, "label": "currency" },
      "operator": "in",
      "operand": "MXN",
      "operand_type": "values"
    }
  ],
  "members": [
    {
      "payment_provider_name": null,
      "merchant_payment_provider_name": null,
      "fraud_provider": "CYBERSOURCE",
      "sort": 1,
      "capabilities": [],
      "strategy": "cascade",
      "post_authorization": false,
      "shadow_mode": false
    }
  ],
  "ignore_next_rules": true,
  "created_at": "2026-07-08T01:07:29.439794Z"
}

Get a rule by ID#

GET /routing/v1/rules/{rule_id}

Retorna uma única regra, incluindo seu conditions, members e qualquer children. rule_id é o identificador numérico.

cURL

curl 'https://api.sandbox.deuna.io/routing/v1/rules/21866' \
  -H 'X-Api-Key: {{API KEY}}'

Resposta 200

JSON
{
  "id": 21866,
  "label": "MX Mastercard — Cybersource",
  "data_type": "credit_card",
  "priority": 2,
  "status": "enabled",
  "is_default": false,
  "trigger": "merchant_rule",
  "conditions": [
    {
      "id": 44269,
      "rule_option": { "id": 3, "label": "branch" },
      "operator": "in",
      "operand": "mastercard",
      "operand_type": "values"
    },
    {
      "id": 44270,
      "rule_option": { "id": 5, "label": "currency" },
      "operator": "in",
      "operand": "MXN",
      "operand_type": "values"
    }
  ],
  "members": [
    {
      "fraud_provider_id": "3",
      "fraud_provider": "CYBERSOURCE",
      "sort": 1,
      "capabilities": [],
      "enabled": true,
      "strategy": "cascade",
      "post_authorization": false,
      "shadow_mode": false
    }
  ],
  "ignore_next_rules": true,
  "created_at": "2026-07-08T01:07:29.439794Z",
  "children": [
    {
      "conditions": [
        { "id": 44271, "rule_option": { "id": 15, "label": "fraud_risk" }, "operator": "eq", "operand": "high", "operand_type": "values" }
      ],
      "members": [],
      "ignore_next_rules": true
    },
    {
      "conditions": [
        { "id": 44272, "rule_option": { "id": 15, "label": "fraud_risk" }, "operator": "eq", "operand": "medium", "operand_type": "values" }
      ],
      "members": [
        {
          "payment_provider_id": 45,
          "payment_provider_name": "cybersource",
          "merchant_payment_provider_id": "6e4c651a-3e5f-403d-af9d-6a9e9299acb8",
          "merchant_payment_provider_name": "Cybersource MX",
          "sort": 1,
          "capabilities": ["3ds"],
          "enabled": true,
          "strategy": "cascade",
          "post_authorization": false,
          "shadow_mode": false
        }
      ],
      "ignore_next_rules": true
    }
  ]
}

Erros: PAYROU-NOT_FOUND (404) se a regra não existir; PAYROU-FORBIDDEN (403) se não estiver acessível; PAYROU-INVALID_PATH_PARAM (400) se rule_id não é um número inteiro válido.


Listar regras#

GET /routing/v1/rules

Regras de devolução para seu comerciante em ordem de prioridade. Os resultados são paginado com um cursor opaco.

Parâmetro de consultaTipoDescrição
limitintegerOpcional. Tamanho da página. Padrão 50, máximo 200.
cursorstringOpcional. Cursor opaco de uma resposta anterior pagination.next_cursor. Omitir na primeira página.
payment_provider_idintegerOpcional. Retorne apenas regras que façam referência a esse provedor de pagamento.

A resposta envolve as regras em um pagination objeto. Continue solicitando com next_cursor enquanto has_more é true.

pagination campoTipoDescrição
next_cursorcadeia | nuloCursor para a próxima página ou null na última página.
has_morebooleantrue se mais regras estiverem disponíveis.
limitintegerO tamanho da página que foi aplicado.

cURL

curl 'https://api.sandbox.deuna.io/routing/v1/rules?limit=50' \
  -H 'X-Api-Key: {{API KEY}}'

Resposta 200

JSON
{
  "merchant_id": "87dd2c00-1f7a-44aa-9e05-34330bab73cc",
  "pagination": {
    "next_cursor": "eyJwcmlvcml0eSI6M30",
    "has_more": true,
    "limit": 50
  },
  "rules": [
    {
      "id": 21873,
      "label": "MX Mastercard — Cybersource",
      "data_type": "credit_card",
      "priority": 2,
      "status": "enabled",
      "is_default": false,
      "trigger": "payment",
      "conditions": [
        { "id": 44274, "rule_option": { "id": 3, "label": "branch" }, "operator": "in", "operand": "mastercard", "operand_type": "values" }
      ],
      "members": [
        {
          "payment_provider_id": 45,
          "payment_provider_name": "cybersource",
          "merchant_payment_provider_id": "6e4c651a-3e5f-403d-af9d-6a9e9299acb8",
          "merchant_payment_provider_name": "Cybersource MX",
          "sort": 1,
          "capabilities": ["3ds"],
          "enabled": true,
          "strategy": "cascade",
          "post_authorization": false,
          "shadow_mode": false
        }
      ],
      "ignore_next_rules": true,
      "created_at": "2026-07-08T01:09:49.553614Z"
    }
  ]
}

Atualizar uma regra#

PUT /routing/v1/rules/{rule_id}

Substituição completa da regra. Envie o corpo completo da regra — a mesma forma que criar — incluindo id e created_at. Uso comum: virar status entre enabled e disabled (é assim que você "retira" uma regra em vez de excluí-la).

cURL — desabilitando uma regra

curl -X PUT 'https://api.sandbox.deuna.io/routing/v1/rules/21866' \
  -H 'X-Api-Key: {{API KEY}}' \
  -H 'X-Idempotency-Key: 7c2e5a19-4b8d-4f10-9a3c-1d2e3f4a5b6c' \
  -H 'Content-Type: application/json' \
  -d '{
    "id": 21866,
    "created_at": "2026-07-08T01:07:29.439794Z",
    "label": "MX Mastercard — Cybersource",
    "priority": 2,
    "status": "disabled",
    "trigger": "merchant_rule",
    "is_default": false,
    "data_type": "credit_card",
    "ignore_next_rules": true,
    "conditions": [
      { "id": 44264, "rule_option": { "id": 3, "label": "branch" }, "operator": "in", "operand": "mastercard", "operand_type": "values" },
      { "id": 44265, "rule_option": { "id": 5, "label": "currency" }, "operator": "in", "operand": "MXN", "operand_type": "values" }
    ],
    "members": [
      { "sort": 1, "strategy": "cascade", "fraud_provider": "CYBERSOURCE", "capabilities": [], "post_authorization": false, "shadow_mode": false }
    ]
  }'

Resposta 200

Retorna a regra atualizada com status agora disabled. Nota: condição ids são reemitidos na atualização.


Alterar a prioridade de uma regra (reordenar)#

PUT /routing/v1/rules/{rule_id}/reorder

Move uma regra para uma nova prioridade. Outras regras são sequenciadas novamente de acordo.

cURL

curl -X PUT 'https://api.sandbox.deuna.io/routing/v1/rules/21873/reorder' \
  -H 'X-Api-Key: sk_sandbox_9f8b2c1a7d4e60b3' \
  -H 'Content-Type: application/json' \
  -d '{ "priority": 2 }'
CampoTipoObrigatórioRestrição
priorityintegerSimNon-negative integer

Resposta 200

JSON
{ "priority": 2 }

Erros: PAYROU-VALIDATION (400) com errors[].code = PRIORITY_OUT_OF_RANGE se priority não é um número inteiro não negativo.


Validações#

Crie e atualize, execute essas verificações. Qualquer falha retorna HTTP 400 com código de nível superior PAYROU-VALIDATION e uma entrada por campo incorreto em errors[] (veja Erros para o envelope e o catálogo completo de códigos em nível de campo).

Nível de regra

  • status deve ser um dos enabled, disabled, draft, process-in-background.
  • trigger deve ser um dos payment, reject, merchant_rule.
  • trigger = payment → pelo menos um membro; sem filhos.
  • trigger = reject → sem membros, sem filhos, ignore_next_rules deve ser falso, is_default deve ser falso.
  • trigger = merchant_rule → pelo menos um membro ou pelo menos um filho.
  • is_default = true → sem condições e ignore_next_rules deve ser falso.
  • is_default = false → pelo menos uma condição.
  • priority deve ser > 0 e ≤ 1000.

Condições

  • rule_option.id obrigatório (> 0); operand obrigatório (não vazio).
  • operator deve ser válido para essa opção de regra (ver catálogo).
  • Um rule_option pode aparecer apenas uma vez por regra (exceto metadata).
  • Para metadata (identificação 16): metadata_field_name e metadata_field_type obrigatório; tipo deve ser text ou numeric.
  • Para operand_type = list: operand deve ser um UUID de lista válido que exista.

Membros

  • Cada membro deve fazer referência a exatamente um tipo de provedor: pagamento, pagamento ao comerciante, fraude ou autenticação.
  • Os tipos de provedores não podem ser misturados em um membro.
  • Se merchant_payment_provider_id está presente, payment_provider_id também deve estar presente.
  • Os membros de autenticação exigem authentication_type (um dos 3ds_authentication, 3ds_data_only, unico_id).
  • failover é válido apenas em membros de autenticação; é authentication_type também deve ser um valor válido.
  • sort deve ser único dentro da regra.
  • Um provedor pode aparecer apenas uma vez por regra.
  • strategy deve ser cascade.
  • post_authorization = true apenas para provedores de fraude, e esse membro deve ser último por sort.

Nível de serviço (verificado em relação à configuração do comerciante)

  • A opção de regra referenciada deve existir e suportar o operador fornecido.
  • O provedor de pagamento/pagamento do comerciante/fraude/autenticação referenciado deve estar habilitado para o comerciante.
  • merchant_payment_provider_id deve pertencer ao dado payment_provider_id.

Erros#

Envelope de erro

Cada resposta de erro usa o mesmo formato JSON:

JSON
{
  "code": "PAYROU-VALIDATION",
  "message": "One or more fields failed validation.",
  "request_id": "req_01J9Z8K7QF3M2N4P5R6S7T8U9V",
  "errors": [
    {
      "field": "members",
      "code": "MEMBERS_REQUIRED",
      "message": "At least one member is required when trigger is 'payment'."
    }
  ]
}
CampoTipoDescrição
codestringCódigo de nível superior estável e legível por máquina. Ramo sobre isto, nunca no message.
messagestringResumo legível por humanos. Pode ser reformulado ou localizado — não o analise.
request_idstringÚnico por resposta e também retornado no X-Request-Id cabeçalho de resposta (em caso de sucesso e erro). Cite-o em qualquer solicitação de suporte.
errorsarrayPresente apenas para PAYROU-VALIDATION. Uma entrada por campo incorreto.
errors[].fieldstringCaminho para o campo, usando notação de ponto/colchete — por exemplo. priority, conditions[1].operand, members[0].sort.
errors[].codestringCódigo estável em nível de campo (consulte códigos de validação).
errors[].messagestringDetalhe legível por humanos. Não analise.

Envie sempre um X-Idempotency-Key em gravações. A repetição da mesma chave retorna a resposta original; reutilizando uma chave com um diferente corpo retorna 409 PAYROU-CONFLICT.

Códigos de status HTTP

EstadoSignificado
200 / 201Success.
400A solicitação é inválida — falha na validação, JSON malformado ou parâmetros de caminho/consulta incorretos.
401Autenticação falhou - o X-Api-Key está faltando ou é inválido.
403Autorização falhou — a chave é válida, mas não tem permissão para acessar este comerciante/recurso.
404A regra ou um recurso referenciado não existe.
409Conflito — reutilização da chave de idempotência com um corpo diferente ou uma atualização simultânea.
429Limite de taxa excedido — tente novamente após o Retry-After header.
500Erro inesperado do servidor.
503Uma dependência downstream está temporariamente indisponível – é seguro tentar novamente com espera.

Códigos de nível superior

CódigoHTTPQuando
PAYROU-VALIDATION400Um ou mais campos falharam na validação. Detalhes em errors[].
PAYROU-MALFORMED_JSON400O corpo da solicitação não é JSON válido.
PAYROU-INVALID_PATH_PARAM400Um parâmetro de caminho é do tipo/formato errado (por exemplo, não inteiro rule_id).
PAYROU-INVALID_QUERY_PARAM400Um parâmetro de consulta é inválido (por exemplo, limit fora de alcance, malformado cursor).
PAYROU-UNAUTHENTICATED401Chave de API ausente ou inválida.
PAYROU-FORBIDDEN403Chave válida, mas sem escopo para este comerciante/recurso.
PAYROU-NOT_FOUND404Regra ou recurso referenciado não encontrado.
PAYROU-CONFLICT409Reutilização de chave de idempotência com uma carga útil diferente ou modificação simultânea.
PAYROU-RATE_LIMITED429Muitos pedidos.
PAYROU-INTERNAL500Erro inesperado do servidor.
PAYROU-UPSTREAM_UNAVAILABLE503Uma dependência downstream está temporariamente indisponível.

Códigos de validação

Devolvido para dentro errors[] quando o código de nível superior é PAYROU-VALIDATION. Cada um é estável e seguro para ramificar.

Nível de regra

codeTípico fieldCausa
INVALID_STATUSstatusNenhum dos enabled, disabled, draft, process-in-background.
INVALID_TRIGGERtriggerNenhum dos payment, reject, merchant_rule.
PRIORITY_OUT_OF_RANGEpriorityNão entre 1 e 1000 (abrange ambos ≤ 0 e > 1000).
MEMBERS_REQUIREDmemberstrigger = payment sem membros.
MEMBERS_OR_CHILDREN_REQUIREDmemberstrigger = merchant_rule sem membros nem filhos.
CONDITIONS_REQUIREDconditionsRegra não padrão sem condições.
TRIGGER_CANNOT_BE_DEFAULTis_defaultreject governar com is_default = true.
TRIGGER_CANNOT_HAVE_MEMBERSmembersreject governar com os membros.
TRIGGER_CANNOT_HAVE_CHILDRENchildrenpayment/reject governar com crianças.
TRIGGER_CANNOT_IGNORE_NEXT_RULESignore_next_rulesreject governar com ignore_next_rules = true.
DEFAULT_RULE_CANNOT_HAVE_CONDITIONSconditionsRegra padrão com condições.
DEFAULT_RULE_CANNOT_IGNORE_NEXT_RULESignore_next_rulesRegra padrão com ignore_next_rules = true.

Condições

codeTípico fieldCausa
RULE_OPTION_ID_REQUIREDconditions[i].rule_option.idFaltando ou ≤ 0.
OPERAND_REQUIREDconditions[i].operandOperando vazio para um operador que requer um.
OPERATOR_REQUIREDconditions[i].operatorO operador está vazio.
INVALID_OPERATORconditions[i].operatorOperador não válido para essa opção de regra.
DUPLICATE_RULE_OPTIONconditions[i].rule_optionA mesma opção de regra usada mais de uma vez (exceto metadata).
METADATA_FIELDS_REQUIREDconditions[i].metadata_field_namemetadata condição ausente metadata_field_name/metadata_field_type.
INVALID_METADATA_FIELD_TYPEconditions[i].metadata_field_typeNão text ou numeric.
RULE_OPTION_NOT_FOUNDconditions[i].rule_option.idA opção de regra não existe.
INVALID_LIST_REFERENCEconditions[i].operandoperand_type = list mas o UUID da lista é inválido ou não foi encontrado.

Membros

codeTípico fieldCausa
MEMBER_PROVIDER_REQUIREDmembers[i]O membro não faz referência a nenhum provedor (pagamento, fraude ou autenticação).
MEMBER_MULTIPLE_PROVIDER_TYPESmembers[i]O membro combina tipos de provedores (por exemplo, pagamento + fraude ou pagamento + autenticação).
PAYMENT_PROVIDER_ID_REQUIREDmembers[i].payment_provider_idmerchant_payment_provider_id enviado sem payment_provider_id.
AUTHENTICATION_TYPE_REQUIREDmembers[i].authentication_typeMembro de autenticação sem um authentication_type.
INVALID_AUTHENTICATION_TYPEmembers[i].authentication_typeNenhum dos 3ds_authentication, 3ds_data_only, unico_id (aplica-se a failover.authentication_type também).
FAILOVER_ONLY_ON_AUTHENTICATIONmembers[i].failoverfailover definido em um membro sem autenticação.
DUPLICATE_MEMBERmembers[i]O mesmo provedor aparece mais de uma vez na regra.
DUPLICATE_MEMBER_SORTmembers[i].sortDois membros compartilham um sort value.
INVALID_STRATEGYmembers[i].strategyNão cascade.
POST_AUTH_ONLY_FRAUDmembers[i].post_authorizationpost_authorization = true em um membro não fraudulento.
POST_AUTH_MUST_BE_LASTmembers[i].post_authorizationO post_authorization membro não é o último por sort.
PROVIDER_NOT_AVAILABLEmembers[i]O provedor (pagamento, fraude ou autenticação) não está habilitado para este comerciante.
MERCHANT_PROVIDER_MISMATCHmembers[i].merchant_payment_provider_idA conexão não pertence ao dado payment_provider_id.

Teste A/B

codeTípico fieldCausa
SPLIT_WEIGHTS_MUST_SUM_TO_100childrenCriança weight os valores não somam 100.

Fluxo de ponta a ponta#

O /triggers suporte de endpoint dois modos de integração - escolha o que melhor se adequa à quantidade de lógica de decisão que você deseja possuir. Ambos usam o mesmo endpoint e as mesmas regras; apenas o formato da resposta e o número de chamadas diferem. Selecione-o com mode a pedido (single é o padrão). De qualquer forma, você fecha o ciclo com um /feedback call.

ModoComo funcionaMelhor quando
1 · Chamada única (orientado para o cliente)Um /triggers chamada retorna o plano completo — a autenticação a ser executada (com failover) e o actions que mapeiam cada resultado para processo ou declínio. Você mesmo executa o plano.Você deseja o menor número de viagens de ida e volta e se sente confortável em aplicar a decisão localmente.
2 · Guiado (motorizado)Você liga /triggers e o motor retorna apenas o próxima etapa mais um status. Você executa e depois liga /triggers novamente com o resultado dessa etapa; o motor retorna para a próxima etapa. Repita até status = completed.Você deseja que a DEUNA possua e centralize a lógica de decisão, passo a passo.

Modo 1 – chamada única

Você faz um solteiro /triggers ligue. Se você administra um provedor de fraude antes da DEUNA, inclua seu resultado nessa chamada. A resposta é independente: ela nomeia a autenticação a ser executada (com um failover se o primário não estiver disponível) e o ações que mapeiam o resultado da autenticação para o que fazer a seguir — processo com um provedor de pagamento ou declínio. Sua plataforma executa esse plano localmente e fecha o ciclo com um /feedback ligue - há nenhum segundo /triggers round-trip.

Passo a passo

  1. (Opcional) Pontue com um provedor de fraude. Se sua configuração usa um provedor de fraude antecipadamente, capture sua pontuação/decisão para que possa ser correspondida por regras (por meio do fraud_risk opção ou metadata).
  2. Solicite a recomendação (uma ligação). POST /routing/v1/triggers com os dados da transação (e o resultado da fraude, se houver). A resposta contém uma authentication bloco (primary + opcional failover) e um actions block.
  3. Authenticate. Execute a autenticação recomendada (por exemplo, Autenticação 3DS, Somente dados 3DS ou ID Unico). Se o primary provedor não está disponível, use o failover.
  4. Decida e processe. Aplicar actions: cada resultado é mapeado para process (com o provedor de pagamento mencionado na ação) ou decline; o default a ação se aplica quando nenhum outro resultado corresponde.
  5. Relate o resultado. POST /routing/v1/feedback com o collection objeto e o attempts (resultado da autenticação + resultado do pagamento). Isso fecha o ciclo para análises e rotulagem de ML.

Os comerciantes com um único provedor de pagamento verão um provedor no process ação; lojistas com vários podem configurar uma cascata na regra members, e a recomendação reflete o(s) provedor(es) a ser(em) tentado(s).

Diagrama de sequência
1Your platform2Fraud provider3DEUNA RecommendationEnginescore request (if used)score + decisionOne POST /routing/v1/triggers (txndata + fraud result)recommendation (auth route + failover+ actions)Run recommended auth use failover ifprimary downApply actions - process with paymentprovider, or declineTwo POST /routing/v1/feedback (authresult + payment result)200 OK (outcome recorded, predictionML labeled)
Comerciante ou clienteProvedor ou processadorDEUNA

Resposta do Modo 1 – o plano completo

O /triggers resposta é uma recomendação única e independente: a authentication para executar (com um opcional failover) e o actions que mapeiam o resultado da autenticação para o que fazer. Sua plataforma executa isso localmente.

JSON
{
  "collection": {
    "id": "c7b9e3a2-4d51-4f8a-9b21-6e0f2a1c8d34",
    "prediction_id": "pred_xyz789abc"
  },
  "recommendation": {
    "rule_id": 21866,
    "rule_label": "High risk → 3DS authentication",
    "authentication": {
      "primary":  { "authentication_type": "3ds_authentication" },
      "failover": { "authentication_type": "3ds_data_only" }
    },
    "actions": {
      "on_success_with_liability_shift": { "action": "process", "provider": "acquirer_gateway" },
      "default": { "action": "decline" }
    }
  }
}
CampoTipoDescrição
collection.idUUIDID de correlação para esta avaliação. Ecoe /feedback.
collection.prediction_idstringIdentificador de ML para a recomendação. Ecoe /feedback.
recommendation.rule_idintegerA regra que correspondeu (mesmo identificador do objeto de regra id).
recommendation.rule_labelstringNome da regra legível por humanos.
recommendation.authentication.primaryobjectA autenticação a ser executada primeiro: { "authentication_type": "3ds_authentication" }. Usa o mesmo authentication_type valores como membros da regra.
recommendation.authentication.failoverobjeto | nuloAutenticação de backup se o primário não estiver disponível.
recommendation.actionsobjectMapeia o resultado da autenticação para uma ação. Chaveado por resultado.
recommendation.actions.<outcome>.actionenumeraçãoprocess ou decline.
recommendation.actions.<outcome>.providerstringPresente quando action = process — o nome do provedor de pagamento a ser usado, conforme configurado na sua regra (por exemplo, acquirer_gateway).
recommendation.actions.defaultobjectA ação de fallback é aplicada quando nenhuma outra chave de resultado corresponde.

Chaves de resultados abaixo actions descreva o resultado da autenticação ao qual eles se aplicam (por exemplo, on_success_with_liability_shift); default é o resumo.

Modo 2 – guiado (passo a passo)

Configure "mode": "guided" no pedido. Em vez do plano completo, o mecanismo retorna o próxima etapa e um status, e você conduz o fluxo uma etapa de cada vez:

  • status: awaiting_authentication → next_step informa qual autenticação executar.
  • status: awaiting_fraud → next_step informa qual verificação de fraude executar.
  • status: completed → o motor decidiu; next_step.action é process (com um provider) ou decline.

Depois de executar uma etapa, chame /triggers novamente - eco the collection da resposta anterior e inclua o resultado dessa etapa (authentication_result ou fraud_result). O motor avança e retorna para a próxima etapa. Repita até status = completed, então feche com /feedback.

Diagrama de sequência
1Your platform(merchant / PSP)2DEUNA RecommendationEnginePOST /routing/v1/triggers(mode=guided, txn data)status=awaiting_authentication ·next_step: run 3ds_authenticationRun 3DS authenticationPOST /routing/v1/triggers (collection+ authentication_result)status=completed · next_step: processwith acquirer_gatewayProcess the paymentPOST /routing/v1/feedback (attempts)200 OK
Comerciante ou clienteDEUNA

Primeira resposta - uma etapa a ser executada

JSON
{
  "collection": { "id": "c7b9e3a2-4d51-4f8a-9b21-6e0f2a1c8d34", "prediction_id": "pred_xyz789abc" },
  "recommendation": {
    "rule_id": 21866,
    "status": "awaiting_authentication",
    "next_step": {
      "type": "authentication",
      "authentication_type": "3ds_authentication",
      "failover": { "authentication_type": "3ds_data_only" }
    }
  }
}

Solicitação de acompanhamento – poste o resultado da etapa

JSON
{
  "mode": "guided",
  "collection": { "id": "c7b9e3a2-4d51-4f8a-9b21-6e0f2a1c8d34", "prediction_id": "pred_xyz789abc" },
  "authentication_result": { "eci": "05", "pares_status": "Y", "liability_shift": true }
}

Resposta ao terminal — status = completed

JSON
{
  "collection": { "id": "c7b9e3a2-4d51-4f8a-9b21-6e0f2a1c8d34", "prediction_id": "pred_xyz789abc" },
  "recommendation": {
    "rule_id": 21866,
    "status": "completed",
    "next_step": { "type": "process", "provider": "acquirer_gateway" }
  }
}
CampoTipoDescrição
modeenumeraçãoCampo de solicitação: single (padrão) ou guided.
collectionobjectCampo de solicitação em chamadas guiadas de acompanhamento: ecoe o collection da resposta anterior para continuar a mesma avaliação.
authentication_result / fraud_resultobjectCampo de solicitação: o resultado da etapa que você acabou de realizar.
recommendation.statusenumeraçãoawaiting_authentication, awaiting_fraud, ou completed.
recommendation.next_step.typeenumeraçãoauthentication, fraud, process, ou decline.
recommendation.next_step.authentication_typeenumeraçãoPresente quando type = authentication.
recommendation.next_step.failoverobjeto | nuloBackup opcional para uma etapa de autenticação.
recommendation.next_step.providerstringPresente quando type = process — o provedor de pagamento a ser usado.

Ambos os modos são apoiados pelas mesmas regras e produzem as mesmas decisões – o modo guiado simplesmente pede à DEUNA um passo de cada vez, em vez de devolver todo o plano antecipadamente.

Identificação do cartão ativada /triggers

O cartão em payment_source.card_info pode ser fornecido uma das três maneiras:

MétodoCamposNotas
PAN completocard_numberBIN e marca são derivados do lado do servidor.
BIN + últimos quatrobin (8 dígitos), last_fourUse quando você não transmite o PAN completo. BIN de 8 dígitos fornece roteamento em nível de emissor.
Token de redenetwork_token: { dpan, par, account_bin, cryptogram, eci }Para credenciais tokenizadas. Veja a nota abaixo sobre como obter dados em nível BIN.

Comentários attempts exemplo

attempts relata o que realmente aconteceu: o resultado da autenticação e, em seguida, o resultado do pagamento do seu provedor de pagamento (códigos ISO 8583).

JSON
{
  "collection": { "id": "c7b9e3a2-4d51-4f8a-9b21-6e0f2a1c8d34", "prediction_id": "pred_xyz789abc" },
  "transaction_id": "1b3d5f7a-8c9e-40a2-b1c3-d4e5f6a7b8c9",
  "attempts": [
    {
      "step": "authentication",
      "authentication_type": "3ds_authentication",
      "result": { "eci": "05", "pares_status": "Y", "liability_shift": true }
    },
    {
      "step": "payment",
      "provider": "acquirer_gateway",
      "result": { "status": "declined", "error_code": "05", "error_reason": "do_not_honor" }
    }
  ]
}

error_code usa códigos de resposta ISO 8583 – por ex. "05" = não honre. eci e pares_status carregue o resultado 3DS; liability_shift indica se a autenticação mudou a responsabilidade.

Autenticação de backup (failover)

As regras podem definir um failover provedor de autenticação. Se o recomendado primary provedor não está disponível (por exemplo, o provedor de autenticação 3DS está inativo), a recomendação retorna o failover (por exemplo, somente dados 3DS) para que uma interrupção do provedor nunca deixe uma transação não autenticada.


Dúvidas ou detalhes faltando? Contate sua equipe de integração DEUNA.