https://www.brainiac.software/api/v1/ad-fraud/bot-detect$0.03 USDCDetect ad-click automation signals
Look for automation indicators in caller-supplied HTTP and browser signals. An IP address is ignored. A User-Agent token is a string match, not proof of a bot.
Body
| Field | Required | Notes |
|---|---|---|
signals | Yes | object; Object |
Request exampleJSON
{
"signals": {
"userAgent": "Mozilla/5.0 HeadlessChrome/120.0.0.0",
"webdriver": true,
"mouseMoves": 0,
"keyCount": 0,
"scrollCount": 0,
"clickCount": 1,
"timeOnPageMs": 40
}
}Response exampleJSON
{
"success": true,
"analysis": "The supplied signals include automation indicators. They are not a bot verdict.",
"verdict": "review",
"confidence": "high",
"signals": [
{
"type": "webdriver_flag",
"severity": "high",
"explanation": "The request says webdriver is true.",
"fields": [
"signals.webdriver"
],
"basis": "fact"
},
{
"type": "ua_token_headless_chrome",
"severity": "medium",
"explanation": "The User-Agent contains \"headlesschrome\". This is a string match, not proof of automation.",
"fields": [
"signals.userAgent"
],
"basis": "heuristic"
},
{
"type": "no_interaction_with_click",
"severity": "low",
"explanation": "A click was supplied with no mouse, key, or scroll counts and under 200 ms on the page.",
"fields": [
"signals.mouseMoves",
"signals.keyCount",
"signals.scrollCount",
"signals.clickCount",
"signals.timeOnPageMs"
],
"basis": "heuristic"
}
],
"evidence": [],
"limitations": [
"An IP address is ignored. It cannot establish that a visitor is a bot, and this check does not look up VPN, proxy, or hosting status.",
"A User-Agent token is a string match. It does not prove the browser is automated or authentic.",
"Interaction counts are caller-supplied and can be forged. A single short visit is a weak indicator.",
"Missing fields lower confidence. They do not add fraud risk."
],
"risk_score": 41
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/bot-detect" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"signals": {
"userAgent": "Mozilla/5.0 HeadlessChrome/120.0.0.0",
"webdriver": true,
"mouseMoves": 0,
"keyCount": 0,
"scrollCount": 0,
"clickCount": 1,
"timeOnPageMs": 40
}
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/browser-integrity-check$0.03 USDCCheck browser property consistency
Compare caller-supplied browser properties for contradictions. The User-Agent is not verified, and a timezone offset is not a location.
Body
| Field | Required | Notes |
|---|---|---|
browser | Yes | object; Object |
Request exampleJSON
{
"browser": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Version/17.0 Mobile/15E148 Safari/604.1",
"platform": "Win32",
"brands": [
{
"brand": "Google Chrome",
"version": "120"
}
],
"timezone": "America/New_York",
"timezoneOffsetMinutes": 0
}
}Response exampleJSON
{
"success": true,
"analysis": "Some supplied browser properties contradict each other. That is not proof the browser is fake.",
"verdict": "review",
"confidence": "high",
"signals": [
{
"type": "os_mismatch",
"severity": "medium",
"explanation": "The User-Agent reads as ios and the platform reads as windows.",
"fields": [
"browser.userAgent",
"browser.platform",
"browser.uaPlatform"
],
"basis": "fact"
},
{
"type": "brand_mismatch",
"severity": "medium",
"explanation": "The User-Agent reads as safari and the client-hint brands read as chrome.",
"fields": [
"browser.userAgent",
"browser.brands"
],
"basis": "fact"
},
{
"type": "timezone_offset_mismatch",
"severity": "medium",
"explanation": "The supplied offset matches neither the January nor the July offset of that timezone name.",
"fields": [
"browser.timezone",
"browser.timezoneOffsetMinutes"
],
"basis": "calculation"
}
],
"evidence": [],
"limitations": [
"Browser properties are compared only with each other. The User-Agent is not verified against a real browser.",
"Client hints and WebGL strings are caller-supplied and can be forged.",
"A timezone match uses the January and July offsets of the supplied IANA name. It is not the visitor's location.",
"Missing properties lower confidence. They are not treated as fraud."
]
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/browser-integrity-check" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"browser": {
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 Version/17.0 Mobile/15E148 Safari/604.1",
"platform": "Win32",
"brands": [
{
"brand": "Google Chrome",
"version": "120"
}
],
"timezone": "America/New_York",
"timezoneOffsetMinutes": 0
}
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/device-consistency-check$0.03 USDCCheck device characteristic consistency
Compare caller-supplied device type, OS, model, screen, and architecture. No device identity is looked up.
Body
| Field | Required | Notes |
|---|---|---|
device | Yes | object; Object |
Request exampleJSON
{
"device": {
"deviceType": "phone",
"os": "Android",
"model": "iPhone 15",
"screenWidth": 390,
"screenHeight": 844,
"touch": true
}
}Response exampleJSON
{
"success": true,
"analysis": "Some supplied device fields contradict each other. That does not identify the physical device.",
"verdict": "review",
"confidence": "high",
"signals": [
{
"type": "android_apple_model",
"severity": "high",
"explanation": "The OS reads as Android and the model name reads as an Apple phone or tablet.",
"fields": [
"device.os",
"device.model"
],
"basis": "fact"
}
],
"evidence": [],
"limitations": [
"Device fields are compared only with each other. No device identity is looked up or confirmed.",
"A simulator flag, when supplied, explains an OS and architecture mismatch.",
"Screen size and touch support do not prove which physical device was used.",
"Missing fields lower confidence. They do not add fraud risk."
]
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/device-consistency-check" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"device": {
"deviceType": "phone",
"os": "Android",
"model": "iPhone 15",
"screenWidth": 390,
"screenHeight": 844,
"touch": true
}
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/click-timing-analyze$0.03 USDCAnalyze click timing
Check caller-supplied click timestamps and dwell for impossible order or a fixed short gap. One fast click is a weak indicator, not a campaign pattern.
Body
| Field | Required | Notes |
|---|---|---|
clicks | Yes | array; Array |
Request exampleJSON
{
"clicks": [
{
"id": "C1",
"at": "2026-11-04T12:00:00.000Z",
"pageLoadAt": "2026-11-04T12:00:02.000Z",
"dwellMs": 20
},
{
"id": "C2",
"at": "2026-11-04T12:00:00.200Z"
},
{
"id": "C3",
"at": "2026-11-04T12:00:00.400Z"
},
{
"id": "C4",
"at": "2026-11-04T12:00:00.600Z"
},
{
"id": "C5",
"at": "2026-11-04T12:00:00.800Z"
}
]
}Response exampleJSON
{
"success": true,
"analysis": "Some supplied times are implausible or unusually regular.",
"verdict": "review",
"confidence": "high",
"signals": [
{
"type": "click_before_load",
"severity": "high",
"explanation": "Click C1 is timestamped before its page-load time.",
"fields": [
"clicks[0].at",
"clicks[0].pageLoadAt"
],
"basis": "fact"
},
{
"type": "very_short_dwell",
"severity": "low",
"explanation": "Click C1 has a dwell under 50 ms. One short dwell is a weak indicator.",
"fields": [
"clicks[0].dwellMs"
],
"basis": "heuristic"
},
{
"type": "constant_interval",
"severity": "medium",
"explanation": "The timestamped clicks are about 200 ms apart. A fixed short gap is a calculated pattern, not proof of a bot.",
"fields": [
"clicks[0].at",
"clicks[1].at",
"clicks[2].at",
"clicks[3].at",
"clicks[4].at"
],
"basis": "calculation"
}
],
"evidence": [],
"limitations": [
"Timing rules use only the timestamps and durations in this request.",
"One fast click is a weak indicator. It does not establish a campaign-wide pattern.",
"A constant interval is a calculation over the supplied sequence, not proof of a bot.",
"Missing timestamps lower confidence and are not scored as fraud."
]
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/click-timing-analyze" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"clicks": [
{
"id": "C1",
"at": "2026-11-04T12:00:00.000Z",
"pageLoadAt": "2026-11-04T12:00:02.000Z",
"dwellMs": 20
},
{
"id": "C2",
"at": "2026-11-04T12:00:00.200Z"
},
{
"id": "C3",
"at": "2026-11-04T12:00:00.400Z"
},
{
"id": "C4",
"at": "2026-11-04T12:00:00.600Z"
},
{
"id": "C5",
"at": "2026-11-04T12:00:00.800Z"
}
]
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/duplicate-click-detect$0.03 USDCDetect duplicate click identifiers
Find repeated click ids, gclids, and fbclids in the supplied batch and optional history. Nothing is stored between calls.
Body
| Field | Required | Notes |
|---|---|---|
clicks | Yes | array; Array |
history | No | array; Array |
Request exampleJSON
{
"clicks": [
{
"id": "C1",
"clickId": "clk-1"
},
{
"id": "C2",
"clickId": "clk-1"
}
],
"history": [
{
"clickId": "clk-old"
}
]
}Response exampleJSON
{
"success": true,
"analysis": "Some click identifiers repeat inside the supplied records.",
"verdict": "review",
"confidence": "medium",
"signals": [
{
"type": "duplicate_identifier",
"severity": "medium",
"explanation": "The same clickId appears 2 times in this batch.",
"fields": [
"clicks[0].clickId",
"clicks[1].clickId"
],
"basis": "fact"
}
],
"evidence": [],
"limitations": [
"Duplicates are exact identifier matches inside this request.",
"Earlier clicks are visible only when a history array is included. Nothing is stored between calls.",
"A repeated click id is a fact about the supplied batch. It is not a confirmed invalid click.",
"Missing identifiers produce insufficient_data rather than a fraud score."
]
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/duplicate-click-detect" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"clicks": [
{
"id": "C1",
"clickId": "clk-1"
},
{
"id": "C2",
"clickId": "clk-1"
}
],
"history": [
{
"clickId": "clk-old"
}
]
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/click-velocity-analyze$0.04 USDCAnalyze click velocity
Count timestamped clicks inside a supplied window. A burst is a frequency calculation, not proof of automation. Clicks are not grouped by IP.
Body
| Field | Required | Notes |
|---|---|---|
clicks | Yes | array; Array |
windowSeconds | No | integer |
threshold | No | integer |
groupBy | No | string; One of: none, campaign, fingerprint |
Request exampleJSON
{
"windowSeconds": 10,
"threshold": 5,
"clicks": [
{
"id": "C1",
"at": "2026-11-04T12:00:00.000Z"
},
{
"id": "C2",
"at": "2026-11-04T12:00:01.000Z"
},
{
"id": "C3",
"at": "2026-11-04T12:00:02.000Z"
},
{
"id": "C4",
"at": "2026-11-04T12:00:03.000Z"
},
{
"id": "C5",
"at": "2026-11-04T12:00:04.000Z"
}
]
}Response exampleJSON
{
"success": true,
"analysis": "A supplied window reaches 5 clicks, at or above the threshold of 5.",
"verdict": "review",
"confidence": "medium",
"signals": [
{
"type": "click_burst",
"severity": "medium",
"explanation": "5 timestamped clicks fall inside 10 seconds.",
"fields": [
"clicks[0].at",
"clicks[1].at",
"clicks[2].at",
"clicks[3].at",
"clicks[4].at"
],
"basis": "calculation"
}
],
"evidence": [
{
"kind": "calculation",
"detail": "The window is 10 seconds and the count threshold is 5.",
"fields": [
"windowSeconds",
"threshold"
]
}
],
"limitations": [
"Frequency is counted inside the supplied batch and window. It is not a historical rate.",
"A burst is a calculation. It does not prove the clicks are automated or fraudulent.",
"Clicks are not grouped by IP address.",
"Fewer than three timestamped clicks cannot support a frequency conclusion."
],
"risk_score": 40
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/click-velocity-analyze" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"windowSeconds": 10,
"threshold": 5,
"clicks": [
{
"id": "C1",
"at": "2026-11-04T12:00:00.000Z"
},
{
"id": "C2",
"at": "2026-11-04T12:00:01.000Z"
},
{
"id": "C3",
"at": "2026-11-04T12:00:02.000Z"
},
{
"id": "C4",
"at": "2026-11-04T12:00:03.000Z"
},
{
"id": "C5",
"at": "2026-11-04T12:00:04.000Z"
}
]
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/referrer-integrity-check$0.03 USDCCheck referrer and campaign consistency
Compare a caller-supplied referrer, landing URL, and campaign source. URLs are not fetched. A family mismatch is a heuristic, not a verified referrer.
Body
| Field | Required | Notes |
|---|---|---|
referrer | No | string |
landingUrl | No | string |
campaign | No | object; Object |
expectedHosts | No | array; Array |
Request exampleJSON
{
"referrer": "https://www.google.com/search",
"landingUrl": "https://shop.example/landing?utm_source=facebook",
"campaign": {
"source": "facebook",
"medium": "cpc"
},
"expectedHosts": [
"facebook.com"
]
}Response exampleJSON
{
"success": true,
"analysis": "The supplied referrer, landing URL, or campaign fields disagree.",
"verdict": "review",
"confidence": "medium",
"signals": [
{
"type": "referrer_utm_mismatch",
"severity": "medium",
"explanation": "The referrer looks like google and utm_source looks like meta.",
"fields": [
"referrer",
"landingUrl"
],
"basis": "heuristic"
},
{
"type": "referrer_outside_expected_hosts",
"severity": "medium",
"explanation": "The referrer host is not in the supplied expected-host list.",
"fields": [
"referrer",
"expectedHosts"
],
"basis": "fact"
}
],
"evidence": [],
"limitations": [
"Referrer, landing URL, and campaign fields are caller-supplied. The referrer is not fetched or verified.",
"A source-family mismatch is a heuristic comparison of host names and campaign labels.",
"This check does not decide whether the campaign configuration is correct.",
"An unreadable URL is reported as missing, not as fraud."
]
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/referrer-integrity-check" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"referrer": "https://www.google.com/search",
"landingUrl": "https://shop.example/landing?utm_source=facebook",
"campaign": {
"source": "facebook",
"medium": "cpc"
},
"expectedHosts": [
"facebook.com"
]
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/click-fingerprint-analyze$0.04 USDCCompare click fingerprints
Compare caller-supplied canvas, WebGL, audio, and font hashes. Hashes are not computed here, and a match is not a device identity.
Body
| Field | Required | Notes |
|---|---|---|
fingerprints | Yes | array; Array |
Request exampleJSON
{
"fingerprints": [
{
"id": "F1",
"canvasHash": "abc",
"webglHash": "def",
"userAgent": "Mozilla/5.0 (Windows NT 10.0)"
},
{
"id": "F2",
"canvasHash": "abc",
"webglHash": "def",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)"
}
]
}Response exampleJSON
{
"success": true,
"analysis": "Some supplied fingerprints match or contradict each other. A match is not a device identity.",
"verdict": "review",
"confidence": "low",
"signals": [
{
"type": "identical_fingerprint",
"severity": "low",
"explanation": "2 records share the same supplied hash components.",
"fields": [
"fingerprints[0]",
"fingerprints[1]"
],
"basis": "calculation"
},
{
"type": "same_canvas_different_os",
"severity": "medium",
"explanation": "The same canvas hash is paired with User-Agent strings that read as different operating systems.",
"fields": [
"fingerprints[0].canvasHash",
"fingerprints[1].canvasHash"
],
"basis": "heuristic"
}
],
"evidence": [],
"limitations": [
"Hashes are compared as supplied. Canvas, WebGL, audio, and fonts are not collected or computed here.",
"An identical hash is a similarity observation. It does not identify a person or a device.",
"At least two fingerprints are required. A single fingerprint cannot show similarity.",
"Missing hash components are skipped. They do not increase risk."
]
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/click-fingerprint-analyze" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"fingerprints": [
{
"id": "F1",
"canvasHash": "abc",
"webglHash": "def",
"userAgent": "Mozilla/5.0 (Windows NT 10.0)"
},
{
"id": "F2",
"canvasHash": "abc",
"webglHash": "def",
"userAgent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)"
}
]
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/conversion-fraud-detect$0.04 USDCDetect click and conversion disagreements
Compare caller-supplied clicks and conversions for time order, campaign mismatch, and repeated ids. An unmatched conversion is a missing link, not proof the click never happened.
Body
| Field | Required | Notes |
|---|---|---|
clicks | No | array; Array |
conversions | Yes | array; Array |
Request exampleJSON
{
"clicks": [
{
"id": "C1",
"clickId": "clk-1",
"at": "2026-11-04T12:00:05.000Z",
"campaignId": "spring"
}
],
"conversions": [
{
"id": "V1",
"clickId": "clk-1",
"at": "2026-11-04T12:00:01.000Z",
"campaignId": "fall",
"value": 40
}
]
}Response exampleJSON
{
"success": true,
"analysis": "Some supplied click and conversion records disagree or repeat.",
"verdict": "review",
"confidence": "high",
"signals": [
{
"type": "conversion_before_click",
"severity": "high",
"explanation": "Conversion V1 is timestamped before click C1.",
"fields": [
"conversions[0].at",
"clicks[0].at"
],
"basis": "fact"
},
{
"type": "campaign_mismatch",
"severity": "medium",
"explanation": "Conversion V1 and its click name different campaigns.",
"fields": [
"conversions[0].campaignId",
"clicks[0].campaignId"
],
"basis": "fact"
}
],
"evidence": [],
"limitations": [
"Click and conversion records are compared only inside this request.",
"An unmatched conversion is a missing link in the supplied batch, not proof the click never happened.",
"A conversion a few seconds after a click can be legitimate. It is a weak timing indicator.",
"Missing click history lowers confidence and is not treated as fraud."
],
"risk_score": 42
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/conversion-fraud-detect" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"clicks": [
{
"id": "C1",
"clickId": "clk-1",
"at": "2026-11-04T12:00:05.000Z",
"campaignId": "spring"
}
],
"conversions": [
{
"id": "V1",
"clickId": "clk-1",
"at": "2026-11-04T12:00:01.000Z",
"campaignId": "fall",
"value": 40
}
]
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/campaign-anomaly-detect$0.04 USDCDetect campaign metric anomalies
Find impossible ratios and, when at least eight rows have clicks and impressions, click-through-rate outliers. An outlier is a statistic, not a fraud verdict.
Body
| Field | Required | Notes |
|---|---|---|
rows | Yes | array; Array |
Request exampleJSON
{
"rows": [
{
"id": "R1",
"clicks": 10,
"impressions": 1000,
"conversions": 1
},
{
"id": "R2",
"clicks": 12,
"impressions": 1000,
"conversions": 1
},
{
"id": "R3",
"clicks": 9,
"impressions": 1000,
"conversions": 1
},
{
"id": "R4",
"clicks": 11,
"impressions": 1000,
"conversions": 1
},
{
"id": "R5",
"clicks": 10,
"impressions": 1000,
"conversions": 1
},
{
"id": "R6",
"clicks": 13,
"impressions": 1000,
"conversions": 1
},
{
"id": "R7",
"clicks": 8,
"impressions": 1000,
"conversions": 1
},
{
"id": "R8",
"clicks": 900,
"impressions": 1000,
"conversions": 1200
}
]
}Response exampleJSON
{
"success": true,
"analysis": "The supplied campaign rows include an outlier or an impossible ratio. That is not a fraud verdict.",
"verdict": "review",
"confidence": "high",
"signals": [
{
"type": "conversions_above_clicks",
"severity": "high",
"explanation": "Row R8 has more conversions than clicks.",
"fields": [
"rows[7].conversions",
"rows[7].clicks"
],
"basis": "fact"
},
{
"type": "ctr_outlier",
"severity": "medium",
"explanation": "Row R8 has a click-through rate 559.2 standard deviations from the other supplied rows.",
"fields": [
"rows[7].clicks",
"rows[7].impressions"
],
"basis": "calculation"
}
],
"evidence": [
{
"kind": "calculation",
"detail": "Click-through rates were compared with leave-one-out z-scores across 8 rows.",
"fields": [
"rows"
]
}
],
"limitations": [
"Anomalies are statistics over the supplied rows only. They are not a fraud verdict.",
"A z-score is calculated only when at least eight comparable rates exist.",
"Impossible ratios, such as conversions above clicks, are facts about the supplied numbers.",
"Missing metrics are skipped. They do not increase the anomaly score."
],
"risk_score": 40
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/campaign-anomaly-detect" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"rows": [
{
"id": "R1",
"clicks": 10,
"impressions": 1000,
"conversions": 1
},
{
"id": "R2",
"clicks": 12,
"impressions": 1000,
"conversions": 1
},
{
"id": "R3",
"clicks": 9,
"impressions": 1000,
"conversions": 1
},
{
"id": "R4",
"clicks": 11,
"impressions": 1000,
"conversions": 1
},
{
"id": "R5",
"clicks": 10,
"impressions": 1000,
"conversions": 1
},
{
"id": "R6",
"clicks": 13,
"impressions": 1000,
"conversions": 1
},
{
"id": "R7",
"clicks": 8,
"impressions": 1000,
"conversions": 1
},
{
"id": "R8",
"clicks": 900,
"impressions": 1000,
"conversions": 1200
}
]
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/click-pattern-detect$0.04 USDCDetect repeated click patterns
Look for identical timestamps, a fixed gap, or identical coordinates across a supplied click collection. Fewer than five usable clicks is insufficient.
Body
| Field | Required | Notes |
|---|---|---|
clicks | Yes | array; Array |
Request exampleJSON
{
"clicks": [
{
"id": "C1",
"at": "2026-11-04T12:00:00.000Z",
"x": 10,
"y": 10
},
{
"id": "C2",
"at": "2026-11-04T12:00:00.500Z",
"x": 10,
"y": 10
},
{
"id": "C3",
"at": "2026-11-04T12:00:01.000Z",
"x": 10,
"y": 10
},
{
"id": "C4",
"at": "2026-11-04T12:00:01.500Z",
"x": 10,
"y": 10
},
{
"id": "C5",
"at": "2026-11-04T12:00:02.000Z",
"x": 10,
"y": 10
}
]
}Response exampleJSON
{
"success": true,
"analysis": "The supplied clicks repeat a time or coordinate pattern. That is not proof of automation.",
"verdict": "review",
"confidence": "high",
"signals": [
{
"type": "fixed_gap",
"severity": "medium",
"explanation": "Timestamped clicks keep a gap of about 500 ms.",
"fields": [
"clicks[0].at",
"clicks[1].at",
"clicks[2].at",
"clicks[3].at",
"clicks[4].at"
],
"basis": "calculation"
},
{
"type": "identical_coordinates",
"severity": "medium",
"explanation": "Five or more clicks share the same x and y.",
"fields": [
"clicks[0].x",
"clicks[1].x",
"clicks[2].x",
"clicks[3].x",
"clicks[4].x"
],
"basis": "calculation"
}
],
"evidence": [],
"limitations": [
"Patterns are sequences in the supplied clicks: repeated times, identical coordinates, or a fixed gap.",
"One click cannot establish a pattern. Fewer than five usable clicks returns insufficient_data.",
"A repeated coordinate or interval is a calculation, not proof of automation.",
"This check does not use IP addresses or external reputation."
],
"risk_score": 40
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/click-pattern-detect" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"clicks": [
{
"id": "C1",
"at": "2026-11-04T12:00:00.000Z",
"x": 10,
"y": 10
},
{
"id": "C2",
"at": "2026-11-04T12:00:00.500Z",
"x": 10,
"y": 10
},
{
"id": "C3",
"at": "2026-11-04T12:00:01.000Z",
"x": 10,
"y": 10
},
{
"id": "C4",
"at": "2026-11-04T12:00:01.500Z",
"x": 10,
"y": 10
},
{
"id": "C5",
"at": "2026-11-04T12:00:02.000Z",
"x": 10,
"y": 10
}
]
}
JSONhttps://www.brainiac.software/api/v1/ad-fraud/click-risk-score$0.04 USDCScore supplied click risk
Sum a documented weight for each supplied click attribute. Missing data adds no points. The score is not a probability of fraud.
Body
| Field | Required | Notes |
|---|---|---|
click | Yes | object; Object |
signals | No | object; Object |
history | No | array; Array |
conversion | No | object; Object |
referrer | No | string |
landingUrl | No | string |
campaign | No | object; Object |
Request exampleJSON
{
"click": {
"id": "C1",
"clickId": "clk-1",
"at": "2026-11-04T12:00:05.000Z",
"dwellMs": 20
},
"signals": {
"webdriver": true,
"userAgent": "Mozilla/5.0 HeadlessChrome/120.0"
},
"history": [
{
"clickId": "clk-1"
}
],
"conversion": {
"id": "V1",
"at": "2026-11-04T12:00:01.000Z",
"clickId": "clk-1"
}
}Response exampleJSON
{
"success": true,
"analysis": "The score sums the weights of attributes that are present. It is not a fraud accusation.",
"verdict": "review",
"confidence": "high",
"signals": [
{
"type": "automation_flag",
"severity": "high",
"explanation": "A supplied automation flag adds 25 points.",
"fields": [
"signals.webdriver",
"signals.headless",
"signals.automationFlags"
],
"basis": "fact"
},
{
"type": "automation_ua_token",
"severity": "medium",
"explanation": "An automation token in the User-Agent adds 20 points. It is a string match.",
"fields": [
"signals.userAgent"
],
"basis": "heuristic"
},
{
"type": "implausible_dwell",
"severity": "low",
"explanation": "A dwell under 50 ms adds 15 points. One short dwell is a weak indicator.",
"fields": [
"click.dwellMs"
],
"basis": "heuristic"
},
{
"type": "duplicate_click_id",
"severity": "medium",
"explanation": "The click repeats an identifier from the supplied history and adds 30 points.",
"fields": [
"click.clickId",
"click.gclid",
"click.fbclid",
"history"
],
"basis": "fact"
},
{
"type": "conversion_before_click",
"severity": "high",
"explanation": "The conversion is timestamped before the click and adds 25 points.",
"fields": [
"conversion.at",
"click.at"
],
"basis": "fact"
}
],
"evidence": [
{
"kind": "calculation",
"detail": "Weights: automation flag 25, User-Agent token 20, short dwell 15, click before load 25, duplicate id 30, conversion before click 25, referrer mismatch 12. The sum is capped at 100.",
"fields": [
"click"
]
}
],
"limitations": [
"The score is a capped sum of documented weights. It is not a probability of fraud and not an accusation.",
"Only attributes present on this request are weighted. Missing data reduces confidence and adds no points.",
"A User-Agent token, a short dwell, and a referrer mismatch are heuristics.",
"Duplicate identifiers and a conversion before its click are facts about the supplied records only."
],
"risk_score": 100
}cURL
curl -i -X POST "https://www.brainiac.software/api/v1/ad-fraud/click-risk-score" \
-H 'content-type: application/json' \
-H 'Idempotency-Key: <fresh-64-character-random-hex-key>' \
--data-binary @- <<'JSON'
{
"click": {
"id": "C1",
"clickId": "clk-1",
"at": "2026-11-04T12:00:05.000Z",
"dwellMs": 20
},
"signals": {
"webdriver": true,
"userAgent": "Mozilla/5.0 HeadlessChrome/120.0"
},
"history": [
{
"clickId": "clk-1"
}
],
"conversion": {
"id": "V1",
"at": "2026-11-04T12:00:01.000Z",
"clickId": "clk-1"
}
}
JSON