What to send for each event type
The more you send, the more signals fire — but only event_type and (for most
events) ip are hard requirements. Canonical payloads:
Field notes
device_token on card events
Not “recommended” in the ordinary sense: it is the only field whose absence removes enforcement rather than a signal — the two card rules that can block on their own both read a device-keyed counter. See device fingerprinting for exactly what goes dark. Per-request it stays optional (a browser that blocks collection must still be able to sign up); it is your integration that is incomplete without it.
ip — optional only on trial_convert
Conversions are usually recorded in a payment-provider webhook handler, where there is no client request — and therefore no honest client IP — in scope. The other events happen inside a user-initiated request, so send the IP: IP-family and velocity signals depend on it. Never send your own server’s IP as a stand-in — omit rather than lie.
identity{} — an open key set
Any string → string map: phone, payer_wallet, github_handle, whatever
identifiers your product collects. Unrecognized keys are stored and used for
identity linking; you don’t need to ask us before sending a new one.
payment{} — pass through from Stripe
payment_method.card.fingerprint → card_fingerprint,
payment_method.card.funding → card_funding. amount is integer minor
units; currency is a 3-letter code (any case; we normalize). There is no
card-issuing-country field to send yet — see the note under
velocity_card_countries.
Signals that go dark without a field
An absent field is “unknown”, and unknown never fires a rule — so a missing field looks exactly like clean traffic. The three that catch people out:
Strict requests, tolerant emails
- Unknown top-level keys are rejected with a 400
invalid_request— an integration typo fails loudly in test mode instead of silently dropping a signal. Anything free-form belongs incontext{}, which is stored and echoed back but never rejected. - Email is barely validated at the API edge (length +
@). On purpose: the engine judges email quality and reports it in reason codes; the schema just transports what your user typed. Don’t pre-filter emails before sending them.
Next
Device fingerprinting — the browser snippet that keeps the device-keyed rules alive. Not optional if you take payments.