curl -X POST 'https://verification.didit.me/v3/transactions/rules/backtest/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"conditions": [{"field": "currency", "operator": "eq", "value": "EUR"}, {"field": "amount", "operator": "lt", "value": 10000}], "aggregation": [{"metric": "count", "operator": "gte", "value": 20, "window": "30d", "filters": {"direction": "INBOUND", "transaction_type": "finance", "subject_vendor_data": "__current__", "currency": "EUR"}}, {"metric": "max", "field": "amount", "operator": "lt", "value": 10000, "window": "30d", "filters": {"direction": "INBOUND", "transaction_type": "finance", "subject_vendor_data": "__current__", "currency": "EUR"}}], "evaluation_mode": "ALL", "scope": {"transaction_types": ["finance"], "directions": ["INBOUND"]}, "period_days": 90}'import os
import requests
resp = requests.post(
'https://verification.didit.me/v3/transactions/rules/backtest/',
headers={'x-api-key': os.environ['DIDIT_API_KEY']},
json={
"conditions": [
{
"field": "currency",
"operator": "eq",
"value": "EUR"
},
{
"field": "amount",
"operator": "lt",
"value": 10000
}
],
"aggregation": [
{
"metric": "count",
"operator": "gte",
"value": 20,
"window": "30d",
"filters": {
"direction": "INBOUND",
"transaction_type": "finance",
"subject_vendor_data": "__current__",
"currency": "EUR"
}
},
{
"metric": "max",
"field": "amount",
"operator": "lt",
"value": 10000,
"window": "30d",
"filters": {
"direction": "INBOUND",
"transaction_type": "finance",
"subject_vendor_data": "__current__",
"currency": "EUR"
}
}
],
"evaluation_mode": "ALL",
"scope": {
"transaction_types": [
"finance"
],
"directions": [
"INBOUND"
]
},
"period_days": 90
},
timeout=30,
)
resp.raise_for_status()
stats = resp.json()
print(stats['matched'], 'matches across', stats['affected_entities'], 'subjects')const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
conditions: [
{field: 'currency', operator: 'eq', value: 'EUR'},
{field: 'amount', operator: 'lt', value: 10000}
],
aggregation: [
{
metric: 'count',
operator: 'gte',
value: 20,
window: '30d',
filters: {
direction: 'INBOUND',
transaction_type: 'finance',
subject_vendor_data: '__current__',
currency: 'EUR'
}
},
{
metric: 'max',
field: 'amount',
operator: 'lt',
value: 10000,
window: '30d',
filters: {
direction: 'INBOUND',
transaction_type: 'finance',
subject_vendor_data: '__current__',
currency: 'EUR'
}
}
],
evaluation_mode: 'ALL',
scope: {transaction_types: ['finance'], directions: ['INBOUND']},
period_days: 90
})
};
fetch('https://verification.didit.me/v3/transactions/rules/backtest/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/transactions/rules/backtest/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'conditions' => [
[
'field' => 'currency',
'operator' => 'eq',
'value' => 'EUR'
],
[
'field' => 'amount',
'operator' => 'lt',
'value' => 10000
]
],
'aggregation' => [
[
'metric' => 'count',
'operator' => 'gte',
'value' => 20,
'window' => '30d',
'filters' => [
'direction' => 'INBOUND',
'transaction_type' => 'finance',
'subject_vendor_data' => '__current__',
'currency' => 'EUR'
]
],
[
'metric' => 'max',
'field' => 'amount',
'operator' => 'lt',
'value' => 10000,
'window' => '30d',
'filters' => [
'direction' => 'INBOUND',
'transaction_type' => 'finance',
'subject_vendor_data' => '__current__',
'currency' => 'EUR'
]
]
],
'evaluation_mode' => 'ALL',
'scope' => [
'transaction_types' => [
'finance'
],
'directions' => [
'INBOUND'
]
],
'period_days' => 90
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/transactions/rules/backtest/"
payload := strings.NewReader("{\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"period_days\": 90\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://verification.didit.me/v3/transactions/rules/backtest/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"period_days\": 90\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/transactions/rules/backtest/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"period_days\": 90\n}"
response = http.request(request)
puts response.read_body{
"evaluated": 4820,
"matched": 12,
"affected_entities": 4,
"period_days": 90
}Backtest Rules
Evaluate a hypothetical rule configuration against your recent transactions (most recent first, up to the backtest cap) without creating a rule or touching any transaction. Use it before activating a rule to see how often it would have matched and how many subjects it would have affected.
curl -X POST 'https://verification.didit.me/v3/transactions/rules/backtest/' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"conditions": [{"field": "currency", "operator": "eq", "value": "EUR"}, {"field": "amount", "operator": "lt", "value": 10000}], "aggregation": [{"metric": "count", "operator": "gte", "value": 20, "window": "30d", "filters": {"direction": "INBOUND", "transaction_type": "finance", "subject_vendor_data": "__current__", "currency": "EUR"}}, {"metric": "max", "field": "amount", "operator": "lt", "value": 10000, "window": "30d", "filters": {"direction": "INBOUND", "transaction_type": "finance", "subject_vendor_data": "__current__", "currency": "EUR"}}], "evaluation_mode": "ALL", "scope": {"transaction_types": ["finance"], "directions": ["INBOUND"]}, "period_days": 90}'import os
import requests
resp = requests.post(
'https://verification.didit.me/v3/transactions/rules/backtest/',
headers={'x-api-key': os.environ['DIDIT_API_KEY']},
json={
"conditions": [
{
"field": "currency",
"operator": "eq",
"value": "EUR"
},
{
"field": "amount",
"operator": "lt",
"value": 10000
}
],
"aggregation": [
{
"metric": "count",
"operator": "gte",
"value": 20,
"window": "30d",
"filters": {
"direction": "INBOUND",
"transaction_type": "finance",
"subject_vendor_data": "__current__",
"currency": "EUR"
}
},
{
"metric": "max",
"field": "amount",
"operator": "lt",
"value": 10000,
"window": "30d",
"filters": {
"direction": "INBOUND",
"transaction_type": "finance",
"subject_vendor_data": "__current__",
"currency": "EUR"
}
}
],
"evaluation_mode": "ALL",
"scope": {
"transaction_types": [
"finance"
],
"directions": [
"INBOUND"
]
},
"period_days": 90
},
timeout=30,
)
resp.raise_for_status()
stats = resp.json()
print(stats['matched'], 'matches across', stats['affected_entities'], 'subjects')const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
conditions: [
{field: 'currency', operator: 'eq', value: 'EUR'},
{field: 'amount', operator: 'lt', value: 10000}
],
aggregation: [
{
metric: 'count',
operator: 'gte',
value: 20,
window: '30d',
filters: {
direction: 'INBOUND',
transaction_type: 'finance',
subject_vendor_data: '__current__',
currency: 'EUR'
}
},
{
metric: 'max',
field: 'amount',
operator: 'lt',
value: 10000,
window: '30d',
filters: {
direction: 'INBOUND',
transaction_type: 'finance',
subject_vendor_data: '__current__',
currency: 'EUR'
}
}
],
evaluation_mode: 'ALL',
scope: {transaction_types: ['finance'], directions: ['INBOUND']},
period_days: 90
})
};
fetch('https://verification.didit.me/v3/transactions/rules/backtest/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/transactions/rules/backtest/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'conditions' => [
[
'field' => 'currency',
'operator' => 'eq',
'value' => 'EUR'
],
[
'field' => 'amount',
'operator' => 'lt',
'value' => 10000
]
],
'aggregation' => [
[
'metric' => 'count',
'operator' => 'gte',
'value' => 20,
'window' => '30d',
'filters' => [
'direction' => 'INBOUND',
'transaction_type' => 'finance',
'subject_vendor_data' => '__current__',
'currency' => 'EUR'
]
],
[
'metric' => 'max',
'field' => 'amount',
'operator' => 'lt',
'value' => 10000,
'window' => '30d',
'filters' => [
'direction' => 'INBOUND',
'transaction_type' => 'finance',
'subject_vendor_data' => '__current__',
'currency' => 'EUR'
]
]
],
'evaluation_mode' => 'ALL',
'scope' => [
'transaction_types' => [
'finance'
],
'directions' => [
'INBOUND'
]
],
'period_days' => 90
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/transactions/rules/backtest/"
payload := strings.NewReader("{\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"period_days\": 90\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://verification.didit.me/v3/transactions/rules/backtest/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"period_days\": 90\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/transactions/rules/backtest/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"conditions\": [\n {\n \"field\": \"currency\",\n \"operator\": \"eq\",\n \"value\": \"EUR\"\n },\n {\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000\n }\n ],\n \"aggregation\": [\n {\n \"metric\": \"count\",\n \"operator\": \"gte\",\n \"value\": 20,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n },\n {\n \"metric\": \"max\",\n \"field\": \"amount\",\n \"operator\": \"lt\",\n \"value\": 10000,\n \"window\": \"30d\",\n \"filters\": {\n \"direction\": \"INBOUND\",\n \"transaction_type\": \"finance\",\n \"subject_vendor_data\": \"__current__\",\n \"currency\": \"EUR\"\n }\n }\n ],\n \"evaluation_mode\": \"ALL\",\n \"scope\": {\n \"transaction_types\": [\n \"finance\"\n ],\n \"directions\": [\n \"INBOUND\"\n ]\n },\n \"period_days\": 90\n}"
response = http.request(request)
puts response.read_body{
"evaluated": 4820,
"matched": 12,
"affected_entities": 4,
"period_days": 90
}Authorizations
Your application's API key, from Developers -> API keys in the Business Console. The primary key has full access. A named key can be scoped: none, read or write per resource, limited to some workflows or to approved sessions, to a list of IP addresses, and to an expiry date. 401 means the key is missing, wrong, revoked or expired; 403 means the key has no access to this resource or action, or the request came from an address outside its IP list; 404 on a session route means the session is outside the key's workflows or statuses. A key without media access receives image, video and PDF URLs as null, and a key without sessions write receives session links and tokens as null. See https://docs.didit.me/console/api-keys.
Body
Hypothetical rule configuration to evaluate against recent transactions. Read-only and free: nothing is created or modified. Send the same conditions, aggregation, evaluation_mode AND scope as the rule you intend to activate. Omitted conditions, aggregation and scope add no constraints of their own; dropping scope can include directions or transaction types the saved rule skips. Omitted evaluation_mode defaults to ALL (which can reduce matches for an ANY rule), and omitted period_days defaults to 90 days, not unlimited history.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
ALL, ANY Which transactions the rule applies to. Only these three keys are accepted.
Show child attributes
Show child attributes
1 <= x <= 365