Saltar al contenido principal
En esta página
Ejemplo interactivoUsa datos de ejemplo y no realiza solicitudes de API.
Producción
Estrategias de pago

Motor de recomendación

Define la ruta ordenada de proveedores evaluada para una regla coincidente.

Acme LATAM · Producción
ConfiguraciónMotor de recomendación
Activa
01AdyenRuta principal
02WorldpayRuta de respaldo
03StripeRuta de respaldo
EnrutamientoAdyen → Worldpay → Stripe

Autenticación#

Todos los puntos finales se autentican con un Clave API enviado en el X-Api-Key encabezado: este es el único esquema de autenticación admitido. Su comerciante se resuelve desde la clave API, por lo que el identificador de comerciante no no aparecen en la URL.

HTTP
X-Api-Key: {{DEUNA's API Key}}
X-Idempotency-Key: {{UUID v4}}
Content-Type: application/json
encabezadoRequeridoDescripción
X-Api-KeySíSu clave API. Determina el entorno y el ámbito comercial.
Content-TypeSíapplication/json.
X-Idempotency-KeyRecomendadoUna clave única que genera por solicitud lógica (un UUID funciona bien). Reintentar con la misma clave devuelve el resultado original en lugar de aplicar la operación dos veces; envíela para que los reintentos de la red nunca creen reglas duplicadas ni cuenten dos veces una acción.

Resumen de puntos finales#

MétodoRutaPropósito
GET/routing/v1/rulesListar todas las reglas (orden de prioridad)
POST/routing/v1/rulesCrear una regla
GET/routing/v1/rules/{rule_id}Get a single rule by ID
PUT/routing/v1/rules/{rule_id}Actualizar una regla (reemplazo completo)
PUT/routing/v1/rules/{rule_id}/reorderCambiar la prioridad de una regla

Parámetros de ruta:

ParámetroTipoNotas
rule_idintegerIdentificador de regla numérico devuelto por create/list.

El objeto de regla#

Una regla es el recurso principal devuelto y aceptado por estos puntos finales.

CampoTipoRequeridoDescripción
idintegerSólo respuestaIdentificador de regla asignado por el servidor.
labelstringSíNombre de regla legible por humanos.
data_typestringSíFamilia de métodos a los que se aplica esta regla: credit_card, debit_card, prepaid_card.
priorityintegerSíOrden de evaluación — Las carreras más bajas primero, el primer partido gana. (números no negativos)
statusEnumeraciónSíenabled, disabled, draft
is_defaultbooleanSísi true, esta es la regla alternativa cuando no hay otras coincidencias. Una regla predeterminada debe tener no condiciones y no debe establecer ignore_next_rules.
triggerEnumeraciónSípayment, rejecto merchant_rule. Ver Desencadenantes.
conditionsarray<Condition>CondicionalCriterios de coincidencia, Y combinado. Requerido a menos que is_default = true.
membersarray<Member>CondicionalOrdenó a los proveedores que lo intentaran. Requerido para payment; requerido (o children) para merchant_rule; prohibido para reject.
childrenarray<Child>OpcionalRamas secundarias ponderadas para pruebas A/B (solo con trigger = merchant_rule).
ignore_next_rulesbooleanSísi true, deje de evaluar más reglas una vez que ésta coincida. Prohibido para reject y para reglas predeterminadas.
created_atcadena (RFC3339)Sólo respuestaMarca de tiempo de creación.

Desencadenantes

triggerSignificadomemberschildrenignore_next_rulesis_default
paymentEnrute el pago a los proveedores enumerados.Requerido (≥1)No permitidoPermitidoPermitido
rejectBloquee la transacción por completo.No permitidoNo permitidoNo permitidoNo permitido
merchant_ruleGrupo/rama: ruta a través de miembros o niños ponderados.Requerido si no hay niñosPermitidoPermitidoPermitido

El objeto de condición#

Las condiciones definen lo que debe coincidir con una transacción. Todas las condiciones de una regla se combinan con AND.

CampoTipoRequeridoDescripción
idintegerSólo respuestaID de condición asignada por el servidor.
rule_optionobjectSíEl campo a coincidir, por ejemplo. { "id": 5, "label": "currency" }. Utilice una opción de regla disponible para el comerciante; id debe ser > 0.
operatorEnumeraciónSíOperador de comparación. Debe ser válido para esa opción de regla
operandstringCondicionalLos valores con los que comparar, siempre serializado como una cadena. El formato depende del operador. Requerido para cada operador excepto is_present, que no requiere operando.
operand_typestringNovalues (predeterminado) o list (El operando hace referencia a una lista personalizada por UUID).
operand_configobjeto | nuloCondicionalUsado cuando operand_type = list: { "custom_list": { "field_to_evaluate": "email" } }.
metadata_field_namecadena | nuloCondicionalRequerido cuando rule_option.id = 16 (metadata). La clave de metadatos a evaluar.
metadata_field_typecadena | nuloCondicionalRequerido cuando rule_option.id = 16. uno de text, numeric.
error_codestringSólo respuestaSe establece cuando falla el procesamiento asíncrono de una condición (por ejemplo, importación de lista).
error_messagestringSólo respuestaDetalles legibles por humanos para error_code.

Ejemplo: igualar tarjetas de la marca Mastercard

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

El objeto miembro#

Los miembros son los proveedores que utiliza una regla coincidente, intentada en sort orden (la cascada). Un miembro hace referencia uno proveedor - un proveedor de pago, un proveedor de fraude, o un proveedor de autenticación.

CampoTipoRequeridoDescripción
payment_provider_idintegerCondicionalID del proveedor de pagos DEUNA. Requerido si merchant_payment_provider_id está presente.
payment_provider_namestringSólo respuestaNombre del proveedor (repetido).
merchant_payment_provider_idUUIDCondicionalConexión de proveedor específica del comerciante. Si se envía, payment_provider_id debe También se enviará.
merchant_payment_provider_namestringSólo respuestaNombre de la conexión (repetido).
fraud_providerstringCondicionalNombre del proveedor de fraude/antifraude. Mutuamente excluyentes con los campos de proveedor de pago y autenticación.
fraud_provider_idstringSólo respuestaID del proveedor fraudulento (repetido).
authentication_providerstringCondicionalNombre del proveedor de autenticación (p. ej. UNICO_ID, CYBERSOURCE_3DS). Se excluyen mutuamente con los campos de proveedores de pago y fraude.
authentication_provider_idstringSólo respuestaID del proveedor de autenticación (repetido).
authentication_typeEnumeraciónCondicionalEl método de autenticación. uno de 3ds_authentication, 3ds_data_only, unico_id. Requerido cuando el miembro es un proveedor de autenticación.
failoverobjeto | nuloOpcionalAutenticación de respaldo utilizada cuando el proveedor principal no está disponible: { "authentication_provider": "...", "authentication_type": "..." }. Válido solo en los miembros del proveedor de autenticación.
sortintegerSíOrden en cascada. debe ser único dentro de la regla.
strategyEnumeraciónSíActualmente solo cascade.
capabilitiesarray<string>SíCapacidades del proveedor a utilizar, p. ["3ds"]. enviar [] si ninguno.
enabled3dsbooleanNoSolicite autenticación 3DS en este miembro (crear carga útil).
post_authorizationbooleanSíSólo un fraude el proveedor puede establecer true, y debe ser el último miembro por sort.
shadow_modebooleanSíEvaluar al proveedor sin afectar la ruta (prueba segura).
enabledbooleanSólo respuestaSi el proveedor está actualmente disponible para el comerciante.

Ejemplo: miembro proveedor de pagos

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
}

Ejemplo: miembro proveedor fraudulento

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

Ejemplo: miembro del proveedor de autenticación (con conmutación por error)

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
}

Pruebas A/B: divide el tráfico entre dos rutas#

Para la prueba A/B, agregue dos rutas a una regla (como children) y dale a cada uno un porcentaje weight. El motor envía esa parte de las transacciones coincidentes a cada ruta, p. 70% a la Ruta A, 30% a la Ruta B - para que puedas compararlos en el tráfico en vivo.

CampoTipoRequeridoDescripción
weightintegerSíPorcentaje de tráfico coincidente enviado a esta ruta. Los pesos de las dos rutas deben sumar 100.
membersarray<Member>SíLos proveedores de esta ruta.

Reglas:

  • exactamente dos routes.
  • weight los valores deben sumar 100.
  • La regla debe establecer ignore_next_rules: true.
  • La tarea es pegajoso por transaction_id (una transacción siempre obtiene la misma ruta), y la ruta que se ejecutó se repite en el /triggers response.

Ejemplo: división 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" }
      ]
    }
  ]
}

Crear una regla#

POST /routing/v1/rules

El siguiente ejemplo crea una merchant_rule para tarjetas de crédito Mastercard en MXN, realiza una verificación de fraude y luego sucursales por fraud_risk: bloquear highy ruta medium/low 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 } ] }
    ]
  }'

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

Devuelve una única regla, incluida su conditions, members y cualquier children. rule_id es el identificador numérico.

cURL

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

Respuesta 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
    }
  ]
}

Errores: PAYROU-NOT_FOUND (404) si la regla no existe; PAYROU-FORBIDDEN (403) si no es accesible; PAYROU-INVALID_PATH_PARAM (400) si rule_id no es un número entero válido.


Lista de reglas#

GET /routing/v1/rules

Reglas de devoluciones para su comerciante en orden de prioridad. Los resultados son paginado con un cursor opaco.

parámetro de consultaTipoDescripción
limitintegerOpcional. Tamaño de página. Predeterminado 50, máximo 200.
cursorstringOpcional. Cursor opaco de una respuesta anterior pagination.next_cursor. Omitir para la primera página.
payment_provider_idintegerOpcional. Devuelva solo reglas que hagan referencia a este proveedor de pagos.

La respuesta envuelve las reglas en un pagination objeto. Sigue solicitando con next_cursor mientras has_more es true.

pagination campoTipoDescripción
next_cursorcadena | nuloCursor para la página siguiente, o null en la última página.
has_morebooleantrue si hay más reglas disponibles.
limitintegerEl tamaño de página que se aplicó.

cURL

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

Respuesta 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"
    }
  ]
}

Actualizar una regla#

PUT /routing/v1/rules/{rule_id}

Reemplazo completo de la regla. Envíe el cuerpo de regla completo (la misma forma que creó), incluido id y created_at. Uso común: voltear status entre enabled y disabled (Así es como se "retira" una regla en lugar de eliminarla).

cURL: deshabilitar una regla

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 }
    ]
  }'

Respuesta 200

Devuelve la regla actualizada con status ahora disabled. Nota: condición idLos s se vuelven a publicar en el momento de la actualización.


Cambiar la prioridad de una regla (reordenar)#

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

Mueve una regla a una nueva prioridad. Otras reglas se vuelven a secuenciar en consecuencia.

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 }'
CampoTipoRequeridoRestricción
priorityintegerSíNon-negative integer

Respuesta 200

JSON
{ "priority": 2 }

Errores: PAYROU-VALIDATION (400) con errors[].code = PRIORITY_OUT_OF_RANGE si priority no es un número entero no negativo.


Validaciones#

Cree y actualice ejecute estas comprobaciones. Cualquier error devuelve HTTP 400 con código de nivel superior PAYROU-VALIDATION y una entrada por campo infractor en errors[] (ver Errores para el sobre y el catálogo completo de códigos a nivel de campo).

Nivel de regla

  • status debe ser uno de enabled, disabled, draft, process-in-background.
  • trigger debe ser uno de payment, reject, merchant_rule.
  • trigger = payment → al menos un miembro; sin hijos.
  • trigger = reject → sin miembros, sin hijos, ignore_next_rules debe ser falso, is_default debe ser falso.
  • trigger = merchant_rule → al menos un miembro o al menos un hijo.
  • is_default = true → sin condiciones y ignore_next_rules debe ser falso.
  • is_default = false → al menos una condición.
  • priority debe ser > 0 y ≤ 1000.

Condiciones

  • rule_option.id requerido (> 0); operand requerido (no vacío).
  • operator debe ser válido para esa opción de regla (ver catálogo).
  • un rule_option puede aparecer sólo una vez por regla (excepto metadata).
  • para metadata (identificación 16): metadata_field_name y metadata_field_type requerido; el tipo debe ser text o numeric.
  • para operand_type = list: operand debe ser un UUID de lista válido que exista.

Miembros

  • Cada miembro debe hacer referencia exactamente a un tipo de proveedor: pago, pago a comerciantes, fraude o autenticación.
  • Los tipos de proveedores no se pueden mezclar en un solo miembro.
  • si merchant_payment_provider_id está presente, payment_provider_id también debe estar presente.
  • Los miembros de autenticación requieren authentication_type (uno de 3ds_authentication, 3ds_data_only, unico_id).
  • failover es valido solo sobre miembros de autenticación; es authentication_type también debe ser un valor válido.
  • sort debe ser único dentro de la regla.
  • Un proveedor puede aparecer sólo una vez por regla.
  • strategy debe ser cascade.
  • post_authorization = true solo para proveedores fraudulentos, y ese miembro debe ser último por sort.

Nivel de servicio (comprobado con la configuración del comerciante)

  • La opción de regla a la que se hace referencia debe existir y ser compatible con el operador determinado.
  • El proveedor de pago/pago-comerciante/fraude/autenticación al que se hace referencia debe estar habilitado para el comerciante.
  • merchant_payment_provider_id debe pertenecer a lo dado payment_provider_id.

Errores#

Sobre de error

Cada respuesta de error utiliza la misma forma 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'."
    }
  ]
}
CampoTipoDescripción
codestringCódigo de nivel superior estable y legible por máquina. Rama en esto, nunca en message.
messagestringResumen legible por humanos. Puede reformularse o localizarse; no lo analice.
request_idstringÚnico por respuesta y también devuelto en el X-Request-Id encabezado de respuesta (en caso de éxito y error). Cítelo en cualquier solicitud de soporte.
errorsarrayPresente sólo para PAYROU-VALIDATION. Una entrada por campo infractor.
errors[].fieldstringRuta al campo, usando notación de punto/corchete, p.e. priority, conditions[1].operand, members[0].sort.
errors[].codestringCódigo estable a nivel de campo (ver códigos de validación).
errors[].messagestringDetalle legible por humanos. No analizar.

Siempre envía un X-Idempotency-Key en escribe. Al reproducir la misma clave se devuelve la respuesta original; reutilizar una llave con un diferente el cuerpo regresa 409 PAYROU-CONFLICT.

Códigos de estado HTTP

EstadoSignificado
200 / 201Success.
400La solicitud no es válida: error de validación, JSON con formato incorrecto o parámetros de consulta/ruta incorrectos.
401Autenticación falló - el X-Api-Key falta o no es válido.
403Autorización fallido: la clave es válida pero no se le permite acceder a este comerciante/recurso.
404La regla o un recurso al que se hace referencia no existe.
409Conflicto: reutilización de claves de idempotencia con un cuerpo diferente o una actualización simultánea.
429Límite de velocidad excedido: vuelva a intentarlo después del Retry-After header.
500Error inesperado del servidor.
503Una dependencia descendente no está disponible temporalmente; es seguro volver a intentarlo con una pausa.

Códigos de nivel superior

CódigoHTTPcuando
PAYROU-VALIDATION400Uno o más campos no superaron la validación. Detalles en errors[].
PAYROU-MALFORMED_JSON400El cuerpo de la solicitud no es JSON válido.
PAYROU-INVALID_PATH_PARAM400Un parámetro de ruta es del tipo/formato incorrecto (por ejemplo, no entero rule_id).
PAYROU-INVALID_QUERY_PARAM400Un parámetro de consulta no es válido (p. ej. limit fuera de rango, mal formado cursor).
PAYROU-UNAUTHENTICATED401Clave API faltante o no válida.
PAYROU-FORBIDDEN403Clave válida, pero no vinculada a este comerciante/recurso.
PAYROU-NOT_FOUND404No se encontró la regla o el recurso al que se hace referencia.
PAYROU-CONFLICT409Reutilización de claves de idempotencia con una carga útil diferente o modificación simultánea.
PAYROU-RATE_LIMITED429Demasiadas solicitudes.
PAYROU-INTERNAL500Error inesperado del servidor.
PAYROU-UPSTREAM_UNAVAILABLE503Una dependencia descendente no está disponible temporalmente.

Códigos de validación

Regresado adentro errors[] cuando el código de nivel superior es PAYROU-VALIDATION. Cada uno es estable y seguro para ramificarse.

Nivel de regla

codeTípico fieldcausa
INVALID_STATUSstatusNinguno de enabled, disabled, draft, process-in-background.
INVALID_TRIGGERtriggerNinguno de payment, reject, merchant_rule.
PRIORITY_OUT_OF_RANGEpriorityno entre 1 y 1000 (cubre ambos ≤ 0 y > 1000).
MEMBERS_REQUIREDmemberstrigger = payment sin miembros.
MEMBERS_OR_CHILDREN_REQUIREDmemberstrigger = merchant_rule sin miembros ni hijos.
CONDITIONS_REQUIREDconditionsRegla no predeterminada sin condiciones.
TRIGGER_CANNOT_BE_DEFAULTis_defaultreject gobernar con is_default = true.
TRIGGER_CANNOT_HAVE_MEMBERSmembersreject gobernar con los miembros.
TRIGGER_CANNOT_HAVE_CHILDRENchildrenpayment/reject gobernar con los niños.
TRIGGER_CANNOT_IGNORE_NEXT_RULESignore_next_rulesreject gobernar con ignore_next_rules = true.
DEFAULT_RULE_CANNOT_HAVE_CONDITIONSconditionsRegla predeterminada con condiciones.
DEFAULT_RULE_CANNOT_IGNORE_NEXT_RULESignore_next_rulesRegla predeterminada con ignore_next_rules = true.

Condiciones

codeTípico fieldcausa
RULE_OPTION_ID_REQUIREDconditions[i].rule_option.idDesaparecido o ≤ 0.
OPERAND_REQUIREDconditions[i].operandOperando vacío para un operador que lo requiere.
OPERATOR_REQUIREDconditions[i].operatorEl operador está vacío.
INVALID_OPERATORconditions[i].operatorOperador no válido para esa opción de regla.
DUPLICATE_RULE_OPTIONconditions[i].rule_optionLa misma opción de regla se usa más de una vez (excepto metadata).
METADATA_FIELDS_REQUIREDconditions[i].metadata_field_namemetadata falta la condición metadata_field_name/metadata_field_type.
INVALID_METADATA_FIELD_TYPEconditions[i].metadata_field_typeno text o numeric.
RULE_OPTION_NOT_FOUNDconditions[i].rule_option.idLa opción de regla no existe.
INVALID_LIST_REFERENCEconditions[i].operandoperand_type = list pero el UUID de la lista no es válido o no se encuentra.

Miembros

codeTípico fieldcausa
MEMBER_PROVIDER_REQUIREDmembers[i]El miembro no hace referencia a ningún proveedor (pago, fraude o autenticación).
MEMBER_MULTIPLE_PROVIDER_TYPESmembers[i]El miembro combina tipos de proveedores (por ejemplo, pago + fraude o pago + autenticación).
PAYMENT_PROVIDER_ID_REQUIREDmembers[i].payment_provider_idmerchant_payment_provider_id enviado sin payment_provider_id.
AUTHENTICATION_TYPE_REQUIREDmembers[i].authentication_typeMiembro de autenticación sin authentication_type.
INVALID_AUTHENTICATION_TYPEmembers[i].authentication_typeNinguno de 3ds_authentication, 3ds_data_only, unico_id (se aplica a failover.authentication_type también).
FAILOVER_ONLY_ON_AUTHENTICATIONmembers[i].failoverfailover establecido en un miembro sin autenticación.
DUPLICATE_MEMBERmembers[i]El mismo proveedor aparece más de una vez en la regla.
DUPLICATE_MEMBER_SORTmembers[i].sortDos miembros comparten un sort value.
INVALID_STRATEGYmembers[i].strategyno cascade.
POST_AUTH_ONLY_FRAUDmembers[i].post_authorizationpost_authorization = true en un miembro no fraudulento.
POST_AUTH_MUST_BE_LASTmembers[i].post_authorizationEl post_authorization el miembro no es el último en sort.
PROVIDER_NOT_AVAILABLEmembers[i]El proveedor (pago, fraude o autenticación) no está habilitado para este comerciante.
MERCHANT_PROVIDER_MISMATCHmembers[i].merchant_payment_provider_idLa conexión no pertenece a lo dado. payment_provider_id.

Pruebas A/B

codeTípico fieldcausa
SPLIT_WEIGHTS_MUST_SUM_TO_100childrenniño weight los valores no suman 100.

Flujo de extremo a extremo#

El /triggers soportes de punto final dos modos de integración – elija lo que se ajuste a la cantidad de lógica de decisión que desea poseer. Ambos utilizan el mismo punto final y las mismas reglas; sólo difieren la forma de respuesta y el número de llamadas. Selecciónelo con mode en la solicitud (single es el valor predeterminado). De cualquier manera, cierras el ciclo con uno /feedback call.

ModoCómo funciona¿Cuándo es lo mejor?
1 · Llamada única (impulsado por el cliente)uno /triggers la llamada devuelve el plan completo — la autenticación a ejecutar (con conmutación por error) y el actions que asignan cada resultado a proceso o declive. Tú mismo ejecutas el plan.Quiere realizar el menor número de viajes de ida y vuelta y se siente cómodo aplicando la decisión localmente.
2 · Guiado (impulsado por motor)tu llamas /triggers y el motor devuelve sólo el siguiente paso más un status. Lo realizas y luego llamas. /triggers nuevamente con el resultado de ese paso; el motor regresa al siguiente paso. Repita hasta status = completed.Quiere que DEUNA se apropie y centralice la lógica de decisión, paso a paso.

Modo 1: llamada única

haces un soltero /triggers llamar. Si ejecuta un proveedor de fraude ante la DEUNA, incluya su resultado en esa llamada. La respuesta es autocontenida: nombra la autenticación a ejecutar (con un conmutación por error si el principal no está disponible) y el acciones que asignan el resultado de la autenticación a qué hacer a continuación: proceso con un proveedor de pagos o declive. Su plataforma ejecuta ese plan localmente y cierra el ciclo con uno /feedback llamar - hay no second /triggers round-trip.

paso a paso

  1. (Opcional) Califique con un proveedor de fraude. Si su configuración utiliza un proveedor de fraude desde el principio, capture su puntuación/decisión para que pueda coincidir con las reglas (a través de fraud_risk opción o metadata).
  2. Solicitar la recomendación (una llamada). POST /routing/v1/triggers con los datos de la transacción (y el resultado del fraude, si lo hubiera). La respuesta contiene una authentication bloquear (primary + opcional failover) y un actions block.
  3. Authenticate. Ejecute la autenticación recomendada (por ejemplo, autenticación 3DS, solo datos 3DS o ID Unico). si el primary proveedor no está disponible, utilice el failover.
  4. Decidir y procesar. Aplicar actions: cada resultado se asigna a process (con el proveedor de pago nombrado en la acción) o decline; el default La acción se aplica cuando ningún otro resultado coincide.
  5. Informar el resultado. POST /routing/v1/feedback con el collection objeto y el attempts (resultado de autenticación + resultado de pago). Esto cierra el ciclo de análisis y etiquetado de ML.

Los comerciantes con un único proveedor de pago verán un proveedor en el process acción; Los comerciantes con varios pueden configurar una cascada en la regla. membersy la recomendación refleja los proveedores a intentar.

Diagrama de secuencia
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)
Comercio o clienteProveedor o procesadorDEUNA

Respuesta del modo 1: el plan completo

El /triggers La respuesta es una recomendación única e independiente: authentication para ejecutar (con un opcional failover) y el actions que asignan el resultado de la autenticación a qué hacer. Su plataforma ejecuta esto 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" }
    }
  }
}
CampoTipoDescripción
collection.idUUIDID de correlación para esta evaluación. Hazlo eco en /feedback.
collection.prediction_idstringIdentificador de ML para la recomendación. Hazlo eco en /feedback.
recommendation.rule_idintegerLa regla que coincidió (el mismo identificador que el objeto de regla) id).
recommendation.rule_labelstringNombre de regla legible por humanos.
recommendation.authentication.primaryobjectLa autenticación que se ejecutará primero: { "authentication_type": "3ds_authentication" }. usa lo mismo authentication_type valores como miembros de la regla.
recommendation.authentication.failoverobjeto | nuloAutenticación de respaldo si la principal no está disponible.
recommendation.actionsobjectAsigna el resultado de la autenticación a una acción. Clave por resultado.
recommendation.actions.<outcome>.actionEnumeraciónprocess o decline.
recommendation.actions.<outcome>.providerstringpresente cuando action = process — el nombre del proveedor de pago a utilizar, según lo configurado en su regla (p. ej. acquirer_gateway).
recommendation.actions.defaultobjectLa acción alternativa se aplicó cuando no coincide ninguna otra clave de resultado.

Claves de resultados en actions describir el resultado de autenticación al que se aplican (p. ej. on_success_with_liability_shift); default es el comodín.

Modo 2: guiado (paso a paso)

Configura "mode": "guided" en la solicitud. En lugar del plan completo, el motor devuelve el siguiente paso y un statusy usted dirige el flujo paso a paso:

  • status: awaiting_authentication → next_step le indica qué autenticación ejecutar.
  • status: awaiting_fraud → next_step le indica qué verificación de fraude ejecutar.
  • status: completed → el motor ha decidido; next_step.action es process (con un provider) o decline.

Después de realizar un paso, llame /triggers otra vez— eco de la collection de la respuesta anterior e incluya el resultado de ese paso (authentication_result o fraud_result). El motor avanza y regresa al siguiente paso. Repita hasta status = completed, luego cerrar con /feedback.

Diagrama de secuencia
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
Comercio o clienteDEUNA

Primera respuesta: un paso a realizar

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

Solicitud de seguimiento: publique el resultado del paso

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

Respuesta a la 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" }
  }
}
CampoTipoDescripción
modeEnumeraciónCampo de solicitud: single (predeterminado) o guided.
collectionobjectCampo de solicitud en llamadas guiadas de seguimiento: haga eco del collection de la respuesta anterior para continuar con la misma evaluación.
authentication_result / fraud_resultobjectCampo de solicitud: el resultado del paso que acaba de realizar.
recommendation.statusEnumeraciónawaiting_authentication, awaiting_fraudo completed.
recommendation.next_step.typeEnumeraciónauthentication, fraud, processo decline.
recommendation.next_step.authentication_typeEnumeraciónpresente cuando type = authentication.
recommendation.next_step.failoverobjeto | nuloCopia de seguridad opcional para un paso de autenticación.
recommendation.next_step.providerstringpresente cuando type = process — el proveedor de pago a utilizar.

Ambos modos están respaldados por las mismas reglas y producen las mismas decisiones: el modo guiado simplemente le pide a DEUNA un paso a la vez en lugar de devolver todo el plan desde el principio.

Tarjeta de identificación en /triggers

la tarjeta en payment_source.card_info se puede suministrar una de tres maneras:

MétodoCamposNotas
PAN completocard_numberBIN y marca se derivan del lado del servidor.
BIN + últimos cuatrobin (8 dígitos), last_fourÚselo cuando no transmita el PAN completo. BIN de 8 dígitos proporciona enrutamiento a nivel de emisor.
token de rednetwork_token: { dpan, par, account_bin, cryptogram, eci }Para credenciales tokenizadas. Consulte la nota a continuación sobre cómo obtener datos a nivel BIN.

Comentarios attempts ejemplo

attempts informa lo que realmente sucedió: el resultado de la autenticación, luego el resultado del pago de su proveedor de pago (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 utiliza códigos de respuesta ISO 8583, p. "05" = no honrar. eci y pares_status llevar el resultado 3DS; liability_shift indica si la autenticación transfirió la responsabilidad.

Autenticación de respaldo (conmutación por error)

Las reglas pueden definir un conmutación por error proveedor de autenticación. si lo recomendado primary El proveedor no está disponible (por ejemplo, el proveedor de autenticación 3DS está inactivo), la recomendación devuelve el failover (por ejemplo, solo datos 3DS) para que una interrupción del proveedor nunca deje una transacción sin autenticar.


¿Preguntas o detalles faltantes? Contacta con tu equipo de integración DEUNA.