{"openapi":"3.1.0","info":{"title":"Ad Fraud Intelligence API","version":"1.0.0","description":"Check caller-supplied ad clicks for automation signals, browser and device contradictions, timing, duplicate ids, velocity, referrer mismatch, fingerprint similarity, conversion disagreements, campaign outliers, repeated patterns, and an explainable risk score. All checks run locally on the request. Paid with x402 exact USDC on Base. No account is required.","contact":{"email":"support@brainiac.software"},"x-guidance":"BRAINIAC.software is a pay-per-call API for software agents. No account or API key is required.\nPayment uses the x402 protocol with exact USDC on Base (chain id 8453). Each POST operation has a fixed USD price.\nHow to call an operation:\n1. POST a JSON body matching the operation's requestBody schema to the operation path. Include an Idempotency-Key header (64 hex characters, 32 random bytes).\n2. If you have not paid, the server responds 402 with payment requirements in the body. Pay the exact amount to the payTo address on Base.\n3. Retry the identical request with the same Idempotency-Key and add a payment-signature header containing the x402 payment payload. On success (200) the operation result is returned.\n4. Reuse the same Idempotency-Key only for retries of the same operation and request body; it will not be charged twice.\nAll outputs are compliance prechecks, drafts, or data lookups for human review. They are not official determinations, legal advice, identity confirmation, or certified filings. Verify time-sensitive or official data with the cited source before acting."},"servers":[{"url":"https://www.brainiac.software"}],"paths":{"/api/v1/ad-fraud/bot-detect":{"post":{"operationId":"detect_ad_click_automation_signals","summary":"Detect ad-click automation signals","description":"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.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"signals":{"type":"object","properties":{"userAgent":{"type":"string","maxLength":400},"acceptLanguage":{"type":"string","maxLength":200},"webdriver":{"type":"boolean"},"headless":{"type":"boolean"},"automationFlags":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":40}},"pluginsCount":{"type":"integer","minimum":0,"maximum":500},"languages":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":40}},"hardwareConcurrency":{"type":"integer","minimum":0,"maximum":512},"deviceMemory":{"type":"number","minimum":0,"maximum":1024},"maxTouchPoints":{"type":"integer","minimum":0,"maximum":32},"screenWidth":{"type":"integer","minimum":0,"maximum":20000},"screenHeight":{"type":"integer","minimum":0,"maximum":20000},"mouseMoves":{"type":"integer","minimum":0,"maximum":1000000},"keyCount":{"type":"integer","minimum":0,"maximum":1000000},"scrollCount":{"type":"integer","minimum":0,"maximum":1000000},"clickCount":{"type":"integer","minimum":0,"maximum":1000000},"timeOnPageMs":{"type":"integer","minimum":0,"maximum":86400000},"ip":{"type":"string","maxLength":80}},"additionalProperties":false}},"required":["signals"],"additionalProperties":false},"example":{"signals":{"userAgent":"Mozilla/5.0 HeadlessChrome/120.0.0.0","webdriver":true,"mouseMoves":0,"keyCount":0,"scrollCount":0,"clickCount":1,"timeOnPageMs":40}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}},"risk_score":{"type":"number"}},"additionalProperties":true},"example":{"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}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.03"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/browser-integrity-check":{"post":{"operationId":"check_browser_property_consistency","summary":"Check browser property consistency","description":"Compare caller-supplied browser properties for contradictions. The User-Agent is not verified, and a timezone offset is not a location.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"browser":{"type":"object","properties":{"userAgent":{"type":"string","maxLength":400},"platform":{"type":"string","maxLength":80},"vendor":{"type":"string","maxLength":80},"language":{"type":"string","maxLength":40},"languages":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":40}},"timezone":{"type":"string","maxLength":80},"timezoneOffsetMinutes":{"type":"integer","minimum":-840,"maximum":840},"screenWidth":{"type":"integer","minimum":0,"maximum":20000},"screenHeight":{"type":"integer","minimum":0,"maximum":20000},"colorDepth":{"type":"integer","minimum":0,"maximum":64},"devicePixelRatio":{"type":"number","minimum":0,"maximum":10},"hardwareConcurrency":{"type":"integer","minimum":0,"maximum":512},"deviceMemory":{"type":"number","minimum":0,"maximum":1024},"maxTouchPoints":{"type":"integer","minimum":0,"maximum":32},"brands":{"maxItems":12,"type":"array","items":{"type":"object","properties":{"brand":{"type":"string","maxLength":40},"version":{"type":"string","maxLength":20}},"required":["brand"],"additionalProperties":false}},"uaPlatform":{"type":"string","maxLength":40},"webglVendor":{"type":"string","maxLength":120},"webglRenderer":{"type":"string","maxLength":160}},"additionalProperties":false}},"required":["browser"],"additionalProperties":false},"example":{"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}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"example":{"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."]}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.03"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/device-consistency-check":{"post":{"operationId":"check_device_characteristic_consistency","summary":"Check device characteristic consistency","description":"Compare caller-supplied device type, OS, model, screen, and architecture. No device identity is looked up.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"device":{"type":"object","properties":{"deviceType":{"type":"string","enum":["phone","tablet","desktop","tv","other"]},"os":{"type":"string","maxLength":40},"osVersion":{"type":"string","maxLength":40},"model":{"type":"string","maxLength":80},"architecture":{"type":"string","maxLength":40},"simulator":{"type":"boolean"},"screenWidth":{"type":"integer","minimum":0,"maximum":20000},"screenHeight":{"type":"integer","minimum":0,"maximum":20000},"pixelRatio":{"type":"number","minimum":0,"maximum":10},"touch":{"type":"boolean"}},"additionalProperties":false}},"required":["device"],"additionalProperties":false},"example":{"device":{"deviceType":"phone","os":"Android","model":"iPhone 15","screenWidth":390,"screenHeight":844,"touch":true}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"example":{"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."]}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.03"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/click-timing-analyze":{"post":{"operationId":"analyze_click_timing","summary":"Analyze click timing","description":"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.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"clicks":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"at":{"type":"string","minLength":8,"maxLength":40},"clickId":{"type":"string","maxLength":160},"gclid":{"type":"string","maxLength":200},"fbclid":{"type":"string","maxLength":200},"dwellMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"timeToClickMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"pageLoadAt":{"type":"string","minLength":8,"maxLength":40},"x":{"type":"number","minimum":0,"maximum":20000},"y":{"type":"number","minimum":0,"maximum":20000},"campaignId":{"type":"string","maxLength":80},"fingerprintId":{"type":"string","maxLength":120},"referrer":{"type":"string","maxLength":500},"landingUrl":{"type":"string","maxLength":500}},"required":["id"],"additionalProperties":false}}},"required":["clicks"],"additionalProperties":false},"example":{"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"}]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"example":{"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."]}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.03"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/duplicate-click-detect":{"post":{"operationId":"detect_duplicate_click_identifiers","summary":"Detect duplicate click identifiers","description":"Find repeated click ids, gclids, and fbclids in the supplied batch and optional history. Nothing is stored between calls.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"clicks":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"at":{"type":"string","minLength":8,"maxLength":40},"clickId":{"type":"string","maxLength":160},"gclid":{"type":"string","maxLength":200},"fbclid":{"type":"string","maxLength":200},"dwellMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"timeToClickMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"pageLoadAt":{"type":"string","minLength":8,"maxLength":40},"x":{"type":"number","minimum":0,"maximum":20000},"y":{"type":"number","minimum":0,"maximum":20000},"campaignId":{"type":"string","maxLength":80},"fingerprintId":{"type":"string","maxLength":120},"referrer":{"type":"string","maxLength":500},"landingUrl":{"type":"string","maxLength":500}},"required":["id"],"additionalProperties":false}},"history":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"clickId":{"type":"string","maxLength":160},"gclid":{"type":"string","maxLength":200},"fbclid":{"type":"string","maxLength":200}},"additionalProperties":false}}},"required":["clicks"],"additionalProperties":false},"example":{"clicks":[{"id":"C1","clickId":"clk-1"},{"id":"C2","clickId":"clk-1"}],"history":[{"clickId":"clk-old"}]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"example":{"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."]}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.03"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/click-velocity-analyze":{"post":{"operationId":"analyze_click_velocity","summary":"Analyze click velocity","description":"Count timestamped clicks inside a supplied window. A burst is a frequency calculation, not proof of automation. Clicks are not grouped by IP.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"clicks":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"at":{"type":"string","minLength":8,"maxLength":40},"clickId":{"type":"string","maxLength":160},"gclid":{"type":"string","maxLength":200},"fbclid":{"type":"string","maxLength":200},"dwellMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"timeToClickMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"pageLoadAt":{"type":"string","minLength":8,"maxLength":40},"x":{"type":"number","minimum":0,"maximum":20000},"y":{"type":"number","minimum":0,"maximum":20000},"campaignId":{"type":"string","maxLength":80},"fingerprintId":{"type":"string","maxLength":120},"referrer":{"type":"string","maxLength":500},"landingUrl":{"type":"string","maxLength":500}},"required":["id"],"additionalProperties":false}},"windowSeconds":{"type":"integer","minimum":1,"maximum":3600},"threshold":{"type":"integer","minimum":3,"maximum":500},"groupBy":{"type":"string","enum":["none","campaign","fingerprint"]}},"required":["clicks"],"additionalProperties":false},"example":{"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"}]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"detail":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}}},"additionalProperties":true}},"limitations":{"type":"array","items":{"type":"string"}},"risk_score":{"type":"number"}},"additionalProperties":true},"example":{"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}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.04"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/referrer-integrity-check":{"post":{"operationId":"check_referrer_and_campaign_consistency","summary":"Check referrer and campaign consistency","description":"Compare a caller-supplied referrer, landing URL, and campaign source. URLs are not fetched. A family mismatch is a heuristic, not a verified referrer.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"referrer":{"type":"string","maxLength":500},"landingUrl":{"type":"string","maxLength":500},"campaign":{"type":"object","properties":{"source":{"type":"string","maxLength":80},"medium":{"type":"string","maxLength":40},"name":{"type":"string","maxLength":80}},"additionalProperties":false},"expectedHosts":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":200}}},"additionalProperties":false},"example":{"referrer":"https://www.google.com/search","landingUrl":"https://shop.example/landing?utm_source=facebook","campaign":{"source":"facebook","medium":"cpc"},"expectedHosts":["facebook.com"]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"example":{"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."]}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.03"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/click-fingerprint-analyze":{"post":{"operationId":"compare_click_fingerprints","summary":"Compare click fingerprints","description":"Compare caller-supplied canvas, WebGL, audio, and font hashes. Hashes are not computed here, and a match is not a device identity.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"fingerprints":{"minItems":1,"maxItems":80,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"canvasHash":{"type":"string","maxLength":128},"webglHash":{"type":"string","maxLength":128},"audioHash":{"type":"string","maxLength":128},"fontHash":{"type":"string","maxLength":128},"userAgent":{"type":"string","maxLength":400},"screenWidth":{"type":"integer","minimum":0,"maximum":20000},"screenHeight":{"type":"integer","minimum":0,"maximum":20000},"timezone":{"type":"string","maxLength":80},"language":{"type":"string","maxLength":40}},"required":["id"],"additionalProperties":false}}},"required":["fingerprints"],"additionalProperties":false},"example":{"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)"}]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"example":{"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."]}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.04"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/conversion-fraud-detect":{"post":{"operationId":"detect_click_and_conversion_disagreements","summary":"Detect click and conversion disagreements","description":"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.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"clicks":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"at":{"type":"string","minLength":8,"maxLength":40},"clickId":{"type":"string","maxLength":160},"gclid":{"type":"string","maxLength":200},"fbclid":{"type":"string","maxLength":200},"dwellMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"timeToClickMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"pageLoadAt":{"type":"string","minLength":8,"maxLength":40},"x":{"type":"number","minimum":0,"maximum":20000},"y":{"type":"number","minimum":0,"maximum":20000},"campaignId":{"type":"string","maxLength":80},"fingerprintId":{"type":"string","maxLength":120},"referrer":{"type":"string","maxLength":500},"landingUrl":{"type":"string","maxLength":500}},"required":["id"],"additionalProperties":false}},"conversions":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"at":{"type":"string","minLength":8,"maxLength":40},"clickId":{"type":"string","maxLength":160},"campaignId":{"type":"string","maxLength":80},"value":{"type":"number","minimum":0,"maximum":1000000000}},"required":["id"],"additionalProperties":false}}},"required":["conversions"],"additionalProperties":false},"example":{"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}]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}},"risk_score":{"type":"number"}},"additionalProperties":true},"example":{"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}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.04"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/campaign-anomaly-detect":{"post":{"operationId":"detect_campaign_metric_anomalies","summary":"Detect campaign metric anomalies","description":"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.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"rows":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"campaignId":{"type":"string","maxLength":80},"day":{"type":"string","maxLength":20},"clicks":{"type":"number","minimum":0,"maximum":1000000000},"impressions":{"type":"number","minimum":0,"maximum":1000000000},"conversions":{"type":"number","minimum":0,"maximum":1000000000},"spend":{"type":"number","minimum":0,"maximum":1000000000}},"required":["id"],"additionalProperties":false}}},"required":["rows"],"additionalProperties":false},"example":{"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}]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"detail":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}}},"additionalProperties":true}},"limitations":{"type":"array","items":{"type":"string"}},"risk_score":{"type":"number"}},"additionalProperties":true},"example":{"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}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.04"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/click-pattern-detect":{"post":{"operationId":"detect_repeated_click_patterns","summary":"Detect repeated click patterns","description":"Look for identical timestamps, a fixed gap, or identical coordinates across a supplied click collection. Fewer than five usable clicks is insufficient.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"clicks":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"at":{"type":"string","minLength":8,"maxLength":40},"clickId":{"type":"string","maxLength":160},"gclid":{"type":"string","maxLength":200},"fbclid":{"type":"string","maxLength":200},"dwellMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"timeToClickMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"pageLoadAt":{"type":"string","minLength":8,"maxLength":40},"x":{"type":"number","minimum":0,"maximum":20000},"y":{"type":"number","minimum":0,"maximum":20000},"campaignId":{"type":"string","maxLength":80},"fingerprintId":{"type":"string","maxLength":120},"referrer":{"type":"string","maxLength":500},"landingUrl":{"type":"string","maxLength":500}},"required":["id"],"additionalProperties":false}}},"required":["clicks"],"additionalProperties":false},"example":{"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}]}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{}},"limitations":{"type":"array","items":{"type":"string"}},"risk_score":{"type":"number"}},"additionalProperties":true},"example":{"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}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.04"},"protocols":[{"x402":{}}]}}},"/api/v1/ad-fraud/click-risk-score":{"post":{"operationId":"score_supplied_click_risk","summary":"Score supplied click risk","description":"Sum a documented weight for each supplied click attribute. Missing data adds no points. The score is not a probability of fraud.","tags":["ad-fraud"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"click":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"at":{"type":"string","minLength":8,"maxLength":40},"clickId":{"type":"string","maxLength":160},"gclid":{"type":"string","maxLength":200},"fbclid":{"type":"string","maxLength":200},"dwellMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"timeToClickMs":{"type":"integer","minimum":-1000000,"maximum":86400000},"pageLoadAt":{"type":"string","minLength":8,"maxLength":40},"x":{"type":"number","minimum":0,"maximum":20000},"y":{"type":"number","minimum":0,"maximum":20000},"campaignId":{"type":"string","maxLength":80},"fingerprintId":{"type":"string","maxLength":120},"referrer":{"type":"string","maxLength":500},"landingUrl":{"type":"string","maxLength":500}},"required":["id"],"additionalProperties":false},"signals":{"type":"object","properties":{"userAgent":{"type":"string","maxLength":400},"acceptLanguage":{"type":"string","maxLength":200},"webdriver":{"type":"boolean"},"headless":{"type":"boolean"},"automationFlags":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":40}},"pluginsCount":{"type":"integer","minimum":0,"maximum":500},"languages":{"maxItems":20,"type":"array","items":{"type":"string","maxLength":40}},"hardwareConcurrency":{"type":"integer","minimum":0,"maximum":512},"deviceMemory":{"type":"number","minimum":0,"maximum":1024},"maxTouchPoints":{"type":"integer","minimum":0,"maximum":32},"screenWidth":{"type":"integer","minimum":0,"maximum":20000},"screenHeight":{"type":"integer","minimum":0,"maximum":20000},"mouseMoves":{"type":"integer","minimum":0,"maximum":1000000},"keyCount":{"type":"integer","minimum":0,"maximum":1000000},"scrollCount":{"type":"integer","minimum":0,"maximum":1000000},"clickCount":{"type":"integer","minimum":0,"maximum":1000000},"timeOnPageMs":{"type":"integer","minimum":0,"maximum":86400000},"ip":{"type":"string","maxLength":80}},"additionalProperties":false},"history":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"clickId":{"type":"string","maxLength":160},"gclid":{"type":"string","maxLength":200},"fbclid":{"type":"string","maxLength":200}},"additionalProperties":false}},"conversion":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":120},"at":{"type":"string","minLength":8,"maxLength":40},"clickId":{"type":"string","maxLength":160},"campaignId":{"type":"string","maxLength":80},"value":{"type":"number","minimum":0,"maximum":1000000000}},"required":["id"],"additionalProperties":false},"referrer":{"type":"string","maxLength":500},"landingUrl":{"type":"string","maxLength":500},"campaign":{"type":"object","properties":{"source":{"type":"string","maxLength":80}},"additionalProperties":false}},"required":["click"],"additionalProperties":false},"example":{"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"}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Fresh random 32-byte value encoded as 64 hexadecimal characters. Reuse unchanged only for retries of the same operation and request.","schema":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"}}],"responses":{"200":{"description":"Illustrative endpoint-specific JSON response shape. Conditional fields depend on the result and data-source availability.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"analysis":{"type":"string"},"verdict":{"type":"string"},"confidence":{"type":"string"},"signals":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"severity":{"type":"string"},"explanation":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}},"basis":{"type":"string"}},"additionalProperties":true}},"evidence":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"detail":{"type":"string"},"fields":{"type":"array","items":{"type":"string"}}},"additionalProperties":true}},"limitations":{"type":"array","items":{"type":"string"}},"risk_score":{"type":"number"}},"additionalProperties":true},"example":{"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}}}},"400":{"description":"Invalid JSON or request schema."},"402":{"description":"Payment Required"},"409":{"description":"Idempotency conflict, in-progress payment, or expired result cache. Reusing the key cannot trigger a second charge."},"413":{"description":"Request body exceeds the 24 MB limit."},"500":{"description":"Operation failed. With upfront settlement this may occur after payment; reuse the same idempotency key to retrieve the stored result."},"503":{"description":"Payment or retry-safe result storage is unavailable; the operation is not run."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.04"},"protocols":[{"x402":{}}]}}}},"components":{"schemas":{"ApiError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}}}