Motore di raccomandazione
Questa guida documenta l'API di trading per la gestione delle regole nel motore di raccomandazione DEUNA. Una regola combina le condizioni con un elenco ordinato di fornitori di pagamento, frode o autenticazione e le regole facoltative per i bambini ponderati per i test A/B. Le regole vengono valutate per priorità fino a quando non si gioca.
In questa pagina
Motore di raccomandazione
Definisci il percorso ordinato dei provider valutato per una regola corrispondente.
Autenticazione#
Tutti gli endpoint autenticano con un Chiave API inviato nel X-Api-Key header — questo è l'unico schema di autenticazione supportato. Il tuo commerciante è risolto dalla chiave API, così l'identificatore commerciante fa non non non lo so appaiono nell'URL.
X-Api-Key: {{DEUNA's API Key}}
X-Idempotency-Key: {{UUID v4}}
Content-Type: application/json| Intestazione | Obbligatorio | Descrizione |
|---|---|---|
X-Api-Key | Sì. | La chiave API. Determina l'ambiente e la portata del commerciante. |
Content-Type | Sì. | application/json. |
X-Idempotency-Key | Raccomandazioni | Una chiave unica che si genera per richiesta logica (un UUID funziona bene). Ripensando con la stessa chiave restituisce il risultato originale invece di applicare l'operazione due volte — inviarlo così retries di rete non creare regole duplicate o doppio conteggio un'azione. |
Riepilogo del punto di vista#
| Metodo | Sentiero | Oggetto |
|---|---|---|
GET | /routing/v1/rules | Elenca tutte le regole (ordine priorità) |
POST | /routing/v1/rules | Creare una regola |
GET | /routing/v1/rules/{rule_id} | Get a single rule by ID |
PUT | /routing/v1/rules/{rule_id} | Aggiornare una regola (sostituire completamente) |
PUT | /routing/v1/rules/{rule_id}/reorder | Cambiare la priorità di una regola |
Parametri del percorso:
| Parametro | Tipo | Note |
|---|---|---|
rule_id | integer | Identificatore di regola numerico restituito da creare/list. |
L'oggetto della Regola#
Una regola è la risorsa principale restituita e accettata da questi endpoint.
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
id | integer | Risposta solo | Identificatore di regola assegnato dal server. |
label | string | Sì. | Nome di regola leggibile dall'uomo. |
data_type | string | Sì. | Metodo famiglia questa regola si applica a: credit_card, debit_card, prepaid_card. |
priority | integer | Sì. | Ordine di valutazione — prima corsa, prima vittoria partita (numeri non negativi) |
status | enumera | Sì. | enabled, disabled, draft |
is_default | boolean | Sì. | Se true, questa è la regola di fallback quando nessun altro corrisponde. Una regola predefinita deve avere No. condizioni e non deve essere impostata ignore_next_rules. |
trigger | enumera | Sì. | payment, rejecto merchant_rule. Vedi Triggers. |
conditions | array<Condition> | Condizionamenti | Criteri di corrispondenza, E-combinato. Richiesto a meno che is_default = true. |
members | array<Member> | Condizionamenti | I fornitori hanno ordinato di tentare. Obbligatorio payment; richiesto (o children) per merchant_rule; vietato per reject. |
children | array<Child> | Facoltativo | Bracciali per bambini ponderati per test A/B (solo con trigger = merchant_rule). |
ignore_next_rules | boolean | Sì. | Se true, smettere di valutare altre regole una volta che questo corrisponde. Proibita reject e per regole di default. |
created_at | stringa (RFC3339) | Risposta solo | Tempi di creazione. |
Triggers
trigger | Significato | members | children | ignore_next_rules | is_default |
|---|---|---|---|---|---|
payment | Percorso del pagamento ai fornitori elencati. | Richiesto (≥1) | Non consentito | Consentito | Consentito |
reject | Bloccate la transazione. | Non consentito | Non consentito | Non consentito | Non consentito |
merchant_rule | Gruppo/branch: percorso attraverso i membri o bambini ponderati. | Richiesto se non bambini | Consentito | Consentito | Consentito |
L'oggetto Condizione#
Le condizioni definiscono ciò che una transazione deve corrispondere. Tutte le condizioni su una regola sono combinate con AND.
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
id | integer | Risposta solo | ID stato assegnato dal server. |
rule_option | object | Sì. | Il campo da abbinare, per esempio { "id": 5, "label": "currency" }. Utilizzare un'opzione di regola disponibile al commerciante; id deve essere > 0. |
operator | enumera | Sì. | Operatore di confronto. Deve essere valido per quella opzione di regola |
operand | string | Condizionamenti | Il valore(i) da confrontare contro, sempre serializzato come una stringa. Formato dipende dall'operatore. Richiesto per ogni operatore eccetto is_present, che non richiede alcun operando. |
operand_type | string | No. | values (predefinito) o list (operare fa riferimento ad una lista personalizzata di UUID). |
operand_config | oggetto | null | Condizionamenti | Usato quando operand_type = list: { "custom_list": { "field_to_evaluate": "email" } }. |
metadata_field_name | stringa | null | Condizionamenti | Obbligatorio quando rule_option.id = 16 (metadata). La chiave dei metadati per valutare. |
metadata_field_type | stringa | null | Condizionamenti | Obbligatorio quando rule_option.id = 16. Uno di text, numeric. |
error_code | string | Risposta solo | Impostare quando l'elaborazione asincrona di una condizione (ad esempio l'importazione di elenco) non è riuscita. |
error_message | string | Risposta solo | Dettaglio leggibile per l'uomo error_code. |
Esempio — corrispondenza carte di marca Mastercard
{
"rule_option": { "id": 3, "label": "branch" },
"operator": "in",
"operand": "mastercard"
}Oggetto#
I membri sono i fornitori che utilizzano una regola corrispondente, tentati sort ordine (la cascata). Riferimenti di un membro uno fornitore — un fornitore di pagamento- Un'altra volta. fornitore di frodio un provider di autenticazione.
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
payment_provider_id | integer | Condizionamenti | ID fornitore di pagamento DEUNA. Se necessario merchant_payment_provider_id Strumento e dati di connessione usati per elaborare il pagamento. |
payment_provider_name | string | Risposta solo | Nome del fornitore (ritorno riecheggiato). |
merchant_payment_provider_id | UUID | Condizionamenti | La connessione specifica del fornitore di Merchant. Se inviato, payment_provider_id deve essere anche essere inviato. |
merchant_payment_provider_name | string | Risposta solo | Nome di connessione (ritorno riecheggiato). |
fraud_provider | string | Condizionamenti | Nome del fornitore di frode/antifrode. Mutualmente esclusivo con i campi di pagamento- e di autenticazione-provider. |
fraud_provider_id | string | Risposta solo | ID fornitore di frode (risolto). |
authentication_provider | string | Condizionamenti | Nome del fornitore di autenticazione (ad es. UNICO_ID, CYBERSOURCE_3DS). Mutualmente esclusivo con i campi di pagamento- e frode-provider. |
authentication_provider_id | string | Risposta solo | ID fornitore di autenticazione (ritorno riecheggiato). |
authentication_type | enumera | Condizionamenti | Il metodo di autenticazione. Uno di 3ds_authentication, 3ds_data_only, unico_id. Obbligatorio quando il membro è un fornitore di autenticazione. |
failover | oggetto | null | Facoltativo | Autenticazione di backup utilizzata quando il fornitore primario non è disponibile: { "authentication_provider": "...", "authentication_type": "..." }. Valido solo solo sui membri del fornitore di autenticazione. |
sort | integer | Sì. | Ordine Cascade. Deve essere unico all'interno della regola. |
strategy | enumera | Sì. | Attualmente solo cascade. |
capabilities | array<string> | Sì. | Capacità del fornitore da usare, ad esempio. ["3ds"]. Invia [] se non ne ha. |
enabled3ds | boolean | No. | Richiedi l'autenticazione 3DS su questo membro (creare payload). |
post_authorization | boolean | Sì. | Solo un frode provider può impostare truee deve essere Ultimo ultimo membro sort. |
shadow_mode | boolean | Sì. | Valutare il fornitore senza influenzare la rotta (prova sicura). |
enabled | boolean | Risposta solo | Se il fornitore è attualmente disponibile per il commerciante. |
Esempio — membro del fornitore di pagamento
{
"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
}Esempio — membro del gruppo di frodi
{
"sort": 1,
"strategy": "cascade",
"fraud_provider": "CYBERSOURCE",
"capabilities": [],
"post_authorization": false,
"shadow_mode": false
}Esempio — membro del fornitore di autenticazione (con failover)
{
"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
}Test A/B — traffico diviso tra due percorsi#
Al test A/B, aggiungere due percorsi a una regola (come children) e dare a ciascuno una percentuale weight. Il motore invia quella parte delle transazioni corrispondenti a ogni percorso — ad esempio. 70% sulla Route A, 30% sulla Route B — così potete paragonarli sul traffico dal vivo.
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
weight | integer | Sì. | Percentuale di traffico corrispondente inviato a questo percorso. I pesi delle due rotte devono essere sommati 100. |
members | array<Member> | Sì. | Il fornitore(i) per questo percorso. |
Regole:
- Esattamente. Due routes.
weighti valori devono essere sommati 100.- La regola deve essere impostata
ignore_next_rules: true. - Assegnazione appiccicoso per
transaction_id(una transazione ottiene sempre la stessa rotta), e la rotta che corre è riecheggiata nel/triggersresponse.
Esempio: 70/30 spaccato
{
"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" }
]
}
]
}Creare una regola#
POST /routing/v1/rules
L'esempio qui sotto crea un merchant_rule per le carte di credito Mastercard in MXN, effettua un controllo delle frodi, e poi i rami da fraud_risk: blocco highe via 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 } ] }
]
}'const response = await fetch("https://api.sandbox.deuna.io/routing/v1/rules", {
method: "POST",
headers: {
"X-Api-Key": "{{API KEY}}",
"X-Idempotency-Key": "b3f1c2d4-9a8e-4c11-bb77-2e5f9c74a6b1",
"Content-Type": "application/json"
},
body: JSON.stringify({
"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
}
]
}
]
})
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"POST",
"https://api.sandbox.deuna.io/routing/v1/rules",
headers={
"X-Api-Key": "{{API KEY}}",
"X-Idempotency-Key": "b3f1c2d4-9a8e-4c11-bb77-2e5f9c74a6b1",
"Content-Type": "application/json"
},
json={
"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
}
]
}
]
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/routing/v1/rules",
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: {{API KEY}}",
"X-Idempotency-Key: b3f1c2d4-9a8e-4c11-bb77-2e5f9c74a6b1",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"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
]
]
]
]
])
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/routing/v1/rules"))
.header("X-Api-Key", "{{API KEY}}")
.header("X-Idempotency-Key", "b3f1c2d4-9a8e-4c11-bb77-2e5f9c74a6b1")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\n \"label\": \"MX Mastercard — Cybersource\",\n \"priority\": 2,\n \"status\": \"enabled\",\n \"trigger\": \"merchant_rule\",\n \"is_default\": false,\n \"data_type\": \"credit_card\",\n \"ignore_next_rules\": true,\n \"conditions\": [\n { \"rule_option\": { \"id\": 3, \"label\": \"branch\" }, \"operator\": \"in\", \"operand\": \"mastercard\" },\n { \"rule_option\": { \"id\": 5, \"label\": \"currency\" }, \"operator\": \"in\", \"operand\": \"MXN\" }\n ],\n \"members\": [\n { \"sort\": 1, \"strategy\": \"cascade\", \"fraud_provider\": \"CYBERSOURCE\" }\n ],\n \"children\": [\n { \"conditions\": [ { \"rule_option\": { \"id\": 15 }, \"operator\": \"eq\", \"operand\": \"high\" } ], \"members\": [] },\n { \"conditions\": [ { \"rule_option\": { \"id\": 15 }, \"operator\": \"eq\", \"operand\": \"medium\" } ],\n \"members\": [ { \"sort\": 1, \"strategy\": \"cascade\", \"payment_provider_id\": 45, \"merchant_payment_provider_id\": \"6e4c651a-3e5f-403d-af9d-6a9e9299acb8\", \"capabilities\": [\"3ds\"], \"enabled3ds\": false } ] },\n { \"conditions\": [ { \"rule_option\": { \"id\": 15 }, \"operator\": \"eq\", \"operand\": \"low\" } ],\n \"members\": [ { \"sort\": 1, \"strategy\": \"cascade\", \"payment_provider_id\": 45, \"merchant_payment_provider_id\": \"6e4c651a-3e5f-403d-af9d-6a9e9299acb8\", \"capabilities\": [\"3ds\"], \"enabled3ds\": false } ] }\n ]\n }"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("POST", "https://api.sandbox.deuna.io/routing/v1/rules", strings.NewReader("{\n \"label\": \"MX Mastercard — Cybersource\",\n \"priority\": 2,\n \"status\": \"enabled\",\n \"trigger\": \"merchant_rule\",\n \"is_default\": false,\n \"data_type\": \"credit_card\",\n \"ignore_next_rules\": true,\n \"conditions\": [\n { \"rule_option\": { \"id\": 3, \"label\": \"branch\" }, \"operator\": \"in\", \"operand\": \"mastercard\" },\n { \"rule_option\": { \"id\": 5, \"label\": \"currency\" }, \"operator\": \"in\", \"operand\": \"MXN\" }\n ],\n \"members\": [\n { \"sort\": 1, \"strategy\": \"cascade\", \"fraud_provider\": \"CYBERSOURCE\" }\n ],\n \"children\": [\n { \"conditions\": [ { \"rule_option\": { \"id\": 15 }, \"operator\": \"eq\", \"operand\": \"high\" } ], \"members\": [] },\n { \"conditions\": [ { \"rule_option\": { \"id\": 15 }, \"operator\": \"eq\", \"operand\": \"medium\" } ],\n \"members\": [ { \"sort\": 1, \"strategy\": \"cascade\", \"payment_provider_id\": 45, \"merchant_payment_provider_id\": \"6e4c651a-3e5f-403d-af9d-6a9e9299acb8\", \"capabilities\": [\"3ds\"], \"enabled3ds\": false } ] },\n { \"conditions\": [ { \"rule_option\": { \"id\": 15 }, \"operator\": \"eq\", \"operand\": \"low\" } ],\n \"members\": [ { \"sort\": 1, \"strategy\": \"cascade\", \"payment_provider_id\": 45, \"merchant_payment_provider_id\": \"6e4c651a-3e5f-403d-af9d-6a9e9299acb8\", \"capabilities\": [\"3ds\"], \"enabled3ds\": false } ] }\n ]\n }"))
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "{{API KEY}}")
request.Header.Set("X-Idempotency-Key", "b3f1c2d4-9a8e-4c11-bb77-2e5f9c74a6b1")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Restituisce l’ordine elaborato con 201
{
"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}
Restituisce una singola regola, inclusa la sua conditions, members e qualsiasi children. rule_id è l'identificatore numerico.
cURL
curl 'https://api.sandbox.deuna.io/routing/v1/rules/21866' \
-H 'X-Api-Key: {{API KEY}}'const response = await fetch("https://api.sandbox.deuna.io/routing/v1/rules/21866", {
method: "GET",
headers: {
"X-Api-Key": "{{API KEY}}"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/routing/v1/rules/21866",
headers={
"X-Api-Key": "{{API KEY}}"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/routing/v1/rules/21866",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: {{API KEY}}"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/routing/v1/rules/21866"))
.header("X-Api-Key", "{{API KEY}}")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/routing/v1/rules/21866", nil)
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "{{API KEY}}")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Restituisce l’ordine elaborato con 200
{
"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
}
]
}Errori: PAYROU-NOT_FOUND (404) se la regola non esiste; PAYROU-FORBIDDEN (403) se non è accesibile; PAYROU-INVALID_PATH_PARAM (400) se rule_id non è un intero valido.
Regole di elenco#
GET /routing/v1/rules
Restituisce regole per il vostro commerciante in ordine prioritario. I risultati sono impaginato con un cursore opaco.
| Param di query | Tipo | Descrizione |
|---|---|---|
limit | integer | Facoltativo. Dimensioni pagina. Predefinito 50, massimo 200. |
cursor | string | Facoltativo. cursore Opaque da una risposta precedente pagination.next_cursor. Omit per la prima pagina. |
payment_provider_id | integer | Facoltativo. Restituzione regole che fanno riferimento a questo fornitore di pagamento. |
La risposta avvolge le regole in un pagination oggetto. Continua a chiedere con next_cursor mentre has_more è true.
pagination campo | Tipo | Descrizione |
|---|---|---|
next_cursor | stringa | null | Cursore per la pagina successiva, o null nell'ultima pagina. |
has_more | boolean | true se sono disponibili più regole. |
limit | integer | La dimensione della pagina che è stata applicata. |
cURL
curl 'https://api.sandbox.deuna.io/routing/v1/rules?limit=50' \
-H 'X-Api-Key: {{API KEY}}'const response = await fetch("https://api.sandbox.deuna.io/routing/v1/rules?limit=50", {
method: "GET",
headers: {
"X-Api-Key": "{{API KEY}}"
}
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"GET",
"https://api.sandbox.deuna.io/routing/v1/rules?limit=50",
headers={
"X-Api-Key": "{{API KEY}}"
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/routing/v1/rules?limit=50",
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: {{API KEY}}"
]
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/routing/v1/rules?limit=50"))
.header("X-Api-Key", "{{API KEY}}")
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
)
func main() {
request, err := http.NewRequest("GET", "https://api.sandbox.deuna.io/routing/v1/rules?limit=50", nil)
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "{{API KEY}}")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Restituisce l’ordine elaborato con 200
{
"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"
}
]
}Aggiornare una regola#
PUT /routing/v1/rules/{rule_id}
Sostituto completo della regola. Inviare il corpo regola completo — la stessa forma di creare — compreso id e created_at. Uso comune: flip status tra enabled e disabled (questo è il modo in cui "ritire" una regola invece di eliminare).
cURL — disabilitare una regola
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 }
]
}'const response = await fetch("https://api.sandbox.deuna.io/routing/v1/rules/21866", {
method: "PUT",
headers: {
"X-Api-Key": "{{API KEY}}",
"X-Idempotency-Key": "7c2e5a19-4b8d-4f10-9a3c-1d2e3f4a5b6c",
"Content-Type": "application/json"
},
body: JSON.stringify({
"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
}
]
})
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"PUT",
"https://api.sandbox.deuna.io/routing/v1/rules/21866",
headers={
"X-Api-Key": "{{API KEY}}",
"X-Idempotency-Key": "7c2e5a19-4b8d-4f10-9a3c-1d2e3f4a5b6c",
"Content-Type": "application/json"
},
json={
"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
}
]
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/routing/v1/rules/21866",
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: {{API KEY}}",
"X-Idempotency-Key: 7c2e5a19-4b8d-4f10-9a3c-1d2e3f4a5b6c",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"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
]
]
])
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/routing/v1/rules/21866"))
.header("X-Api-Key", "{{API KEY}}")
.header("X-Idempotency-Key", "7c2e5a19-4b8d-4f10-9a3c-1d2e3f4a5b6c")
.header("Content-Type", "application/json")
.method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"id\": 21866,\n \"created_at\": \"2026-07-08T01:07:29.439794Z\",\n \"label\": \"MX Mastercard — Cybersource\",\n \"priority\": 2,\n \"status\": \"disabled\",\n \"trigger\": \"merchant_rule\",\n \"is_default\": false,\n \"data_type\": \"credit_card\",\n \"ignore_next_rules\": true,\n \"conditions\": [\n { \"id\": 44264, \"rule_option\": { \"id\": 3, \"label\": \"branch\" }, \"operator\": \"in\", \"operand\": \"mastercard\", \"operand_type\": \"values\" },\n { \"id\": 44265, \"rule_option\": { \"id\": 5, \"label\": \"currency\" }, \"operator\": \"in\", \"operand\": \"MXN\", \"operand_type\": \"values\" }\n ],\n \"members\": [\n { \"sort\": 1, \"strategy\": \"cascade\", \"fraud_provider\": \"CYBERSOURCE\", \"capabilities\": [], \"post_authorization\": false, \"shadow_mode\": false }\n ]\n }"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("PUT", "https://api.sandbox.deuna.io/routing/v1/rules/21866", strings.NewReader("{\n \"id\": 21866,\n \"created_at\": \"2026-07-08T01:07:29.439794Z\",\n \"label\": \"MX Mastercard — Cybersource\",\n \"priority\": 2,\n \"status\": \"disabled\",\n \"trigger\": \"merchant_rule\",\n \"is_default\": false,\n \"data_type\": \"credit_card\",\n \"ignore_next_rules\": true,\n \"conditions\": [\n { \"id\": 44264, \"rule_option\": { \"id\": 3, \"label\": \"branch\" }, \"operator\": \"in\", \"operand\": \"mastercard\", \"operand_type\": \"values\" },\n { \"id\": 44265, \"rule_option\": { \"id\": 5, \"label\": \"currency\" }, \"operator\": \"in\", \"operand\": \"MXN\", \"operand_type\": \"values\" }\n ],\n \"members\": [\n { \"sort\": 1, \"strategy\": \"cascade\", \"fraud_provider\": \"CYBERSOURCE\", \"capabilities\": [], \"post_authorization\": false, \"shadow_mode\": false }\n ]\n }"))
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "{{API KEY}}")
request.Header.Set("X-Idempotency-Key", "7c2e5a19-4b8d-4f10-9a3c-1d2e3f4a5b6c")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}Restituisce l’ordine elaborato con 200
Restituisce la regola aggiornata con status Ora disabled. Nota: stato ids sono ristampati su aggiornamento.
Cambiare la priorità di una regola (riordine)#
PUT /routing/v1/rules/{rule_id}/reorder
Sposta una regola in una nuova priorità. Altre regole sono ri-sequenziate di conseguenza.
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 }'const response = await fetch("https://api.sandbox.deuna.io/routing/v1/rules/21873/reorder", {
method: "PUT",
headers: {
"X-Api-Key": "sk_sandbox_9f8b2c1a7d4e60b3",
"Content-Type": "application/json"
},
body: JSON.stringify({
"priority": 2
})
});
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
const data = await response.json();import requests
response = requests.request(
"PUT",
"https://api.sandbox.deuna.io/routing/v1/rules/21873/reorder",
headers={
"X-Api-Key": "sk_sandbox_9f8b2c1a7d4e60b3",
"Content-Type": "application/json"
},
json={
"priority": 2
},
)
response.raise_for_status()
data = response.json()<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sandbox.deuna.io/routing/v1/rules/21873/reorder",
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: sk_sandbox_9f8b2c1a7d4e60b3",
"Content-Type: application/json"
],
CURLOPT_POSTFIELDS => json_encode([
"priority" => 2
])
]);
$response = curl_exec($curl);
curl_close($curl);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Example {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sandbox.deuna.io/routing/v1/rules/21873/reorder"))
.header("X-Api-Key", "sk_sandbox_9f8b2c1a7d4e60b3")
.header("Content-Type", "application/json")
.method("PUT", HttpRequest.BodyPublishers.ofString("{ \"priority\": 2 }"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.body());
}
}package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
request, err := http.NewRequest("PUT", "https://api.sandbox.deuna.io/routing/v1/rules/21873/reorder", strings.NewReader("{ \"priority\": 2 }"))
if err != nil { panic(err) }
request.Header.Set("X-Api-Key", "sk_sandbox_9f8b2c1a7d4e60b3")
request.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
body, _ := io.ReadAll(response.Body)
fmt.Println(string(body))
}| Campo | Tipo | Obbligatorio | Constraente |
|---|---|---|---|
priority | integer | Sì. | Non-negative integer |
Restituisce l’ordine elaborato con 200
{ "priority": 2 }Errori: PAYROU-VALIDATION (400) con errors[].code = PRIORITY_OUT_OF_RANGE se priority non è un intero non negativo.
Validazioni#
Creare e aggiornare eseguire questi controlli. Qualsiasi errore restituisce HTTP 400 con il codice di alto livello PAYROU-VALIDATION e una voce per campo offensivo in errors[] (v. Errori per la busta e il catalogo completo di codice a livello di campo).
Livello di regola
statusdeve essere uno dienabled,disabled,draft,process-in-background.triggerdeve essere uno dipayment,reject,merchant_rule.trigger = payment→ almeno un membro; nessun bambino.trigger = reject→ nessun membro, nessun bambino,ignore_next_rulesdeve essere falso,is_defaultdeve essere falso.trigger = merchant_rule→ almeno un membro o almeno un bambino.is_default = true→ nessuna condizione eignore_next_rulesdeve essere falso.is_default = false→ almeno una condizione.prioritydeve essere> 0e≤ 1000.
Condizioni
rule_option.idrichiesto (> 0);operandrichiesto (non-vuoto).operatordeve essere valido per quella opzione di regola (vedi catalogo).- A
rule_optionpuò apparire solo una volta per regola (esclusometadata). - per
metadata(id 16):metadata_field_nameemetadata_field_typerichiesto; il tipo deve esseretextonumeric. - per
operand_type = list:operanddeve essere una lista valida UUID che esiste.
Membri
- Ogni membro deve fare riferimento esattamente ad un tipo di fornitore: pagamento, pagamento commerciante, frode o autenticazione.
- I tipi di fornitori non possono essere mescolati su un membro.
- Se
merchant_payment_provider_idè presente,payment_provider_iddeve essere presente anche. - I membri dell'autenticazione richiedono
authentication_type(uno di3ds_authentication,3ds_data_only,unico_id). failoverè valido solo solo sui membri dell'autenticazione; i suoiauthentication_typedeve essere anche un valore valido.sortdeve essere unico all'interno della regola.- Un fornitore può apparire solo una volta per regola.
strategydeve esserecascade.post_authorization = truesolo per i fornitori di frodi, e quel membro deve essere Ultimo ultimo disort.
Livello di servizio (controllato contro la configurazione del commerciante)
- L'opzione di regola di riferimento deve esistere e sostenere l'operatore dato.
- Il fornitore di pagamento/pagamento/frode/autenticazione deve essere abilitato per il commerciante.
merchant_payment_provider_iddeve appartenere al datopayment_provider_id.
Errori#
Busta di errore
Ogni risposta di errore utilizza la stessa forma 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'."
}
]
}| Campo | Tipo | Descrizione |
|---|---|---|
code | string | Codice di alto livello stabile e leggibile dalla macchina. Branch su questo, mai on message. |
message | string | Riepilogo leggibile dall'uomo. Può essere riparlato o localizzato — non lo parse. |
request_id | string | Unico per risposta e anche tornato nel X-Request-Id intestazione di risposta (su successo e errore). Citarlo in qualsiasi richiesta di supporto. |
errors | array | Presente solo per PAYROU-VALIDATION. Una voce per campo offensivo. |
errors[].field | string | Percorso sul campo, utilizzando notazione punti/freschetti — ad esempio. priority, conditions[1].operand, members[0].sort. |
errors[].code | string | Codice di livello del campo stabile (vedere codici di convalida). |
errors[].message | string | Dettaglio leggibile dall'uomo. Non fare la parsa. |
Invia sempre un messaggio
X-Idempotency-Keysu scritture. Riprodurre la stessa chiave restituisce la risposta originale; riutilizzare una chiave con una diverso ritorno del corpo409 PAYROU-CONFLICT.
Codici di stato HTTP
| Stato | Significato |
|---|---|
200 / 201 | Success. |
400 | La richiesta è invalida — la convalida non è riuscita, malformata JSON, o i param difettosi di percorso/query. |
401 | Autenticazione fallita — X-Api-Key manca o non è valido. |
403 | Autorizzazione fallito — la chiave è valida ma non è consentito accedere a questo commerciante / risorse. |
404 | La regola o una risorsa di riferimento non esiste. |
409 | Conflitto — il riutilizzo chiave di idempotency con un corpo diverso, o un aggiornamento concomitante. |
429 | Limite di tasso superiore — riprovazione dopo Retry-After header. |
500 | Errore del server inaspettato. |
503 | Una dipendenza a valle è temporaneamente non disponibile — sicuro da riprovare con il backoff. |
Codici di livello superiore
| Codice | HTTP | Quando |
|---|---|---|
PAYROU-VALIDATION | 400 | Uno o più campi non sono riusciti a convalidare. Dettagli in errors[]. |
PAYROU-MALFORMED_JSON | 400 | Il corpo di richiesta non è valido JSON. |
PAYROU-INVALID_PATH_PARAM | 400 | Un parametro del percorso è il tipo/formato sbagliato (ad esempio non integer) rule_id). |
PAYROU-INVALID_QUERY_PARAM | 400 | Un parametro di query è non valido (ad es. limit fuori portata, malformato cursor). |
PAYROU-UNAUTHENTICATED | 401 | Mancante o non valida chiave API. |
PAYROU-FORBIDDEN | 403 | Chiave valida, ma non portata a questo commerciante / risorse. |
PAYROU-NOT_FOUND | 404 | Regola o risorsa di riferimento non trovata. |
PAYROU-CONFLICT | 409 | Riutilizzo chiave di Idempotency con un carico di pagamento diverso, o modifica concomitante. |
PAYROU-RATE_LIMITED | 429 | Troppe richieste. |
PAYROU-INTERNAL | 500 | Errore del server inaspettato. |
PAYROU-UPSTREAM_UNAVAILABLE | 503 | Una dipendenza a valle non è temporaneamente disponibile. |
Codici di convalida
Ritornato dentro errors[] quando il codice di primo livello è PAYROU-VALIDATION. Ognuno è stabile e sicuro da ramificarsi.
Livello di regola
code | Tipico field | Causa |
|---|---|---|
INVALID_STATUS | status | Non uno di enabled, disabled, draft, process-in-background. |
INVALID_TRIGGER | trigger | Non uno di payment, reject, merchant_rule. |
PRIORITY_OUT_OF_RANGE | priority | Non trascurabile 1 e 1000 (coperte entrambe) ≤ 0 e > 1000). |
MEMBERS_REQUIRED | members | trigger = payment senza membri. |
MEMBERS_OR_CHILDREN_REQUIRED | members | trigger = merchant_rule con né membri né figli. |
CONDITIONS_REQUIRED | conditions | Regola non di default senza condizioni. |
TRIGGER_CANNOT_BE_DEFAULT | is_default | reject regola con is_default = true. |
TRIGGER_CANNOT_HAVE_MEMBERS | members | reject governare con i membri. |
TRIGGER_CANNOT_HAVE_CHILDREN | children | payment/reject governare con i bambini. |
TRIGGER_CANNOT_IGNORE_NEXT_RULES | ignore_next_rules | reject regola con ignore_next_rules = true. |
DEFAULT_RULE_CANNOT_HAVE_CONDITIONS | conditions | Regola di default con le condizioni. |
DEFAULT_RULE_CANNOT_IGNORE_NEXT_RULES | ignore_next_rules | Regola di default con ignore_next_rules = true. |
Condizioni
code | Tipico field | Causa |
|---|---|---|
RULE_OPTION_ID_REQUIRED | conditions[i].rule_option.id | Mancato o ≤ 0. |
OPERAND_REQUIRED | conditions[i].operand | Operando vuoto per un operatore che ne richiede uno. |
OPERATOR_REQUIRED | conditions[i].operator | L'operatore è vuoto. |
INVALID_OPERATOR | conditions[i].operator | Operatore non valido per tale opzione di regola. |
DUPLICATE_RULE_OPTION | conditions[i].rule_option | Stessa opzione di regola utilizzata più di una volta (escluso metadata). |
METADATA_FIELDS_REQUIRED | conditions[i].metadata_field_name | metadata condizione mancante metadata_field_name/metadata_field_type. |
INVALID_METADATA_FIELD_TYPE | conditions[i].metadata_field_type | Non lo so. text o numeric. |
RULE_OPTION_NOT_FOUND | conditions[i].rule_option.id | L'opzione di regola non esiste. |
INVALID_LIST_REFERENCE | conditions[i].operand | operand_type = list ma la lista UUID è non valida o non trovata. |
Membri
code | Tipico field | Causa |
|---|---|---|
MEMBER_PROVIDER_REQUIRED | members[i] | I membri non fanno riferimento a provider (pagamento, frode o autenticazione). |
MEMBER_MULTIPLE_PROVIDER_TYPES | members[i] | I membri mescolano i tipi di fornitori (ad esempio il pagamento + frode, o il pagamento + autenticazione). |
PAYMENT_PROVIDER_ID_REQUIRED | members[i].payment_provider_id | merchant_payment_provider_id inviato senza payment_provider_id. |
AUTHENTICATION_TYPE_REQUIRED | members[i].authentication_type | Membro di autenticazione senza un authentication_type. |
INVALID_AUTHENTICATION_TYPE | members[i].authentication_type | Non uno di 3ds_authentication, 3ds_data_only, unico_id (Applicazioni) failover.authentication_type anche). |
FAILOVER_ONLY_ON_AUTHENTICATION | members[i].failover | failover su un membro non-autentico. |
DUPLICATE_MEMBER | members[i] | Lo stesso fornitore appare più di una volta nella regola. |
DUPLICATE_MEMBER_SORT | members[i].sort | Due membri condividono una sort value. |
INVALID_STRATEGY | members[i].strategy | Non lo so. cascade. |
POST_AUTH_ONLY_FRAUD | members[i].post_authorization | post_authorization = true su un membro non-fraud. |
POST_AUTH_MUST_BE_LAST | members[i].post_authorization | Il post_authorization membro non è ultimo da sort. |
PROVIDER_NOT_AVAILABLE | members[i] | Il Fornitore (pagamento, frode o autenticazione) non è abilitato per questo commerciante. |
MERCHANT_PROVIDER_MISMATCH | members[i].merchant_payment_provider_id | La connessione non appartiene alla data payment_provider_id. |
Test A/B
code | Tipico field | Causa |
|---|---|---|
SPLIT_WEIGHTS_MUST_SUM_TO_100 | children | Bambino bambino weight i valori non sommano a 100. |
Flusso end-to-end#
Il /triggers Supporti endpoint due modalità di integrazione — scegliere quale sia la quantità della logica di decisione che si desidera possedere. Entrambi usano lo stesso punto finale e le stesse regole; solo la forma di risposta e il numero di chiamate differiscono. Selezionalo con mode su richiesta (single è il default). In entrambi i casi, chiudi il loop con uno /feedback call.
| Modalità | Come funziona | Quando è meglio |
|---|---|---|
| 1 · Singola chiamata (Client-driven) | Uno /triggers chiamata restituisce il piano completo — l'autenticazione da eseguire (con failover) e actions che mappano ogni risultato a processo o declino. Eserciti il piano da solo. | Vuoi le ultime gite e sei comodo ad applicare la decisione a livello locale. |
| 2 · Guidato (motore-driven) | Chiamate /triggers e il motore ritorna solo il passo successivo più un status. Lo esegua, poi chiama /triggers di nuovo con il risultato di quel passo; il motore restituisce il passo successivo. Ripeti fino a quando non status = completed. | Vuoi che DEUNA possieda e centralizzi la logica decisionale, passo dopo passo. |
Modalità 1 — singola chiamata
Tu fai singolo /triggers Chiama. Se si esegue un fornitore di frode prima di DEUNA, includere il suo risultato in quella chiamata. La risposta è autocontenuta: si nomina l'autenticazione da eseguire (con un fallire se il primario non è disponibile) e il azioni che mappa il risultato di autenticazione a cosa fare successivo — processo con un fornitore di pagamento o declino. La tua piattaforma esegue che pianifica localmente e chiude il loop con uno /feedback — c'è un no second /triggers round-trip.
Passo dopo passo
- (Opzionale) Punteggio con un fornitore di frode. Se la configurazione utilizza un provider di frode in alto, cattura il suo punteggio / decisione in modo che possa essere abbinato alle regole (tramite le regole)
fraud_riskopzione ometadata). - Richiedere la raccomandazione (una chiamata).
POST /routing/v1/triggerscon i dati delle transazioni (e il risultato delle frodi, se ne ha). La risposta contiene unauthenticationblocco (primary+ facoltativofailover) eactionsblock. - Authenticate. Eseguire l'autenticazione raccomandata (ad esempio autenticazione 3DS, solo dati 3DS, o ID Unico). Se il
primaryil fornitore non è disponibile, utilizzarefailover. - Decide e processa. Applicare
actions: ogni esito mappa aprocess(con il fornitore di pagamento denominato nell'azione) odecline;defaultl'azione si applica quando nessun altro risultato corrisponde. - Segnala il risultato.
POST /routing/v1/feedbackcon ilcollectionoggetto eattempts(risultato di autenticità + risultato di pagamento). Questo chiude il loop per l'analisi e l'etichettatura ML.
I commercianti con un unico fornitore di pagamento vedranno un fornitore nel
processazione; i commercianti con diversi possono configurare una cascata nella regolamembers, e la raccomandazione riflette il provider(i) di tentare.
Risposta della modalità 1 — il piano completo
Il /triggers risposta è una raccomandazione unica e autonoma: authentication da eseguire (con opzione failover) e actions che mappa il risultato di autenticazione a cosa fare. La tua piattaforma esegue questo localmente.
{
"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" }
}
}
}| Campo | Tipo | Descrizione |
|---|---|---|
collection.id | UUID | ID di correlazione per questa valutazione. Echo in /feedback. |
collection.prediction_id | string | ML maniglia per la raccomandazione. Echo in /feedback. |
recommendation.rule_id | integer | La regola che corrispondeva (stesso identificativo come l'oggetto di regola) id). |
recommendation.rule_label | string | Nome di regola leggibile dall'uomo. |
recommendation.authentication.primary | object | L'autenticazione da eseguire prima: { "authentication_type": "3ds_authentication" }. Utilizza lo stesso authentication_type valori come membri della regola. |
recommendation.authentication.failover | oggetto | null | Autenticazione di backup se il primario non è disponibile. |
recommendation.actions | object | Consente di visualizzare il risultato dell'autenticazione in un'azione. Chiuso per risultato. |
recommendation.actions.<outcome>.action | enumera | process o decline. |
recommendation.actions.<outcome>.provider | string | Presente quando action = process — il nome del fornitore di pagamento da utilizzare, come configurato nella regola (ad es. acquirer_gateway). |
recommendation.actions.default | object | L'azione di fallback applicata quando nessun altro risultato corrisponde. |
Tasti di uscita sotto actions descrivere il risultato di autenticazione a cui si applicano (ad es. on_success_with_liability_shift); default è il catch-all.
Modalità 2 — guidati (passo)
Imposta "mode": "guided" su richiesta. Invece del piano completo, il motore restituisce il passo successivo e un status, e si guida il flusso un passo alla volta:
status: awaiting_authentication→next_stepti dice quale autenticazione eseguire.status: awaiting_fraud→next_stepti dice quale controllo frode per eseguire.status: completed→ il motore ha deciso;next_step.actionèprocess(con unprovider) odecline.
Dopo aver eseguito un passo, chiama /triggers — di nuovo — eco il collection dalla risposta precedente e includere il risultato di quel passaggio (authentication_result o fraud_result). Il motore avanza e ritorna il passo successivo. Ripeti fino a quando non status = completed, poi vicino con /feedback.
Prima risposta — un passo per eseguire
{
"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" }
}
}
}Richiesta di follow-up — posta il risultato del passaggio
{
"mode": "guided",
"collection": { "id": "c7b9e3a2-4d51-4f8a-9b21-6e0f2a1c8d34", "prediction_id": "pred_xyz789abc" },
"authentication_result": { "eci": "05", "pares_status": "Y", "liability_shift": true }
}Risposta del terminale — status = completed
{
"collection": { "id": "c7b9e3a2-4d51-4f8a-9b21-6e0f2a1c8d34", "prediction_id": "pred_xyz789abc" },
"recommendation": {
"rule_id": 21866,
"status": "completed",
"next_step": { "type": "process", "provider": "acquirer_gateway" }
}
}| Campo | Tipo | Descrizione |
|---|---|---|
mode | enumera | Campo di richiesta: single (predefinito) o guided. |
collection | object | Campo richiesta su chiamate guidate di follow-up: eco il collection dalla risposta precedente per continuare la stessa valutazione. |
authentication_result / fraud_result | object | Campo richiesta: il risultato del passaggio appena eseguito. |
recommendation.status | enumera | awaiting_authentication, awaiting_fraudo completed. |
recommendation.next_step.type | enumera | authentication, fraud, processo decline. |
recommendation.next_step.authentication_type | enumera | Presente quando type = authentication. |
recommendation.next_step.failover | oggetto | null | Backup opzionale per una fase di autenticazione. |
recommendation.next_step.provider | string | Presente quando type = process — il fornitore di pagamento da utilizzare. |
Entrambe le modalità sono sostenute dalle stesse regole e producono le stesse decisioni — la modalità guidata chiede semplicemente a DEUNA per un passo alla volta invece di restituire l'intero piano davanti.
Identificazione della carta su /triggers
La carta in payment_source.card_info può essere fornito uno dei tre modi:
| Metodo | Campi | Note |
|---|---|---|
| PAN completa | card_number | BIN e marca sono derivate lato server. |
| BIN + ultimi quattro | bin (8 cifre), last_four | Usa quando non si trasmette il PAN completo. Il BIN a 8 cifre dà un routing di livello emittente. |
| Token di rete | network_token: { dpan, par, account_bin, cryptogram, eci } | Per le credenziali tokenizzate. Vedere la nota qui sotto per ottenere i dati di livello BIN. |
Feedback attempts esempio
attempts segnala cosa è successo: il risultato dell'autenticazione, quindi il risultato del pagamento dal tuo fornitore di pagamento (codici ISO 8583).
{
"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_codeutilizza i codici di risposta ISO 8583 — ad esempio."05"= non onorare.eciepares_statusportare il risultato 3DS;liability_shiftindica se l'autenticazione ha spostato la responsabilità.
Autenticazione di backup (failover)
Le regole possono definire fallire provider di autenticazione. Se il raccomandato primary provider non è disponibile (ad esempio il fornitore di autenticazione 3DS è in calo), la raccomandazione restituisce failover (ad esempio 3DS Data Only) quindi un'interruzione del fornitore non lascia mai una transazione non autenticata.
Domande o dettagli mancanti? Contatta il tuo team di integrazione DEUNA.